Repository navigation
v0.9.30
AutoBuddy v0.9.30
修复账号卡片读停更旧 JSON 导致新账号模型不显示、429 响应体进日志、×N 重复打印。
1. 新账号有调用次数,模型却不显示
现象
用户反馈:新加的账号调用次数是 11 次,但模型没体现出来。
实测
账号 17521565831(16acb0ee)在用量明细里确实有 18 条记录:
deepseek-v4.1-flash 1 次
glm-5.3 8 次
hy4-preview-f 9 次
但 /api/account-models 返回它的 used / gatewayCalls 全为 None。
根因:v0.9.29 迁移引入的回归
/api/account-models 仍直接读 token_stats_logs.json:
tracker_file = data_dir / "token_stats_logs.json"
with open(tracker_file, "r", encoding="utf-8") as f:
tracker_logs = _json.load(f) or []而这个文件在 10-02 迁移到 SQLite 后就再没被写入过 ——
mtime 与最新记录都停在 10-02 14:06。
新账号的调用只存在于 SQLite,旧 JSON 里根本没有,于是看起来
就像「新账号没被调用过」。
修复
新增 token_tracker.load_tracker_records():读取明细时自动走当前
存储后端(SQLite 或 JSON)。调用方不该再直接读那个 JSON 文件 ——
否则换后端时又会出现同样的双份数据源问题。
account-models 改用它;新路径失败时退回旧文件兜底,绝不整页空白。
2. 上游非 200 的响应体现在会记进日志
排查 429 时发现一个阻碍定性的缺口:日志里只有状态码,
rate limit / quota / 上游错误体一条都没有。
于是同一个 429 无法区分:
| 可能 | 处理 |
|---|---|
| 速率限流 | 等一会儿就好 |
| 额度耗尽 | 得充值或换号 |
历史上额度耗尽正是 HTTP 429 + code=14018 Credits exhausted ——
两者都是 429,没有响应体就只能靠猜。
新增 _log_upstream_error(),挂在 _looks_like_model_unavailable()
这个两条转发路径(流式 / 非流式)的共同判定入口上,覆盖每一次
上游错误。写入前抹掉 requestId / traceId(每次都不同,不抹掉
就是一条一条刷屏),并截断到 400 字符。
3. 周期汇报的 ×N 不再每个周期重复打印
实测数据
2727 条 ×N 行里,835 条与上一条一字不差;/health 更是
连续 27 条 ×1 完全相同。
三个成因,两个要修
① ×N 字符本身是正确的(不用改)
实测 200 ×6 的字节为 c39736,即 U+00D7 × + 6 ——
符号与数字各一个,不存在「重复」。用户看到的「重复」是整行重复。
② 周期汇报绕过了黑名单(修)
周期汇报是直接 print,不走 logging filter,所以 NOISY_PATHS
黑名单对它无效 —— /health 这类探活接口每 60s 稳定产出一条,
独占 1561 条。新增 _is_noisy_access(),复用同一份黑名单静音它们。
③ 同内容同次数 = 没有新信息(修)
与上一周期同内容且同次数的汇报不再打印
(_ACCESS_DEDUP_LAST_PRINTED 记录上次打印值)。
测试
全量 19 个测试文件 ✅ 全绿
五模块 AST ✅ 通过
注入 JS node --check ✅ 通过
升级说明
重建容器即可,/data 数据不受影响。
- 无数据库结构变更;
- 本次修复的账号卡片问题,升级后立即生效(不再依赖停更的旧 JSON);
- 旧 JSON 文件保留在原地不删,但已无任何读取方依赖它。