Gemini CLI 通知:在它完成或需要你时获得提示音或提醒

你在看别的东西时,Gemini CLI 会一直安静地停在“Waiting for confirmation”。它其实可以通知你,只是这项设置默认关闭,而且在 Windows 上的表现与文档描述不同。

作者:Aslan,Pet Island 团队 · 更新于 2026年10月26日 · 阅读时长 5 分钟

简短回答

在 ~/.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/settings.json复制
{
"general": {
"enableNotifications": true
}
}

开启后,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 发送的内容
iTerm2OSC 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 选择声音。

Windows Terminal settings.json(配置文件)复制
{
"bellStyle": "all"
}

如果你想尝试用真正的桌面通知代替响铃,可以强制指定方式:

~/.gemini/settings.json复制
{
"general": {
"enableNotifications": true,
"notificationMethod": "osc9"
}
}

某个终端是否会把 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:

~/.gemini/hooks/ding.ps1复制
# Two short beeps: frequency in Hz, duration in ms
[Console]::Beep(880, 150)
[Console]::Beep(1320, 150)
 
# Hooks must print one JSON object
"{}"

然后让两个事件都指向它:

~/.gemini/settings.json复制
{
"general": { "enableNotifications": true },
"hooks": {
"Notification": [
{ "matcher": "*", "hooks": [ { "name": "ding-approval", "type": "command",
"command": "powershell -NoProfile -ExecutionPolicy Bypass -File $HOME\\.gemini\\hooks\\ding.ps1" } ] }
],
"AfterAgent": [
{ "matcher": "*", "hooks": [ { "name": "ding-done", "type": "command",
"command": "powershell -NoProfile -ExecutionPolicy Bypass -File $HOME\\.gemini\\hooks\\ding.ps1" } ] }
]
}
}

-ExecutionPolicy Bypass 可以避免最常见的失败:PowerShell 拒绝运行脚本。Gemini 文档建议将 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser 作为一劳永逸的解决方法。

macOS 和 Linux

在其他系统上,hook 通过 bash -c 运行。一行脚本就能搞定:

~/.gemini/hooks/ding.sh复制
#!/usr/bin/env bash
cat > /dev/null # drain the event JSON
afplay /System/Library/Sounds/Glass.aiff 2>/dev/null \
|| paplay /usr/share/sounds/freedesktop/stereo/complete.oga 2>/dev/null
echo '{}'

赋予它可执行权限(chmod +x ~/.gemini/hooks/ding.sh),并在同样的两个事件中使用 "command": "$HOME/.gemini/hooks/ding.sh"。

想要两种不同的声音,一种表示“需要批准”,一种表示“已完成”?那就写两个脚本。hook 还可以从 stdin 读取事件:Notification 的输入包含 notification_type、message 和 details,因此你可以在弹窗中显示具体的请求内容。

hook 不运行的原因

  1. 查看 /hooks panel。 它会列出 Gemini CLI 加载的所有 hook。如果 hook 被禁用了,/hooks enable-all 可以重新启用它们。
  2. 文件夹未受信任。 在未受信任的文件夹中,Gemini CLI 会忽略项目的 .gemini/settings.json,因此项目 hook 不会加载。请把通知 hook 放在用户设置(~/.gemini/settings.json)中,这样它们在任何地方都能生效。
  3. 修改过的 hook 会被视为新 hook。 Gemini CLI 会为项目 hook 生成指纹;如果 hook 的名称或命令发生变化,它会被视为一个新的、未受信任的 hook。
  4. stdout 中有其他内容。 JSON 前面多出的 echo 或一条 PowerShell 警告都会导致解析失败。请把日志发送到 stderr。
  5. 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日 对照以下页面核实。智能体更新很快;如有不符,以官方页面为准。

继续阅读

在屏幕顶部回应每一个智能体。

Windows 和 Mac · 免费试用 7 天,之后一次性支付 8.99 美元 · 每笔销售拿出 1 美元为流浪动物提供食物

免费试用 Pet Island