Codex + ntfy 通知使用说明
如果你经常让 Codex 在终端里跑任务,给它接一个 notify 钩子会方便很多。每轮对话结束后,Codex 都可以把本轮摘要推送到 ntfy,这样手机和桌面端都能第一时间收到提醒。
下面这套配置适合本地 Codex CLI + ntfy。默认示例使用公共服务器 https://ntfy.sh,如果你有自建 ntfy,只需要把服务器地址改掉即可。
1. 前置条件
- 已安装并能正常使用 Codex CLI
- 本机可用
python3 - 已能访问 ntfy
如果你直接使用公共 ntfy.sh,建议把 topic 设成一串随机字符串,不要用过于简单的名字。
2. 写入通知脚本
先创建 ~/.codex 目录,再写入脚本:
1 | mkdir -p ~/.codex |
默认 topic 是 codex-notify,只是为了让示例能直接跑起来。真正使用时,最好通过环境变量换成你自己的随机 topic。
3. 配置 Codex
编辑 ~/.codex/config.toml,把 notify 放在顶层:
1 | model = "gpt-5.4" |
这里有两个细节要注意:
notify必须在顶层,不要写进别的配置段里- 脚本路径建议写绝对路径,别偷懒直接写
~/.codex/notify.py
如果你不知道自己的绝对路径是什么,可以先执行:
1 | echo "$HOME/.codex/notify.py" |
然后把输出结果填进 config.toml。
4. 订阅 ntfy topic
你可以任选一种方式订阅:
- 手机安装 ntfy App,然后添加同名 topic
- 浏览器直接打开
https://ntfy.sh/你的topic
如果你后面通过 NTFY_TOPIC 改了 topic,订阅时也要用改过的那个名字。
5. 测试通知
先手动调用脚本,确认 ntfy 本身没有问题:
1 | python3 ~/.codex/notify.py '{"type":"agent-turn-complete","last-assistant-message":"测试通知","input-messages":["你好"],"cwd":"/tmp","thread-id":"demo"}' |
如果这一步能收到推送,再跑一条最短的 Codex 会话:
1 | codex "只回复 test" |
正常情况下,Codex 完成这一轮后,你应该会再收到一条 ntfy 通知。
6. 可选环境变量
如果你不想把服务器地址、topic 和鉴权信息写死,可以在启动 Codex 前设置环境变量:
1 | export NTFY_SERVER="https://ntfy.sh" |
如果你的 ntfy 服务器启用了鉴权:
1 | export NTFY_TOKEN="你的token" |
如果想长期生效,就把这些环境变量写进 ~/.zshrc 或 ~/.bashrc。
7. 常见问题
收不到通知
优先按这个顺序排查:
- 确认
notify确实写在~/.codex/config.toml顶层 - 确认脚本路径是绝对路径,而且文件有执行权限
- 先手动执行一次
python3 ~/.codex/notify.py '...' - 再检查 topic 是否和 ntfy 订阅端一致
通知标题里中文不显示
这是 HTTP 头部编码限制导致的,正文不受影响。上面的脚本已经做了兜底处理:如果标题里有无法安全放进头部的字符,就自动退回英文标题 Codex notification。
公共 topic 不安全
ntfy.sh 的公共 topic 不是私密空间。只要别人知道你的 topic 名称,就可能订阅到同样的消息。更稳妥的做法有两种:
- 使用足够长、足够随机的 topic
- 自建 ntfy 服务,或者开启鉴权后配合
NTFY_TOKEN使用