Repository navigation
Epic: Pillar 1 — governed model access through the Omni Gateway LLM proxy #2
Description
Summary
Pillar 1 makes the Omni Gateway LLM proxy a drop-in model provider for eight
agent frameworks, so a developer keeps their framework and their IDE and gains
governed, attributed model access. This is the pillar whose platform contract is
live-verified, and the one that is useful on its own — build plan §9.1 says
ship M1 publicly rather than waiting for Pillars 2–3.
The one design rule (§3.1)
Adapters return native framework objects. donkey.langgraph.chat_model("gpt-4o")
returns a real ChatOpenAI, not a FabricChatModel wrapper. Consequences,
all deliberate:
- zero surface area to maintain when a framework adds features
- users keep structured output, streaming, caching, callbacks with no gaps
- if the SDK is abandoned, user code degrades to three lines of manual config
- the cost — no cross-framework portability of agent code — is accepted;
portability was never the ask
Child issues
Core foundation — config, auth, transport, error taxonomy, telemetry, cache.
All built; core is framework-free and enforced by import-linter in CI.
LLM surface — donkey.llm.client() (async + blocking overloads),
resolve() / ModelHandle, honest list_models(), token-usage surfacing.
Eight framework adapters — one issue each, covering the factory, the
connection_kwargs() accessor, the module-level factory, header/transport
injection fidelity, and the TypeScript equivalent where one exists.
Header injection fidelity, per framework
The differentiator is that every governed value is injected in one place
(§2.3, core/transport.py). Frameworks differ in how much of it they accept:
| Framework | default_headers |
Our httpx client | Correlation ID |
|---|---|---|---|
| LangGraph | yes | yes (http_async_client) |
per-run |
| OpenAI Agents SDK | yes | yes (we build the AsyncOpenAI) |
per-run |
| Anthropic SDK | yes | yes | per-run |
| Strands | yes (client_args) |
yes (client_args) |
per-run |
| Agent Framework | yes | yes | per-run |
| LlamaIndex | yes | no | per-client |
| Google ADK | via LiteLLM extra_headers |
no — LiteLLM owns transport | per-client |
| CrewAI | via LiteLLM extra_headers |
no — LiteLLM owns transport | per-client |
ADK and CrewAI record an asserted, documented exemption for
correlation_id_propagated in the conformance kit's KNOWN_LIMITATIONS, never a
silent skip (§8.1).
Acceptance criteria
- All eight adapters signature-verified against installed packages (§8)
- Each passes the conformance kit or carries an asserted exemption
- Each has a runnable
examples/<framework>/needing only env vars - Each has a docs page showing the manual equivalent, so users can eject (§9.2)
- Each is listed in the nightly matrix with a version floor and no ceiling
-
0.1.0tagged once the Tier-1 four are green and §0.4 support statement is resolved
References
- Build plan §3, §9.1 (M1), §9.2 (DoD per adapter)
python/src/donkey_kit/llm/,python/src/donkey_kit/integrations/docs/m1-completion-checklist.md
Activity
amirkhan-ak-sf commentedon Sep 4, 2026
Closing as superseded by the phase-based backlog rebuild.
'Epic: Pillar 1' — the three-pillar framing is replaced by the phase model. Superseded by the new Phase 1 epic.
feat(skeleton): define the last-call record once at donkey.last_call (#…
fix(langgraph): report last_call after ChatOpenAI.ainvoke() (#893)