Build

Framework matrix

Same control plane, many runners. The plane never assumes LangGraph — adapters share a generic worker loop and speak Runner Protocol.

What it is

Python LangGraph + TypeScript LangGraph.js are first-class. CrewAI, LlamaIndex, AutoGen, and plain LangChain ship as thin adapters under python/adapters/.

Why it is here

“Framework-agnostic” only counts if dispatch, cancel, HITL, and connectors work the same way for every runner kind — with honest gaps called out.

Support matrix

Capability LangGraph (Py) LangGraph.js CrewAI LlamaIndex AutoGen LangChain
Dispatch via planeYesYesYesYesYesYes
Cancel (WatchCancels)YesYes*YesYesYesYes
HITL interrupt / resumeYesYes*LimitedLimitedLimitedLimited
Opaque checkpoint proxyYesYesYes†YesYes†Yes†
Direct Postgres saverYesYes
True --concurrency NYesYesSerialized per graphYesSerialized per graphYes
Isolated adapter venvYesYesYesShared
E2E in CI matrixYesHappy pathHappy pathHappy pathHappy pathYes

* TypeScript cancel/HITL verified live; matrix CI scenarios today lean on LangGraph-Python example agents. † CrewAI / AutoGen / LangChain restore a message transcript on the plane and fold prior turns into the next invoke (not a full framework-native memory graph). LlamaIndex restores chat_history natively. LangGraph keeps its own saver (direct Postgres or HTTP proxy). checkpoint_ref time-travel remains LangGraph-only.

How to implement

  1. LangGraph — runkite-runner (Py) or TS runner with langgraph.json.
  2. Adapters — install each adapter’s deps (isolated venv for CrewAI / LI / AutoGen), then PYTHONPATH=python:python/adapters and python -m crewai_adapter (etc.).
  3. Clients keep the same Agent Protocol shape: last human message in, AI message out.
  4. See Agents for register/run; Checkpoints for durable state (LangGraph + adapters).

In the product

Admin → Agents — registered ids across runner kinds
Runkite Admin Agents list

What to expect

Reference: docs/runners.md · Protocols