cost-xray README

The project's README from github.com/tigerless-labs/cost-xray. As one markdown file: README.md.

cost-xray

See what your AI coding agent actually sends to the API — and what each part costs.

agents capture local only license MIT

Most usage tools read local logs. That shows the total cost of a call or session, but it misses the request-time context assembled before the model is invoked: system prompts, tool schemas, MCP blocks, tool results, cache reads/writes, and previous thinking blocks.

cost-xray captures the actual local API traffic for Claude Code and Codex, then attributes tokens and dollars back to the sources inside the request. It shows not just how much a turn cost, but why it cost that much.

Home — every session by agent · project · session, with token and dollar totals
cost-xray Home: every captured session grouped by agent · project · session, with per-row turns, cache-hit %, tokens, and cost
Drill a session — context-window occupancy (top) and per-source cost, down to each MCP server (bottom)
cost-xray Detail: context-window occupancy this turn (top) and cumulative per-source cost drilled down to each MCP server (bottom)

Requirements

Install

curl -fsSL https://raw.githubusercontent.com/tigerless-labs/cost-xray/master/install.sh | bash

The installer asks which agent(s) to capture — Claude Code, Codex, or both — and prompts even under curl … | bash.

Then open a new terminal and run claude / codex exactly as before — capture is automatic, no flags and no base-URL change. It's forward-only: runs started in that new shell are captured, not past history. Open the live TUI from anywhere:

cx

Capture runs as a background service (auto-start on boot, self-healing, port-adaptive) and doesn't change what your agent does, its results, or its cost — pause anytime with cx stop. See docs/install.md for systemd details, GUI agents (Cursor base-URL setup), manual (no-systemd) mode, and troubleshooting.

Usage

cx                  # open the live cost-xray TUI (from any directory)
cx status           # services' state, live ports, sessions captured
cx stop             # stop monitoring — proxies down; agents run direct (uncaptured)
cx start            # resume monitoring
cx restart          # restart the proxies (after a config change)
cx install          # (re)install — authoritative: installs the chosen agents, removes the rest
cx uninstall        # remove services + shell wrappers (keeps captured data)

cx is the whole CLI and works from any directory. Change port/upstream by editing ~/.cost-xray/env, then cx restart. (./run.sh <cmd> from the repo still works too — cx just calls it for you from anywhere.)

In the TUI, drill from the top down: agent → project → session → category → MCP server → tool → per-turn call → the real output. Every cell carries its cache split (read / write / fresh / output $).

Supported Agents

Agent Status Capture
Claude Code Supported reverse proxy (base-URL override) — no certificate
Codex Supported forward proxy + scoped local CA (self-healing wrapper)

The wire is decoded by a thin per-agent adapter — the only place code forks by agent (docs/architecture.md; per-agent capture + tokenizer notes under docs/providers/). Adding an agent is one small module; anything speaking the Anthropic or OpenAI-Responses wire shape is close to drop-in.

Features

Cost attribution, below the tool

cost-xray traces every token's cost — split into fresh / cache-read / cache-write / output — to the source that caused it, and down to the individual call: the cost of this Read invocation and its output, not a session sum. Everyone else aggregates — a request- or session-level total, at most grouped by tool type ("Read cost $X this session"). As far as we've found, nothing else prices below the tool, call by call.

Window occupancy

What is taking space in the context window right now — system prompt, every tool schema, MCP servers, messages, and generated output — decomposed into source-level rows. Prompt caching makes a stable 40k-token schema block cheap on cache read, but it still crowds out the code and conversation that matter; cost-xray shows you the occupancy, not just the bill.

Unused MCP waste

Configured servers and tools that are injected into every request's prefix but never actually called. They pay their tool-schema overhead on every turn — cost-xray flags the dead weight.

Tokenization accuracy

Claude's tokenizer is private — no official or open-source tokenizer exists — and calling Anthropic's count_tokens API for everything would add load and hit its limits. So for Claude, cost-xray uses an estimator plus proportional calibration: tiktoken sizes each part, the parts it mis-sizes most (thinking, tool schemas) get targeted corrections — pinned with count_tokens when you're logged in, a fixed ratio otherwise — and the rest is scaled so the calibrated total matches the provider's own usage. The total, and therefore the bill, is exact; only the split between sources in the same request is approximate. We benchmark those residuals continuously (CONTRIBUTING.md) and they're small enough for attribution work.

Coming soon: an opt-in exact mode — every part sized by full count_tokens differencing — manually enabled, for users who need maximum per-source precision.

Self-healing capture

The wrappers are per-command and self-healing: if the proxy is down, the wrapper restarts it and routes through; if it can't, the agent runs direct — never broken. Stop monitoring anytime with cx stop (agents then run direct).

Capture everything, store almost nothing

cost-xray keeps the complete raw API traffic — but a long session re-sends its whole history every turn, so the capture is hugely repetitive. We deduplicate it: each unique block (message, schema, tool result) is stored once, with a tiny per-turn delta. Full per-turn bytes rebuild on demand. Disk stays small even across million-token sessions.

Why not just read the logs?

Log-based tools (ccusage, codeburn, and similar) are excellent at local-first session analytics: they read local transcripts, classify turns by tool usage, and price the session by model, day, or task. That answers how much did I spend. cost-xray answers the lower-level question: what bytes did the model actually receive, and which source owns those tokens?

