Spaces:
Sleeping
Sleeping
| # @kayba_ai/openclaw-tracing | |
| OpenClaw plugin that captures every agent turn β user message, full LLM prompt and response (including thinking blocks), tool calls, final reply β and ships it as a structured Kayba trace. | |
| Pairs with [@kayba_ai/tracing](../typescript/). Whatever signals a tool-level plugin (e.g. a trader plugin) is already emitting via `kayba.trace()` will land in the same Kayba folder and can be cross-referenced with these turn-level traces by `runId`. | |
| ## What you get | |
| - One trace per agent turn, named `agent.turn` | |
| - Child span `llm.call` capturing the full LLM input/output for the turn | |
| - Span attributes: `openclaw.runId`, `openclaw.sessionId`, `openclaw.agentId`, `openclaw.channelId`, `openclaw.senderId` | |
| - Token usage, stop reason, and the assistant's full content blocks (thinking + text + tool calls) on the `llm.call` span output | |
| - Compatible with ACE β the captured shape contains everything `OpenClawToTraceStep` needs | |
| ## Install | |
| ```bash | |
| openclaw plugins install @kayba_ai/openclaw-tracing | |
| ``` | |
| Then add the config block to `~/.openclaw/openclaw.json`. The `hooks.allowConversationAccess` flag is required because conversation-content hooks are gated for non-bundled plugins: | |
| ```json | |
| { | |
| "plugins": { | |
| "allow": ["kayba-tracing"], | |
| "entries": { | |
| "kayba-tracing": { | |
| "enabled": true, | |
| "hooks": { | |
| "allowConversationAccess": true | |
| }, | |
| "config": { | |
| "apiKey": "kayba_ak_...", | |
| "folder": "main" | |
| } | |
| } | |
| } | |
| } | |
| } | |
| ``` | |
| Restart the gateway. From this point on, every agent turn produces one trace at https://use.kayba.ai/traces/v2. | |
| ## Config | |
| | Key | Type | Default | Notes | | |
| |---|---|---|---| | |
| | `apiKey` | string | (required) | From https://use.kayba.ai/settings/api-keys | | |
| | `baseUrl` | string | `https://use.kayba.ai` | For self-hosted Kayba | | |
| | `folder` | string | `null` | Dashboard folder for grouping | | |
| | `captureSystemPrompt` | boolean | `true` | Include the (potentially large) system prompt on each `llm.call` span | | |
| | `captureHistory` | boolean | `true` | Include `historyMessages` on each `llm.call` span (large for long sessions) | | |
| | `maxAttributeBytes` | integer | `65536` | Per-attribute truncation cap | | |
| ## How it works | |
| The plugin subscribes to OpenClaw's typed hooks via `api.on(...)`: | |
| | Hook | Used for | | |
| |---|---| | |
| | `message_received` | open turn, capture user message + sender | | |
| | `before_agent_start` | bind `runId` | | |
| | `llm_input` | capture prompt, system prompt, history, model, provider | | |
| | `llm_output` | capture response, assistant content blocks, usage | | |
| | `agent_end` | finalize and emit the trace | | |
| Race protection: `agent_end` and `llm_output` can fire in either order. The plugin defers finalize by `~250ms` after `agent_end` to absorb a late `llm_output`, and falls through immediately if both have already arrived. | |
| Stale-turn safety: turn state older than 5 minutes is evicted. A turn that never reaches `agent_end` (crashed mid-loop) is dropped silently β the trader plugin's per-tool spans still land independently. | |
| ## Why a separate plugin and not part of `@kayba_ai/tracing` | |
| OpenClaw's plugin loader requires a manifest (`openclaw.plugin.json` + `package.json` with `openclaw.extensions[]`) and must be installed via `openclaw plugins install`. Bundling that into the generic SDK would force the OpenClaw runtime as a dependency on every SDK consumer, including the trader plugin which uses the SDK directly without the OpenClaw plugin contract. | |
| ## License | |
| MIT | |