Repository navigation
v1.1.0 — 上游账号统计真正开始记账
v1.1.0 — 上游账号统计真正开始记账
本轮修掉了「上游账号管理」页面上长期存在的两个互相打架的假数字。
修了什么
管理页上并排摆着两组数:每行的「调用次数 / 错误数」,和顶部汇总卡的「成功率」。
汇总卡按「没数据就算 100%」显示 100.0%,而每一行永远是 0 和红着的 0.0% ——
两个数互相矛盾,而且没有任何地方会报错。
根因是一条断掉的链:
- 统计该落在
ModelUpstreamAccount(上游账号 ↔ 模型的绑定)上,但
update_upstream_usage()开头那句if not hasattr(account, 'usage_count')恒为真,
22 处调用点全是静默空操作,一行统计都没写进去过。 select_upstream_account()只记住账号、把绑定对象丢掉了,而绑定是统计唯一的落点。- 列表接口直接序列化账号,没有聚合绑定上的用量,就算写了也读不出来。
用户能感知到的变化
- 「上游账号管理」现在显示真实的调用次数、错误数、成功率与最后使用时间。
- 成功率口径统一为
(用量 - 错误) / 用量:没调用过是 100% 不是 0%,
失败也计一次使用(否则分母会漏掉失败)。 - 表格里去掉了
weight/max_qps/avg_latency三个后端根本没有数据源的列。 - 编辑弹窗不再丢配置:补回
max_tpm/proxy_url回填,改用PATCH,
api_key留空时不再覆盖原有密钥。
内部改动
- 新增
apps/utils/channel_stats.py,作为渠道统计的唯一来源(脏值归零、未调用 100%、分母口径)。 - 视图层用
Sum+Coalesce聚合绑定用量,未使用过的账号是0而不是null。 - 统计写回改用
F()原子自增,不再读改写。 - 新增 34 例测试(
apps/utils/tests17 +apps/ai_models/tests17);
其中一组是跨语言契约锁:前端表格的prop必须能在后端序列化器里找到,
编辑弹窗回填的字段必须能写回 —— 上一版正是因为缺这条锁,max_tpm/proxy_url
缺失了整整一版而没人发现。 - 全量 275 例通过(
ai_models17 /api_proxy116 /dashboard21 /image_gen50 /utils71)。
验证方式
sqlite 内存库端到端跑「选账号 → 2 次成功 + 1 次失败 → 查列表接口」:
total_calls=3 error_count=1 success_rate=66.7,未使用账号 100.0,max_tpm / proxy_url 正常返回。
另做 13 条缺陷注入的负向验证(含反向对照),源码 sha256 逐字节还原。