FAQ
Why does Korch().run(...) need the [dspy] extra? I thought the base install was just pydantic.
Both are true. The base install (pydantic alone) imports cleanly and lets you build
configuration and typed models. But every reasoning agent is built on
DSPy — there's deliberately one reasoning implementation, not a lighter
non-DSPy fallback that would double the surface and risk drifting out of behavioral parity. So
"works on a base install" means no API key, no network (MockLM handles that) — not no
[dspy]. See Installation.
If you want to run without [dspy] at all, write a fully custom agent instead of using the
default reasoning worker — see Writing a custom agent.
What's the difference between Korch and Swarm?
Korch().run(objective) is the one-liner: it classifies your objective and plans a team of agents
for you (the Architect). Swarm is the typed builder: you declare the agents, their models, and
the topology (edges) explicitly. Reach for Korch when you want the framework to decide the
team; reach for Swarm when you already know it. Both drive the same kernel underneath.
Does this need any infrastructure to try?
No. The zero-config default is: local (in-process) runtime, MockLM (deterministic, offline)
gateway, in-memory persistence. Installing with the [dspy] extra and calling Korch().run(...)
needs no API key, no network, and no service running. See the
Quick Start for the exact install command.
Is this production-ready?
Kendra Orchestrator SDK is 0.x and at its first release, v0.1.0 (see Project status in the
README) — Phases 0–11 (the kernel,
runtimes, agents, routing, tools, governance, the remote client, the full test/benchmark suite,
and this documentation) are complete and tested; Phase 12's release pipeline has shipped and
v0.1.0 is tagged, published to PyPI, and published as
a GitHub Release (ADR 0021).
Judge readiness for your use case against that state directly rather
than a blanket label — see .claude/memory/PROJECT_STATE.md
in the repository for the current, detailed snapshot.
How is this different from LangGraph / CrewAI / AutoGen?
The comparison that matters most is the execution model, not the feature list: Kendra Orchestrator SDK runs supersteps as a Bulk Synchronous Parallel computation — every active agent computes against a frozen snapshot in parallel, and results merge through reducers that are associative and order-independent, so concurrency can never change the outcome. Paired with the durable runtime, a run is durable (survives a crash, resumes from its last checkpoint) and replayable. See Architecture for the full mechanism. This project doesn't maintain a feature-by-feature comparison table against other frameworks — architectures are worth understanding on their own terms.
Can I use a model provider other than through the Kendra gateway?
The built-in real gateway (OpenAIGateway) speaks the OpenAI-compatible chat completions shape
against a configured base_url — point KENDRA_AI_GATEWAY_URL at any OpenAI-API-compatible
endpoint, not necessarily Kendra's own. For a provider with an incompatible wire format, implement
IModelGateway yourself (async complete(messages, *, model, max_tokens) -> Message) and pass it
as model_gateway= to Korch/Swarm — it's an ARI port specifically so you can do this.
Does state survive a restart?
Depends on the runtime and the persistence backend, independently:
- Local runtime is synchronous and in-process — nothing survives the process ending.
- Durable runtime (
KORCH_RUNTIME=temporal) checkpoints every superstep durably regardless of persistence backend — a crash resumes from the last barrier. PERSISTENCE_BACKEND(in-memory by default) controls whether the bitemporal decision/event record itself is queryable after the fact, separately from run durability.
What happens if an agent takes too long?
Each agent has its own timeout_seconds (default 120s); exceeding it fails that agent's turn. A
run overall is bounded by max_supersteps — reaching it without every agent halting ends the run
with an error rather than running forever.
Where do I ask something this page doesn't answer?
Open an issue on the repository, or check Troubleshooting first — many concrete error messages are covered there.