mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-21 11:25:03 +00:00
OAuth 账号被上游收走 image_generation 能力后,/v1/images/* 稳定返回同一句 400 (Tool choice 'image_generation' not found in 'tools' parameter),但网关不做 任何处置,坏号持续被排程选中(报告者实测连续 17 次同 body 400、窗口内 0 成功、 持续 3.5 小时,直到人工停调度)。 RateLimitService 的 400 分支是白名单式,只认 organization has been disabled / credit balance / identity verification is required 三句,其余 400 明确不处理; 唯一能兜任意 400 的 tryTempUnschedulable 又要求账号开启 temp-unschedulable 开关,OAuth 账号默认没开。两条路都不命中,shouldDisable 恒为 false,也没有任何 model 作用域冷却。 修复收窄到 sub2api 自建 body 的 images 管线:buildOpenAIImagesResponsesRequest 产出的 body 必定同时带 tool_choice 与匹配的 image_generation tool,这条路上出现 该 400 只可能是上游收了账号能力。forwardOpenAIImagesOAuth 在 upstreamCtx 上打 自建标记(覆盖其下游全部三个错误分支),共用错误入口读到标记才把该 400 判为能力 丢失,对 openai:image_generation 作用域冷却 30 分钟(对齐 upstreamModelNotFound Cooldown),不禁用整颗账号——账号对文本请求依然健康。 未采用 issue 建议①的全局签名匹配:handleOpenAIAccountUpstreamError 同时服务 passthrough 路径,客户端可自带「tool_choice 指 image_generation 但 tools 不带」 的请求触发一字不差的同一句 400,全局匹配等于任何 API 用户一句话即可禁用健康 账号。附 5 个测试,其中防毒杀用例在撤掉该闸门后会实测失败。建议②(连续 N 次 400 熔断)涉及跨请求状态与配置项,另议。 Fixes #4466 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>