在 Mac 上接收 Codex 审批提醒和任务完成提醒。

Codex 可以在完成工作或等待你批准时提醒你,但 notify 设置只负责完成通知。本指南说明 Mac 上各项 Codex 提醒设置的作用,所附代码片段已对照 OpenAI 文档核查。

Codex 的 notify 设置只会在一轮任务完成时运行你指定的程序,不会在请求批准时运行(截至 2026 年 10 月)。如需审批提醒,可以使用 Codex 内置的终端通知([tui] notifications,默认在终端处于后台时触发,只有部分终端会显示横幅),或在 ~/.codex/hooks.json 中添加 PermissionRequest 钩子。如果使用 ChatGPT 桌面应用,请在 Settings > Notifications 中开启权限通知。

最后更新:

Cowork Island

macOS 14 或更高版本。
Apple 芯片和 Intel 处理器。
免费版无需账户。

免费下载

了解各项 Codex 设置的作用。

Codex 可以通过以下四种方式在 Mac 上提醒你。一轮任务指的是这样一个过程:你发送消息,Codex 开始工作,随后停下来等待你回应。钩子是 Codex 在指定时机运行的命令,例如在请求你批准之前运行。

Mac 上的 Codex 提醒设置,依据 OpenAI 文档整理(核查日期:2026年10月18日)
设置项设置位置一轮任务完成需要批准注意事项
notify~/.codex/config.toml是否配置后才会启用。运行一个由你指定的程序。
[tui] notifications~/.codex/config.toml是是默认开启。终端不在前台时触发。只有支持横幅的终端才会显示横幅。
钩子(Stop、PermissionRequest)~/.codex/hooks.json是是默认开启。每个新钩子都必须先在 /hooks 中设为信任,才能运行。
ChatGPT 桌面应用Settings > Notifications是是一轮任务完成、权限请求和提问的提醒各有独立开关。

一个常见误解是:设置了 notify,就会收到审批提醒,结果却一直等不到。OpenAI 的配置文档说明,目前只有 agent-turn-complete 会触发 notify。如需审批提醒,请使用表中另外三种方式之一。

先试试 Codex 内置的提醒。

Codex 的终端通知默认开启,你可能已经收到过。只有终端(运行 Codex 的应用,例如 Terminal 或 iTerm2)不在前台时,通知才会触发。如果想自行选择哪些事件触发通知,可以在配置文件中设置。

将以下内容添加到 ~/.codex/config.toml。如果文件中已有 [tui] 配置节,请把这些键放在该节下,不要再添加一个 [tui] 节标题。注释中的终端列表来自 Codex 源代码,并非其文档(见下文)。

[tui]
notifications = ["agent-turn-complete", "approval-requested"]
notification_method = "auto"        # osc9 in iTerm2/Ghostty/Kitty/Warp/WezTerm; bel elsewhere
notification_condition = "unfocused" # or "always"

将 notification_method 设为 auto 后,Codex 会自行选择提醒方式:osc9 发送一段特殊代码(转义序列),部分终端会将其转换为桌面通知;bel 则触发终端响铃。如果希望在查看终端时也收到提醒,请将 notification_condition 设为 "always"。

为什么 Terminal 只响铃。

OpenAI 文档没有列出哪些终端会显示横幅。根据 Codex 的公开源代码,它会向 Ghostty、iTerm2、Kitty、Warp 和 WezTerm 发送横幅序列,向其他所有终端发送普通响铃信号,包括 macOS 自带的 Terminal 应用。这一行为可能随源代码更新而改变。单靠响铃不会显示横幅。在 Terminal 中,Settings > Profiles > Advanced > Bell 提供视觉响铃、程序坞标记,以及窗口处于后台时让程序坞图标跳动的选项。如需在 Terminal 中显示真正的通知横幅,请使用下文的钩子。

在 tmux 中,只有开启 allow-passthrough,Codex 的横幅序列才能传出:设为 on 时,仅允许可见窗格传出;设为 all 时,隐藏窗格也可以传出(依据 tmux 手册)。将以下一行添加到 ~/.tmux.conf;如果也想收到隐藏窗格的提醒,请将 on 改为 all:

set -g allow-passthrough on

用 notify 在一轮任务完成时显示 Mac 通知横幅。

notify 会在一轮任务完成时运行一个程序,并通过一个 JSON 参数将详情传给它。在任何终端中,它的工作方式都相同。OpenAI 的示例使用 terminal-notifier,这是一个通过 Homebrew 安装的第三方工具,并非 macOS 自带。下面的脚本只使用 macOS 自带的功能:显示 Codex 最后一条回复的开头和项目文件夹,并播放 Glass 提示音。

第 1 步:将以下内容保存为新文件 ~/.codex/notify-macos.js:

// Codex notify -> macOS banner + sound. Codex appends one JSON argument.
function run(argv) {
  var n = {};
  try { n = JSON.parse(argv[argv.length - 1] || "{}"); } catch (e) {}
  if (n.type && n.type !== "agent-turn-complete") return;
  var app = Application.currentApplication();
  app.includeStandardAdditions = true;
  var msg = String(n["last-assistant-message"] || "Turn complete").slice(0, 180);
  var folder = String(n.cwd || "").split("/").pop();
  app.displayNotification(msg, { withTitle: "Codex finished", subtitle: folder, soundName: "Glass" });
}

第 2 步:将以下一行添加到现有的 ~/.codex/config.toml 中,放在第一个 [section] 节标题之前。将 YOUR_NAME 替换为你的个人文件夹名称。Codex 会按原样执行这个列表,因此不会展开 ~(这一点依据 Codex 源代码,并非其文档)。

notify = ["/usr/bin/osascript", "-l", "JavaScript", "/Users/YOUR_NAME/.codex/notify-macos.js"]