The difference is the data source. Log readers see the transcript after the agent has run — but the system prompt, injected tool schemas, MCP schemas, reminders, and provider-added blocks are assembled at request time and never written to the transcript. In real coding-agent requests, that invisible prefix can be roughly half the context or more. cost-xray reads the raw API request, so it can compute source-level tokens and attribute cost to schemas, MCP servers, tools, and message buckets.

Question Log / usage tools cost-xray wire capture
How much did the session cost? Yes Yes
Which task/tool was active? Yes Yes
System prompt and injected schemas visible? No Yes
How many tokens does each tool schema occupy? No, schemas aren't in logs Yes
Which MCP server is dead weight in the prefix? Estimate Exact
Cache read/write/fresh dollars per source/tool? No, usage is request-level Yes, by span and cache boundary
Live view of the current request window? No Yes

Reading the dashboard

cost-xray surfaces the data; you read the story. A few patterns worth knowing:

Signal you see What it might mean
A 40k-token MCP schema block on every turn A configured server crowding the prefix — drill it to see if any tool was called
Cache-read dollars dwarf fresh input Stable prefix is working; the spend is in what's new each turn
Repeated cache-write on the same source The prefix is being rewritten — something upstream of it changed
Thinking tokens dominate output cost Long reasoning turns; check whether they earned their keep
A tool's schema costs more than the tool is ever used Candidate to drop from the agent's tool-set
Big tool_result rows on Read/Bash Uncapped output bloating the window — cap it at the source

These are starting points, not verdicts. One experimental session looking odd is fine; the same pattern across weeks of work is a config issue.

How it works

cost-xray runs mitmproxy as a local capture hop and keeps all analysis off the request path.

agent ──HTTP──▶ mitmproxy ──HTTPS──▶ model API
                     │
                     └── redacted raw request/response → ~/.cost-xray/sessions/
                                      │
                                      └── materializer → TUI / cost attribution

See docs/install.md for setup and docs/architecture.md for the full pipeline.

Credits

Capture built on mitmproxy; the SSE/redaction approach was adapted from llm-interceptor. Pricing data from LiteLLM. README structure inspired by codeburn.

Built by Tigerless Labs.

License

MIT


© Tigerless · tigerless.ai · tigerless.com

cost-xray (tigerless-labs/cost-xray)

Searching Database…

这是什么?cost-xray 是一个本地工具,捕获 Claude Code 或 Codex 与其提供商之间的原始 API 流量,然后精确拆解每个请求里有什么、每个部分各花多少钱——包括系统提示词、工具 schema、MCP 块、缓存 token 与新鲜 token,等等。
这是像 ccusage 那样的日志仪表盘,还是别的什么?它不同于基于日志的工具:它不是在会话结束后读取本地转录,而是运行一个本地代理来拦截实际的 API 请求,因此能看到系统提示词和注入的工具 schema 这些从不出现在转录中的隐藏部分。
怎么让它跑起来?运行安装器(curl ... | bash,或者如果你已经克隆了仓库就用 ./install.sh);它会询问要捕获哪个智能体——Claude Code、Codex,还是两者都要。之后,只需打开一个新终端并照常运行 claude 或 codex;捕获会作为后台服务自动开始。
需要 API 密钥或更改智能体的配置吗?不需要——无需 API 密钥、无需账户,也无需更改 Claude Code 或 Codex 的任何配置;捕获只是一跳透明的本地代理。你只需要在 macOS 或 Linux 上装好一个受支持的智能体。
它能捕获我已经在运行的会话吗?不能,它只向前捕获——只有安装后在新的终端里启动的会话才会被捕获,不包括过往历史。另外请注意,对 Claude 来说,由于分词器是私有的,按来源拆分的 token 数是估算值(用真实总数校准过),并非精确值。
它能在 Windows 上运行吗?没有说明支持 Windows——列出的受支持平台只有 macOS 和 Linux,Cursor 这类 GUI 智能体需要手动设置 base URL。
当我的 API 密钥和机密经过捕获代理时会怎样?它们在任何内容落盘之前就会被脱敏——Authorization 头、API 密钥、cookie 以及看起来像机密的正文字段都会被剔除。代理只绑定 127.0.0.1,不发送任何遥测数据,一切都在本地保存在 ~/.cost-xray/ 下,直到你删除它。
窗口占用视图显示什么?它拆解当前正在填满模型上下文窗口的内容——系统提示词、每个工具 schema、MCP 服务器、消息和输出——让你看清是什么在挤占空间,即使多亏缓存它们其实并不贵。
它能告诉我某个 MCP 服务器是不是白费的开销吗?可以——它会标记那些 schema 被注入到每个请求前缀却从未被实际调用的已配置 MCP 服务器或工具,揭穿你每一轮都在为其买单的死重。
如果捕获代理崩溃了会怎样?每个智能体的包装器都能自愈:如果代理挂了,它会重启并经由代理路由;如果仍然连不上,智能体就直接运行——捕获绝不会弄坏你的智能体。
为什么不直接用 ccusage 这类基于日志的工具?日志读取器只能在事后看到转录,会遗漏在请求时才组装起来的系统提示词、注入的工具 schema 和 MCP 块——这些可能占上下文的一半甚至更多;cost-xray 读取的则是原始线上流量。
Size
0.4 MB
Stars
5.8K
Updated
CommitOct 15
Age
4mo
Commits · 90 Days