Coding agents
Trace a coding agent
Run evalkit coding install and each Claude Code, Codex, Gemini CLI, Cursor, Windsurf or OpenCode turn arrives in your Environment as a trace.
evalkit coding install points a coding agent you already use at an Environment, with no application code. Each turn then arrives as one trace that holds the main agent, every subagent it launched and everything each of them did.
Install
The evalkit command comes with the SDK: pip install syntropylabs-evalkit, or npx evalkit from the npm package. The quickstart's Coding agents tab shows the command below with your Environment's real key and starts watching for the first trace.
evalkit coding install --vendor claude-code --key tk_live_...
evalkit coding install --vendor codex --key tk_live_...
evalkit coding install --vendor gemini-cli --key tk_live_... --capture full
evalkit coding install --vendor cursor --key tk_live_... --scope project
evalkit coding install --vendor windsurf --key tk_live_...
evalkit coding install --vendor opencode --key tk_live_...
evalkit coding status
evalkit coding doctor
evalkit coding uninstall --vendor codex| Flag | Meaning |
|---|---|
--vendor | claude-code, codex, gemini-cli, cursor, windsurf or opencode |
--key | the Environment key; optional once a key is stored or EVALKIT_API_KEY is set |
--endpoint | the OTLP base; default https://api.syntropylabs.ai/v1/otlp |
--tenant | the tenant id doctor reads traces back with, needed only against an older receiver |
--scope user|project | project writes into the current directory's config, not your home directory |
--capture minimal|full | whether prompt, reply and tool text leave your machine; default minimal, or the level an earlier install stored |
--no-traces | send log events only; spans are on by default wherever the vendor has them |
--no-subagents | Claude Code only: write no hooks at all |
--dry-run | show what would be written |
--managed | Claude Code only: print a managed-settings snippet and write nothing |
The key and endpoint are stored once in ~/.config/evalkit/config.env, and ~/.config/evalkit/state.json records exactly which keys, blocks and files the installer wrote. Both files are mode 0600. uninstall removes only what was written and restores any value it replaced, including a key you had already set to the same value. The CLI never prints the key in full.
Both CLIs write byte-identical files for the same flags, except that only the Python CLI installs the Codex reply hooks and has backfill.
Then start a session
Start a new agent session, because a running one keeps its old configuration. Give the agent one task. Within a few seconds the quickstart shows "First Claude Code session received" (or your vendor's name), the operation, span count and model, and View trace. Home's checklist ticks Install SDK and Receive first trace.
In Traces, the Coding agent facet separates agent sessions from application traffic, and a turn that launched subagents has an "N subagents" chip. Sessions lists the turns of one session in order. Continue in Reading a turn.
How the data flows
Claude Code, Codex and Gemini CLI export OpenTelemetry themselves. The installer only points their exporter at the receiver: POST …/v1/otlp/v1/traces|logs|metrics, JSON or protobuf, with Authorization: Bearer <environment key>.
Cursor and Windsurf have no telemetry export. The installer registers evalkit coding hook entries in their hooks file, and the hook builds the spans itself with deterministic ids. OpenCode gets a plugin file that does the same.
One turn is one trace. Content and usage records arrive separately, and the receiver merges each onto the span it describes, so a turn can be readable before its dollars arrive. Metrics are accepted and dropped, and every number shown is derived from spans. What each vendor exports has the per-vendor table.