Skip to content

v1.3.1

Choose a tag to compare

@shuishuipingan shuishuipingan released this 08 Oct 21:18
· 22 commits to main since this release

✨ 新增功能

① 测试工程化 —— tests/ 并发编排上线:

  • tests/run_all.py:并发、每套件独立日志、失败打 tail 25 行、强制 UTF-8、无匹配套件返回 2(防「0 passed / 0 failed → exit 0」这种假绿);
  • 11 个套件 / 747 条断言,含工作包点名的三类空白:代理不变量(参数穿透式断言 + 基线登记)、keep-alive 早拒(裸 socket)、前端 DOM 断言(首个 .js 套件,自读 dashboard.html + 内联元素桩);
  • 兼容入口保留:python _test_qoder.py 照旧可用;套件正逐段从它迁出(本轮已迁 2 段,legacy 仍承载其余 —— 迁移期间总数只增不减);
  • ⚠️ 一处更正:工作包让照抄的 wb tests/_dom_stub.js 并不存在(递归查 0 命中);它的真实做法就是「每个套件自读 dashboard.html + 内联手写约 15 行元素桩」,我们按后者实现,没有引入 jsdom(保住零依赖)。

② 账号退避 / 熔断 / 降权三族:

  • note_soft_rate(软限流指数退避:600 → 1200 → 2400,封顶 7200)· note_failure(硬错误熔断)· note_unknown_failure(未知错误降权)· note_success(统一复位入口);
  • 接线 6 处 —— 这正是教训所在:三族在接上调用点之前是死代码(有断言证明接线前 6 处计数全 0);
  • 防误接(反例断言):直连 401/403 · 信封 429(10605 排队,接了会让一次排队冷掉全账号) · 内容审核 · 402 余额不足 · 单号池 → 三族零调用;
  • 单号池不接(total>1 条件):单号池接熔断/长退避 = 变相打死账号;
  • 运维恢复:三族状态是内存态(不落盘)→ 重启即清 / 等窗口自动过(30 分钟起、封顶 6 小时);面板的「重新启用」走 clear_error,有意不清熔断。

③ 用量字段与聚合:

  • usage 行补 reasoning_effort / reasoning_effort_requested / key_id(全脱敏);三态可辨:同值 = 原样透传 · 不同 = 被挪档 · 空串 = 请求了但未下发;
  • 新增 GET /usage/by-key(与 /usage/by-account 逐字对称;sum(by_key) == sum(by_account) 不变量已断言;缺 key_id 的行归 (no-key) 桶、不丢弃);
  • 面板:最近请求表加 Key 与 档位 两列(档位三态一眼可辨)· 指标页新增按 API Key 用量透视(Key / 请求数 / 输入 / 输出(含思考)/ 缓存 / 总 token / 占比 / 积分 / 模型前 5,按 token 降序)。

🐛 问题修复

  • 临期积分分派:管道就绪、当前不触发 —— 实测上游 /quota/usage 不返回 per-package 到期字段(只有顶层 expiresAt,且它可能是「按月重置」而非「到期作废」)。处置:防御性透传(上游一旦补字段即自动生效、无需改码)+ 刻意不把顶层 expiresAt 贴到包级 —— 硬贴会让「按月重置」的额度被优先消耗(反向浪费)。

🎨 体验优化:见 ③ 的两处 UI(档位三态 + 按 Key 透视)。

⚠️ 其他变更

  • 测试方法论(写入团队配方):parity 类断言只能用 requests / token / credit(models 是前 5 名截断的展示字段,拿它求和必假失败);error 行两侧都跳过;窗口按 row["at"](epoch)过滤、完全不看 iso,且缺 at 的行被当 0(夹具必须给 at);窗口边界是闭区间;桶数不等是正常语义(一个 Key 可打多个账号)。
  • 验证配方补充:任何「逐字节一致」类对照必须用固定夹具或同一份快照 —— 真实日志仍在被追加(analytics 统计 error 行、 by_account 跳过),否则会把「日志在长」误判成「改动引入差异」。

验证

  • 双入口全绿:python tests/run_all.py → 11 suites / 747 checks / 0 failed;python _test_qoder.py → 658 checks / 0 failed / 4 skipped;
  • 每个新套件都有「改坏 → 必红」自证(本轮 6 条:护栏等号边界 · 代理绕过点 · 前端配色 · 三族接线计数 · parity 口径 · dashboard 渲染);
  • 三族接线:接线前 6 红(计数全 0,正是 6 个待接点)→ 接线后 13 绿;
  • parity 修绿的过程本身也是个证据:期望值先按实测口径重算(无窗口 645 / day 145),而不是改实现去迁就断言。