1. 多 AI 工具监控为什么总对不上账
如果你同时用 Claude Code 写代码、用 OpenAI API 跑业务、又在内网架了一套 LiteLLM Proxy 做统一网关,大概率遇到过这种场景:月底想统计一下这个月 AI 花了多少钱,结果三个地方的数据各说各话。Claude Code 那边看不到 token 消耗,OpenAI 后台只有按天聚合的账单,LiteLLM 的/metrics里又是一堆 Prometheus 格式的原始指标,想拼成一张统一的成本报表,光字段对齐就要折腾半天。
这个问题的根子在于:不同 AI 工具的监控数据格式、采集方式、上报通道完全不一样。OpenAI 走的是 Usage API 拉取模式,LiteLLM 暴露的是 Prometheus 指标端点,Claude Code 这类客户端工具则更适合用 OTLP 推送。三套机制、三种数据模型,如果没有一个统一的接入层,你只能写三份采集脚本,维护三套 Key,最后还要自己写聚合逻辑。
我试过直接用各自的 SDK 分别对接,代码量不算大,但 Key 管理很快就乱了——OpenAI 的 Key、Anthropic 的 Key、LiteLLM 的认证 Token 散落在不同配置文件里,轮换一次要改好几个地方。更麻烦的是,当你想加一个新模型或者换一个供应商时,采集端要跟着改,监控端也要跟着改。
TaoToken 在这里扮演的角色,是一个统一的 API 通道和 Key 管理层。它本身不替代你的监控系统(Prometheus、Grafana 该用还用),而是把 Claude Code、OpenAI、LiteLLM 这些采集对象的接入方式统一到一套 Base URL + Key + Model ID 的配置模型上。你只需要在 TaoToken 控制台生成一个 Key,然后在各个工具的配置里把请求指向 TaoToken 的 API 地址,采集和监控的数据流就都经过同一个通道,字段格式、认证方式、上报路径自然就统一了。
这篇文章面向的是已经在用或者准备用多 AI 工具做开发的工程师,尤其是需要做成本追踪、Token 统计、错误率监控的团队。接下来我会按实际配置的顺序,从 TaoToken 的前置准备开始,一步步给出 Claude Code 的settings.json、LiteLLM 的config.toml、CC Switch 的配置片段,然后演示怎么验证采集数据是否正常上报,最后把常见的报错和排查方法列出来。你跟着做一遍,应该能在一小时内把三套工具的监控接入跑通。
2. TaoToken 前置准备:Key、Base URL 与模型 ID 三件套
在配置任何采集器之前,先把 TaoToken 这边的三件套准备好:API Key、Base URL、Model ID。这三个东西是后面所有配置的基础,缺一个都跑不通。
2.1 获取 API Key
打开 TaoToken 控制台,进入 API Keys 页面。如果你还没有账号,先注册一个。创建 Key 的时候建议按用途命名,比如claude-code-monitor、litellm-proxy、openai-collector,这样后面排查问题时能一眼看出是哪个工具在用。
创建完成后,Key 只会显示一次,复制下来存到安全的地方。不要硬编码到代码或配置文件里,后面我会用环境变量的方式引用。
注意:TaoToken 的 Key 是统一凭证,同一个 Key 可以用于 Claude Code、OpenAI 兼容接口、LiteLLM 等多种接入方式。但为了监控数据能按来源区分,建议不同工具用不同的 Key,这样在指标里可以通过 Key 维度做更细的归因。
2.2 确认 Base URL
TaoToken 的 API 地址是:
https://taotoken.net/api这个地址是 OpenAI 兼容格式的,也就是说任何支持自定义 Base URL 的 OpenAI SDK 或工具,都可以直接指向这里。Claude Code 走的是 Anthropic 格式,TaoToken 也做了兼容,具体配置在下一节展开。
2.3 选择 Model ID
TaoToken 支持的主流模型包括 GPT-4o、GPT-4o-mini、Claude 3.5 Sonnet、Claude 3 Opus 等。在控制台的模型列表页面可以看到当前可用的 Model ID。配置时要用准确的 Model ID,比如gpt-4o、claude-3-5-sonnet-20241022,不要用别名或简写,否则请求会返回 404。
如果你不确定某个模型是否可用,可以直接在模型对话页面测试一下。输入 Model ID 发一条消息,能正常返回就说明配置没问题。
2.4 环境变量准备
把三件套写入环境变量,后面所有配置文件都通过${VAR}的方式引用:
# ~/.bashrc 或 ~/.zshrc export TAOTOKEN_API_KEY="sk-你的TaoToken Key" export TAOTOKEN_BASE_URL="https://taotoken.net/api" export TAOTOKEN_MODEL_ID="gpt-4o"如果你用 Claude Code,还需要额外设置 Anthropic 相关的变量:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="$TAOTOKEN_API_KEY"改完记得source ~/.bashrc让变量生效。验证一下:
echo $TAOTOKEN_API_KEY | head -c 8 # 应该输出 sk-xxxxx 的前几位这一步看起来简单,但后面 90% 的 401 报错都是因为环境变量没生效或者 Key 复制错了。建议先把这步做扎实。
3. 可复制配置:Claude Code settings.json、LiteLLM config.toml 与 CC Switch 片段
这一节是全文的核心,给出三套工具的可复制配置。每套配置都包含 Base URL、Key、Model ID 三件套,你可以直接改改环境变量名就能用。
3.1 Claude Code settings.json 配置
Claude Code 的配置文件默认在~/.claude/settings.json。如果目录不存在,先创建:
mkdir -p ~/.claude然后写入以下内容:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的TaoToken Key", "ANTHROPIC_MODEL": "claude-3-5-sonnet-20241022", "ANTHROPIC_SMALL_FAST_MODEL": "claude-3-5-haiku-20241022" }, "permissions": { "allow": [ "Bash(git*)", "Bash(npm*)", "Read", "Write" ] }, "telemetry": { "enabled": true, "otlp_endpoint": "http://localhost:4317", "otlp_protocol": "grpc", "service_name": "claude-code", "resource_attributes": { "source": "claude_code", "environment": "production" } } }这里有几个关键点。ANTHROPIC_BASE_URL指向 TaoToken 的 API 地址,Claude Code 会把所有请求发到这里。ANTHROPIC_MODEL指定主模型,ANTHROPIC_SMALL_FAST_MODEL是后台任务用的轻量模型,建议用 Haiku 系列省钱。
telemetry段是监控接入的关键。Claude Code 支持 OTLP 协议上报遥测数据,包括请求次数、Token 消耗、延迟等。otlp_endpoint指向你本地的 OTLP Collector(通常是 4317 端口的 gRPC)。如果你还没有 Collector,可以用 OpenTelemetry Collector 或者直接让 TaoToken 的监控端接收。
注意:
telemetry段里的resource_attributes会作为标签附加到所有指标上,source: claude_code这个标签后面在 PromQL 里会用来筛选 Claude Code 的数据。
3.2 LiteLLM config.toml 配置
LiteLLM Proxy 的配置文件通常是config.yaml,但如果你用 TOML 格式管理,可以写成config.toml。这里给出 TOML 版本:
[litellm_settings] callbacks = ["prometheus"] drop_params = true [model_list] [[model_list.item]] model_name = "gpt-4o" [model_list.item.litellm_params] model = "openai/gpt-4o" api_base = "https://taotoken.net/api" api_key = "os.environ/TAOTOKEN_API_KEY" [[model_list.item]] model_name = "claude-3-5-sonnet" [model_list.item.litellm_params] model = "anthropic/claude-3-5-sonnet-20241022" api_base = "https://taotoken.net/api" api_key = "os.environ/TAOTOKEN_API_KEY" [general_settings] master_key = "os.environ/LITELLM_MASTER_KEY" database_url = "os.environ/DATABASE_URL"callbacks = ["prometheus"]这行是监控接入的核心,它让 LiteLLM 在每次请求后把指标暴露到/metrics端点。api_base指向 TaoToken,api_key用os.environ/前缀引用环境变量,避免明文写 Key。
启动 LiteLLM Proxy:
litellm --config config.toml --port 4000启动后访问http://localhost:4000/metrics,应该能看到 Prometheus 格式的指标输出。如果看到litellm_requests_metric、litellm_tokens_metric这类指标,说明配置生效了。
3.3 CC Switch 配置片段
CC Switch 是用来在多个 Claude Code 配置之间切换的工具。如果你同时有官方 API 和 TaoToken 两套配置,可以用 CC Switch 管理。配置文件通常在~/.cc-switch/config.json:
{ "providers": [ { "name": "taotoken", "base_url": "https://taotoken.net/api", "api_key": "sk-你的TaoToken Key", "model": "claude-3-5-sonnet-20241022", "small_fast_model": "claude-3-5-haiku-20241022" } ], "active": "taotoken" }切换时执行:
cc-switch use taotoken这个配置和 Claude Code 的settings.json是联动的,CC Switch 会把选中的 provider 写入~/.claude/settings.json的env段。所以如果你用 CC Switch,就不需要手动改settings.json了。
3.4 三件套对照表
把三套配置里的关键参数整理成表,方便你对照检查:
| 工具 | Base URL | Key 来源 | Model ID 示例 |
|---|---|---|---|
| Claude Code | https://taotoken.net/api | ANTHROPIC_API_KEY | claude-3-5-sonnet-20241022 |
| LiteLLM | https://taotoken.net/api | TAOTOKEN_API_KEY | gpt-4o/claude-3-5-sonnet |
| CC Switch | https://taotoken.net/api | sk-你的TaoToken Key | claude-3-5-sonnet-20241022 |
三套配置的 Base URL 完全一致,Key 可以复用同一个,Model ID 按各自支持的格式填写。这就是统一通道的好处:配置模型一致,排查问题时只需要检查一个地址。
4. 验证请求:确认采集数据正常上报
配置写完不代表监控就通了,必须验证数据是否真的上报到了采集端。这一节给出具体的验证步骤,从单工具测试到多源聚合,一步步确认。
4.1 验证 Claude Code 请求走 TaoToken
先确认 Claude Code 的请求确实发到了 TaoToken。最简单的方法是在 Claude Code 里执行一个简单任务,然后看 TaoToken 控制台的请求日志。
打开终端,运行:
claude "用一句话解释什么是递归"如果配置正确,Claude Code 会返回结果,同时 TaoToken 控制台的请求日志里会出现一条记录,包含模型名、Token 消耗、耗时等信息。
如果报 401,检查ANTHROPIC_API_KEY是否设置正确:
echo $ANTHROPIC_API_KEY如果报连接错误,检查ANTHROPIC_BASE_URL:
echo $ANTHROPIC_BASE_URL # 应该输出 https://taotoken.net/api4.2 验证 LiteLLM 指标端点
LiteLLM 启动后,直接 curl 它的 metrics 端点:
curl -s http://localhost:4000/metrics | grep litellm你应该能看到类似这样的输出:
# HELP litellm_requests_metric Total number of requests # TYPE litellm_requests_metric counter litellm_requests_metric{model="gpt-4o",api_base="https://taotoken.net/api"} 12.0 litellm_tokens_metric{model="gpt-4o",type="input"} 3456.0 litellm_tokens_metric{model="gpt-4o",type="output"} 789.0如果litellm_requests_metric的数值在发请求后增加,说明指标采集正常。如果一直是 0,检查callbacks = ["prometheus"]是否写对了。
4.3 验证 OTLP 上报
Claude Code 的 OTLP 数据发到localhost:4317,你需要一个 OTLP Collector 来接收。最简单的验证方式是启动一个 OpenTelemetry Collector,配置如下:
# otel-collector-config.yaml receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 exporters: logging: loglevel: debug prometheus: endpoint: "0.0.0.0:8889" service: pipelines: metrics: receivers: [otlp] exporters: [logging, prometheus]启动 Collector:
otelcol --config otel-collector-config.yaml然后在 Claude Code 里执行一个任务,观察 Collector 的日志输出。如果看到claude_code相关的指标,说明 OTLP 上报通了。同时访问http://localhost:8889/metrics也能看到 Prometheus 格式的指标。
4.4 多源数据聚合验证
当三套工具都接入后,用 PromQL 做一次聚合查询,确认数据能统一到一起。假设你用 Prometheus 作为存储,在 Prometheus 的查询界面执行:
# 所有来源的总请求数 sum by (source) (ai_requests_total) # 按模型分组的 Token 消耗 sum by (model) (ai_tokens_input_total + ai_tokens_output_total) # 各来源的成本 sum by (source) (ai_cost_usd_total)如果source标签能区分出claude_code、openai、litellm三个值,说明多源聚合成功。如果某个来源缺失,回到对应工具的配置检查。
4.5 成功结果对照
配置全部跑通后,你应该能看到这样的结果:
| 检查项 | 预期结果 |
|---|---|
| Claude Code 请求 | TaoToken 控制台有请求日志 |
| LiteLLM /metrics | 有litellm_requests_metric且数值增长 |
| OTLP Collector | 日志中有claude_code指标 |
| Prometheus 查询 | sum by (source)返回三个来源 |
| 成本统计 | ai_cost_usd_total有非零值 |
如果这五项都通过,说明监控接入完成。接下来就是排查可能出现的错误。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
配置过程中最容易踩的坑集中在几个报错上。这一节按报错信息分类,给出排查步骤和解决方法。
5.1 401 Unauthorized
这是最常见的报错,几乎都是 Key 的问题。排查顺序:
第一步,确认环境变量是否生效:
echo $TAOTOKEN_API_KEY echo $ANTHROPIC_API_KEY如果输出为空,说明变量没设置或者没 source。检查~/.bashrc或~/.zshrc里的 export 语句,然后重新 source。
第二步,确认 Key 没有多余空格。复制 Key 的时候很容易带上换行或空格,用这个命令检查:
echo -n "$TAOTOKEN_API_KEY" | wc -c # 对比 Key 的实际长度第三步,确认 Key 在 TaoToken 控制台是启用状态。如果 Key 被禁用或删除,也会返回 401。
第四步,如果 Claude Code 报 401 但 LiteLLM 正常,检查ANTHROPIC_API_KEY是否单独设置了。Claude Code 读的是这个变量,不是TAOTOKEN_API_KEY。
5.2 local proxy failed
这个报错通常出现在 Claude Code 启动时,提示本地代理连接失败。原因一般是ANTHROPIC_BASE_URL配置错误,或者网络无法访问 TaoToken 的地址。
先检查 Base URL:
echo $ANTHROPIC_BASE_URL # 应该是 https://taotoken.net/api然后测试网络连通性:
curl -I https://taotoken.net/api如果 curl 返回 200 或 401,说明网络通,问题在配置。如果 curl 超时,检查你的网络环境是否能访问外网。
还有一种情况是 Claude Code 的旧版本会缓存代理配置,改完settings.json后需要重启 Claude Code 才生效。直接关掉终端重新打开。
5.3 reading choices 报错
这个报错通常来自 OpenAI SDK 或 LiteLLM,提示解析响应时找不到choices字段。原因是请求返回的不是标准的 OpenAI 格式,可能是:
第一,Model ID 写错了,TaoToken 返回了错误信息而不是正常的 completion 响应。检查model字段是否和控制台的 Model ID 一致。
第二,Base URL 少了/api后缀。TaoToken 的地址是https://taotoken.net/api,不是https://taotoken.net。少了/api会返回 404 页面,SDK 解析时就报reading choices。
第三,请求体格式不对。如果你用的是 Anthropic 格式的请求发到 OpenAI 兼容端点,响应结构不匹配。确认你用的 SDK 和端点格式一致。
排查方法是用 curl 直接发一个请求:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o", "messages": [{"role": "user", "content": "test"}] }'如果 curl 返回正常的 JSON 且有choices字段,说明服务端没问题,问题在 SDK 配置。如果 curl 也报错,看错误信息定位。
5.4 OAuth 相关报错
Claude Code 在某些版本会尝试 OAuth 流程,如果你用的是 API Key 模式,可能会看到 OAuth 相关的报错。解决方法是在settings.json里明确禁用 OAuth:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的TaoToken Key", "CLAUDE_CODE_DISABLE_OAUTH": "true" } }设置CLAUDE_CODE_DISABLE_OAUTH=true后,Claude Code 会直接用 API Key 认证,跳过 OAuth 流程。
5.5 指标缺失排查
如果配置都通了,但 Prometheus 里查不到某个来源的指标,按这个顺序排查:
第一,确认采集器是否启用。LiteLLM 检查callbacks配置,Claude Code 检查telemetry.enabled。
第二,确认上报端点可达。OTLP 用curl -v localhost:4317测试端口,Prometheus 用curl localhost:4000/metrics测试。
第三,确认标签是否正确。如果source标签没设置,聚合查询时会被过滤掉。
第四,确认时间范围。Prometheus 查询默认是最近 1 小时,如果数据是几小时前上报的,调整时间范围。
5.6 报错速查表
| 报错信息 | 最可能原因 | 快速修复 |
|---|---|---|
| 401 Unauthorized | Key 错误或未设置 | 检查环境变量,重新 source |
| local proxy failed | Base URL 错误 | 确认地址含/api |
| reading choices | Model ID 或 URL 错误 | 用 curl 测试端点 |
| OAuth 报错 | 认证模式冲突 | 设置DISABLE_OAUTH=true |
| 指标缺失 | 采集器未启用 | 检查 callbacks/telemetry 配置 |
6. 把监控接入固化下来:长期编码与 Agent 场景的配置建议
配置跑通只是第一步,真正要发挥监控的价值,需要把它固化到日常开发流程里。这一节给几个实用建议,针对长期编码和 Agent 场景。
6.1 用 Coding Plan 管理长期编码的 Key
如果你每天都在用 Claude Code 写代码,建议在 TaoToken 控制台创建一个专门的 Coding Plan。Coding Plan 的好处是额度独立、用量可追踪,不会和业务 API 的消耗混在一起。创建后把 Key 配到 Claude Code 的settings.json里,这样监控数据里source: claude_code的指标就只反映编码场景的消耗。
配置方式和普通 Key 一样,只是 Key 的来源不同:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的Coding Plan Key", "ANTHROPIC_MODEL": "claude-3-5-sonnet-20241022" } }6.2 Agent 场景的标签规范
如果你在跑 Agent 任务,建议在请求头或配置里加上业务标签,这样监控数据能按项目维度拆分。LiteLLM 支持在请求里传 metadata:
import litellm response = litellm.completion( model="gpt-4o", messages=[{"role": "user", "content": "分析这段代码"}], metadata={ "source": "agent", "project": "code-review", "environment": "production" } )这些 metadata 会作为标签附加到 Prometheus 指标上,后面可以用sum by (project)做项目级成本分析。
6.3 告警规则配置
监控数据有了,下一步是配置告警。在 Prometheus 的告警规则文件里加几条:
groups: - name: ai-cost-alerts rules: - alert: DailyCostExceeded expr: sum(increase(ai_cost_usd_total[24h])) > 100 for: 5m labels: severity: warning annotations: summary: "AI 日成本超过 100 美元" - alert: HighErrorRate expr: | sum(rate(ai_errors_total[5m])) / sum(rate(ai_requests_total[5m])) > 0.05 for: 10m labels: severity: critical annotations: summary: "AI 请求错误率超过 5%"这两条规则分别监控日成本和错误率。日成本超过 100 美元告警,错误率超过 5% 告警。阈值按你的实际情况调整。
6.4 定期检查清单
把下面这些检查项加入你的周常运维清单:
每周确认 TaoToken 控制台的 Key 用量是否正常,有没有异常峰值。检查 Prometheus 的ai_cost_usd_total是否和 TaoToken 账单对得上。确认 OTLP Collector 和 LiteLLM Proxy 的进程还在运行。检查告警规则有没有误报或漏报。
如果发现某个来源的数据突然断了,先看对应工具的进程状态,再看网络连通性,最后看配置有没有被改动。大部分问题都是环境变量失效或者进程挂掉导致的。
6.5 扩展新工具的接入路径
当你需要接入新的 AI 工具时,接入路径是固定的:先在 TaoToken 控制台创建 Key,然后在工具的配置里设置 Base URL 为https://taotoken.net/api,填入 Key 和 Model ID,最后验证请求和指标上报。三件套不变,配置模型一致,这就是统一通道的价值。
如果你在配置过程中遇到本文没覆盖的报错,可以去 TaoToken 的接入文档页面查一下,那里有更详细的参数说明和示例。需要测试模型可用性的话,模型对话页面可以直接发请求验证。长期编码场景建议用 Coding Plan 管理额度,避免和业务 API 混在一起。