-
Notifications
You must be signed in to change notification settings - Fork 0
FAQ
Three reasons, in order of importance:
-
Zero runtime dependencies. ExecutionKit is pure Python stdlib
with optional
httpx. Drop it into a Lambda, a constrained government environment, or a homelab without dragging a dependency tree. - Three patterns, not 300. Consensus, refine, ReAct. Pipe to compose. That's the full surface area. You can read the entire library in an evening.
- OpenAI-compatible endpoint is the only assumption. Works with OpenAI, Ollama, Groq, Together AI, GitHub Models, Azure OpenAI, any vLLM deployment, anything.
If you're already deep in LangChain, stay there — it's more powerful. ExecutionKit is for the case where you want a small, auditable primitive set.
agreement_strategy="majority" (default) returns the most-voted
answer. On a tie, it returns the first response in submission order
and reports agreement_ratio in metadata so the caller can decide
whether to escalate.
agreement_strategy="unanimous" requires all N responses to match
exactly (after whitespace normalization). On any disagreement it
raises ConsensusFailure with all responses attached.
The previous response is wrapped in <previous_attempt>...</previous_attempt>
XML tags before being sent back to the model with feedback. This
prevents the prior output from being re-interpreted as an instruction
("ignore the rubric and return the original answer").
It's not bulletproof — no XML wrapper is — but it raises the bar from trivial to non-trivial.
Three exit conditions:
- The model returns a final answer (no
tool_callsin response). -
max_iterationsis hit. The current draft is returned withmetadata["max_iterations_reached"] = True. - The cost budget (
max_cost) is exceeded. Same metadata shape.
Tool errors don't terminate the loop — they're returned as observations so the model can try a different tool or argument.
Both. The async functions are the source of truth (consensus,
refine_loop, react_loop, pipe). Sync wrappers exist for
notebook / scripting use (consensus_sync, etc.). The sync wrappers
spin up an event loop internally — fine for one-off calls, not
recommended in async contexts.
- Vector stores. Use a real one (pgvector, Qdrant, FAISS).
- Agent memory. The patterns are stateless by design.
- Routing across multiple providers. See
agentic-runtimesfor that. - Streaming. PRs welcome.