Skip to content

v1.1.0 — 上游账号统计真正开始记账

Choose a tag to compare

@virtualman333 virtualman333 released this 16 Sep 18:45
· 16 commits to master since this release

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/tests 17 + apps/ai_models/tests 17);
    其中一组是跨语言契约锁:前端表格的 prop 必须能在后端序列化器里找到,
    编辑弹窗回填的字段必须能写回 —— 上一版正是因为缺这条锁,max_tpm / proxy_url
    缺失了整整一版而没人发现。
  • 全量 275 例通过(ai_models 17 / api_proxy 116 / dashboard 21 / image_gen 50 / utils 71)。

验证方式

sqlite 内存库端到端跑「选账号 → 2 次成功 + 1 次失败 → 查列表接口」:
total_calls=3 error_count=1 success_rate=66.7,未使用账号 100.0,max_tpm / proxy_url 正常返回。
另做 13 条缺陷注入的负向验证(含反向对照),源码 sha256 逐字节还原。