Start here
kaboo is three libraries that snap together. Pick the path that matches what you want to build — you can always add the others later.
flowchart TD
Q{What do you want?}
Q -->|Orchestrate agents| WF
Q -->|Persist & replay runs| RT
Q -->|Render agent activity| RC
Q -->|The whole thing| FS
WF[kaboo-workflows]
RT[kaboo-runtime]
RC[kaboo-react]
FS[Full-stack tutorial]
I want to orchestrate agents
Define models, agents, tools, MCP servers, and multi-agent orchestrations
(delegate / swarm / graph / parallel / nested) in YAML, then serve them as an
AG-UI SSE endpoint. load() returns plain strands objects, so you can also
drive agents in-process. Host backends get a first-class per-run side channel
(forwardedProps → get_forwarded_props()), authorized attachment fetching
(attachments.base_url / authorization), and — with
create_agui_app(session_config_key=...) — runs that submit their own config,
so one process serves many workflows and editing one takes effect on the next turn
without a restart.
→ kaboo-workflows · Getting started
I want to persist and replay runs
Drop a plugin into a CopilotKit runtime (NestJS or any Node framework) that
records the full event log per thread and replays it on reconnect — so a browser
refresh mid-run or post-run restores exactly what happened. Ships an
InMemoryThreadStore and a PostgresThreadStore, and records real thread
ownership (accessPolicy.ownerOf → createdById) so hosts can scope thread
lists per caller without parsing ids. Persisted state is replayed into the next
run, which is what makes conversation history server-owned and a pending
human-in-the-loop approval durable across a restart.
I want to render agent activity
Drop-in React components + hooks that turn the AG-UI run stream into a live, hierarchical activity tree with drill-down and human-in-the-loop, inside a CopilotKit chat.
→ kaboo-react · Concepts
I want the whole stack
Wire all three end-to-end: YAML agents → served over AG-UI → persisted in a CopilotKit runtime → rendered in React, backed by Postgres.
How they fit together
flowchart LR
C[kaboo-react<br/>UI] -->|/api/copilotkit| R[kaboo-runtime<br/>CopilotKit runtime]
R -->|HttpAgent| W[kaboo-workflows<br/>AG-UI SSE]
R <-->|persist / replay| DB[(Postgres)]
W -->|AG-UI events| R
R -->|streamed events| C
Upgrading the stack
kaboo-workflows 0.29, kaboo-runtime 0.8 and kaboo-react 0.12 move onto AG-UI's
own events and state: sub-agents are SUBAGENT_* events, questions are tools
the browser runs, approvals are native interrupts, and a conversation's memory is
server-owned state. Upgrade the three together — older versions don't read
the new events. Each library's upgrade guide lists what to change in your code:
kaboo-workflows ·
kaboo-runtime ·
kaboo-react.
kaboo-react 0.12 needs CopilotKit 1.79.1 or later; move CopilotKit's runtime with it. Until this generation the libraries could be upgraded in any order: kaboo-runtime 0.7 and kaboo-react 0.11 run on CopilotKit 1.78 or later, 0.6 and 0.10 on CopilotKit 1.62 to 1.71.1, and kaboo-workflows 0.27 and 0.28 work with either pair.
Each pattern below runs as a scenario in the lab, and the guides say when to reach for which. What each feature needs, as of kaboo-workflows 0.29, kaboo-runtime 0.8 and kaboo-react 0.12:
| Feature | Needs |
|---|---|
| Sub-agent cards with their own text, tools and results | kaboo-workflows sends SUBAGENT_* events; kaboo-react folds them, live and on replay |
| Questions with Other, and file or data-source requests, from any agent | kaboo-workflows client_tools; kaboo-react useAskUserTool and useRequestTool |
| Approve all, Deny with a reason, expiry that never locks the chat | kaboo-react and kaboo-workflows |
| Sending a message skips what is waiting | kaboo-react and kaboo-workflows |
| "Allow for this chat" and "Always allow" | all three: kaboo-runtime with a grant store remembers, kaboo-workflows offers and honours, kaboo-react shows |
Tools that enforce their own approvals (kaboo_approval) |
all three: kaboo-workflows interrupt.tool_approvals pauses, kaboo-runtime's onDecision hands the decision (with request) to the host for the tool's service, kaboo-react shows "Applies to …" |
| A workspace the agents keep, read-only in the browser | kaboo-workflows state_effects; kaboo-runtime's state keys; kaboo-react useAgentState, useAgentPresence and useLiveToolCalls |
enrich setting server-owned state, compacted runs, replay past aborted runs |
kaboo-runtime |
| A partner's MCP App in the chat | CopilotKit's MCPAppsMiddleware on the agent, with kaboo-runtime 0.8 passing the app's requests through and continuing the run after its tool |
| Responses that stay small on long threads | kaboo-workflows 0.29, which no longer re-sends the transcript |
Tool annotations for skip_read_only |
an MCP server that declares them, relayed by localcore-gateway or AgentCore Gateway |