Claude API用量追踪工具:开源代理方案实现成本监控与优化
在AI应用开发中,API调用成本控制与性能监控是工程实践的关键环节。其核心原理在于通过中间件拦截技术,对请求流量进行实时采集与元数据记录,结合数据库存储与聚合分析,实现细粒度用量追踪。这一技术方案的价值在于将大模型API从黑盒消费转变为透明运营,帮助团队掌握成本构成、识别异常调用并优化资源分配。在实际应用场景中,开发者常面临官方后台数据粒度粗、延迟高的问题,无法满足精细化管理需求。本文介绍的cla
1. 项目概述:一个为Claude开发者设计的代码使用量追踪工具
最近在折腾Claude API做项目时,我遇到了一个挺实际的问题:怎么才能清晰地知道我的代码到底调用了多少次API、花了多少钱、每个功能模块的消耗占比如何?官方后台的数据太笼统,而且延迟高,对于需要精细成本控制和性能优化的团队来说,远远不够用。就在我四处寻找解决方案时,发现了GitHub上一个名为“claude-code-usage”的项目,作者是brucechou1983。这个工具的核心目标很明确——为使用Claude(特别是其代码相关能力,如Claude Code)的开发者,提供一个轻量级、可自部署的API使用量追踪与分析系统。
简单来说,它就像一个为你专属的Claude API“仪表盘”。你不再需要频繁登录官方后台,去在一堆混杂的请求日志里手动筛选;而是通过这个工具,自动收集、聚合并可视化你的每一次API调用。无论是个人开发者测试新想法,还是团队在正式产品中集成Claude,都能通过它实时掌握使用情况,及时发现异常调用(比如某个循环里的提示词写错了,导致每秒被调用上百次),从而避免月底收到“惊喜账单”。这个项目解决的不是“能不能用”的问题,而是“怎么用得明明白白、用得划算”的问题,对于所有将大模型API投入实际生产的团队来说,这都是一个刚需。
2. 核心设计思路:从日志收集到可视化分析的全链路拆解
2.1 为什么需要独立的用量追踪?
Claude官方提供的用量统计存在几个天然的短板。首先,数据粒度不够细。你只能看到某个API Key在某个时间段内的总请求数、总token消耗和总费用,但无法区分这些请求具体来自哪个应用、哪个用户、甚至哪个功能模块。其次,数据延迟可能高达数小时,无法实现实时监控。最后,缺乏自定义分析能力。你无法按照自己的业务维度(如项目ID、用户等级、模型版本)进行聚合查询。
“claude-code-usage”项目的设计哲学,正是为了填补这些空白。它的核心思路是“中间件拦截+本地存储+灵活分析”。工具本身作为一个轻量级的代理服务,部署在你的应用和Claude官方API之间。所有发往Claude API的请求,都会先经过这个代理。代理在转发请求的同时,会同步记录下本次请求的“元数据”——包括但不限于请求时间、使用的模型、提示词(Prompt)和补全(Completion)的token数、请求状态、响应时间,以及你自定义的标签(如 project_id , user_id , feature_name )。这些数据被实时写入一个本地数据库(如SQLite或PostgreSQL),然后通过一个内置的Web仪表盘进行查询和可视化。
2.2 架构选型与技术栈考量
作者在技术栈的选择上体现了实用主义。项目主要使用Python,这是自然语言处理和大模型领域最主流的语言,生态丰富,与Claude的官方SDK无缝集成。Web框架很可能选择了FastAPI或Flask,因为它们轻量、异步支持好,适合构建高性能的API代理。数据库方面,为了降低部署复杂度,默认可能采用了SQLite,它无需单独服务,单文件即可运行,非常适合个人或小团队使用;同时,项目很可能也支持连接更强大的PostgreSQL,以满足团队协作和更大数据量的需求。
前端仪表盘部分,考虑到项目的工具属性,大概率使用了简单的模板引擎(如Jinja2)配合一些轻量级图表库(如Chart.js或ECharts)来渲染,避免了复杂前端框架带来的额外依赖和构建步骤。整个架构追求的是“开箱即用”:开发者克隆项目,配置好API Key和数据库连接,启动服务,然后将自己应用的API端点从 https://api.anthropic.com 改为本工具的代理地址,追踪就自动开始了。
注意 :这种代理模式意味着你的所有API请求流量都会经过自部署的服务。因此,务必确保该服务部署在安全、可靠的环境中,并做好访问权限控制,防止API Key泄露和请求数据被窃取。
3. 核心功能模块深度解析
3.1 请求拦截与元数据记录
这是工具的基石。其核心是一个HTTP代理服务器,它需要精准地识别出指向Claude API的请求。通常,它会监听特定路径,例如 /v1/messages (对应Claude的消息API)。当请求到达时,代理会执行以下关键操作:
- 请求验证与转发 :首先,它会从请求头中提取出你配置的Claude API Key,将其替换或添加到转发给官方API的请求头中(这里通常采用添加
x-api-key头的方式)。同时,它需要保留用户原始请求的Body(即提示词和参数)。 - 异步日志记录 :在将请求转发给官方API的同时, 不会 等待官方响应回来再记录。而是会立即提取并记录那些在转发时就能确定的信息,例如:
request_id: 生成一个唯一ID用于追踪。timestamp: 请求发起时间。model: 请求指定的模型(如claude-3-opus-20240229)。prompt_tokens: 通过计算请求Body中的消息内容估算出的token数(这里需要集成类似tiktoken的库来精确计算)。custom_tags: 从请求头或URL参数中解析出自定义标签。这是非常关键的功能,允许你通过类似X-Project-ID: my_awesome_app这样的请求头来打标。
- 响应处理与补全记录 :收到Claude API的响应后,代理再将响应体原样返回给你的应用。同时,在后台异步完成日志记录的补充:
response_id: 记录官方返回的响应ID。status_code: HTTP状态码。completion_tokens: 从响应体中提取出AI生成的文本,并计算其token数。total_tokens:prompt_tokens+completion_tokens。response_time_ms: 整个请求的耗时。cost: 根据当前模型的定价(如claude-3-opus每百万tokens输入$15,输出$75)和本次使用的token数,计算出本次请求的估算成本。这一步需要工具内置一个模型价格表,并定期更新。
3.2 数据存储与聚合模型设计
记录下来的海量请求数据需要被高效存储和查询。数据库表的设计至关重要。一个核心的 api_requests 表可能包含以下字段:
CREATE TABLE api_requests (
id INTEGER PRIMARY KEY AUTOINCREMENT,
request_id TEXT UNIQUE,
timestamp DATETIME,
model TEXT,
prompt_tokens INTEGER,
completion_tokens INTEGER,
total_tokens INTEGER,
status_code INTEGER,
response_time_ms INTEGER,
estimated_cost REAL,
project_id TEXT,
user_id TEXT,
feature_name TEXT,
-- ... 其他自定义标签字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
为了支持快速分析,通常还需要创建索引,例如在 timestamp 、 project_id 、 model 上创建索引,这样按时间范围、按项目、按模型筛选查询时会非常快。
除了原始记录,工具可能还会定期(例如每小时或每天)运行聚合任务,生成汇总数据到另一张 usage_summary 表。这张表可以存储按小时/天/项目/模型维度聚合的总请求数、总token、总成本、平均响应时间等。这样,在查询历史趋势图表时,就不需要每次都去扫描庞大的原始数据表,极大提升了仪表盘的加载速度。
3.3 可视化仪表盘与查询接口
数据有了,如何直观地看?仪表盘的设计应围绕几个核心场景:
- 实时监控 :一个大屏,显示当前小时/分钟的请求速率、成功/失败率、平均响应时间、实时成本消耗。这有助于快速发现服务异常。
- 成本分析 :这是重中之重。需要提供按项目、按模型、按时间(日/周/月)维度的成本柱状图或曲线图。一眼就能看出哪个项目是“耗电大户”,哪个模型升级导致了成本激增。
- 用量明细 :一个可筛选、可分页的表格,列出所有历史请求。支持按时间、状态码、项目、用户等条件筛选,方便定位某一次具体的调用。
- Token效率分析 :统计平均每次请求的Prompt Token和Completion Token比例。如果一个功能的Prompt非常长但Completion很短,可能就需要优化提示词工程;反之,如果Completion很长,则可能需要考虑是否输出过于冗余。
此外,工具还应提供简单的RESTful API,允许你将用量数据集成到自己的监控系统(如Grafana)或财务系统中。
4. 部署与配置实操指南
4.1 环境准备与快速启动
假设你已经在开发机上准备好了Python 3.8+的环境和Git。部署的第一步是获取代码。
git clone https://github.com/brucechou1983/claude-code-usage.git
cd claude-code-usage
接下来是安装依赖。项目根目录下应该有一个 requirements.txt 文件。
pip install -r requirements.txt
安装的依赖通常包括: fastapi (Web框架), uvicorn (ASGI服务器), sqlalchemy (ORM), pydantic (数据验证), httpx (异步HTTP客户端,用于转发请求), tiktoken (Token计算)等。
安装完成后,你需要复制或重命名配置文件模板。通常项目会提供一个 .env.example 或 config.yaml.example 文件。
cp .env.example .env
然后,用你喜欢的编辑器打开 .env 文件,进行关键配置:
# 你的Claude API Key,从Anthropic控制台获取
CLAUDE_API_KEY=sk-ant-xxx...
# 代理服务监听的端口,你的应用将请求发往这个地址
PROXY_HOST=0.0.0.0
PROXY_PORT=8000
# 数据库连接字符串,默认使用SQLite,文件位于项目目录内
DATABASE_URL=sqlite:///./claude_usage.db
# 仪表盘访问的密钥(可选但强烈建议设置),用于基础认证
DASHBOARD_USERNAME=admin
DASHBOARD_PASSWORD=your_strong_password_here
配置完成后,就可以启动服务了。启动命令可能类似:
python main.py
# 或者,如果使用uvicorn直接运行ASGI应用
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
看到服务成功启动在 http://localhost:8000 后,你可以先访问 http://localhost:8000/dashboard (具体路径看项目文档)登录仪表盘。此时还没有数据,因为还没有流量经过代理。
4.2 集成到你的应用:修改API端点
这是最关键的一步。假设你原来使用Python anthropic SDK调用Claude的代码是这样的:
import anthropic
client = anthropic.Anthropic(api_key="your-api-key")
response = client.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=1000,
messages=[{"role": "user", "content": "Hello, Claude"}]
)
为了让流量经过用量追踪代理,你不需要修改SDK调用逻辑,只需要改变API的基地址(base URL)。 anthropic SDK通常支持通过 base_url 参数来指定。
import anthropic
# 将base_url指向你本地部署的代理服务
client = anthropic.Anthropic(
api_key="your-api-key", # 这里可以填任意值或留空,因为代理会替换它
base_url="http://localhost:8000/v1" # 注意,代理服务模拟了Claude API的/v1路径
)
# 其余的调用代码完全不变
response = client.messages.create(...)
重要 :此时,你传递给 Anthropic 客户端的 api_key 参数实际上不会被发送到官方API(因为请求被代理拦截了)。代理服务会使用你在其配置文件( .env )中设置的 CLAUDE_API_KEY 来替换它。这样做的好处是,你的应用代码中可以不写或写一个假的API Key,真正的密钥安全地保存在代理服务器的配置里。
对于其他语言或直接使用HTTP请求的场景,只需将请求的URL从 https://api.anthropic.com/v1/messages 改为 http://你的代理地址:端口/v1/messages 即可,请求头和Body保持不变。
4.3 为请求打上业务标签
为了让数据分析更有意义,你需要为不同的请求打上业务标签。最常用的方式是通过HTTP请求头传递。代理服务会识别特定的请求头,并将其值作为标签存入数据库。
例如,你想标记当前请求属于“项目A”的“总结摘要”功能,由“用户123”发起:
import anthropic
client = anthropic.Anthropic(
api_key="dummy_key",
base_url="http://localhost:8000/v1",
# 关键:通过default_headers设置自定义标签头
default_headers={
"X-Project-ID": "project_a",
"X-Feature-Name": "summarization",
"X-User-ID": "user_123"
}
)
response = client.messages.create(...)
代理服务会解析 X-Project-ID 、 X-Feature-Name 、 X-User-ID 这些头(具体的头名称需要查看项目文档),并将它们的值记录到数据库的对应字段中。这样,在仪表盘里你就可以轻松地筛选出“项目A”在“总结摘要”功能上的所有花费了。
5. 仪表盘使用与数据分析实战
5.1 核心面板解读与日常监控
登录仪表盘后,你通常会看到几个核心面板:
-
概览面板 :显示最近24小时或7天的关键指标趋势图。包括:
- 请求量 :折线图,观察调用频率是否有异常峰值。
- Token消耗 :通常分为输入Token和输出Token两条线,帮助你了解成本构成。
- 估算成本 :折线图,直观显示每天花了多少钱。
- 平均响应延迟 :折线图,监控API性能是否稳定。如果延迟突然飙升,可能意味着网络问题或官方API负载过高。
- 成功率 :饼图或指标卡,显示成功请求与失败(如429限流、5xx错误)请求的比例。
-
成本分析面板 :这是财务关注的重点。你可以在这里:
- 按 项目 分组查看成本排行,快速定位成本最高的项目。
- 按 模型 分组(如Claude 3 Opus vs Sonnet vs Haiku),分析不同模型带来的成本差异,为模型选型提供数据支持。
- 选择不同的时间粒度(日、周、月),查看成本变化趋势。
-
请求日志面板 :一个功能强大的数据表格,列出了每一笔请求的详细记录。支持:
- 时间范围筛选 :精确查看某一时刻的请求。
- 状态码筛选 :快速找出所有失败的请求,便于排查问题。
- 项目/功能/用户筛选 :进行多维度的下钻分析。
- 查看详情 :点击单条记录,可以展开查看其完整的请求提示词(Prompt)和AI回复(Completion)内容。 这是一个非常强大的调试功能 ,当AI输出不符合预期时,你可以直接在这里回溯当时的“对话现场”。
5.2 基于数据进行优化决策
数据本身没有价值,基于数据的行动才有。以下是一些基于仪表盘数据可以进行的优化:
- 识别并优化“低效”提示词 :在请求日志中,按
prompt_tokens从高到低排序。你会发现一些提示词异常长的请求。点开详情,分析这些长提示词是否必要。是否包含了过多无关的上下文?是否可以通过更精炼的指令达到相同效果?优化提示词是降低输入Token成本最直接的方法。 - 调整模型策略 :通过成本分析面板,对比不同模型在相似任务上的成本和效果。也许对于简单的文本校对任务,使用更便宜的Claude 3 Haiku模型已经足够,而不必一直使用昂贵的Opus模型。你可以据此制定一个模型路由策略:简单任务用便宜模型,复杂任务再用强模型。
- 设置用量告警 :虽然工具本身可能不直接提供告警功能,但你可以定期查看成本趋势。如果发现某个项目或功能的成本在短期内急剧上升,应立即介入检查。是否是代码出现了循环调用BUG?还是该功能突然迎来了大量用户?你可以基于数据库,自己写一个简单的脚本,当每日成本超过阈值时发送邮件或Slack通知。
- 评估功能ROI :结合业务数据(如某个AI功能带来的用户活跃度或收入提升),与它产生的API成本进行对比,可以清晰地评估该AI功能的投资回报率,为产品决策提供依据。
6. 生产环境部署与高阶配置
6.1 从开发环境到生产环境
在本地开发测试没问题后,你需要将 claude-code-usage 部署到一台稳定的服务器上,供团队所有应用调用。
- 服务器选择 :选择一台网络稳定、有公网IP(如果需要从外部调用)的云服务器。配置无需太高,初期2核4GB内存足够。
- 使用进程守护 :不能直接通过
python main.py在终端运行,终端关闭服务就停了。需要使用像systemd或supervisor这样的进程管理工具。以下是一个systemd服务文件的示例(/etc/systemd/system/claude-usage.service):
然后使用[Unit] Description=Claude Code Usage Tracker After=network.target [Service] Type=simple User=www-data Group=www-data WorkingDirectory=/path/to/claude-code-usage Environment="PATH=/usr/local/bin" EnvironmentFile=/path/to/claude-code-usage/.env.production # 生产环境配置文件 ExecStart=/usr/local/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000 Restart=always RestartSec=5 [Install] WantedBy=multi-user.targetsudo systemctl start claude-usage启动,sudo systemctl enable claude-usage设置开机自启。 - 数据库升级 :生产环境建议将SQLite更换为PostgreSQL。PostgreSQL更稳定,支持并发连接数更高,且便于后期做数据备份和迁移。只需修改
.env.production中的DATABASE_URL为PostgreSQL连接串即可,例如DATABASE_URL=postgresql://user:password@localhost:5432/claude_usage。工具使用的ORM(如SQLAlchemy)通常能自动处理表结构迁移。 - 安全加固 :
- 防火墙 :在服务器防火墙中,只开放代理服务端口(如8000)和必要的SSH端口。
- HTTPS :如果你的应用通过公网调用此代理, 必须 配置HTTPS。可以使用Nginx作为反向代理,配置SSL证书。
- 访问控制 :确保仪表盘的访问密码足够复杂,并考虑限制访问IP(通过Nginx或应用自身配置)。
6.2 性能调优与数据维护
随着请求量增大,需要注意以下问题:
- 数据库性能 :确保
api_requests表在timestamp,project_id等常用查询字段上建立了索引。定期清理过期数据,可以写一个定时任务(cron job),每月删除3个月前的原始请求日志,只保留聚合后的统计数据。 - 代理服务性能 :代理服务本身是I/O密集型(网络转发和数据库写入)。使用异步框架(如FastAPI+
httpx)能很好地处理并发。如果请求量极大(每秒数百次),可以考虑将日志写入先放入一个内存队列(如Redis),然后由后台工作者批量写入数据库,避免数据库写入成为瓶颈。 - 高可用考虑 :对于关键业务,可以考虑部署两个代理实例,前面用负载均衡器(如Nginx)做分流。两个实例连接同一个PostgreSQL数据库。需要确保自定义的
request_id在分布式环境下也能保持全局唯一。
7. 常见问题与故障排查实录
在实际部署和使用过程中,你肯定会遇到各种问题。以下是我和社区遇到的一些典型情况及其解决方案。
7.1 代理服务相关
问题1:应用修改API端点后,调用Claude全部超时或失败。
- 排查步骤 :
- 检查代理服务状态 :在服务器上运行
sudo systemctl status claude-usage,查看服务是否正在运行。检查日志sudo journalctl -u claude-usage -f是否有错误信息。 - 检查网络连通性 :从代理服务器本身,尝试用
curl命令直接调用Claude官方API,确保服务器能访问api.anthropic.com。curl -X POST https://api.anthropic.com/v1/messages -H "x-api-key: YOUR_KEY" ...。如果连不上,检查服务器网络和防火墙规则。 - 检查配置 :确认代理服务的
.env文件中CLAUDE_API_KEY配置正确且未过期。 - 检查应用配置 :确认你的应用中将
base_url修改成了正确的代理服务器地址和端口。 特别注意 :如果你的应用在Docker容器内,而代理服务在宿主机上,不能使用localhost,需要使用宿主机的局域网IP或服务名。
- 检查代理服务状态 :在服务器上运行
问题2:仪表盘可以打开,但看不到任何数据。
- 排查步骤 :
- 确认流量经过代理 :检查你的应用代码,确保
base_url已正确修改。 - 检查数据库 :登录到数据库(如
sqlite3 claude_usage.db),执行SELECT COUNT(*) FROM api_requests;,看是否有记录。如果没有,说明代理没有成功写库。检查代理日志,看是否有数据库连接错误或写入错误。 - 检查时间筛选 :仪表盘默认可能只显示“今天”的数据。如果你刚刚开始使用,请将时间筛选范围调整到包含你开始测试的时间点。
- 确认流量经过代理 :检查你的应用代码,确保
7.2 数据与标签相关
问题3:自定义的业务标签(如Project ID)没有在仪表盘中显示或无法筛选。
- 原因与解决 :这通常是因为代理服务没有正确解析你设置的自定义请求头。你需要:
- 查阅
claude-code-usage项目的文档,确认它支持哪些自定义请求头字段。常见的命名可能是X-Usage-Tag-Project、X-Tag-Project等。 - 在你的应用代码中,确保设置了正确的请求头名称。
- 检查代理服务的配置,看是否需要显式启用或配置自定义标签的解析功能。
- 查阅
问题4:仪表盘中估算的成本和Claude官方后台显示的成本有细微差异。
- 原因 :这是正常现象。差异可能来自:
- Token计算方式 :代理使用
tiktoken库计算Token,与Anthropic官方计算方式可能存在极其细微的差异(通常可忽略)。 - 定价数据延迟 :代理内置的模型价格表可能没有及时更新到最新的价格。你需要定期关注项目更新,或手动更新代理服务中存储定价的配置文件。
- 数据聚合时间差 :官方后台的数据有数小时延迟,且结算周期可能以UTC时间零点为准,而你的代理统计的是本地时间。建议以官方账单为准,代理数据主要用于实时监控和趋势分析。
- Token计算方式 :代理使用
7.3 扩展与集成
问题5:我想把用量数据推送到我们公司自己的数据仓库(如Snowflake)或BI工具(如Tableau)里,怎么做?
- 方案 :
claude-code-usage项目通常专注于收集和提供基础可视化。对于高级集成,你有几个选择:- 直接查询数据库 :因为所有数据都存在数据库里(SQLite或PostgreSQL),你可以直接用你熟悉的BI工具连接这个数据库,进行更复杂的分析和报表制作。
- 使用内置API :检查项目是否提供了查询用量数据的REST API。如果有,你可以写一个定时脚本,调用这些API将数据同步到你的数据仓库。
- 修改源码,增加导出功能 :这是最灵活的方式。你可以在代码中增加一个功能,定期将聚合数据以CSV格式导出到指定目录,或直接调用你公司数据平台的API进行推送。这需要一定的开发能力。
问题6:团队多人使用,如何区分不同成员或不同团队的用量?
- 方案 :核心机制就是利用 自定义标签 。
- 为每个团队/项目分配唯一ID :在代理配置或一个共享配置中心,定义好团队和项目的映射关系。
- 在应用层注入标签 :每个团队在调用代理时,必须在请求头中带上自己团队或项目的唯一ID(如
X-Team-ID: data_science)。 - 仪表盘权限(高级) :基础的仪表盘可能所有数据都可见。如果需要数据隔离,就需要修改前端和后端代码,实现基于标签的数据过滤和用户登录权限系统。例如,团队A的用户登录后,只能看到
team_id为A的数据。这属于二次开发范畴。
经过这样一番从原理到实践,从部署到排查的深度折腾,你会发现 brucechou1983/claude-code-usage 这类工具的价值远超一个简单的计数器。它把大模型API从“黑盒消费”变成了“透明运营”,让你在享受AI能力的同时,牢牢握住了成本与效能的缰绳。对于任何严肃的AI应用项目,这样一层可观测性建设,不是可选项,而是必选项。
更多推荐



所有评论(0)