☰
狂揽 1.9k Star!用 claude-tap 看清 Claude Code 每次 API 流量背后到底发生了什么
2026/10/2 6:19:53 网站建设 项目流程

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 Star,MIT 协议,最新版本 v0.1.120,Python 3.11+ 环境即可运行。

它适合谁?三类人最该装:一是 Claude Code 重度用户,想搞清楚 Agent 为什么在某个任务上突然变差;二是做 prompt 工程的人,需要看到完整 system prompt 和 token 分项才能优化;三是自己做 Agent 开发的,相当于一个懂 LLM 语义的调试代理,比通用 HTTP 抓包工具好用得多。普通代理只给你看原始 JSON,claude-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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。

Claude Code 通过环境变量读取 base URL 和 key,所以配置方式就是设置两个环境变量。先在你的 shell 配置文件里加上(以 zsh 为例,bash 用户改~/.bashrc):

# 编辑 ~/.zshrc export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="你的 TaoToken API Key"

保存后source ~/.zshrc让配置生效。API Key 在 TaoToken 控制台的 API Keys 页面创建,地址是https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite。创建时建议给 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-tap

claude-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、Codex),claude-tap 用反向代理模式;对于不支持改地址的客户端(Gemini CLI),它用正向代理模式,通过HTTPS_PROXY环境变量把流量导过来。这些细节 claude-tap 自己处理,你只需要记住对应的启动参数。

安全方面可以放心:常见的鉴权 header(Authorization、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 bypassPermissions,claude-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_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite。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/api,Key 是你在控制台创建的,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.html

trace 文件默认存在当前目录的.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-tap:

claude-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_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite,你应该能看到刚才那次请求的记录,包括时间、模型、token 用量。本地 claude-tap 和控制台两边对照,如果 token 数对得上,说明链路完全打通。

如果你用的是 Coding Plan 长期跑 Agent 任务,建议把 claude-tap 的 trace 保留下来,按天归档。Coding Plan 的入口在https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite,配合 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-tap,trace 就是空的。

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_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite建一个,建议按用途分开建,比如claude-code-daily和claude-code-experiment,这样在调用记录里能区分不同场景的消耗。接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite,里面有各客户端的完整配置示例,遇到字段名不确定时去对一下。

长期跑 Agent 任务的话,Coding Plan 比按量计费更划算,入口在https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite。配合 claude-tap 的 trace 归档,你能清楚看到每个任务的 token 消耗,做预算时心里有数。

最后给一个实用习惯:每次排查完一个诡异问题,把对应的 trace HTML 存下来,文件名带上问题描述,比如trace_上下文截断_20260621.html。攒多了之后你会发现,很多问题其实是同一类原因,下次再遇到直接翻旧 trace 就行,不用重新抓。claude-tap 的 export 命令前面给过,claude-tap export <trace文件> -o <输出.html>,生成的 HTML 自包含,发给同事对方直接打开就能看,不需要装任何东西。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询