Zwei Wege der Entwicklung
Agent-Lab ist ein Framework, das Sie als Bibliothek nutzen, und zugleich ein Repository, in dem Sie direkt arbeiten können. Beides wird unterstützt:
- Als Bibliothek (empfohlen für Produkte). Fügen Sie
btech-agent-labzu Ihrem eigenen Projekt hinzu, definieren Sie Agenten durch Erweitern der Basisklassen und stellen Sie die Anwendung mitcreate_app()zusammen. Sie erweitern das Framework über seine öffentliche API – Vererbung, Decorators und Konfiguration – und bearbeiten niemals Framework-Code. Beginnen Sie mit dem Tutorial oder dem Schnellstart und lesen Sie dann Das Framework erweitern. Um den Boilerplate-Code zu überspringen, erzeugen Sie ein fertiges Nutzerprojekt per Scaffolding mituvx cookiecutter gh:btech-software/agent-lab --directory cookiecutter(siehe cookiecutter/README.md). - Im Repository (für Mitwirkende und die Referenzimplementierung). Klonen Sie das
Repository, fügen Sie Agenten unter
agent_lab/services/agent_types/hinzu, führen Sie die mitgelieferte Referenzanwendung aus und nutzen Sie die Notebooks und Integrationstests. So werden die integrierten Agenten entwickelt. Siehe Agentische Workflows entwickeln.
Beide Wege verwenden dieselben Bausteine; der Unterschied liegt nur darin, wo Ihr Code liegt. Wählen Sie, was zu Ihrem Projekt passt.
Setup
Installation
Agent-Lab setzt Python 3.12+ voraus und verwendet uv für das Dependency-Management.
Agent-Lab als Bibliothek nutzen – installieren Sie es in Ihr eigenes Projekt:
pip install btech-agent-lab
# or
uv add btech-agent-labIm Repository arbeiten – klonen Sie es und synchronisieren Sie die Umgebung:
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 dependenciesStellen Sie sicher, dass Docker oder eine andere Container-Runtime installiert ist und läuft – die Integrationstests verwenden sie (über testcontainers), und die mitgelieferten Docker-Compose-Dateien stellen die Abhängigkeiten der Anwendung bereit.
Die Beispiel-Umgebungsdatei kopieren
cp .env.example .envDiese Datei enthält API-Schlüssel für KI-Anbieter und die Endpoints, die von den Agenten-Simulationen verwendet werden. Jede Variable ist in der Konfigurationsreferenz dokumentiert.
Referenzimplementierung
Das Repository enthält eine vollständige Referenzanwendung (agent_lab.main), die
alle integrierten Agenten registriert – RAG, Browser-Automatisierung, Voice Memos, Vision und Multi-Agenten-Supervisors.
Sie ist sowohl ein deploybares Produkt als auch das maßgebliche Beispiel dafür, wie
das Framework genutzt wird: Sie ist nichts weiter als ein Aufruf von create_app() über die integrierten
Agentenpakete.
# agent_lab/main.py
from agent_lab.app_factory import create_app
app = create_app() # scans DEFAULT_SCAN_PACKAGES: all built-in capabilitiesNutzen Sie sie als lebendige Referenz beim Entwickeln Ihrer eigenen Anwendung und als schnellsten Weg, um Agent-Lab End-to-End auszuprobieren. Die Bereitstellung ihrer Infrastruktur (die drei PostgreSQL-Datenbanken, Redis, Keycloak, Vault) in Entwicklung oder Produktion wird im Deployment-Guide beschrieben. Der nächste Abschnitt zeigt, wie Sie sie lokal ausführen.
Die Anwendung ausführen
Die Anwendung mit Uvicorn starten
Für Entwicklung und Debugging mit einer IDE führen Sie die Referenzanwendung direkt aus:
uvicorn agent_lab.main:app --reloadDie interaktive OpenAPI-Dokumentation finden Sie unter http://localhost:8000/docs.
Wenn Sie Agent-Lab als Bibliothek nutzen, führen Sie Ihre Anwendung auf dieselbe Weise aus – richten Sie
uvicorn auf das Modul aus, das create_app() aufruft:
uvicorn app:app --reload # where app.py defines `app = create_app(scan_packages=[...])`Die Anwendung mit Docker Compose starten
Zwei vorkonfigurierte Docker-Compose-Dateien führen die Referenzanwendung zusammen mit einem Observability-Stack aus:
compose-grafana.yml: die Anwendung plus Grafana, Prometheus, Tempo und Loki.compose-opensearch.yml: die Anwendung plus OpenSearch Dashboards.
docker compose -f compose-grafana.yml up --build # Grafana stack
docker compose -f compose-opensearch.yml up --build # OpenSearch Dashboards stackNach dem Start der Anwendung ist die API unter http://localhost:18000/docs erreichbar. Observability-Dashboards:
- Grafana: http://localhost:3000 (Standard-Zugangsdaten:
admin/admin). Siehe das Grafana-Beispiel. - OpenSearch Dashboards: http://localhost:5601. Siehe das OpenSearch-Beispiel.
Entwicklungspraktiken
Dependency Injection
Die Anwendung verwendet Dependency Injector für Dependency Injection, was Zuständigkeiten sauber trennt und das Testen erleichtert.
Der Container ist in agent_lab/core/container.py definiert. Wenn Sie Agent-Lab als
Bibliothek nutzen, leiten Sie von Container ab, um eigene Provider hinzuzufügen, und übergeben Sie die Instanz an
create_app(container=...). Wenn Sie im Repository arbeiten, registrieren Sie zusätzliche Framework-Services
direkt im Container.
Anwendungskonfiguration
Die Konfiguration wird über eine ConfigSource geladen (siehe agent_lab/core/config.py) und
an den DI-Container gebunden. Das Framework bringt drei YAML-Quellen für Entwicklung und
Tests mit, die automatisch anhand einer Umgebungsvariable ausgewählt werden:
config-dev.yml: Entwicklungsumgebung, aktiviert, wennDEVELOPINGgesetzt ist – gedacht für das Debugging in der IDE.config-test.yml: Testumgebung, aktiviert, wennTESTINGgesetzt ist – wird vom Setup der Integrationstests verwendet.config-docker.yml: Docker-Compose-Umgebung, aktiviert, wennDOCKERgesetzt ist.
Diese Dateien definieren Einstellungen wie Datenbankverbindungen und Authentifizierung und sind ausschließlich für
Entwicklung und Tests gedacht. Verwenden Sie in der Produktion Vault über
VaultConfigSource (der Standard, wenn kein Umgebungs-Flag gesetzt ist). Um die
Konfiguration aus einem anderen Backend bereitzustellen, implementieren Sie Ihre eigene ConfigSource und übergeben sie
an create_app(config_source=...). Alle Konfigurationsschlüssel und Umgebungsvariablen
sind in der Konfigurationsreferenz dokumentiert.
Entity-Domänenmodell
Das Datenmodell – die in der gesamten Anwendung verwendeten Entitäten und ihre Beziehungen – finden Sie im Entity-Domänenmodell.
Logging und Observability
Die Anwendung verwendet OpenTelemetry für Logging und
Observability; das Setup befindet sich in agent_lab/infrastructure/metrics/tracer.py. Aufrufe von FastAPI,
HTTPX, LangChain, SQLAlchemy und OpenAI sind von Haus aus instrumentiert, mit
austauschbaren Backends für Langfuse und LangWatch.
Details finden Sie im Observability-Guide.
Tests
Das Projekt verwendet pytest mit Schwerpunkt auf Integrationstests (Coverage-Schwelle: 90 %), gestützt auf Testcontainers, sodass die Tests gegen echte Services in Docker-Containern laufen. Eine separate Simulations-Suite bewertet das Agentenverhalten End-to-End mit einem LLM-as-Judge.
make test # unit + integration with coverage
make test_simulations # end-to-end agent simulations (calls live LLMs)Die erste Ausführung kann mehrere Minuten dauern, da Docker-Images und Embedding-Modelle heruntergeladen werden. Das Gesamtbild finden Sie im Test-Guide.
pre-commit initialisieren
Wenn Sie zur Codebasis beitragen oder neue Agenten auf Basis von Agent-Lab entwickeln möchten, installieren Sie die pre-commit-Hooks:
pre-commit installSo wird sichergestellt, dass Ihr Code vor dem Commit den Coding-Standards des Projekts entspricht.
Agentische Workflows entwickeln
Agent-Lab basiert auf LangGraph, das eine leistungsfähige Möglichkeit bietet, agentische Workflows mit LLMs zu entwickeln. Dank der modularen Architektur und der Agent-Basisklassen ist die Entwicklung eines solchen Workflows unkompliziert.
Eine neue Agent-Implementierung definieren
Der Agent ist ein Kernkonzept in Agent-Lab: eine autonome Einheit, die Aufgaben ausführen, Entscheidungen treffen und mit anderen Agenten oder externen Systemen interagieren kann. Ein Agent ist eine konkrete Implementierung einer der Basisklassen:

