Repository navigation
Commit 429cd2f
committed
fix: 修复计费周期清零、思考能力误关与额度显示取错数据源
本次修复覆盖代码审查中发现的全部 23 项缺陷。原则是「最小改动、不过度修复」:
能在桥接层/统计层根治的不在前端打补丁,能在上游语义层确认的不猜测网关行为。
- stats: 周期边界接受规则改为「先本地推进 → 拒绝非前进的陈旧报告 → 前进
幅度在 7 天内视为同周期 → 超过才清零」。原先按派生起点精确比较,边界
抖动 1 小时就抹掉本周期累计;且 /user/status 有 1 小时缓存,陈旧报告会
把已经滚进新周期的累计一起清零。首次观测只采纳边界、不清零,否则新装
会丢弃同步前累计的 credits。
- stats: addMonthsMs 把日夹取到目标月长度(3/31 减一月得 2/28,闰年得
2/29)。原先 AddDate 规范化月溢出(3/31 → 3/3),31 号重置的账号每月
都被误判为新周期并清零。
- stats: Report() 改为纯投影,不再推进边界、不再置 dirty。原先读路径带写
副作用,面板 15 秒轮询在跨周期瞬间就会清零并持久化本周期累计。
- stats: 滚动循环加「不推进即丢弃边界」与 2400 次循环上限。原先
addMonthsMs 对少数历史时区(如 America/Asuncion 1972-09)非严格递增,
循环在持锁下死循环会挂死整个进程。
- stats: 新增 ClearAccount()。原先 SetAccount(nil) 是 no-op,没有任何入口
能清除已持久化的账号快照。
- models: 能力判定改为「thinking_config.enabled 存在且非 null → 顶层
is_reasoning → 默认 true」,两个兜底方向统一为 true。原先只信顶层
flag,导致 dfmodel / kmodel_latest 的思考能力被静默关闭;且字段缺失时
为 false、整个目录不可达时为 true,同一部署内方向矛盾。
- models: 档位元数据改读真实的嵌套路径 thinking_config.disabled /
thinking_config.enabled.efforts,保留扁平旧格式兼容。原先读的扁平
efforts / supports_disabled 在真实目录里不存在,档位校验形同虚设,任意
字符串(含畸形值)都会被原样转发给上游。
- models: 新增 MaxRequestedOutputTokens = 1_000_000,调用方传入的
max_tokens 超出即钳制。原先 1e18 之类异常值会原样写入网关请求。
- models: normalizeEfforts 的 map 分支先排序,输出确定化。原先迭代顺序
随机,结果不可复现。
- bridge: 计费周期改以 /user/status 的 nextResetAt 为准,OpenAPI 的
expiresAt 仅在缺失时兜底且必须小于 2100-01-01。无期限套餐会把
expiresAt 填成 9999-12-31 哨兵值,原先它会覆盖真实边界,导致本地周期
滚动永久失效、面板显示「剩 2912178 天」。统计层加同样的守卫,使已落盘
的哨兵值不会永久拒绝后续真实上报。
- bridge: 元数据不可用时不再放行 reasoning_effort=none。未声明
thinking_config.disabled 的模型(gmodel / gfmodel / kmodel /
kmodel_latest)会以 HTTP 400 拒绝整个请求。
- bridge: resolveAccountStatus 用 5 秒派生超时包住 /user/status 查询。该
调用位于 refreshMu 临界区内,原先失败会串行阻塞所有等待续期的请求。
- bridge: 新增 errNoUserID 哨兵,首次 jobToken 交换不带 user id 属预期
降级路径,原先同样打 WARN。
- bridge: fetchAccountStatus 缓存命中分支改为返回克隆。原先直接交出内部
指针,调用方可绕过 accountMu 改写缓存。
- bridge: resolveMaxTokens 的钳制在 float64 域完成。原先依赖 int,32 位
构建下 int(1e18) 会回绕并被判为非法,静默回退目录缺省值。
- bridge: parallel_tool_calls 保持原有顶层落点,注释改为陈述事实(网关
是否读取尚未验证),并补测试锁定,搬移或删除都必须是显式变更。
- admin: 「合计剩余」只累加 available 的池子。原先不可用池子仍全额计入,
同一张卡上逐行标「不可用」、汇总却把它算进可用合计。
- admin: 额度池 total=0 视为不存在,首行不再固定取 userQuota。免费账号
的套餐池 total=0、真实额度在 addOnQuota,原先首行渲染成「套餐 8 / 0 ·
剩 0」加红色超额徽标。
- admin: 移除恒真的 total >= 0 死分支。
- auth: 上游响应日志降为 status + duration,去掉 headers 与 body;非 200
路径的错误体先按 key 脱敏、再按 rune 边界截断,AuthError.Error() 内部
同样脱敏(Detail 保持原始供分类使用)。原先每分钟一次打印完整响应体
(含 userId、trace id、配额明细),约 2 MB/天。
- transform: Usage.Billable 加 json:"-",仅内部传给
stats.Usage.NonBillable。原先它会随 usage chunk 序列化给 OpenAI 客户端,
billable=false 会被误读为「这次没算钱」。
- main: 额度刷新 goroutine 纳入优雅关闭(独立的 accountStop /
accountDone,先 join 再触发最终 flush)。原先它的写回会落在 flush 之后
并静默丢失。
- main: shutdown 的 drain 与 join 并发启动,但等待 drain 完成后才取消
context。原先 join 一完成即 cancel,SIGTERM 时会中断所有在途流式请求。
- main: 停止流程用 sync.Once 保证幂等,首个信号后注销 handler,重复触发
不再 panic。
- main: PAT 变更(含清空)后清除账号快照;写入与清除共享 patWriteMu 并
在锁内复核 PAT,关闭「在途刷新写回已被清除的旧账号」的时序窗口;启动
时清一次持久化快照以覆盖重启场景。
- README: 说明 parameters.max_tokens 总是发送属本次的行为变更、档位实效
(除 none 外差异落在采样噪声内)、周期边界接受规则,以及「合计剩余」
只统计可用池子的口径。
验证:go build ./... / go vet ./... / go test ./... -count=2 全绿;
GOARCH=386 与 5 个时区(UTC、Asia/Shanghai、America/New_York、
Pacific/Chatham、Australia/Lord_Howe)全绿;改动文件去 CRLF 后 gofmt
无差异。关键回归测试均经变异验证:回退修复即失败。1 parent 4272ed6 commit 429cd2f
15 files changed
Lines changed: 2450 additions & 113 deletions
File tree
- admin
- auth
- bridge
- models
- stats
- transform
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
153 | 153 | | |
154 | 154 | | |
155 | 155 | | |
156 | | - | |
| 156 | + | |
157 | 157 | | |
158 | 158 | | |
159 | 159 | | |
| |||
179 | 179 | | |
180 | 180 | | |
181 | 181 | | |
| 182 | + | |
| 183 | + | |
182 | 184 | | |
183 | 185 | | |
184 | 186 | | |
185 | 187 | | |
186 | | - | |
187 | | - | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
188 | 192 | | |
189 | 193 | | |
190 | 194 | | |
| |||
246 | 250 | | |
247 | 251 | | |
248 | 252 | | |
| 253 | + | |
| 254 | + | |
249 | 255 | | |
250 | 256 | | |
251 | 257 | | |
| |||
268 | 274 | | |
269 | 275 | | |
270 | 276 | | |
271 | | - | |
| 277 | + | |
| 278 | + | |
272 | 279 | | |
273 | 280 | | |
274 | 281 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
337 | 337 | | |
338 | 338 | | |
339 | 339 | | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
340 | 389 | | |
341 | 390 | | |
342 | 391 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1345 | 1345 | | |
1346 | 1346 | | |
1347 | 1347 | | |
1348 | | - | |
| 1348 | + | |
| 1349 | + | |
| 1350 | + | |
| 1351 | + | |
1349 | 1352 | | |
1350 | 1353 | | |
1351 | 1354 | | |
1352 | 1355 | | |
1353 | | - | |
| 1356 | + | |
1354 | 1357 | | |
1355 | 1358 | | |
1356 | 1359 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| 29 | + | |
29 | 30 | | |
30 | 31 | | |
31 | 32 | | |
| |||
343 | 344 | | |
344 | 345 | | |
345 | 346 | | |
346 | | - | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
347 | 352 | | |
348 | 353 | | |
349 | 354 | | |
| |||
408 | 413 | | |
409 | 414 | | |
410 | 415 | | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
411 | 540 | | |
412 | 541 | | |
413 | 542 | | |
| |||
498 | 627 | | |
499 | 628 | | |
500 | 629 | | |
501 | | - | |
| 630 | + | |
502 | 631 | | |
503 | 632 | | |
504 | 633 | | |
| |||
695 | 824 | | |
696 | 825 | | |
697 | 826 | | |
698 | | - | |
699 | | - | |
| 827 | + | |
| 828 | + | |
700 | 829 | | |
701 | | - | |
| 830 | + | |
| 831 | + | |
| 832 | + | |
| 833 | + | |
702 | 834 | | |
703 | 835 | | |
704 | 836 | | |
| |||
841 | 973 | | |
842 | 974 | | |
843 | 975 | | |
844 | | - | |
| 976 | + | |
845 | 977 | | |
846 | 978 | | |
847 | 979 | | |
| |||
1084 | 1216 | | |
1085 | 1217 | | |
1086 | 1218 | | |
1087 | | - | |
| 1219 | + | |
1088 | 1220 | | |
1089 | 1221 | | |
1090 | 1222 | | |
| |||
0 commit comments