Skip to content

v0.9.30

Choose a tag to compare

@deltrivx deltrivx released this 05 Oct 15:10
· 1 commit to main since this release

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 文件保留在原地不删,但已无任何读取方依赖它。