CLIProxyAPI(八):cpa_keeper 与 cpa_cost——用量追踪与成本分析工具

本文是 CLIProxyAPI 系列教程第八篇,介绍两个配套 Python 工具:cpa_keeper.py(持久化用量追踪)和 cpa_cost.py(等效成本分析)。

系列目录

  1. (一)入门——把 CLI 订阅变成标准 API
  2. (二)多账号轮询与配额策略
  3. (三)接入主流 AI 编程工具
  4. (四)生产部署——Nginx、TLS 与安全加固
  5. (五)Antigravity——用 Google 订阅解锁 Claude Opus 4.8
  6. (六)结合 new-api 打造多用户 API 网关
  7. (七)自动化运维——配额监控与告警
  8. (八)cpa_keeper 与 cpa_cost——用量追踪与成本分析工具(本文)
# cpa_keeper & cpa_cost 工具 ## cpa_keeper.py ### 数据源:CLIProxyAPI 管理 API ### 存储:SQLite(~/.cpa/usage.db) ### 命令:collect / status / query ### 配合 crontab 每5分钟自动采集 ## cpa_cost.py ### 数据源:new-api SQLite 日志 ### 按模型汇总 Token 用量 ### 对照 Anthropic 官方定价 ### 命令:report --month / --token ## 配置 ### ~/.cpa/config.env ### CPA_SECRET(明文 secret-key) ### CPA_HOST / NEW_API_DB ## 集成 ### 与第七篇 crontab 配合 ### 与 new-api 日志联动

背景与设计思路

第七篇已经建立了基于 Shell 脚本的运维基础,能做到账号健康检测和月度 CSV 统计。但 CSV 方案有局限:

  • 难以跨时间段聚合查询(如"某账号过去3天的请求量趋势")
  • 无法按令牌或模型维度切分分析
  • 无法量化订阅的经济价值(给决策层看的数据)

两个 Python 脚本各司其职:

工具 数据源 核心价值
cpa_keeper.py CLIProxyAPI 管理 API 账号状态快照 → SQLite,支持历史趋势查询
cpa_cost.py new-api SQLite 日志 Token 用量 × 官方定价 → 等效 API 费用报告
flowchart LR CPA["CLIProxyAPI\n:8317"] --> K["cpa_keeper.py collect\n每5分钟 crontab"] K --> DB1["~/.cpa/usage.db\nSQLite 账号快照"] NDB["new-api\none-api.db"] --> C["cpa_cost.py report\n按需手动"] C --> R["成本报告\n终端输出"] DB1 --> Q["cpa_keeper.py query\n历史趋势"]

两个工具都是纯标准库 Python 3,无需 pip install 任何第三方包,复制脚本即可用。


前置条件

  • CLIProxyAPI 已运行,管理 API 可访问(参见第七篇)
  • new-api 已运行,SQLite 日志在 ~/new-api/one-api.db
  • 脚本已放置于 ~/cpa/(第七篇已建立此目录)

配置 secret-key

两个工具通过 ~/.cpa/config.env 读取配置:

# 编辑配置文件
nano ~/.cpa/config.env

内容:

# CLIProxyAPI secret-key(填入明文,即设置时输入的原始密钥)
CPA_SECRET=你的明文密钥

# CLIProxyAPI 地址(通常不需要改)
CPA_HOST=http://localhost:8317

# new-api SQLite 路径(通常不需要改)
NEW_API_DB=/home/你的用户名/new-api/one-api.db

注意CPA_SECRET 填的是设置 secret-key 时使用的明文,不是 config.yaml 里看到的 bcrypt 哈希值。CLIProxyAPI 在启动时自动对明文哈希,只要你还记得原始密钥就行。

保存后测试连通性:

python3 ~/cpa/cpa_keeper.py status

1. cpa_keeper.py 用量追踪器

1.1 工作原理

