
1. Claude Code 调用链路为什么是个黑盒claude-tap 抓包能解决什么用 Claude Code 写代码的人大概都遇到过这种时刻同一个任务前两轮回答得挺利索第三轮突然开始答非所问或者反复调用同一个工具却拿不到想要的结果。你盯着终端里滚动的输出完全不知道它到底往 API 发了什么、上下文里还剩多少、system prompt 里是不是塞了某条限制。Claude Code 本身是个封闭的 CLI它调用 Anthropic API 的过程不对外暴露你只能看到最终吐出来的文字。这就是 claude-tap 要解决的问题。它是一个本地代理加 Trace 查看器一行命令就能拦截 Claude Code、Codex CLI、Gemini CLI、Cursor CLI 等 AI 编程工具的 API 流量把 system prompt、工具调用、token 用量、请求 diff 全部摊开给你看。GitHub 上已经拿到 1.9k StarMIT 协议最新版本 v0.1.120Python 3.11 环境即可运行。它适合谁三类人最该装一是 Claude Code 重度用户想搞清楚 Agent 为什么在某个任务上突然变差二是做 prompt 工程的人需要看到完整 system prompt 和 token 分项才能优化三是自己做 Agent 开发的相当于一个懂 LLM 语义的调试代理比通用 HTTP 抓包工具好用得多。普通代理只给你看原始 JSONclaude-tap 知道哪段是 system prompt、哪个字段是 token 用量并以开发者友好的方式呈现。我试过在排查一个「Claude 第三轮开始忘事」的问题时用它的 Diff 视图一看发现第三轮请求里之前的工具结果已经被截断了——不是模型变傻是上下文窗口到头了。这种问题靠猜是猜不出来的必须看到请求原文。本文会从零演示装好 claude-tap、抓一次完整的 Claude Code 请求、读懂 system prompt 和 token 明细、定位异常调用最后把 endpoint 改到 TaoToken让调用记录统一可查。全程可复制不需要注册任何账号数据全部留在本机。2. 前置准备安装 claude-tap 并接入 TaoToken 统一查看调用记录claude-tap 的安装非常轻推荐用 uv速度比 pip 快不少。如果你还没装 uv先装 uv 再装 claude-tap# 安装 uv如果已有可跳过 curl -LsSf https://astral.sh/uv/install.sh | sh # 用 uv 安装 claude-tap uv tool install claude-tap # 或者用 pip pip install claude-tap装完之后验证一下版本确认命令可用claude-tap --version # 预期输出类似claude-tap 0.1.120升级也简单一条命令claude-tap update接下来是接入 TaoToken 的部分。TaoToken 提供统一的 API 入口把 Claude Code 的 endpoint 指过去之后你既能在 claude-tap 里看本地抓到的请求也能在 TaoToken 控制台里看到调用记录两边对照着排查会方便很多。TaoToken 的 API 地址是https://taotoken.net/api官网是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content。Claude Code 通过环境变量读取 base URL 和 key所以配置方式就是设置两个环境变量。先在你的 shell 配置文件里加上以 zsh 为例bash 用户改~/.bashrc# 编辑 ~/.zshrc export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEY你的 TaoToken API Key保存后source ~/.zshrc让配置生效。API Key 在 TaoToken 控制台的 API Keys 页面创建地址是https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite。创建时建议给 key 起个能认出来的名字比如claude-code-local方便后面在调用记录里区分。如果你用的是 Claude Code 的 settings 文件而不是环境变量配置长这样。路径是~/.claude/settings.json{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: 你的 TaoToken API Key } }注意这个 JSON 里 key 的名字必须和上面一致ANTHROPIC_BASE_URL不要写成ANTHROPIC_BASE_URI之类的变体Claude Code 只认前者。改完 settings 文件后重启 Claude Code 才会生效。配置好之后正常启动 Claude Code 应该能跑通。但我们要的是抓包所以启动命令从claude换成claude-tap# 原来这样启动 claude # 改成这样其余用法完全不变 claude-tapclaude-tap 会在本地起一个反向代理把 Claude Code 发出的请求先截下来记录再转发到ANTHROPIC_BASE_URL指向的地址。也就是说请求最终打到 TaoToken但中间经过了 claude-tap 的本地代理所以你能在本地看到完整请求内容同时在 TaoToken 控制台看到调用记录。如果你用的是 Codex CLI 或 Gemini CLI启动方式略有不同# Codex CLI claude-tap --tap-client codex # Gemini CLI claude-tap --tap-client gemini # Cursor CLI claude-tap --tap-client cursor对于支持自定义 base URL 的客户端Claude Code、Codexclaude-tap 用反向代理模式对于不支持改地址的客户端Gemini CLI它用正向代理模式通过HTTPS_PROXY环境变量把流量导过来。这些细节 claude-tap 自己处理你只需要记住对应的启动参数。安全方面可以放心常见的鉴权 headerAuthorization、x-api-key 等在写入 trace 之前会自动脱敏所有数据存在本机不上传云端不需要注册任何账号。这一点在团队协作场景里很重要——你可以把生成的 HTML trace 文件直接发给同事对方不需要装任何东西就能审查一次 Agent 运行的完整记录。3. 可复制配置claude-tap 抓包参数与 TaoToken endpoint 设置这一节把配置拆成三块claude-tap 的启动参数、TaoToken 的 endpoint 设置、以及 trace 文件的导出方式。每一块都给可直接复制的片段。先说 claude-tap 的常用启动参数。最基础的用法就是claude-tap它会自动打开浏览器实时查看器。如果你不想开浏览器只要记录加--tap-no-live# 不打开实时浏览器只记录 trace claude-tap --tap-no-live如果你想把 Claude Code 的权限模式一起传进去用--分隔 claude-tap 自己的参数和 Claude Code 的参数# 把 --permission-mode bypassPermissions 传给 Claude Code claude-tap -- --permission-mode bypassPermissions这个--很关键。--前面的参数归 claude-tap后面的归 Claude Code。如果你不加--直接写claude-tap --permission-mode bypassPermissionsclaude-tap 会以为--permission-mode是它自己的参数报未知参数错误。再说 TaoToken 的 endpoint 设置。前面用的是环境变量这里给一份完整的 settings.json 片段路径~/.claude/settings.json你可以直接覆盖{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的TaoTokenKey, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }这里多了一个ANTHROPIC_MODEL用来指定默认模型。TaoToken 支持多个 Claude 模型你可以在模型对话页面确认当前可用的模型 ID地址是https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite。Model ID 必须和平台上的完全一致写错了会返回 404 或 model not found。如果你同时用 Codex CLI它的配置在~/.codex/auth.json格式和 Claude Code 不同{ OPENAI_API_KEY: sk-你的TaoTokenKey, OPENAI_BASE_URL: https://taotoken.net/api }Codex 读的是OPENAI_API_KEY和OPENAI_BASE_URL不要和 Claude Code 的变量名混用。三件套记牢Base URL 是https://taotoken.net/apiKey 是你在控制台创建的Model ID 从模型列表里选。最后是 trace 文件的导出。claude-tap 退出时会自动生成一个自包含的 HTML 文件所有 CSS、JS、数据全部内联零依赖离线可打开。如果你想手动从 trace 文件生成 HTML用claude-tap export# 从 trace 文件生成 HTML claude-tap export .traces/2026-06-21/trace_141557.jsonl -o trace.htmltrace 文件默认存在当前目录的.traces/下按日期分文件夹文件名是trace_时分秒.jsonl。jsonl 格式意味着每行一个 JSON 对象你可以用jq直接过滤# 统计某次 trace 里所有请求的 input token 总量 cat .traces/2026-06-21/trace_141557.jsonl | jq -s map(.usage.input_tokens) | add这条命令会把该 trace 文件里所有请求的 input token 加起来做成本估算时很有用。如果你只想看某一次请求的完整内容用jq按索引取# 取第 3 条请求索引从 0 开始 cat .traces/2026-06-21/trace_141557.jsonl | jq -s .[2]配置到这里就齐了。启动 claude-tap跑一个简单任务然后我们进入验证环节。4. 验证请求抓一次完整 Claude Code 调用并读懂 token 与工具链路现在跑一次完整的验证。打开终端启动 claude-tapclaude-tap浏览器会自动打开一个本地查看器地址通常是http://127.0.0.1:某个端口。先别管浏览器回到终端在 Claude Code 里输入一个简单任务比如帮我读一下当前目录下的 README.md总结成三句话回车之后Claude Code 会发起请求。你会在浏览器查看器里看到一条新的请求记录冒出来。点进去能看到几个关键区块。第一个区块是完整的 system prompt。Claude Code 的 system prompt 通常有好几千个 token里面包含工具使用规范、安全约束、行为指导还有当前工作目录、操作系统、Git 状态等动态注入的信息。这些内容平时完全不可见。有时候 Claude 的行为莫名其妙比如死活不愿意做某件事或者一直用你不期望的格式回复问题往往就藏在 system prompt 的某段限制里。现在能直接看了。第二个区块是 token 用量明细。每次请求的 token 分项都清清楚楚输入、输出、缓存读取、缓存创建。做 prompt 优化时这个数据直接决定你往哪个方向下手。比如你之前以为 Claude Code 的缓存命中率应该很高看了实际数据之后发现命中率远没有预期好才意识到工作目录不一样会导致 system prompt 完全不同自然就没有缓存可以用。第三个区块是工具调用的完整链路。tool_use 请求和对应的 tool_result 全部可查包括工具名称、入参、出参。上面那个读 README 的任务你会看到 Claude 先发起一个Read工具的 tool_use入参是文件路径然后收到 tool_result里面是文件内容最后才生成总结。如果你在排查「为什么 Claude 用了这个工具但没达到预期效果」看一眼完整链路通常就能找到问题。第四个区块是请求 Diff。这是我觉得最实用的功能。多轮对话时相邻两次请求之间的上下文会变化——新消息加进来旧的工具调用结果被追加有时候某些内容会被压缩或截断。Diff 视图会把两次请求之间的差异高亮出来字符级别的一眼就能看清上下文怎么演变。你发现 Claude 在第三轮之后开始忘事用 Diff 一看发现第三轮请求里之前的工具结果已经被截断了那就不是模型变傻是上下文窗口到头了。验证成功的标志有三个浏览器查看器里出现了请求记录token 明细里的 input_tokens 是个合理数字通常几千到几万工具调用链路里能看到 tool_use 和 tool_result 成对出现。如果这三个都满足说明 claude-tap 抓包和 TaoToken endpoint 都配通了。再补一个验证动作确认 TaoToken 那边也收到了调用。打开 TaoToken 控制台的调用记录页面地址是https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite你应该能看到刚才那次请求的记录包括时间、模型、token 用量。本地 claude-tap 和控制台两边对照如果 token 数对得上说明链路完全打通。如果你用的是 Coding Plan 长期跑 Agent 任务建议把 claude-tap 的 trace 保留下来按天归档。Coding Plan 的入口在https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite配合 trace 记录你能清楚看到每个任务的 token 消耗趋势做成本优化时有据可依。5. 常见报错排查401、local proxy failed、reading choices、OAuth 怎么处理抓包过程中最容易撞上几类报错这里按真实错误信息逐个拆。401 Unauthorized。这个最常见通常是 API Key 没配对。先确认ANTHROPIC_API_KEY的值是不是完整的有没有多余空格或换行。如果你把 key 写在 settings.json 里检查 JSON 格式是否合法可以用jq . ~/.claude/settings.json验证。还有一种情况是 key 被撤销了去 TaoToken 控制台的 API Keys 页面确认 key 状态是 active。如果 key 没问题但还是 401检查ANTHROPIC_BASE_URL是不是写成了https://taotoken.net/api/末尾多了斜杠有些客户端对末尾斜杠敏感去掉试试。local proxy failed。这是 claude-tap 自己的报错意思是本地代理起不来。常见原因是端口被占用。claude-tap 默认会选一个可用端口但如果你的环境限制了端口范围可能起不来。解决办法是指定端口claude-tap --tap-port 8899如果指定端口还是失败检查是不是有另一个 claude-tap 进程还在跑用ps aux | grep claude-tap找出来 kill 掉。另外如果你在容器里跑确认容器网络模式允许本地回环。reading choices 相关报错。这个通常出现在 Codex CLI 或兼容 OpenAI 接口的客户端上报错信息类似error reading choices或invalid response format。原因是客户端期望 OpenAI 格式的响应但 endpoint 返回了别的格式。检查你的OPENAI_BASE_URL是不是指向了https://taotoken.net/api以及 Model ID 是不是 OpenAI 兼容的模型。如果你在 Claude Code 里误用了 OpenAI 格式的配置也会出这个错确认 Claude Code 用的是ANTHROPIC_*变量而不是OPENAI_*。OAuth 相关报错。Claude Code 某些版本会走 OAuth 流程报错信息类似OAuth token expired或failed to refresh token。如果你用的是 API Key 模式理论上不该触发 OAuth。检查 settings.json 里有没有残留的 OAuth 配置比如oauthAccount字段有的话删掉。另外确认你没有同时设置ANTHROPIC_API_KEY和 OAuth 相关的环境变量两者冲突时 Claude Code 可能优先走 OAuth 然后失败。trace 文件为空。claude-tap 跑完了但.traces/目录下没有文件或者文件是空的。先确认 claude-tap 确实拦截到了请求——如果 Claude Code 根本没发出请求比如卡在启动阶段自然没有 trace。检查ANTHROPIC_BASE_URL是否指向了 claude-tap 的本地代理地址而不是直接指向 TaoToken。claude-tap 启动时会打印它监听的本地地址确认 Claude Code 的请求打到了这个地址。如果你手动改了ANTHROPIC_BASE_URL绕过 claude-taptrace 就是空的。token 数对不上。本地 claude-tap 看到的 token 数和 TaoToken 控制台显示的对不上。这种情况通常是缓存导致的——claude-tap 记录的是请求发出的原始 token 数TaoToken 控制台可能把缓存读取单独计算。对照时看 input_tokens 和 cache_read_input_tokens 两项加起来应该能对上。如果差得很多检查是不是有多个客户端同时用同一个 key控制台会把所有调用混在一起。排查时有个通用技巧先用claude-tap --tap-no-live跑一次把 trace 存下来然后用jq逐条看请求内容。很多问题看一眼请求原文就清楚了比盯着报错猜快得多。6. 把 endpoint 固定到 TaoToken让每次调用都有记录可查配置和排查都走通之后建议把 endpoint 固定下来别每次手动改环境变量。最稳的方式是写进 settings.json前面给过完整片段这里再强调一次路径和字段名~/.claude/settings.json字段是env.ANTHROPIC_BASE_URL和env.ANTHROPIC_API_KEY。改完重启 Claude Code 生效。固定之后的好处是你每次跑 Claude Code请求都会经过 claude-tap 本地记录一份同时打到 TaoToken 控制台记录一份。两边对照本地看请求细节控制台看整体用量趋势。做 prompt 优化时本地 trace 告诉你 system prompt 哪段太长、哪次工具调用多余控制台告诉你这个月 token 消耗曲线哪个任务最烧钱。如果你还没创建 TaoToken 的 API Key去https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite建一个建议按用途分开建比如claude-code-daily和claude-code-experiment这样在调用记录里能区分不同场景的消耗。接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite里面有各客户端的完整配置示例遇到字段名不确定时去对一下。长期跑 Agent 任务的话Coding Plan 比按量计费更划算入口在https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。配合 claude-tap 的 trace 归档你能清楚看到每个任务的 token 消耗做预算时心里有数。最后给一个实用习惯每次排查完一个诡异问题把对应的 trace HTML 存下来文件名带上问题描述比如trace_上下文截断_20260621.html。攒多了之后你会发现很多问题其实是同一类原因下次再遇到直接翻旧 trace 就行不用重新抓。claude-tap 的 export 命令前面给过claude-tap export trace文件 -o 输出.html生成的 HTML 自包含发给同事对方直接打开就能看不需要装任何东西。