copilotkit-agui

Use when building custom agent backends, implementing the AG-UI protocol, debugging streaming issues, or understanding how agents communicate with frontends. Covers event types, SSE transport, AbstractAgent/HttpAgent patterns, state synchronization, tool calls, and human-in-the-loop flows.

Skill file

Preview skill file
---
name: copilotkit-agui
description: "Use when building custom agent backends, implementing the AG-UI protocol, debugging streaming issues, or understanding how agents communicate with frontends. Covers event types, SSE transport, AbstractAgent/HttpAgent patterns, state synchronization, tool calls, and human-in-the-loop flows."
version: 1.0.0
---

# AG-UI Protocol Skill

## Overview

AG-UI (Agent-User Interaction) is CopilotKit's open event-based protocol for agent-to-UI communication. All agent-frontend interaction flows through typed events streamed over SSE (Server-Sent Events) or binary protobuf transport. Agents implement `AbstractAgent.run()` returning an RxJS `Observable<BaseEvent>`, and the client SDK handles event application, state management, and message history.

## When to Use

- Building a custom agent backend that needs to speak AG-UI
- Implementing `AbstractAgent.run()` for a new framework integration
- Debugging why events aren't reaching the frontend or arriving malformed
- Understanding event ordering (lifecycle, text, tool calls, state)
- Working with state synchronization (snapshots vs JSON Patch deltas)
- Implementing human-in-the-loop interrupt/resume flows
- Troubleshooting SSE streaming or encoding issues

## When NOT to Use

- For CopilotKit React hooks and frontend components, use `copilotkit-develop`
- For CopilotKit runtime setup and configuration, use `copilotkit-setup`
- For framework-specific integration guides (LangGraph, Mastra, CrewAI), use `copilotkit-integrations`

## Quick Reference

### Event Families

| Family     | Events                                                                                                 | Purpose                     |
| ---------- | ------------------------------------------------------------------------------------------------------ | --------------------------- |
| Lifecycle  | `RUN_STARTED`, `RUN_FINISHED`, `RUN_ERROR`, `STEP_STARTED`, `STEP_FINISHED`                            | Run boundaries and progress |
| Text       | `TEXT_MESSAGE_START`, `TEXT_MESSAGE_CONTENT`, `TEXT_MESSAGE_END`                                       | Streaming text messages     |
| Tool Calls | `TOOL_CALL_START`, `TOOL_CALL_ARGS`, `TOOL_CALL_END`, `TOOL_CALL_RESULT`                               | Agent tool invocations      |
| State      | `STATE_SNAPSHOT`, `STATE_DELTA`, `MESSAGES_SNAPSHOT`                                                   | State synchronization       |
| Reasoning  | `REASONING_START`, `REASONING_MESSAGE_START/CONTENT/END`, `REASONING_END`, `REASONING_ENCRYPTED_VALUE` | Chain-of-thought visibility |
| Activity   | `ACTIVITY_SNAPSHOT`, `ACTIVITY_DELTA`                                                                  | Structured progress updates |
| Custom     | `RAW`, `CUSTOM`                                                                                        | Extension points            |

### Convenience Chunk Events

`TEXT_MESSAGE_CHUNK` and `TOOL_CALL_CHUNK` auto-expand into Start/Content/End triads via the client's `transformChunks` pipeline. Use these for simpler backend implementations.

### SSE Wire Format

Each event is a JSON object sent as an SSE data line:

```
data: {"type":"RUN_STARTED","threadId":"t1","runId":"r1"}\n\n
data: {"type":"TEXT_MESSAGE_START","messageId":"m1","role":"assistant"}\n\n
data: {"type":"TEXT_MESSAGE_CONTENT","messageId":"m1","delta":"Hello"}\n\n
data: {"type":"TEXT_MESSAGE_END","messageId":"m1"}\n\n
data: {"type":"RUN_FINISHED","threadId":"t1","runId":"r1"}\n\n
```

### Packages

| Package          | npm                                                     | Purpose              |
| ---------------- | ------------------------------------------------------- | -------------------- |
| `@ag-ui/core`    | Events, types, schemas                                  | Protocol definition  |
| `@ag-ui/client`  | AbstractAgent, HttpAgent, middleware, event application | Client SDK           |
| `@ag-ui/encoder` | EventEncoder (SSE + protobuf)                           | Server-side encoding |

## Workflow: Building an AG-UI Backend

1. **Define your endpoint** -- Accept POST with `RunAgentInput` body, respond with `text/event-stream`
2. **Parse input** -- Extract `threadId`, `runId`, `messages`, `tools`, `state`, `context` from the request body
3. **Emit events in order** -- `RUN_STARTED` first, then content events, then `RUN_FINISHED` or `RUN_ERROR`
4. **Encode as SSE** -- Use `@ag-ui/encoder`'s `EventEncoder.encode()` or manually write `data: JSON\n\n`
5. **Handle tool results** -- Client sends `TOOL_CALL_RESULT` back; agent processes and continues

See `references/building-agents.md` for a complete working example.

## Key Protocol Rules

- Every run MUST start with `RUN_STARTED` and end with `RUN_FINISHED` or `RUN_ERROR`
- `TEXT_MESSAGE_CONTENT.delta` must be non-empty
- Tool call events are linked by `toolCallId`
- `STATE_DELTA` uses RFC 6902 JSON Patch operations
- Multiple sequential runs are supported -- each must complete before the next starts
- Messages accumulate across runs; state continues unless reset by `STATE_SNAPSHOT`

## References

- `references/protocol-spec.md` -- Complete event type reference with schemas and examples
- `references/building-agents.md` -- Step-by-step guide to building AG-UI backends
- `references/event-flow-diagrams.md` -- ASCII sequence diagrams for common flows
- `references/client-sdk.md` -- @ag-ui/client API reference

Source

Creator's repository · copilotkit/copilotkit

View on GitHub

Security

Security checks in progress
Results will appear here once audits complete
What this skill can do
Reads your filesConnects to the internetRuns code on your machine
Checked by 3 independent security firms
Does it try to trick the AI?Not yet checkedPending · Gen Agent Trust Hub
Does it sneak in hidden code?Not yet checkedPending · Socket
Does it have known bugs?Not yet checkedPending · Snyk