cpa_keeper.py collect 调用 GET /v0/management/auth-files 端点拿到所有账号的状态快照,写入 ~/.cpa/usage.dbsnapshots 表。每条记录包含:时间戳、邮箱、Provider 类型、状态(active/unavailable)、累计成功/失败数。

flowchart LR CR["crontab\n*/5 * * * *"] --> Col["cpa_keeper.py collect"] Col --> API["GET /v0/management/auth-files"] API --> CPA["CLIProxyAPI"] CPA --> R["JSON 响应\nfiles[].status"] R --> DB["~/.cpa/usage.db\nINSERT INTO snapshots"]

1.2 命令参考

查看实时账号状态

python3 ~/cpa/cpa_keeper.py status

输出示例:

📊 CLIProxyAPI 账号状态(2026-06-06 12:00:00)
账号总数: 3  活跃: 3

  ✅ [antigravity] bhffxdg0@gmail.com
     状态: active  成功: 142  失败: 0
  ✅ [claude] abdulrazaqgorano@gmail.com
     状态: active  成功: 38   失败: 0
  ✅ [gemini-cli] bhffxdg0@gmail.com
     状态: active  成功: 0    失败: 0

手动采集一次快照

python3 ~/cpa/cpa_keeper.py collect
# [12:05:00] 已记录 2 个账号,2/2 正常

crontab 已配置为每 5 分钟自动采集,通常不需要手动触发。

查询历史快照

# 查看最近 24 小时
python3 ~/cpa/cpa_keeper.py query

# 查看最近 72 小时
python3 ~/cpa/cpa_keeper.py query --hours 72

输出(节选):

过去 24 小时的账号状态快照(最新 100 条):
时间                 邮箱                           类型           状态           成功   失败
──────────────────────────────────────────────────────────────────────────────────────────
2026-06-06 12:00:00  ✅ bhffxdg0@gmail.com         antigravity    active          142      0
2026-06-06 11:55:00  ✅ abdulrazaqgorano@gmail.com  claude         active           38      0
2026-06-06 11:50:00  ❌ bhffxdg0@gmail.com          gemini-cli     unavailable       0      5

如果某个时间点看到 unavailable,可以对照告警日志(~/cpa/logs/alerts.log)确认是否触发了告警。

1.3 直接查询 SQLite

如果你需要更复杂的分析(比如绘图、导出),可以直接操作数据库:

sqlite3 ~/.cpa/usage.db

-- 查看各账号 unavailable 次数(过去7天)
SELECT email, provider, COUNT(*) AS unavailable_count
FROM snapshots
WHERE status = 'unavailable'
  AND ts >= strftime('%s','now','-7 days')
GROUP BY email, provider;

-- 查看某账号的状态时间线(最近100条)
SELECT datetime(ts, 'unixepoch', 'localtime') AS t,
       status, success, failed
FROM snapshots
WHERE email = 'bhffxdg0@gmail.com'
  AND provider = 'antigravity'
ORDER BY ts DESC
LIMIT 100;

-- 统计各 provider 今日成功率
SELECT provider,
       MAX(success) AS total_success,
       MAX(failed)  AS total_failed
FROM snapshots
WHERE ts >= strftime('%s','now','start of day')
GROUP BY provider;

2. cpa_cost.py 成本分析工具

2.1 工作原理

cpa_cost.py 读取 new-api 的 SQLite 日志(one-api.db),按模型汇总 prompt_tokenscompletion_tokens,再乘以 Anthropic 官方定价,得出等效 API 费用。

这个数字的意义在于:你用订阅账号跑了多少请求,如果直接调用 API 的话要花多少钱——直观展示订阅的经济价值。

flowchart LR NDB["new-api\none-api.db"] --> C["cpa_cost.py report"] C --> G["GROUP BY model_name\nSUM tokens"] G --> P["× 官方定价\n$/百万token"] P --> R["成本报告\n终端输出"]

内置定价表(截至 2026 年 6 月):