以下三种情况会导致 notify 无法正常工作:

  • 添加了第二行 notify。一个配置文件只能有一项,重复的键会导致文件无法加载。如果其他工具已经在使用它,可以让它指向一个同时运行两个程序的小脚本,也可以改用 Stop 钩子,因为各个文件中的钩子可以并行运行。
  • 放错了位置。如果把这一行粘贴到文件末尾,放在某个 [section] 节标题下,它就会归入该配置节,Codex 不会将其作为 notify 设置读取。
  • 写进了项目配置。Codex 会忽略项目自身 .codex/config.toml 中的 notify。它只在 ~/.codex/config.toml 中生效。

如果没有出现横幅,请打开“系统设置”>“通知”。Anthropic 的钩子指南指出,通过 osascript 发送的横幅会在此处列于 Script Editor 名下,你需要为它允许通知,而且 macOS 不会事先询问你。你的 Mac 上显示的名称可能有所不同。

用 Codex 钩子显示审批横幅。

钩子可以让你在任何终端中收到真正的审批横幅,包括 Terminal。Codex 会在请求你批准某项操作之前运行 PermissionRequest 钩子,在一轮任务完成时运行 Stop 钩子。不需要批准的命令不会触发 PermissionRequest。

将以下内容合并到 ~/.codex/hooks.json 中。如果文件已存在,不要覆盖它,其他工具可能在里面保存了自己的条目(在 Cowork Island 中开启 Codex 后,它也会这样做)。将下方各条目添加到 "hooks" 内对应的列表中;如果列表不存在,就创建一个。每个条目都要保留各自的花括号。

{
  "hooks": {
    "PermissionRequest": [
      { "hooks": [ { "type": "command", "async": true, "timeout": 10,
        "command": "/usr/bin/osascript -e 'display notification \"Codex needs your approval\" with title \"Codex\" sound name \"Funk\"' >/dev/null 2>&1" } ] }
    ],
    "Stop": [
      { "hooks": [ { "type": "command", "async": true, "timeout": 10,
        "command": "/usr/bin/osascript -e 'display notification \"Codex finished\" with title \"Codex\" sound name \"Glass\"' >/dev/null 2>&1" } ] }
    ]
  }
}
  1. 保存文件,打开 Codex,然后输入 /hooks。
  2. 将两个新条目都设为信任。对于新增或修改过的钩子,Codex 会在你设为信任之前跳过它们,因此未受信任的钩子看起来会像是失效了。
  3. 保留末尾的 >/dev/null 2>&1:Stop 钩子必须输出 JSON,或不输出任何内容。

如果想改用语音播报或手机提醒,通知配置生成器可以在浏览器中生成条目,并告诉你应将它放入哪个文件。

在 ChatGPT 桌面应用中使用 Codex。

自 2026 年 7 月 9 日起,Codex 应用已成为 macOS 版 ChatGPT 桌面应用的一部分。它的提醒需要在应用中设置,不在配置文件中:

  • Settings > Notifications(Cmd+,):一轮任务完成提醒可设为从不显示、仅在 ChatGPT 处于后台时显示,或始终显示。权限通知和提问通知各有独立开关。
  • Sound:任务完成、权限请求和提问共用一种通知提示音。可选择 Default、Classic 或 None;在 macOS 上,也可以使用系统提示音或导入的音频文件。
  • Activity:在提供此功能的版本中,点按侧边栏的铃铛,或按 Cmd+Option+U,即可查看未读、正在运行或等待你回应的对话列表。

上面的 [tui] 配置键适用于在终端中运行的 Codex。OpenAI 文档没有说明桌面应用中的对话是否会运行 notify 或你自己的钩子,因此不要依赖它们来提醒你。

也可以选择免配置方案。

Cowork Island 是一款适用于 macOS 14 或更高版本的应用,它把受支持工具中的 AI 智能体会话汇集在刘海下方的面板中,显示每个会话的状态。你可以看清哪些 Codex 或 Claude Code 会话正在运行,哪些「需要你处理」,并在同一个视图中看到提醒。

Codex 在你开启之前保持关闭。你需要先在「设置」中开启它,再在 Codex 中允许 Cowork Island 的钩子,这一步与上文的信任操作类似。完成后,每个 Codex 会话都会显示状态。默认情况下,某个会话需要你处理时,小岛会自动展开;但如果该会话的终端已在前台,就不会展开。对于 ChatGPT 应用中的 Codex 对话,ChatGPT 已在前台时也一样。你可以在「设置」中关闭「收到提问时」。会话完成后,小岛默认展开 5 秒。ChatGPT 应用中的 Codex 也会显示「需要你处理」,你在 ChatGPT 中回答。对于受支持的 Claude Code 请求,你可以在小岛上允许或拒绝某项操作,或回答选择题。对于其他工具,你可能需要在各自的应用或终端中作出回应。

Cowork Island 不会发送 macOS 通知,而是让小岛本身展开。提示音在你开启之前保持关闭;「需要审批」提示音免费提供,「会话完成」提示音属于 Pro 功能。它不使用 Codex 的 notify 设置,因此你现有的 notify 脚本可以继续工作。它会将自己的条目添加到 ~/.codex/hooks.json 中,与你的条目并存。像上面的代码片段一样,让你的钩子各自保留在独立条目中,并存放在它的 ~/.perch 文件夹之外,它就会保留这些钩子。

免费版一次显示一张会话卡片。Pro 会显示你的所有会话,让你能跳转回这些会话,并增加详细用量条、完成提示音和更多角色选项。7 天 Pro 试用会自动开始,每台 Mac 仅限一次,无需填写支付信息。查看方案和安装指南。

免费下载

参考来源。

把下载链接发给自己,稍后使用。