Service Topology
Data Flow: A Turn
When a user sends a message, here is the complete data flow:- Client → Diminuendo (
turn/startACP method over WebSocket) - Diminuendo → Podium (native
process_messageover WebSocket to coordinator at/agent/{instanceId}) - Podium → Agent (dispatches to agent process via Unix socket IPC)
- Agent → Ensemble (HTTP POST
/api/v1/streamfor LLM inference) - Ensemble → Provider (Routes to optimal provider endpoint with cache affinity)
- Provider → Ensemble (SSE stream of tokens)
- Ensemble → Agent (Unified event blocks streamed back)
- Agent → Podium (Stream updates via IPC)
- Podium → Diminuendo (native
StreamUpdateevents over WebSocket, e.g.{ type: "update", event_type: "tool_call_start" }) - Diminuendo → Client (ACP
item/agentMessage/deltanotifications — Diminuendo’sPodiumNativeMappertranslates 40+ native event types to ACP)
External Dependencies
| Dependency | Used By | Purpose |
|---|---|---|
| SQLite | All services | Primary data store (embedded, per-tenant/per-agent) |
| Redis/Valkey | Ensemble, Podium | Cross-instance rate limiting, service discovery, pub/sub |
| S3/MinIO | All services | Response persistence (Ensemble), deployment registry (Podium), CAS backing (Chronicle), database replication via Litestream |
| Auth0 | Diminuendo | JWT verification for user authentication |
| LLM Providers | Ensemble | Anthropic, OpenAI, Google Gemini, xAI Grok, OpenRouter |
Deployment Model
Each service can be deployed independently:- Ensemble: Horizontally scalable Go binary behind ALB. SQLite local + Redis for coordination.
- Podium: Coordinator (Rust) + Gateway (Rust) on ECS/Docker. Agents spawn as child processes. S3 deployment registry for distributed bundles.
- Chronicle: Compiled into the Podium Docker image. Mounts per-agent FUSE filesystems. Also supports FSKit backend on macOS 15.4+.
- Diminuendo: Single Bun process per instance. Scales by routing tenants to different instances (data is per-tenant SQLite files).