模型 输入 $/1M 输出 $/1M
claude-opus-4-8/4-7/4-6 $5.00 $25.00
claude-sonnet-4-6/4-5 $3.00 $15.00
claude-haiku-4-5 $0.80 $4.00
gemini-2.5-pro $1.25 $5.00
gemini-2.5-flash / gemini-3-x $0.15 $0.60
deepseek-v4-flash $0.07 $0.28
deepseek-v4-pro $0.27 $1.10

2.2 命令参考

近30天报告

python3 ~/cpa/cpa_cost.py report

指定月份

python3 ~/cpa/cpa_cost.py report --month 2026-06

按 new-api 令牌名筛选

适合查看某个团队成员的消耗情况:

python3 ~/cpa/cpa_cost.py report --month 2026-06 --token alice-dev

实际输出示例

📊 CLIProxyAPI 等效成本报告 — 2026-06

模型                                         请求      输入Token      输出Token       等效费用
──────────────────────────────────────────────────────────────────────────────────────────
claude-opus-4-8                               12       48,200          3,100        $0.3183
claude-sonnet-4-6                             45       98,500          8,200        $0.4185
claude-haiku-4-5-20251001                      8       12,000            800        $0.0129
gemini-2.5-flash                              30        8,100          1,200        $0.0019
deepseek-v4-pro                               15          150            480        $0.0005
──────────────────────────────────────────────────────────────────────────────────────────
合计                                          110      166,950         13,780        $0.7521

💡 若直接调用 Anthropic API,同等用量约需 $0.75 USD
   (按官方公开定价估算,实际费用以 Anthropic 账单为准)

2.3 更新定价

Anthropic 定价偶尔调整,脚本顶部的 PRICING 字典可以直接编辑:

nano ~/cpa/cpa_cost.py

找到 PRICING = { 部分,按最新官方定价修改。


3. 与 crontab 的集成

第七篇配置的 crontab 已包含 cpa_keeper.py collect 的定时任务:

# 查看当前 crontab
crontab -l | grep cpa

应该看到:

*/5 * * * * /usr/bin/python3 /home/sdmike/cpa/cpa_keeper.py collect >> /home/sdmike/cpa/logs/cron.log 2>&1

验证采集是否在运行:

# 查看最近采集日志
tail -20 ~/cpa/logs/cron.log

# 查看数据库里有多少条快照
sqlite3 ~/.cpa/usage.db "SELECT COUNT(*) FROM snapshots;"

4. 典型使用场景

场景1:账号失效后复盘

发现某段时间请求失败,用 cpa_keeper.py query --hours 48 查看快照,找到 unavailable 的时间点,对照 ~/cpa/logs/alerts.log 确认告警是否触发。

场景2:月末成本汇报

# 生成上月报告
python3 ~/cpa/cpa_cost.py report --month 2026-05

# 生成本月报告
python3 ~/cpa/cpa_cost.py report --month 2026-06

把输出贴给领导,说明"这套 Google/Claude 订阅方案本月节省了 $XX 的 API 费用"。

场景3:查某个成员用了多少

python3 ~/cpa/cpa_cost.py report --token pearl

小结

两个工具配合,构成了一套轻量但完整的用量分析体系:

工具 解决什么问题
cpa_keeper.py "某账号是什么时候开始失效的?" / "某时间段有多少请求?"
cpa_cost.py "这套订阅方案本月省了多少钱?" / "谁用得最多?"

两者都不依赖任何第三方包,部署即用,代码也足够简单,可以直接按需修改。


系列导航

实操清单

  • ~/cpa/cpa_keeper.py 已创建(纯标准库,无需 pip)
  • ~/cpa/cpa_cost.py 已创建(纯标准库,无需 pip)
  • crontab 已配置 cpa_keeper.py collect(每5分钟)
  • cpa_cost.py report --month 2026-06 运行验证,输出正常($0.05 等效成本)
  • ~/.cpa/config.env 已填入 CPA_SECRET
  • cpa_keeper.py status 返回 3/3 active(antigravity / claude / gemini-cli)
  • cpa_keeper.py collect + query 验证通过,历史快照写入 SQLite 正常