你让 Gemini CLI 查看一张图片,ReadFile 成功读取了 .png,结果下一轮就返回 400 INVALID_ARGUMENT,消息是 Requests ending with a model turn are not supported.。此后同一会话中的每次调用都以同样方式失败。在 0.66.0 版本(截至 2026 年 11 月 4 日 npm 上的 latest)中,已确认的原因是一处模型名称判断无法识别带点号的 ID,例如 gemini-3.8-flash。先用 /clear 离开当前会话,再从下面三种绕过方法中选一种。
"Requests ending with a model turn are not supported" 错误长什么样?
读取图片之后,会按顺序出现三行。issue google-gemini/gemini-cli #30074 中的报告正是如此:
✓ ReadFile Screenshot (209).png → Read image file: Screenshot (209).png
[System: You successfully executed a tool but returned an empty response. Please analyze the tool output and explain your progress or final answer.]
✕ [API Error: [{
"error": {
"code": 400,
"message": "Requests ending with a model turn are not supported.",
...
"status": "INVALID_ARGUMENT"
}
}]]
中间那行以 [System: You successfully executed a tool but returned an empty response 开头,说明模型在读取后返回了空响应。如果它出现在 400 之前,就是本文说的情况。
为什么 Gemini CLI 读取图片会出错?
因为在 0.66.0 中,图片没有放在工具响应里送达模型。packages/core/src/config/models.ts 中的 supportsMultimodalFunctionResponse 函数用 model.startsWith('gemini-3-') 来判断。带点号的 ID 通不过这个判断,于是图片作为独立的兄弟 part 放在 functionResponse 旁边,而不是嵌套在其中。修复它的 PR #29982 的说明解释了这一机制。
拿不到图片,模型返回空响应,CLI 插入空响应提示,发给 API 的历史以模型轮次结尾。API 以 400 拒绝这种格式。最后这段因果链是 issue #30074 中贡献者的分析,不是 Google 的官方说法。
| 会话中的模型 ID | 能通过 startsWith('gemini-3-')? | 0.66.0 是否受影响 |
|---|---|---|
gemini-3-pro-preview | 是 | 否 |
gemini-3-flash-preview | 是 | 否 |
gemini-3.1-pro-preview | 否 | 是 |
gemini-3.1-flash-lite | 否 | 是 |
gemini-3.5-flash | 否 | 是 |
gemini-3.5-flash-lite | 否 | 是 |
gemini-3.8-flash | 否 | 是 |
如何离开卡住的会话?
运行 /clear。根据命令参考,它会清除对话上下文并开始新会话。在同一会话中重试没有用:历史已经以错误的轮次结尾,每次新调用都会重复 400。
/clear
再次请求读取图片之前,先应用下面的某种绕过方法。否则下一次读取图片会以同样方式卡住新会话。
如何让 read_file 在 0.66.0 中正常读取图片?
开启动态模型配置。开启后,同一个函数会跳过前缀判断,改为读取模型定义;在 0.66.0 的 defaultModelConfigs.ts 中,上表所有 Gemini 3 模型都带有 multimodalToolUse: true。编辑 ~/.gemini/settings.json:
{
"experimental": {
"dynamicModelConfiguration": true
}
}
配置文档将此键标注为 Requires restart: Yes,所以要关闭并重新打开 CLI。这是一个实验性选项,也会改变模型定义和解析的读取方式。如果 /model 中出现异常,请改回 false。
能不能绕开工具直接发送图片?
可以,在提示词里用 @。@路径 在内部使用 read_many_files,把内容插入你的消息,而不是工具响应,因此不会触发 functionResponse 的问题。
@docs/login-screen.png 登录按钮错位了,CSS 改了什么?
有两点要注意,都来自 0.66.0 的代码。只有写明文件名或扩展名,图片才会被读取:只写 @docs/ 时,图片会被跳过,原因是 asset file (image/pdf/audio) was not explicitly requested by name or extension。另外,路径中的空格要用反斜杠转义,例如 @screen\ captures/login.png。
哪个 Gemini CLI 版本已经包含修复?
目前只有 nightly。PR #29982 于 2026 年 10 月 28 日合入 main,比 0.66.0 晚一天。我们逐个检查了 npm 各渠道中的这个文件:
| npm 渠道(2026-11-04) | 版本 | 是否包含修复 |
|---|---|---|
latest | 0.66.0 | 否 |
preview | 0.67.0-preview.0 | 否 |
nightly | 0.67.0-nightly.20261104 | 是(自 10 月 30 日的 nightly 起) |
npm install -g @google/gemini-cli@nightly
nightly 是每日构建,可能带来其他问题。要回到稳定版,运行 npm install -g @google/gemini-cli@latest。issue #30074 仍未关闭:一位贡献者指出了第二处问题,即 geminiChat.ts 中 ensureTerminalUserTurn() 与 stripToolCallIdPrefixes() 的执行顺序,仍可能让历史以模型轮次结尾。如果在 nightly 上错误再次出现,@路径 仍是最稳妥的绕过方法。
如果你想在终端里使用编程代理,又不想每次重试都计算 token,Verboo Code 提供无限 token。



