提交前确认
是否是最新版
是,使用最新版
调用的是哪个渠道
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 后发现,冷却状态写入前预取的凭证也可能在重试时被复用。
本地修复方案:
- 写入冷却状态后重新选择凭证,避免使用过期的预取结果。
- 全部凭证冷却时,按恢复时间进行可取消、有累计等待上限的等待。
- 等待超限或重试耗尽时,保留原始错误和 Retry-After。
- 流式已经输出内容后,不从头重试,避免重复输出。
修改后实测:连续两轮工具调用成功,第三轮遇到限流,等待后正常返回最终文本,整轮约 59 秒。
提交前确认
是否是最新版
是,使用最新版
调用的是哪个渠道
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 后发现,冷却状态写入前预取的凭证也可能在重试时被复用。
本地修复方案:
修改后实测:连续两轮工具调用成功,第三轮遇到限流,等待后正常返回最终文本,整轮约 59 秒。