Skip to content

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.

→ kaboo-runtime · Concepts

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.

→ Full-stack tutorial

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