Architecture Overview
Core Components
graph TB
subgraph "AgentPlatform"
P[Platform] --> R[AgentRegistry]
P --> S[Storage Backend]
P --> MW[Middleware Stack]
P --> RF[RouterFactory]
end
subgraph "Per Agent"
R --> A[RegisteredAgent]
A --> M[AgentManifest]
A --> G["graph_fn / node_fn"]
A --> C[Config]
A --> PM[PromptManager]
end
subgraph "Auto-Generated"
RF --> E1["POST /invoke"]
RF --> E2["POST /invoke/stream"]
RF --> E3["POST /chat"]
RF --> E4["POST /a2a/tasks"]
RF --> E5["GET /health"]
RF --> E6["GET /card"]
end
Request Flow
sequenceDiagram
Client->>+Middleware: HTTP Request
Middleware->>+RouterFactory: Authenticated
RouterFactory->>+Registry: get(agent_name)
Registry-->>-RouterFactory: RegisteredAgent
RouterFactory->>+Agent: graph.ainvoke(state)
Agent-->>-RouterFactory: result
RouterFactory->>+Storage: save thread/messages
Storage-->>-RouterFactory: ok
RouterFactory-->>-Middleware: Response
Middleware-->>-Client: JSON / SSE
Key Design Decisions
- Convention over configuration — drop a folder, get an API
- Everything is optional — only
__init__.py required
- Override anything — custom routers replace auto-generated ones
- Async-first — all I/O is async
- ABC-based storage — swap backends without code changes