showcase/shell-docs/src/content/docs/troubleshooting/debug-mode.mdx
When your agent isn't behaving as expected — events are missing, state isn't updating, or tool calls aren't executing — you need visibility into what's happening in the event pipeline. Debug mode gives you that visibility with detailed logging on both the server (runtime) and client (React) side.
Enable it to see:
Pass debug: true to the CopilotRuntime constructor:
const runtime = new CopilotRuntime({
agents: {
// your agents
},
debug: true, // [!code highlight]
});
This produces structured Pino logs (formatted by pino-pretty) with a copilotkit-debug component label:
[14:32:01.123] DEBUG (copilotkit-debug): Agent run started
agentName: "default"
threadId: "abc-123"
[14:32:01.130] DEBUG (copilotkit-debug): SSE stream opened
[14:32:01.145] DEBUG (copilotkit-debug): Event emitted
type: "TEXT_MESSAGE_START"
messageId: "msg-1"
role: "assistant"
[14:32:01.200] DEBUG (copilotkit-debug): Event emitted
type: "TEXT_MESSAGE_CONTENT"
deltaLength: 42
[14:32:01.250] DEBUG (copilotkit-debug): Event emitted
type: "TEXT_MESSAGE_END"
[14:32:01.260] DEBUG (copilotkit-debug): Event emitted
type: "RUN_FINISHED"
[14:32:01.261] DEBUG (copilotkit-debug): SSE stream completed
eventCount: 4
loggedEventCount: 4
Pass debug={true} to the <CopilotKit> provider:
<CopilotKit
runtimeUrl="/api/copilotkit"
debug={true} // [!code highlight]
>
<YourApp />
</CopilotKit>
This forwards the debug configuration to the AG-UI client transport layer (transformChunks), which may produce transport-level debug output depending on the AG-UI library version. Note that the richest debug logging comes from the server-side CopilotRuntime — enable debug: true there for full structured Pino logs of every AG-UI event.
Instead of true, you can pass an object for fine-grained control over what gets logged:
debug: {
events: true, // Log every event emitted/received
lifecycle: true, // Log request/run lifecycle (start, finish, error)
verbose: false, // Log full payloads instead of summaries
}
This works the same way on both the server and client.
| Input | events | lifecycle | verbose |
|---|---|---|---|
debug: true | true | true | false |
debug: {} | true | true | false |
debug: { events: false } | false | true | false |
When debug is a boolean (true), events and lifecycle logging are enabled but verbose mode is off by default (to avoid leaking PII in logs). To get full event payloads, explicitly opt in with debug: { verbose: true }.
Log only lifecycle events (no per-event logs):
debug: { events: false, lifecycle: true }
Log events with full payloads but skip lifecycle:
debug: { events: true, lifecycle: false, verbose: true }
Enable debug on the server side for the most detailed visibility:
Event emitted — are the expected events being sent?SSE stream completed shows the expected eventCount.Enable server-side debug and look for:
TOOL_CALL_START events being emitted on the serverTOOL_CALL_ARGS and TOOL_CALL_END events following correctlyLook for STATE_SNAPSHOT or STATE_DELTA events in server logs. If they appear on the server but not in the browser's SSE stream, there may be a connection issue.
| Category | Log Message | Description |
|---|---|---|
| Lifecycle | Agent run started | An agent run was initiated, includes agent name and thread ID |
| Lifecycle | SSE stream opened | The SSE response stream was created |
| Lifecycle | SSE stream completed | The stream finished, includes total event count |
| Lifecycle | SSE stream errored | The stream encountered an error |
| Events | Event emitted | Each AG-UI event as it's written to the stream |
In summary mode (verbose off), event logs include key identifiers like messageId, toolCallId, toolCallName, role, and content lengths instead of full payloads.
On the client, the debug configuration is passed through to the AG-UI transport layer. The AG-UI client library controls what (if any) debug output is produced. CopilotKit itself does not emit console.debug calls — the debug flag configures the underlying AG-UI event pipeline.