Trace OpenCode terminal coding sessions, model calls, and tool usage with Arize AX for full observability.OpenCode is an open-source AI coding agent built for the terminal. The Arize Coding Harness Tracing instruments OpenCode sessions with an in-process plugin and exports OpenInference spans to Arize AX. Each turn is captured as a trace, with nested spans for the model call and every tool invocation.
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
Curl installer
macOS / Linux:Local clone
~/.arize/harness/config.json, and copies the tracing plugin to ~/.config/opencode/plugin/arize-tracing.ts. OpenCode auto-discovers plugins from both the plugin/ and plugins/ directories under ~/.config/opencode/, so no opencode.json edit is required.
Configuration
Credentials live in~/.arize/harness/config.json. Environment variables override values in config.json and can be set in your shell profile so they apply to every OpenCode session.
If
ARIZE_TRACE_ENABLED=false is set in your shell environment — for example, inherited from another harness’s configuration — tracing is silently disabled. Set ARIZE_TRACE_ENABLED=true before launching OpenCode, or unset the variable to fall back to the default of true.Redaction controls
EachARIZE_LOG_* flag accepts "true" or "false" and defaults to "true". Set to "false" to opt out per category:
Observe
Once tracing is enabled, OpenCode activity is streamed to Arize AX. Each turn (one user prompt to the assistant’s response) is captured as a trace.Spans Captured
Each turn produces a three-level span tree:
Timestamps come from OpenCode’s own millisecond clocks rather than wall-clock time on the tracing process. The default project name is
opencode unless you set ARIZE_PROJECT_NAME.
How Tracing Works
OpenCode is architecturally different from the other coding agents in this repo. Extensions load as plugins inside OpenCode’s Bun runtime — there is no per-event subprocess. The integration has two pieces:- A TypeScript plugin shim at
~/.config/opencode/plugin/arize-tracing.tsthat listens formessage.updatedandsession.idleevents, pulls the authoritative session snapshot via the OpenCode SDK, and pipes it to the reconciler. - A Python reconciler (
arize-hook-opencode) that walks the snapshot and emits any newTurn,LLM, andTOOLspans, deduplicated by message ID and tool call ID. Spans are sent directly to Arize AX — no separate buffer or collector service is required.
Limitations
Sub-agent andtask sessions trace independently. OpenCode’s built-in task tool spawns sub-agents that each get their own sessionID. In v1, each sub-agent session produces its own independent trace; they are not linked back to the parent session’s trace.