Gemini CLI 通知:在它完成或需要你时获得提示音或提醒
你在看别的东西时,Gemini CLI 会一直安静地停在“Waiting for confirmation”。它其实可以通知你,只是这项设置默认关闭,而且在 Windows 上的表现与文档描述不同。
简短回答
在 ~/.gemini/settings.json 中设置 "general": { "enableNotifications": true }(或通过 /settings → General → Enable Notifications)。之后,Gemini CLI 会在需要批准和会话完成时提醒你。在 Windows Terminal 和 VS Code 终端中,自动模式只会触发终端响铃,所以如果你想要真正的桌面通知,可以试试 notificationMethod: "osc9"。如需自定义提示音,请添加一个 Notification hook(在工具权限提示时触发)和一个 AfterAgent hook(在一轮对话结束时触发)。
开始之前:确认你用的是哪个 Gemini CLI
Gemini CLI 文档上的一条横幅说明,对于免费层级和 Google One 用户,Gemini CLI 已于 2026 年 6 月 18 日被 Antigravity CLI 取代。下文的所有内容都针对 Gemini CLI 本身(gemini 命令和 ~/.gemini/settings.json)。如果你已迁移到 Antigravity,它的设置存放在其他位置。
大家想要这个功能已经很久了。Gemini CLI 仓库中关于声音通知的功能请求(#4310)获得了 74 个赞,一位维护者提高了它的优先级,“to reflect how many people care”(以反映有多少人关心此事)。后来的一个讨论(#13313)说得很直接:“I can never tell when it is done.”(我永远不知道它什么时候完成。)
开启内置通知
Gemini CLI 有一项实验性的通知功能,默认处于关闭状态。在 CLI 中通过 /settings → General → Enable Notifications 开启,或在设置文件中开启:
开启后,Gemini CLI 会在以下两种事件发生时提醒你:
- 需要操作:模型正在等待你的输入或工具批准。
- 会话完成:某个会话已成功结束。
通知标题分别是“Gemini CLI needs your attention”和“Gemini CLI session complete”。Gemini CLI 本身不会播放声音:它向终端发送一个转义序列,由终端决定接下来的行为。
通知如何送达(以及 Windows 为什么不同)
第二项设置 general.notificationMethod 决定提醒的发送方式。可选值为 auto(默认)、osc9、osc777 和 bell。
通知页面上说 CLI 使用 OSC 9 转义序列,并以终端响铃作为后备。源代码则更为具体。在 auto 模式下(packages/cli/src/utils/terminalNotifications.ts):
| 终端 | auto 发送的内容 |
|---|---|
| iTerm2 | OSC 9(桌面通知) |
| Windows Terminal、VS Code 终端、Alacritty、Apple 终端 | 仅响铃(BEL) |
| 其他所有终端 | OSC 777 |
因此在 Windows Terminal 上,你得到的是响铃,而不是弹出通知。响铃的效果由 Windows Terminal 的设置决定:bellStyle 接受 all、audible、window、taskbar 和 none,默认值为 audible。设为 all 时,Windows Terminal 会播放声音并让任务栏图标闪烁;你可以用 bellSound 选择声音。
如果你想尝试用真正的桌面通知代替响铃,可以强制指定方式:
某个终端是否会把 OSC 9 转为 Windows 通知,取决于终端版本。如果什么都没出现,请改回 auto 或 bell,并使用 bellStyle: "all"。响铃正是 Gemini CLI 自己的代码为 Windows Terminal 选择的方式。
在 tmux 或 screen 中,Gemini CLI 会把序列包装在透传转义中,使其仍能到达外层终端。
用 hook 设置你自己的提示音
如果你想要特定的声音、弹窗或发到手机的消息,请使用 hook。Gemini CLI 会在固定节点运行 hook 命令,并等待它们完成。这里有两个事件值得关注:
Notification在 CLI 发出系统提醒时触发。目前唯一的类型是ToolPermission(某个工具正在等待你的批准)。该 hook 不能批准或拦截任何操作,仅起提示作用。AfterAgent在每轮对话中模型给出最终回复后触发一次。Gemini 自己的最佳实践页面建议在“you only need to check the final completion”(只需检查最终完成情况)时使用它。
hook 默认开启(hooksConfig.enabled)。hook 必须向 stdout 输出恰好一个 JSON 对象,不能有其他内容(没什么要说时输出 {} 即可)。退出码 0 表示成功;2 表示拦截(只对可拦截的事件有意义);其他任何退出码都视为警告,CLI 会继续运行。默认超时为 60 秒(timeout 以毫秒为单位)。
Windows(PowerShell)
在 Windows 上,Gemini CLI 使用 pwsh -NoProfile -Command 运行 hook 命令;如果没有安装 PowerShell 7,则使用 powershell.exe。把以下脚本保存为 %USERPROFILE%\.gemini\hooks\ding.ps1:
然后让两个事件都指向它:
-ExecutionPolicy Bypass 可以避免最常见的失败:PowerShell 拒绝运行脚本。Gemini 文档建议将 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser 作为一劳永逸的解决方法。
macOS 和 Linux
在其他系统上,hook 通过 bash -c 运行。一行脚本就能搞定:
赋予它可执行权限(chmod +x ~/.gemini/hooks/ding.sh),并在同样的两个事件中使用 "command": "$HOME/.gemini/hooks/ding.sh"。
想要两种不同的声音,一种表示“需要批准”,一种表示“已完成”?那就写两个脚本。hook 还可以从 stdin 读取事件:Notification 的输入包含 notification_type、message 和 details,因此你可以在弹窗中显示具体的请求内容。
hook 不运行的原因
- 查看
/hooks panel。 它会列出 Gemini CLI 加载的所有 hook。如果 hook 被禁用了,/hooks enable-all可以重新启用它们。 - 文件夹未受信任。 在未受信任的文件夹中,Gemini CLI 会忽略项目的
.gemini/settings.json,因此项目 hook 不会加载。请把通知 hook 放在用户设置(~/.gemini/settings.json)中,这样它们在任何地方都能生效。 - 修改过的 hook 会被视为新 hook。 Gemini CLI 会为项目 hook 生成指纹;如果 hook 的名称或命令发生变化,它会被视为一个新的、未受信任的 hook。
- stdout 中有其他内容。 JSON 前面多出的
echo或一条 PowerShell 警告都会导致解析失败。请把日志发送到 stderr。 - matcher。 对于
Notification和AfterAgent,使用"*"(或空字符串)匹配所有内容。生命周期事件使用精确字符串匹配,工具事件使用正则表达式。
或者减少被询问的次数
通知能帮你更快地回应;你也可以减少 Gemini CLI 需要你的次数。general.defaultApprovalMode 可以是 default(询问)、auto_edit(自动批准编辑,其他操作仍询问)或 plan(只读)。按 Shift+Tab 可在它们之间切换。tools.allowed 列出可跳过确认对话框的工具(例如 run_shell_command(git)),tools.confirmationRequired 列出必须始终询问的工具。
YOLO 模式(--yolo 或 Ctrl+Y)会批准一切,并默认开启沙盒。它只能通过命令行启用;如果你与他人共用这台电脑,可以用 security.disableYoloMode 将其彻底关闭。
Pet Island 的用武之地
一声提示音只能告诉你发生了什么事,却无法告诉你是哪个终端,也无法告诉你 Gemini 想运行什么。Pet Island 把 Gemini CLI 和你的其他智能体一起放到屏幕顶部的小岛上:你可以看到它何时在工作、何时在等待你确认、何时已完成,点击一下就能跳到正确的终端。
对于 Gemini CLI,确认操作本身仍在 Gemini 中进行。Pet Island 会显示请求并带你过去,但不会替你批准 Gemini 的工具。(相比之下,Claude Code 和 Codex 的请求可以直接在小岛上回应。)
常见问题
Gemini CLI 有通知功能吗?
有,这是一项默认关闭的实验性功能。在 ~/.gemini/settings.json 中将 general.enableNotifications 设为 true,或使用 /settings → General → Enable Notifications。
为什么 Gemini CLI 在 Windows 上只会响铃?
在 auto 模式下,Gemini CLI 的代码只向 Windows Terminal 和 VS Code 终端发送终端响铃。Windows Terminal 的 bellStyle 设置决定这声响铃是播放声音、让任务栏闪烁,还是两者兼有。
Gemini CLI hook 能自动批准工具吗?
Notification hook 不能。文档说明它既不能拦截提醒,也不能授予权限。如需预先批准工具,请使用 tools.allowed 或策略引擎。
Gemini CLI 完成时会触发哪个 hook?
AfterAgent。它在每轮对话中模型给出最终回复后触发一次。
hook 应该放在哪里才能在所有项目中生效?
放在用户设置 ~/.gemini/settings.json 中。在未受信任的文件夹中,项目设置会被忽略。
参考来源
本页的每项设置和行为都已于 2026年10月26日 对照以下页面核实。智能体更新很快;如有不符,以官方页面为准。
- Gemini CLI 文档:Notifications(实验性)
- Gemini CLI 文档:Hooks
- Gemini CLI 文档:Hooks reference
- Gemini CLI 文档:Writing hooks(PowerShell 示例)
- Gemini CLI 文档:Configuration reference
- Gemini CLI 文档:Trusted folders
- Gemini CLI 源代码:terminalNotifications.ts
- Gemini CLI issue #4310:声音通知
- Gemini CLI 讨论 #13313:Gemini 完成时播放声音
- Microsoft Learn:Windows Terminal 配置文件设置(bellStyle、bellSound)
- Microsoft Learn:Console.Beep