Skip to content

[Bug]: Gemini CLI 短时 429 冷却被转换为 500「当前无可用凭证」 #417

Description

提交前确认

  • 我已经搜索过现有的 issues,确认这不是重复问题
  • 我已经阅读过项目文档

是否是最新版

是,使用最新版

调用的是哪个渠道

geminicli

调用的是哪个模型

gemini-3,1-pro

调用的是哪个格式

openai 格式

具体报错内容

Google 上游返回:
HTTP 429
status: RESOURCE_EXHAUSTED
reason: RATE_LIMIT_EXCEEDED
message: You have exhausted your capacity on this model. Your quota will reset after 28s.

随后 gcli2api 日志:
[GEMINICLI RETRY] 429 error encountered, retrying (attempt 2/2)
[NON-STREAM] 重试请求 (attempt 3/3)...
[NON-STREAM] 重试时无可用凭证或刷新失败

客户端最终收到:
HTTP 500
{"error":"当前无可用凭证"}

Google 提示等待 28 秒,但 gcli2api 在冷却结束前获取凭证失败,将原始 429 替换为了 500。

错误描述

单个可用凭证下,连续请求或多轮工具调用时,Google 返回:

429 / RESOURCE_EXHAUSTED / RATE_LIMIT_EXCEEDED
Your quota will reset after 28s.

gcli2api 将该凭证对应模型设置为冷却,但随后只按较短的固定间隔重试。由于冷却尚未结束,获取不到可用凭证,最终向客户端返回:

HTTP 500
{"error":"当前无可用凭证"}

预期:保留原始 429 和恢复时间,或者在有上限的等待后重试。
实际:可恢复的短时限流被转换成通用 500,导致工具调用链中断。

此问题不要求真正并发;连续的模型请求也能触发。

补充信息(可选)

检查 src/api/geminicli.py 后发现,冷却状态写入前预取的凭证也可能在重试时被复用。

本地修复方案:

  1. 写入冷却状态后重新选择凭证,避免使用过期的预取结果。
  2. 全部凭证冷却时,按恢复时间进行可取消、有累计等待上限的等待。
  3. 等待超限或重试耗尽时,保留原始错误和 Retry-After。
  4. 流式已经输出内容后,不从头重试,避免重复输出。

修改后实测:连续两轮工具调用成功,第三轮遇到限流,等待后正常返回最终文本,整轮约 59 秒。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions