Due modi di sviluppare
Agent-Lab è un framework che usi come libreria, ma è anche un repository in cui puoi lavorare direttamente. Entrambe le modalità sono supportate:
- Come libreria (consigliato per i prodotti). Aggiungi
btech-agent-labal tuo progetto, definisci gli agenti estendendo le classi base e assembla l'app concreate_app(). Estendi il framework tramite la sua API pubblica (sottoclassi, decorator e configurazione) senza mai modificare il codice del framework. Inizia dal Tutorial o dal Quickstart, poi leggi Estendere il framework. Per evitare il codice boilerplate, genera un progetto consumatore già pronto conuvx cookiecutter gh:btech-software/agent-lab --directory cookiecutter(vedi cookiecutter/README.md). - Nel repository (per i contributori e l'implementazione di riferimento). Clona il
repository e aggiungi gli agenti in
agent_lab/services/agent_types/, esegui l'app di riferimento inclusa e usa i notebook e i test di integrazione. È così che vengono sviluppati gli agenti integrati. Vedi Creare workflow agentici.
Entrambi i percorsi usano gli stessi elementi costitutivi; l'unica differenza è dove risiede il tuo codice. Scegli quello più adatto al tuo progetto.
Configurazione iniziale
Installazione
Agent-Lab richiede Python 3.12+ e usa uv per la gestione delle dipendenze.
Usare Agent-Lab come libreria: installalo nel tuo progetto:
pip install btech-agent-lab
# or
uv add btech-agent-labLavorare nel repository: clonalo e sincronizza l'ambiente:
git clone https://github.com/btech-software/agent-lab.git
cd agent-lab
uv sync # runtime dependencies
uv sync --group test # add the test/simulation dependenciesAssicurati che Docker o un altro container runtime sia installato e in esecuzione: i test di integrazione lo usano (tramite testcontainers) e i file Docker Compose inclusi forniscono le dipendenze dell'applicazione.
Copiare il file di ambiente di esempio
cp .env.example .envQuesto file contiene le API key dei fornitori di AI e gli endpoint usati dalle simulazioni di agenti. Ogni variabile è documentata nel Riferimento della configurazione.
Implementazione di riferimento
Il repository include un'applicazione di riferimento completa (agent_lab.main) che
registra tutti gli agenti integrati: RAG, automazione del browser, memo vocali, visione
e supervisor multi-agente. È sia un prodotto pronto per il deployment sia l'esempio
canonico di come usare il framework: non è altro che una chiamata a create_app() sui
package degli agenti integrati.
# agent_lab/main.py
from agent_lab.app_factory import create_app
app = create_app() # scans DEFAULT_SCAN_PACKAGES: all built-in capabilitiesUsala come riferimento concreto mentre crei la tua app e come modo più rapido per provare Agent-Lab end-to-end. Il provisioning della sua infrastruttura (i tre database PostgreSQL, Redis, Keycloak, Vault) in sviluppo o in produzione è descritto nella guida al deployment. La sezione seguente mostra come eseguirla in locale.
Eseguire l'applicazione
Avviare l'applicazione con Uvicorn
Per lo sviluppo e il debug con un IDE, esegui direttamente l'app di riferimento:
uvicorn agent_lab.main:app --reloadAccedi alla documentazione OpenAPI interattiva su http://localhost:8000/docs.
Quando usi Agent-Lab come libreria, esegui la tua app nello stesso modo: punta
uvicorn al modulo che chiama create_app():
uvicorn app:app --reload # where app.py defines `app = create_app(scan_packages=[...])`Avviare l'applicazione con Docker Compose
Due file Docker Compose preconfigurati eseguono l'app di riferimento insieme a uno stack di osservabilità:
compose-grafana.yml: l'applicazione più Grafana, Prometheus, Tempo e Loki.compose-opensearch.yml: l'applicazione più OpenSearch Dashboards.
docker compose -f compose-grafana.yml up --build # Grafana stack
docker compose -f compose-opensearch.yml up --build # OpenSearch Dashboards stackDopo l'avvio dell'applicazione, l'API è disponibile su http://localhost:18000/docs. Dashboard di osservabilità:
- Grafana: http://localhost:3000 (credenziali predefinite:
admin/admin). Vedi l'esempio con Grafana. - OpenSearch Dashboards: http://localhost:5601. Vedi l'esempio con OpenSearch.
Pratiche di sviluppo
Dependency injection
L'applicazione usa Dependency Injector per la dependency injection, che mantiene separate le responsabilità e semplifica i test.
Il container è definito in agent_lab/core/container.py. Quando usi Agent-Lab come
libreria, crea una sottoclasse di Container per aggiungere i tuoi provider e passa
l'istanza a create_app(container=...). Quando lavori nel repository, registra i
servizi aggiuntivi del framework direttamente nel container.
Configurazione dell'applicazione
La configurazione viene caricata tramite una ConfigSource (vedi
agent_lab/core/config.py) e collegata al container DI. Il framework include tre
sorgenti YAML per sviluppo e test, selezionate automaticamente tramite variabile
d'ambiente:
config-dev.yml: ambiente di sviluppo, attivato quandoDEVELOPINGè impostata; pensato per il debug nell'IDE.config-test.yml: ambiente di test, attivato quandoTESTINGè impostata; usato dalla configurazione dei test di integrazione.config-docker.yml: ambiente Docker Compose, attivato quandoDOCKERè impostata.
Questi file definiscono impostazioni come le connessioni ai database e l'autenticazione,
e sono destinati solo a sviluppo e test. In produzione, usa Vault tramite
VaultConfigSource (l'impostazione predefinita quando non è impostato alcun flag
d'ambiente). Per fornire la configurazione da un backend diverso, implementa una tua
ConfigSource e passala a create_app(config_source=...). Ogni chiave di
configurazione e variabile d'ambiente è documentata nel
Riferimento della configurazione.
Modello di dominio delle entità
Consulta il Modello di dominio delle entità per il modello dei dati: le entità e le loro relazioni usate in tutta l'applicazione.
Logging e osservabilità
L'applicazione usa OpenTelemetry per logging e
osservabilità; la configurazione si trova in agent_lab/infrastructure/metrics/tracer.py.
Le chiamate FastAPI, HTTPX, LangChain, SQLAlchemy e OpenAI sono strumentate di serie,
con backend pluggable per Langfuse e LangWatch.
Consulta la guida all'osservabilità per i dettagli.
Test
Il progetto usa pytest con un'attenzione particolare ai test di integrazione (soglia di copertura: 90%), supportati da Testcontainers, così i test vengono eseguiti su servizi reali in container Docker. Una suite di simulazione separata valuta il comportamento degli agenti end-to-end con un LLM-as-judge.
make test # unit + integration with coverage
make test_simulations # end-to-end agent simulations (calls live LLMs)La prima esecuzione può richiedere diversi minuti, perché scarica le immagini Docker e i modelli di embedding. Consulta la guida ai test per il quadro completo.
Inizializzare pre-commit
Se intendi contribuire al codice o creare nuovi agenti basati su Agent-Lab, installa gli hook di pre-commit:
pre-commit installIn questo modo il tuo codice rispetta gli standard di codifica del progetto prima di ogni commit.
Creare workflow agentici
Agent-Lab è basato su LangGraph, che offre un modo potente per creare workflow agentici usando gli LLM. Crearne uno è un processo semplice grazie all'architettura modulare e alle classi base degli agenti.
Definire una nuova implementazione di agente
L'agente è un concetto fondamentale in Agent-Lab: rappresenta un'entità autonoma in grado di eseguire task, prendere decisioni e interagire con altri agenti o sistemi esterni. Un agente è un'implementazione concreta di una delle classi base:

Una classe che estende WorkflowAgentBase definisce:
- un workflow che rappresenta il comportamento dell'agente: task, processi decisionali e interazioni con altri agenti o sistemi esterni.
- parametri di inizializzazione come i prompt (template Jinja2) e altre impostazioni che personalizzano il comportamento dell'agente (collection del vector store, temperatura e così via).
Ecco un esempio di parametri di inizializzazione persistiti per un agente che esegue trascrizione e analisi vocale, dopo che l'agente è stato creato e salvato nel database:

È possibile creare e perfezionare tramite la REST API più agenti basati sulla stessa implementazione.
Registrare l'agente con @discoverable_agent
Applica alla tua sottoclasse di AgentBase il decorator
@discoverable_agent("<agent_type>"). Quel solo decorator è tutta la registrazione di
cui un agente ha bisogno: rende l'agente
- individuabile dal registro degli agenti (
agent_lab/services/agent_types/registry.py), - risolvibile tramite il container DI, che lo istanzia in modo lazy e inietta le
eventuali
extra_depsdichiarate, - valido per l'API, perché lo schema di creazione degli agenti valida
agent_typerispetto al registro in modo dinamico.
from agent_lab import AgentBase, AgentUtils, discoverable_agent
@discoverable_agent("my_agent", extra_deps=("my_service",))
class MyAgent(AgentBase):
def __init__(self, agent_utils: AgentUtils, my_service):
super().__init__(agent_utils)
self.my_service = my_service
...Nota (migrazione): le versioni precedenti richiedevano di collegare manualmente ogni agente in
container.py, di aggiungerlo aregistry.pye di estendere lo schema Pydantic inagents/schema.py. Questi passaggi sono obsoleti:@discoverable_agentli gestisce tutti. Leextra_depsche dichiari vengono risolte per nome sul container (eventualmente una sua sottoclasse) al momento dell'istanziazione.
Se un agente ha bisogno di collaboratori oltre ad AgentUtils, esponili come provider
sul container (crea una sottoclasse di Container quando usi la libreria) e indicali
in extra_deps.
Rendere l'agente individuabile
Il framework importa solo i moduli di agenti che gli vengono indicati, così che il decorator venga eseguito:
Nel repository: posiziona l'agente in
agent_lab/services/agent_types/: l'app di riferimento analizza quel package come parte diDEFAULT_SCAN_PACKAGES(create_app()).Come libreria: passa il tuo package a
create_app(scan_packages=[*DEFAULT_SCAN_PACKAGES, "my_agents"])(un elenco esplicito sostituisce quello predefinito, ed è anche il modo per escludere le funzionalità integrate) oppure pubblicalo da un package installato tramite il gruppo di entry pointagent_lab.agents, così che i consumatori lo rilevino automaticamente:# pyproject.toml of the package that ships the agents [project.entry-points."agent_lab.agents"] my_agents = "my_agents"
Sperimentare con l'implementazione dell'agente
Consulta i notebook per esempi di test interattivi di un agente con Jupyter, usando lo stesso meccanismo di dependency injection. È un modo comodo per prototipare e validare il comportamento in un ambiente controllato: vedi la Guida per ricercatori.
Interfaccia REST API dell'agente
Una volta registrato un agente, crea e gestisci le sue istanze tramite la REST API: puoi eseguire diverse istanze configurate della stessa implementazione, ognuna con i propri prompt e impostazioni. Consulta il Riferimento della REST API per il catalogo degli endpoint e gli esempi di richiesta.
Testare l'agente
- I test di integrazione (
tests/integration/) validano l'agente su infrastruttura reale con pytest e testcontainers. - Le simulazioni (
tests/simulation/) valutano il comportamento end-to-end con un LLM-as-judge. Consulta la guida ai test.
Server MCP
Consulta la guida al server MCP per esporre i tuoi agenti (e tool aggiuntivi) a client MCP come Claude Desktop per la discovery degli agenti, la cronologia dei dialoghi e la comunicazione tra agenti.
Estendere il framework
Quando usi Agent-Lab come libreria, definisci l'applicazione interamente tramite
create_app() e l'API pubblica esportata dal package di primo livello agent_lab,
senza mai modificare il codice del framework:
| Punto di estensione | Come |
|---|---|
| Agenti | Crea una sottoclasse di una classe base, applica @discoverable_agent e registrala tramite scan_packages=[...] o l'entry point agent_lab.agents. |
| Servizi e dipendenze | Crea una sottoclasse di Container, aggiungi i provider e passala come create_app(container=...). |
| Configurazione | Implementa una ConfigSource (o usa YamlConfigSource / VaultConfigSource) e passa create_app(config_source=...). |
| Route HTTP aggiuntive | Crea un APIRouter, incapsulalo in un RouterMount (con la sua policy di autenticazione) e passa create_app(extra_routers=[...]). |
| Tool e prompt MCP | Applica @discoverable_mcp_tool / @discoverable_mcp_prompt / @discoverable_mcp_registrar, registrali con lo stesso passaggio scan_packages / entry point degli agenti e aggiungi frammenti di istruzioni MCP tramite create_app(mcp_instructions=[...]). |
| Backend di tracing | Crea una sottoclasse di TracingBackend e registrala nel tuo Container per esportare gli span sulla tua piattaforma. |
from agent_lab import (
DEFAULT_SCAN_PACKAGES,
Container,
RouterMount,
YamlConfigSource,
create_app,
)
class MyContainer(Container):
my_service = ... # providers.Factory(MyService, ...)
app = create_app(
container=MyContainer(),
scan_packages=[*DEFAULT_SCAN_PACKAGES, "my_agents"],
config_source=YamlConfigSource("config.yml"),
extra_routers=[RouterMount(my_router, "/custom", ["custom"])],
mcp_instructions=["Extra guidance for MCP clients."],
)Tutto quanto sopra è esportato da agent_lab (vedi agent_lab/__init__.py); l'elenco
completo delle chiavi di configurazione usate da queste opzioni si trova nel
Riferimento della configurazione.
Contribuire
Il supporto della community è molto apprezzato. Se riscontri problemi o hai suggerimenti di miglioramento, segnalali creando una issue nella nostra pagina GitHub Issues.
Per contribuire al progetto, segui questi passaggi:
- Crea un fork del repository.
- Crea un nuovo branch per la tua funzionalità o correzione.
- Attiva gli hook di pre-commit eseguendo
pre-commit install, apporta le tue modifiche ed esegui il commit con messaggi chiari e concisi. - Assicurati che le tue modifiche superino gli hook di pre-commit e la soglia di
copertura del 90% (
make test). - Esegui il push delle modifiche nel tuo fork del repository.
- Crea una Pull Request (PR) verso il branch
maindel repository originale.
Esamineremo la tua PR e ti daremo un riscontro. Grazie per i tuoi contributi e il tuo supporto!
Deployment in produzione
Consulta la guida al deployment per eseguire il deployment dell'applicazione di riferimento in produzione usando i chart Helm e gli script Terraform inclusi.