Skip to content

v3.1.3

Choose a tag to compare

@github-actions github-actions released this 04 Nov 02:22
· 17 commits to main since this release

v3.1.3 主打 模型输出失控防护(#845) 和 Antigravity 配额门禁按模型族隔离(#848/#850),同时补上额度受限后的续聊换号、Responses 上下文落盘、降智检测自适应退避,并修复 Claude 账号自动暂停阈值的百分比换算(#843)。

Features

  • 模型输出失控防护(#845,@ggg17226)。 生产中遇到过模型在工具参数里无限重复输出:下游每收到一个 arguments 增量都要全量重解析,计算量呈 O(n²),最终拖死客户端。新增的防护对 Responses、Chat Completions、Anthropic、Gemini、Grok 原生流以及下游 WebSocket 做周期重复、工具参数增量泛洪、字节预算超限和终态滥用检测。命中后先取消上游、丢弃缓冲,再向下游返回 502 model_output_guard_triggered(WebSocket 为 error 帧 + 1013 关闭);不自动重试,也不扣账号健康分;usage_logs 记录为 upstream_error_kind=model_output_guard。各项上限在设置页配置(工具 ≤ 通道 ≤ 请求),多实例 5 秒轮询同步。默认关闭。 无论是否开启,SSE 单行/单事件都新增 8 MiB 硬上限。贡献者提供了生产 6 小时巡检数据(3829 请求、命中 28 次、未误杀正常流),以及 1 MiB 单流 race 下 CPU 开销 1.23% 的性能数据。

  • 额度受限后续聊可换号,Responses 上下文可落盘恢复(#838,@dundunge)。 以前绑定账号额度用尽或触发阈值自动暂停时,续聊只能失败。现在 HTTP 与 WebSocket 续聊在上下文可完整重放时会解绑并换到其他符合条件的账号;含不可迁移引用、加密压缩状态或工具调用不配对时仍返回错误。Memory 缓存 + SQLite 主库部署下,上下文还会写入主库同目录的独立文件 response-context.db:按内容去重,默认滑动保留 48 小时,总量上限 2 GiB;L1 淘汰或进程重启后可从磁盘恢复。Redis 模式继续使用共享后端。

  • 新增 reset_5h_first 调度模式与按账号定时测试(#838,@dundunge)。 新调度模式在既有优先级和健康档内,优先使用 5h 窗口最早重置的可用 Codex 账号。账号可配置工作日/周末定时测连(默认关闭):开启后会向真实上游发请求、消耗额度,失败不重试,错过的时间点不补发,也不保证能激活或重置额度窗口。详见 docs/RESET_5H_PRIORITY.md。

  • Antigravity 配额门禁按模型族隔离,可选临期优先调度(#848,@yanhao98 提出;#850)。 上游配额只按桶下发,旧实现把所有桶混在一起:3p-weekly 用完后,同号的 Gemini 请求也会被挡,即使 gemini-weekly 还是满的。现在按 ID 前缀把桶和模型归入 Gemini、Claude+GPT、Argon 三族;整号只在所有已识别族都耗尽时才阻断。选号、429 Retry-After 和配额压力都按请求模型所在族计算;未知桶和未知模型保持原来的整号口径。新增的 expiry_priority_enabled(默认关闭,时间窗 1–168 小时,默认 24 小时)开启后,round_robin 模式下请求模型所在族的周配额临近重置、且剩余 ≥5% 的账号优先承接新会话,减少周额度过期浪费。Argon 桶的真实 ID 尚未用 Ultra 账号确认,目前按前缀匹配。

  • 降智检测自适应退避与渐进恢复(#849,@bikeread)。 以前已被检测暂停的账号仍按固定间隔探测,出错后还会切到更短的重试间隔,上游长时间不可用时会产生大量无效探测。新增的自适应模式(默认关闭)让自动暂停的账号按指数退避,上限可配置;首次通过后改用短间隔确认,达到原有恢复阈值才恢复调度。退避状态重启后保留;凭证被上游明确拒绝时,暂停该代凭证的自动检测,更新凭证后恢复。详见 docs/INTELLIGENCE_BACKOFF.md。

  • API Key 自助用量页补齐并发与请求日志详情(#847,@bxb1337)。 自助页新增资源范围(自动 / Codex / Claude 等)和当前并发 / 上限显示(每 5 秒刷新,页面隐藏时暂停)。请求日志补充客户端 IP、UA、思考强度、独立思考 Token、缓存读写、首字与总耗时、tok/s。展示组件与管理页共用。

Fixes

  • Claude 账号与共享分组弹窗的自动暂停阈值按百分比换算(#843,@xpzhang 报告)。 Claude 单号调度弹窗和各渠道共用的分组管理弹窗标注"(%)",却把输入值原样提交给只接受 0..1 的后端,填 95 会报"超出范围,必须在 0..1 之间",回显也显示小数。现在两处与 Codex 页、全局设置页一样,提交时 ÷100、回显时 ×100,保存前校验 0–100 并允许小数。换算逻辑抽成共享模块并补了单测。之前按变通办法填 0.95 存下来的值本身正确,升级后会显示为 95,无需处理。

  • Codex 维护请求与 OAuth 刷新统一使用对话身份(#846,@bxb1337)。 以前维护请求要单独打开"统一身份"开关,OAuth 换码固定带旧版 codex-cli/0.91.0 UA,刷新请求也不复用配置的身份。现在删除这个开关:维护请求、模型清单发现和令牌刷新都走与对话相同的身份解析和账号覆盖;刷新改为 JSON 并携带 refresh_reason。身份配置无法解析时直接报错,不再回退到内置身份。

  • OAuth 换码与刷新改用 Chrome TLS 指纹,设备画像默认固定(#839,@frank8ai)。 RT 刷新和管理端授权码换取不再使用 Go 标准 TLS 栈,避免暴露 Go 指纹。STABILIZE_DEVICE_PROFILE 默认改为 true,同一账号的设备/系统画像不再在请求间漂移。示例配置改为推荐 CODEX_TRANSPORT_MODE=utls_chrome,代码默认值不变。

  • Antigravity 保留延迟加载工具的原始身份(#842,@frank8ai)。 Responses 的命名空间工具、自定义工具、工具搜索声明、搜索加载的工具、调用历史和强制 tool_choice,现在被桥接为扁平 Gemini 函数,并在 JSON、原生 SSE、缓冲 SSE 三条回包路径上还原原始身份。流式函数调用只按相同 call ID 合并,参数相同的独立调用不再被合并成一个。

  • 上下文错误码、413 诊断、模型清单与定价(#838,@dundunge)。 上下文不可用的错误码从 response_context_unavailable 改为 previous_response_not_found,提示客户端重发完整上下文。413 响应补充上限、检测阶段和实际观测大小。合并实时上游清单与账号快照时,未观测账号不再清空上游能力字段。新增 gpt-6.1-terra 内置定价。

  • 依赖安全更新。 golang.org/x/net 升级到 v0.62.0,修复 GO-2026-6860。

Upgrade Notes

  • 数据库迁移: system_settings 自动新增 6 列输出防护配置(output_guard_*),只加列且默认关闭;SQLite / PostgreSQL 启动时自动完成,无需手动操作。降智检测的自适应配置写入现有 JSON 字段,不迁移、也不自动启用已有账号。
  • 默认行为变化:
    • Memory 缓存 + SQLite 主库部署会在主库同目录生成 response-context.db,最多占用约 2 GiB 磁盘。该文件包含会话上下文内容,不在主库备份范围内,请按部署环境评估访问权限与保留策略。用 RESPONSE_CONTEXT_STORE_PATH=off 关闭;用 RESPONSE_CONTEXT_STORE_TTL_HOURS / RESPONSE_CONTEXT_STORE_MAX_MB 调整保留时长和容量。
    • STABILIZE_DEVICE_PROFILE 默认改为 true;需要恢复旧行为时显式设为 false。
    • 上下文不可用的错误码改为 previous_response_not_found;依赖旧错误码 response_context_unavailable 的客户端需要调整。
    • 设置页的 Codex"统一客户端身份"开关已移除;客户端身份配置无法解析时,维护请求与 OAuth 刷新会报错,不再回退。
    • SSE 单行 / 单事件 8 MiB 硬上限始终生效,与输出防护是否开启无关。
  • 默认关闭、需手动开启的新功能: 输出失控防护、Antigravity 临期优先调度、reset_5h_first 调度模式、按账号定时测试、降智检测自适应退避。
  • 建议升级。 使用 Claude 账号自动暂停阈值、Antigravity 多模型族账号,或需要防范模型输出失控的部署建议升级。
  • 本次验证范围。 发布源码提交的 GitHub CI 通过(含 race 分片、PostgreSQL 兼容与静态检查);proxy-a-g 分片首轮因已知的生图选择性重试计数 flake(TestForwardImagesSelectiveRetryBuffersWholeExplicitErrorAttempt)失败,与本次改动无关,重跑通过。前端 445 项 lib 测试与类型检查通过。本地 PostgreSQL + Redis 2004 容器已用发布前源码重建并通过健康检查。Antigravity 模型族门禁未在真实 V2 配额快照号池上实测,Argon 桶 ID 待确认;会话换号、上下文落盘、定时测试和输出防护的真实上游效果依赖贡献者提供的验证,本次发版未重复。

致谢

  • @ggg17226 — 模型输出失控防护(#845)。
  • @dundunge — 续聊换号、上下文落盘、reset_5h_first 调度、定时测试与诊断改进(#838)。
  • @bikeread — 降智检测自适应退避与渐进恢复(#849)。
  • @bxb1337 — Codex 维护/OAuth 身份统一与密钥自助用量页(#846、#847)。
  • @frank8ai — OAuth TLS 指纹加固、设备画像固定与 Antigravity 延迟工具身份修复(#839、#842)。
  • @yanhao98 — 提出 Antigravity 模型分桶感知与临期优先调度需求(#848)。
  • @xpzhang — 报告 Claude 账号自动暂停阈值百分比问题(#843)。

Full Changelog: v3.1.2...v3.1.3