Files
yoi/crates/agen/docs/architecture.md

3.1 KiB

agen architecture

agen separates orchestration, event projection, and provider transport so applications can replace an LLM client without changing the turn loop or tool model.

┌────────────────────────────────────────────┐
│ Engine                                     │
│ turn loop · interceptors · tool execution  │
│ typed state: Mutable → Locked → Mutable    │
└─────────────────────┬──────────────────────┘
                      │
┌─────────────────────▼──────────────────────┐
│ Timeline                                   │
│ event dispatch · block collectors          │
└─────────────────────┬──────────────────────┘
                      │
┌─────────────────────▼──────────────────────┐
│ LlmClient                                  │
│ transport · provider wire-format schemes   │
└────────────────────────────────────────────┘

Main modules

Module Responsibility
engine Turn execution, pause/resume, retries, tool integration, and callbacks
state Sealed Mutable and Locked type-state markers
interceptor Application-owned control decisions at orchestration boundaries
tool / tool_server Tool metadata, registration, execution, and bounded output
timeline Streaming event dispatch, handlers, and block assembly
llm_client Provider-neutral request, response, auth, transport, and scheme contracts
providers Optional higher-level provider adapters such as the codex feature
prune / token_counter Cache-aware history reduction and token estimation
usage_record Request and token usage accounting

Request flow

Engine history
  → provider-neutral Request
    → Scheme::build_request
      → Provider transport

Response flow

streaming response bytes
  → Scheme event parsing
    → unified Event values
      → Timeline handlers and collectors
        → Engine history/tool decisions

Type state and cache protection

Engine<C, Mutable> permits configuration and history editing. Engine::run or Engine::lock commits the current prefix and produces Engine<C, Locked>. The locked engine may append turns without mutating the committed prefix. Engine::unlock explicitly returns to mutable state when an application accepts losing that cache guarantee.

Public surface

The 0.2 series exposes the low-level client, timeline, tool, pruning, and usage modules because custom clients and orchestration hosts build directly on them. These APIs are intentionally provider-neutral but remain pre-1.0 and may change in later minor releases.