Documentation Index
Fetch the complete documentation index at: https://arize-ax.mintlify.dev/docs/llms.txt
Use this file to discover all available pages before exploring further.
Trace Claude Code CLI sessions, tool usage, and token costs with Arize AX for full observability.Claude Code is Anthropic’s agentic coding tool that lives in your terminal. The Arize Coding Harness Tracing instruments sessions using 16 hook events and sends OpenInference spans to Arize AX or Phoenix. The plugin works with both the Claude Code CLI and the Claude Agent SDK.
Launch Arize AX
To get started, sign up for a free Arize AX account and get your Space ID and API Key:- Log in at app.arize.com
- Click Settings and copy the Space ID
- Open the API Keys tab and create or copy an API key
Install
Claude Code Marketplace
~/.claude/settings.json under env (see Configuration).
Curl installer
macOS / Linux:~/.arize/harness/config.yaml, and registers the hooks in ~/.claude/settings.json.
Local clone
Configuration
The curl and local installers write credentials to~/.arize/harness/config.yaml. Environment variables in ~/.claude/settings.json take precedence and are required for the marketplace install path.
Phoenix (self-hosted)
Arize AX (cloud)
Redaction controls
EachARIZE_LOG_* flag accepts "true" or "false" and defaults to "true". Set to "false" to opt out per category:
| Flag | Redacts |
|---|---|
ARIZE_LOG_PROMPTS | User prompt and assistant response text |
ARIZE_LOG_TOOL_DETAILS | Tool names and arguments |
ARIZE_LOG_TOOL_CONTENT | Tool call output content |
Observe
Now that you have tracing set up, all Claude Code sessions stream to your Arize AX account for observability and evaluation. You’ll see:- Turn traces — each conversation turn (user prompt → assistant response)
- LLM spans — Claude’s responses with model info and token counts
- Tool spans — nested spans for each tool call with inputs, outputs, and duration
- Subagent spans — activity from any subagents Claude spawns
- Session grouping — all turns from the same session grouped by
session_id


Hooks Captured
| Hook | Span Kind | Description |
|---|---|---|
SessionStart | CHAIN | Session initialized, trace/tool counters reset |
UserPromptSubmit | CHAIN | User prompt captured (also lazy-inits session for SDK) |
UserPromptExpansion | — | Stashes slash command metadata to attach to the next turn span |
PreToolUse | TOOL | Tool invocation started, records tool name and input |
PostToolUse | TOOL | Tool invocation completed, records output and duration |
PostToolUseFailure | TOOL | Tool invocation failed, records error attributes |
Stop | LLM | Model response completed with input/output values |
StopFailure | LLM | Turn failed before completion, emits a span with error.type / error.message |
SubagentStart | — | Records subagent start time and prompt keyed by agent_id |
SubagentStop | CHAIN | Subagent response completed |
PreCompact | — | Records compaction start time and trigger |
PostCompact | CHAIN | Compaction completed, emits a span when it fires inside a turn |
PermissionRequest | CHAIN | Permission prompt for tool use |
PermissionDenied | CHAIN | Auto-mode tool denial recorded inside the current turn |
Notification | CHAIN | System notification event |
SessionEnd | CHAIN | Session teardown, state file cleanup |
— don’t emit their own span — they stash state that an adjacent hook (Turn, tool, or compaction) attaches when it fires.
Agent SDK Setup
The tracing plugin also works with the Claude Agent SDK in both Python and TypeScript. The SDK loads the plugin locally — no marketplace install is required — but the setup must be done in your application code before the SDK session starts, so the agent cannot configure it at runtime.You must use
ClaudeSDKClient. The standalone query() function does not support hooks, so tracing will not work with it.1. Locate the plugin
The plugin path depends on how you installed the harness:-
Installed via the Claude Code CLI marketplace: the plugin is cached at
~/.claude/plugins/cache/coding-harness-tracing/claude-code-tracing/1.0.0. -
Installed via the curl or local installer: the plugin lives at
~/.arize/harness/tracing/claude_code. -
Not installed: clone the repo into your project — the plugin path is
./coding-harness-tracing/claude-code-tracing:
2. Create a settings file
The SDK spawns a Claude Code subprocess that does not inherit your shell environment, so tracing env vars must be passed through a settings file referenced fromClaudeAgentOptions:
PHOENIX_ENDPOINT (and optional PHOENIX_API_KEY). The same ARIZE_LOG_* redaction flags from Configuration apply here.
3. Wire the plugin into your app
Pass the plugin path and settings file toClaudeSDKClient:
- Python
- TypeScript
ClaudeAgentOptions (plugin path + setting_sources=["user"] so user-level Claude settings are honored):
Validate
Add"ARIZE_DRY_RUN": "true" to your settings file to verify hooks fire without sending data, and tail ~/.arize/harness/logs/claude-code.log to confirm activity.
Hook parity
| SDK | Coverage |
|---|---|
| TypeScript | Full parity — all 16 hooks fire, including SessionStart, Notification, PermissionRequest, and SessionEnd. |
| Python | SessionStart, SessionEnd, Notification, and PermissionRequest are not available. Session state is lazily initialized on the first UserPromptSubmit; core tracing (LLM, tool, and subagent spans) still works fully. |