Skip to content

fix(gemini): Vertex SA 已删除时停用账号并换号,401 临时不可调度规则首次命中不再永久停用 - #8076

Merged
Wei-Shaw merged 2 commits into
Wei-Shaw:mainfrom
feeeei:fix/gemini-vertex-sa-and-error-policy
Oct 15, 2026
Merged

Wei-Shaw merged 2 commits into
Wei-Shaw:mainfrom
feeeei:fix/gemini-vertex-sa-and-error-policy

Conversation

@feeeei

@feeeei feeeei commented Oct 14, 2026

Copy link
Copy Markdown
Contributor

背景

修复 Gemini 账号停用判定的两个问题,分两个提交。

  1. Vertex SA 已删除时不停号也不换号。SA 删除后换 token 返回 400 {"error":"invalid_grant","error_description":"Invalid grant: account not found"}。三条转发路径把它当成本地构造请求失败直接回 502,账号一直可调度。生产上出现过恢复账号后一小时内持续产生数千次 502 的情况。
  2. 账号级 401 临时不可调度规则首次命中即永久停用。三条转发路径对同一个上游错误响应检查了两次错误策略:第一次写入 401 暂停记录,第二次读回这条记录,当成重复 401,在同一个请求里把账号 SetError。

改动

  • 只精确匹配上面这个 400(invalid_grant 还涵盖时钟偏差等情况,不放宽)。命中后把账号置为 error 并停止调度,Ops 事件按 stage=account_auth 记录,返回 401 failover 换号。其他换 token 失败保持现状。
  • 重试循环内的错误策略检查结果带到循环外复用。循环内没检查过的最终响应在循环外照常检查。

行为变化

  • 账号已有 401 暂停记录时,再次 401 仍升级为 error。
  • SA 已删除且所有账号都换号失败时,客户端收到的状态码与上游真实返回 401 时一致:原生和 /v1/messages 路径为 502,/v1/chat/completions 路径为 401。

测试

新增 unit 用例覆盖三条转发路径:SA 已删除时停号并换号、其他 invalid_grant 不受影响、首次 401 只临时不可调度(在 main 上会失败)、重复 401 升级为
error、循环内未检查的响应在循环外检查。go test -tags=unit ./internal/service/ ./internal/handler/... 通过,golangci-lint v2.14.0 无问题。

- 换取 SA access token 时 token 端点返回 400
  {"error":"invalid_grant","error_description":"Invalid grant: account not found"}
  表示服务账号已被删除,凭据再也换不到 token;此前三条 Gemini 转发路径把它当作
  本地构造请求失败直接回 502,不换号也不改账号状态,账号持续被调度
- 识别该错误后账号置为 error 并停止调度(Service account token rejected (400): …),
  记录凭据获取阶段(stage=account_auth)的 Ops 事件,请求交给 handler 换号
- 只匹配 400 + invalid_grant + account not found:invalid_grant 还涵盖时钟偏差、
  签名无效等情况,其他换 token 失败保持原行为
- token 端点地址改为包级变量,测试中替换为本地服务
- 三条 Gemini 转发路径在重试循环内和循环外各对最终上游错误响应检查一次错误策略。
  配了账号级 401 临时不可调度规则的 API Key / Vertex 账号首次收到 401 时,第一次
  检查写入 401 暂停记录,第二次检查读回该记录判定为重复 401,同一请求内即升级为
  error 永久停用
- 循环内的检查结果带到循环外复用;循环内未检查的最终响应(Claude 兼容层的签名 400
  分支、原生路径的 cachedContent 透传分支)仍在循环外检查
@Wei-Shaw
Wei-Shaw merged commit abdc827 into Wei-Shaw:main Oct 15, 2026
9 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 15, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants