前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
返回 AI 情报前线
All News · 全部资讯9792
  • Liquid开放24B推理模型,面向本地Agent
  • AWS 开源 2B 决策模型,专做选项判断
  • AI 代码审查太吵,会让真问题被忽略
  • Gemini 视频转仿真演示打通机器人训练
  • RAG 检索不准,先评测嵌入模型
  • 实测 agent-hooks:演示不等于兼容认证
  • 让 Claude Code 直接查询 Grafana 排障
  • Copilot 正式接入 Gemini 4 Argon
  • AI 写码的回报取决于审查与反馈
  • 128GB 苹果芯片 Mac 的 oMLX 部署调优
  • CodeAct 用可执行代码组织 Agent 行动
  • 实测 agent-hooks 在执行前拦截超额退款
  • 用 Python 与 Claude 搭建文本清洗流水线
  • 长任务 Agent 如何保存和恢复工作状态
  • 谷歌旗舰 Argon 开放全球 API 接入
  • GitHub 用上下文模型改进密钥扫描
  • 自动化管理 Bedrock 跨账号定价授权
  • AI Studio个人应用可直接经Play安装
  • 企业问答如何选型:检索增强还是微调
  • 日志与搜索结果如何成为提示注入入口
  • Gemini CLI 自动化为何受终端环境影响
  • Gemini 夜间优化二十万行 Python 项目
  • Gemini 4 Argon 将物理推理接入机器人开发
  • n8n 接入 Gemini 4,串联 MCP 与智能体
  • 自然语言安全查询如何降低成本与延迟
  • DeepMind 发布 Gemini 4 Argon 前沿模型
  • Gemini 4 付费上线,API 限时半价
  • Gemini 4 Argon统一百万Token额度
  • Gemini 4 发布,宣称提升编程与复杂推理
  • Google 向开发者开放 Gemini 4 Argon
  • 用 Slack 智能助手打通 IT 支持流程
  • Grok 4.7 智能体如何平衡推理成本
  • Copilot 企业策略支持启动时强制刷新
  • MoE 内核优化提升 H200 推理性能
  • SparseEngine 统一接入十五种稀疏注意力
  • 小模型提示测试:输出格式比文风更关键
  • 用运行状态自动推动编程 Agent 完成任务
  • 微调指标持平,却漏掉更多关键样本
  • 用大模型提取工程图纸中的控制点位
  • 用提交钩子约束编程 Agent 的调用
  • BitNet 提供低比特模型本地推理框架
  • Open WebUI 统一管理本地与云端模型
  • Agent 安全应落实到工具授权层
  • 用拒收日志定位 LLM 工作流故障
  • Agent 消息显示成功却未送达的排查
  • 退款智能体如何设计授权边界
  • MiniCPM-V 4.7 推出端侧 MoE 与微调方案
  • 用双项目测试检查 Agent 记忆串扰
  • Meta 新模型强化智能体记忆与目标保持
  • 用 n8n 自动筛选并推送 AI 新闻简报
  • AI 排障文档应隔离命令证据与解释
  • 已加载 51 / 9792
8.0
热点
AI SCORE
编程提效2026-10-14 00:11

Gemini CLI 自动化为何受终端环境影响

dev.to · AI#Gemini CLI#自动化#提示词
Editor brief · 编辑速览

Gemini CLI 0.63 修复了非交互任务进入计划模式后因等待批准而提前退出的问题。作者通过本地模拟接口捕获请求,发现同一版本会依据是否存在 TTY 使用不同的计划模式系统指令。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

gemini-cli 有个老 bug,乍看像是模型的问题,其实不是。Issue #28913:在脚本里运行 gemini -p "..." -y,Agent 一旦进入 Plan Mode,运行就会自行结束。没有报错,也没有崩溃——模型只输出一段文字,不调用任何工具,进程就退出了。在非交互模式下,纯文本响应就是终止信号,因此,Agent 礼貌地等待批准,在程序看来和“我做完了”完全一样。

这个问题在 0.63 中通过 #29539 修复,变更标题是 fix(core): enable autonomous plan execution in non-interactive mode。我想看看这个修复究竟改了什么,于是把 0.63.0 指向本地 mock endpoint,抓取了两次实际发送的 systemInstruction:一次不带 TTY,一次在 TTY 中运行。

同一个二进制文件,同样的 --approval-mode plan,得到的 prompt 却不同。

Plan Mode, Step 2 and Step 4, side by side, captured from the real request bodies

不带 TTY(gemini -p "..."):29,139 个字符。

在 pty 中运行(script -qec "gemini -i ..."):30,370 个字符。

Agent 启动时收到的指令相差 1,231 个字符,而决定这一差异的唯一因素,就是 stdin 是否为终端。

不需要 API key,也不需要模型。gemini-cli 从 GOOGLE_GEMINI_BASE_URL 读取 endpoint,所以我写了一个小型 HTTP server:接收请求,保存请求体,再返回一段预设响应。然后运行:

npm i -g @google/gemini-cli@0.63.0
gemini --version   # 0.63.0

