Skip to main content
khora ships first-party adapters for the major agentic-framework ecosystems. Each adapter lives in its own optional extra so importing khora never drags in a framework you don’t use, and the adapter module itself imports the framework lazily. The top-level package load is free even with all five extras installed. Every adapter satisfies one of two runtime-checkable Protocols in khora.integrations.protocol (MemoryAdapter or RetrieverAdapter) and registers via the khora.integrations entry-point group so downstream tooling can discover what is installed.

Adapters

All six adapters share the same khora primitives (Khora.remember, Khora.recall, Khora.forget, and Khora.submit_batch), so a single khora instance can back several frameworks at once. Each adapter documents its namespace-resolution rule (typically a UUID5 derived from framework-native identifiers) so two instances pointed at the same khora deployment see the same memory without a shared registry.
crewai and google-adk cannot be installed together. The crewai extra transitively pins opentelemetry-api<1.35 and the google-adk extra pins >=1.36. They’re declared mutually exclusive in [tool.uv].conflicts, so uv sync --all-extras is rejected. Pick one:
The other three adapters (langgraph, openai-agents, llamaindex) have no transitive conflicts and install cleanly alongside either combo. If you need both crewai and google-adk in the same process, use two separate virtual environments.
Hermes has no [hermes] extra. hermes-agent==0.13.0 exact-pins requests==2.33.0, which clashes with khora’s requests>=2.33.1 floor (CVE-2026-25645), so the [hermes] extra was dropped. Install hermes-agent yourself. The adapter still resolves at runtime when both packages are importable. See the Hermes adapter page for the full posture.

Stability

The OpenAI Agents adapter is tagged experimental while upstream remains pre-1.0 (17 releases in 7 months leading up to v0.17). The CrewAI, LangGraph, Google ADK, LlamaIndex, and Hermes adapters are tagged experimental for now and will be promoted to stable once a full khora minor ships without a breaking change to the adapter surface. See each adapter’s page for its specific framework version pin and upstream compatibility notes.

Writing your own adapter

The integration foundation is intentionally small. To add a new framework adapter:
  • Implement khora.integrations.protocol.MemoryAdapter (write side) or RetrieverAdapter (read side), or both. Both are runtime-checkable Protocols.
  • Import the target framework lazily inside the adapter module. Top-level imports of optional frameworks are linted out by tools/check_optional_imports.py in CI.
  • Map framework-native identifiers to khora namespaces deterministically (UUID5 over an adapter-scoped salt is the established pattern).
  • Register the adapter under the khora.integrations entry-point group in pyproject.toml, or call khora.integrations.register() for test-only registration.
  • Use khora.integrations._sync.run_sync if you need to bridge a sync framework callback into khora’s async API. It runs the coroutine on a dedicated daemon-thread loop and blocks the caller, so don’t call it from inside an async def (that stalls the calling event loop while it waits on the daemon loop).
See any of the six shipped adapters for a working template. They range from ~150 LOC (CrewAI) to ~600 LOC (OpenAI Agents) and exercise every part of the foundation.