- [安全增强] 优化与原生对齐应用层与底层特征指纹,提升请求稳定性与防拦截能力。
- [核心修复] 将 v1beta thinkingLevel 转换为 v1internal thinkingBudget (PR #2095):
- 问题根源: OpenClaw、Cline 等客户端发送 v1beta 格式的
thinkingLevel字符串("NONE"/"LOW"/"MEDIUM"/"HIGH")到generationConfig.thinkingConfig。当 AGM 通过 Google v1internal API 代理请求时,Google 会因为 v1internal 仅接受数字型thinkingBudget而拒绝请求,返回400 INVALID_ARGUMENT。 - 修复方案: 在
wrap_request()的现有 budget 处理逻辑之前,新增一个早期转换步骤:检测thinkingLevel字符串,将其映射为对应的数字thinkingBudget(NONE→0,LOW→4096,MEDIUM→8192,HIGH→24576),然后删除thinkingLevel字段并写入thinkingBudget,确保下游所有 budget 处理逻辑(预算封顶、maxOutputTokens调整、自适应检测)都能看到正确的数值预算。 - 测试: 已验证 OpenClaw 发送
thinkingLevel: "LOW"到gemini-3.1-pro-high(Gemini 原生协议),请求现返回200 OK,不再报 400 错误。
- 问题根源: OpenClaw、Cline 等客户端发送 v1beta 格式的
- [核心修复] 账号数据损坏与后台任务无限循环修复 (PR #2094):
- 问题根源: 当用户在设置中输入过大的刷新间隔值(如 999999999)时,
interval * 60 * 1000超过 JS 引擎 32 位有符号整数上限2,147,483,647ms,浏览器会将setInterval延迟静默截断为 1ms,导致前端每秒触发数千次refreshAllQuotas/syncAccountFromDb请求,进而引发多线程并发写同一[uuid].json文件,造成字节流交错、JSON 尾部残留,账号数据永久损坏。 - 原子文件写入 (
account.rs):save_account改为先写入 UUID 后缀的临时文件,再通过fs::rename(POSIX)/MoveFileExW(Windows)原子替换目标文件,与已有的save_account_index保持一致,从根本上消除并发写导致的 JSON 损坏。 - setInterval 溢出保护 (
BackgroundTaskRunner.tsx): 对refresh_interval和sync_interval两个定时器的延迟参数加上Math.min(..., 2147483647)上界限制,防止超过 INT32_MAX 后被浏览器截断为 1ms 无限循环。 - 输入验证 (
Settings.tsx): 将refresh_interval和sync_interval输入框的max属性从60更新为35791(35791 min × 60000 < INT32_MAX),并在onChange中添加NaNfallback(默认为 1)及范围夹紧[1, 35791],从源头阻断非法值输入。
- 问题根源: 当用户在设置中输入过大的刷新间隔值(如 999999999)时,
- [核心优化] OAuth 换票专属:剔除 JA3 指纹与动态 User-Agent 伪装:
- 纯净请求: 仅针对
exchange_code(首次授权)和refresh_access_token(静默续期)的换票请求,移除了底层网络库的 Chrome JA3 指纹伪装,恢复标准纯净的 TLS特征。 - 动态 UA: 换票时自动提取编译时版本号 (
CURRENT_VERSION) 构建专属的User-Agent(如vscode/1.X.X (Antigravity/4.1.23)),以匹配纯净 TLS 链路。
- 纯净请求: 仅针对
- [功能增强] API 反代页面与设置页模型列表全面接入动态模型数据:
- 问题根源: "API 反代 → 支持模型与集成"列表与"模型路由中心"的目标模型选择下拉框,以及"设置 → 固定配额模型"列表,此前均仅从静态
MODEL_CONFIG读取硬编码模型信息,导致账号实际下发的动态新模型(如GPT-OSS 120B、Gemini 3.1 Pro (High)等)无法出现在这些列表中。 - 修复方案:
- 重构
useProxyModelsHook:以账号quota.models动态数据为第一优先数据源,聚合所有账号里所有模型的display_name(为主展示名称)和name(为模型 ID);MODEL_CONFIG仅作为图标/分组的样式补充,以及无账号数据时的静态兜底。 - 新增自动懒加载逻辑:
ApiProxy页面本身不调用fetchAccounts,现在 Hook 内部检测到 store 为空时自动触发,保证动态模型在任意导航路径下均可正常展示。 - 重构
PinnedQuotaModels组件:采用同等策略,从useAccountStore拉取全账号动态模型,并修复了已固定的 "thinking" 类型模型显示"未知"的问题,改为优先展示其真实display_name。
- 重构
- 去重优化: 所有列表均基于模型原始
name(小写)去重,并额外过滤掉-thinking后缀的 MODEL_CONFIG 静态别名条目(这类变体已由账号数据中的supports_thinking标记覆盖)。
- 问题根源: "API 反代 → 支持模型与集成"列表与"模型路由中心"的目标模型选择下拉框,以及"设置 → 固定配额模型"列表,此前均仅从静态