Eine Klasse, die WorkflowAgentBase erweitert, definiert:
- einen Workflow, der das Verhalten des Agenten abbildet – Aufgaben, Entscheidungsfindung und Interaktionen mit anderen Agenten oder externen Systemen.
- Initialisierungsparameter wie die Prompts (Jinja2-Templates) und weitere Einstellungen, die das Verhalten des Agenten anpassen (Vector-Store-Collections, Temperatur usw.).
Hier ein Beispiel für persistierte Initialisierungsparameter eines Agenten, der Sprachtranskription und -analyse durchführt, nachdem der Agent erstellt und in der Datenbank gespeichert wurde:

Über die REST API lassen sich mehrere Agenten auf Basis derselben Implementierung erstellen und verfeinern.
Den Agenten mit @discoverable_agent registrieren
Dekorieren Sie Ihre AgentBase-Unterklasse mit @discoverable_agent("<agent_type>"). Dieser eine
Decorator ist die gesamte Registrierung, die ein Agent benötigt – er macht den Agenten:
- auffindbar für die Agent-Registry (
agent_lab/services/agent_types/registry.py), - auflösbar über den DI-Container, der ihn lazy instanziiert und alle
deklarierten
extra_depsinjiziert, - gültig in der API, weil das Schema zur Agentenerstellung
agent_typedynamisch gegen die Registry validiert.
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
...Hinweis (Migration): Frühere Versionen erforderten es, jeden Agenten manuell in
container.pyzu verdrahten, ihn zuregistry.pyhinzuzufügen und das Pydantic-Schema inagents/schema.pyzu erweitern. Diese Schritte sind obsolet –@discoverable_agentübernimmt sie alle. Alle von Ihnen deklariertenextra_depswerden zum Zeitpunkt der Instanziierung anhand ihres Namens aus dem (gegebenenfalls abgeleiteten) Container aufgelöst.
Benötigt ein Agent über AgentUtils hinaus weitere Kollaborateure, stellen Sie diese als Provider im
Container bereit (leiten Sie von Container ab, wenn Sie die Bibliothek nutzen) und benennen Sie sie in
extra_deps.
Den Agenten auffindbar machen
Das Framework importiert nur Agentenmodule, die ihm bekannt gemacht werden, damit der Decorator ausgeführt wird:
Im Repository: Legen Sie den Agenten unter
agent_lab/services/agent_types/ab – die Referenzanwendung scannt dieses Paket als Teil vonDEFAULT_SCAN_PACKAGES(create_app()).Als Bibliothek: Übergeben Sie Ihr Paket an
create_app(scan_packages=[*DEFAULT_SCAN_PACKAGES, "my_agents"])– eine explizite Liste ersetzt die Standardwerte (so schließen Sie auch integrierte Fähigkeiten aus) – oder veröffentlichen Sie es aus einem installierten Paket über die Entry-Point-Gruppeagent_lab.agents, damit Nutzer es automatisch übernehmen:# pyproject.toml of the package that ships the agents [project.entry-points."agent_lab.agents"] my_agents = "my_agents"
Mit der Agent-Implementierung experimentieren
In den Notebooks finden Sie Beispiele dafür, wie Sie einen Agenten interaktiv mit Jupyter testen – unter Verwendung desselben Dependency-Injection-Mechanismus. Dies ist eine bequeme Möglichkeit, Verhalten in einer kontrollierten Umgebung zu prototypisieren und zu validieren – siehe das Forscherhandbuch.
REST-API-Schnittstelle für Agenten
Sobald ein Agent registriert ist, erstellen und verwalten Sie seine Instanzen über die REST API – Sie können mehrere konfigurierte Instanzen derselben Implementierung betreiben, jede mit eigenen Prompts und Einstellungen. Den Endpoint-Katalog und Request-Beispiele finden Sie in der REST-API-Referenz.
Den Agenten testen
- Integrationstests (
tests/integration/) validieren den Agenten gegen echte Infrastruktur mit pytest und testcontainers. - Simulationen (
tests/simulation/) bewerten das Verhalten End-to-End mit einem LLM-as-Judge. Siehe den Test-Guide.
MCP-Server
Im MCP-Server-Guide erfahren Sie, wie Sie Ihre Agenten (und zusätzliche Tools) für MCP-Clients wie Claude Desktop bereitstellen – für Agent-Discovery, Dialogverlauf und Agent-zu-Agent-Kommunikation.
Das Framework erweitern
Wenn Sie Agent-Lab als Bibliothek nutzen, gestalten Sie die Anwendung vollständig über
create_app() und die öffentliche API, die vom Top-Level-Paket agent_lab exportiert wird –
niemals durch Bearbeiten von Framework-Code:
| Erweiterungspunkt | Vorgehen |
|---|---|
| Agenten | Von einer Basisklasse ableiten, mit @discoverable_agent dekorieren und über scan_packages=[...] oder den Entry Point agent_lab.agents registrieren. |
| Services & Abhängigkeiten | Von Container ableiten, Provider hinzufügen und als create_app(container=...) übergeben. |
| Konfiguration | Eine ConfigSource implementieren (oder YamlConfigSource / VaultConfigSource verwenden) und create_app(config_source=...) übergeben. |
| Zusätzliche HTTP-Routen | Einen APIRouter erstellen, ihn in ein RouterMount (mit seiner Auth-Policy) einbetten und create_app(extra_routers=[...]) übergeben. |
| MCP-Tools & -Prompts | Mit @discoverable_mcp_tool / @discoverable_mcp_prompt / @discoverable_mcp_registrar dekorieren, über denselben scan_packages-/Entry-Point-Mechanismus wie Agenten registrieren und MCP-Instruction-Fragmente über create_app(mcp_instructions=[...]) hinzufügen. |
| Tracing-Backends | Von TracingBackend ableiten und die Klasse in Ihrem Container registrieren, um Spans an Ihre eigene Plattform zu exportieren. |
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."],
)Alles oben Genannte wird von agent_lab exportiert (siehe agent_lab/__init__.py); die vollständige
Liste der Konfigurationsschlüssel, die diese Stellschrauben verwenden, finden Sie in der
Konfigurationsreferenz.
Mitwirken
Unterstützung aus der Community wird sehr geschätzt. Wenn Sie auf Probleme stoßen oder Verbesserungsvorschläge haben, melden Sie diese bitte, indem Sie ein Issue auf unserer Seite GitHub Issues erstellen.
Um zum Projekt beizutragen, gehen Sie wie folgt vor:
- Forken Sie das Repository.
- Erstellen Sie einen neuen Branch für Ihr Feature oder Ihren Bugfix.
- Aktivieren Sie die pre-commit-Hooks mit
pre-commit install, nehmen Sie Ihre Änderungen vor und committen Sie sie mit klaren und prägnanten Commit-Messages. - Stellen Sie sicher, dass Ihre Änderungen die pre-commit-Hooks und die Coverage-Schwelle von 90 %
bestehen (
make test). - Pushen Sie Ihre Änderungen in Ihr geforktes Repository.
- Erstellen Sie einen Pull Request (PR) auf den Branch
maindes ursprünglichen Repositorys.
Wir prüfen Ihren PR und geben Ihnen Feedback. Vielen Dank für Ihre Beiträge und Ihre Unterstützung!
Produktiv-Deployment
Im Deployment-Guide erfahren Sie, wie Sie die Referenzanwendung mit den mitgelieferten Helm-Charts und Terraform-Skripten produktiv deployen.