# ~/.gemini/settings.json
# { "security": { "auth": { "selectedType": "gemini-api-key" } } }
export GEMINI_API_KEY=fake
export GOOGLE_GEMINI_BASE_URL=http://127.0.0.1:8799

# run 1: no TTY
gemini -p "Plan a small refactor of this repo" --approval-mode plan --skip-trust

# run 2: same thing, but give it a terminal
script -qec "gemini -i 'Plan a small refactor of this repo' --approval-mode plan --skip-trust" /dev/null

两次运行请求的 model id 都相同(gemini-3.1-pro-preview-customtools:streamGenerateContent),两个请求体也都记进了 server 日志。我对比的是其中的 systemInstruction 字符串。关键技巧是 script -qec:它会分配一个 pty,让 CLI 认为自己处于交互模式,从而改变它构建的 prompt。

实际有哪些差异

规划工作流由模板渲染生成,会根据是否处于交互模式选择不同分支。

交互模式的 prompt 中包含那句导致问题的指令:“**关键要求:**在首次提出策略的同一轮中,你绝不能继续执行第 3 步(起草)或第 4 步(审查与批准)。你必须等待用户反馈。”这句话,再加上“纯文本回复会结束运行”的模式,就足以解释 #28913。非交互模式的 prompt 删除了这句话,并将目标替换为“自主继续执行”。

交互模式的工具表额外列出了三个工具:activate_skill、ask_user 和 web_fetch。非交互模式的 prompt 还删除了 shell 命令规则中对 ask_user 的提及。这与 issue 讨论中的情况一致:无头会话本来就禁止使用 ask_user,所以旧版的阻塞行为从来不是通过 ask_user 实现的——它靠的是不调用任何工具、只返回纯文本,而这种响应不会被任何机制拦截。

确认修复已进入发布产物,而不只是 main 分支

这个 PR 修改了 packages/core/src/prompts/snippets.ts 中的 renderPlanningWorkflow(),让它根据 options.interactive 选择分支:第 2 步分别变成“确定策略”和“征询意见”,第 4 步的结尾从“正式请求批准。”改为“开始实现。”,而“对齐检查”那条指令只会在交互模式分支中渲染。

我没有仅凭合并状态下结论,而是直接从已安装的 @google/gemini-cli@0.63.0 包中检索这些字符串。发布 bundle 中确实包含两个版本,形式也与代码 diff 所显示的一致。修复已经进入我实际运行的二进制内容,而不只是存在于默认分支上。

用它写脚本时,真正需要注意的地方

你拿到什么 prompt,取决于 stdin 是否为 TTY。这对 CI 来说是个容易踩中的坑。

gemini -p "..." 和 echo "..." | gemini 会拿到自主执行的 prompt。很好。

任何给进程提供 pty 的方式,都会拿到交互模式的 prompt——也就是要求停下来等待的那个版本。使用 script、pty.fork()、expect、某些 docker run -it 调用,或终端复用型 runner 的 wrapper,都会多收到 1,231 个字符的指令,要求 Agent 等待一个根本不会出现的人;而在这种运行模式下,等待会让运行悄无声息地结束。

如果你基于 gemini-cli 构建了无头 runner,它在规划任务中卡住或提前退出,那么在排查其他问题之前,先检查有没有分配 TTY。这会是我首先检查的地方。

我没有验证的部分

需要如实说明验证边界:我抓取的是 prompt 的构建结果,不是模型行为。我的 endpoint 返回的是预设响应,因此,我能证明 CLI 发送了哪些指令,也能证明发布 bundle 中包含这个分支。但我无法证明真实的 Gemini 模型现在会自行调用 exit_plan_mode——这需要真实的 key 和实际运行,我在这里没有做。Google 的 Plan Mode 文档说明,非交互会话会自动批准 enter_plan_mode / exit_plan_mode,并在退出 Plan Mode 时切换到 YOLO;这里我只是引用文档,没有实测。

我也没有抓取 0.62 的 prompt,所以“0.63 修复了这个问题”的判断,依据是 changelog 条目和代码 diff,而不是两个版本的前后对照运行。

自己尝试时,要注意两个坑

仅有 GEMINI_API_KEY 还不够。必须让 security.auth.selectedType 指定一个有效的认证方式,否则 CLI 会拒绝启动。填入 "gateway" 会得到 Invalid auth method selected.(退出码 41);接受的值是 oauth-personal、compute-default-credentials、gemini-api-key 和 vertex-ai。

抓取时不要使用 -y。YOLO 模式会在主请求之前,先发起一次 gemini-3.5-flash-lite:generateContent 的“Task Routing AI”复杂度评分调用。我的预设响应 server 无法生成评分,CLI 重试了五次,随后就一直停在那里。如果你只想获取 prompt,就使用 --approval-mode plan,不要加 -y。交互模式还会为会话标题或摘要额外发起一次 flash-lite 调用。

两份抓取结果都保存为纯文本:分别为 29,139 和 30,370 个字符,总计 59,509 个字符。我调用 CLI 的方式只有一处差异:是否连接了 pty。

如果需要进一步采取行动,你可以考虑屏蔽此人和/或举报滥用行为。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
日志与搜索结果如何成为提示注入入口
下一篇
Gemini 夜间优化二十万行 Python 项目