整活:你是否也让 Codex 在服务器上跑着任务,然后每隔几十秒切回终端看一眼?你是否也遇到过它早就做完了,却因为窗口在后台而白白等了半小时?更难受的是,Codex 有时不是在工作,而是在安静地等你点一个权限审批。

既然人不能一直盯着终端,那就让终端主动来找人。本文将 Codex CLI 的通知接入企业微信群机器人。在匹配的事件触发时,脚本会把普通回合结束、计划制定完成、提问和权限审批消息推送到企业微信。为求方便,你也可以将本文的链接直接提供给 Codex CLI 并让其进行有关配置,有望相较自己从头配置消耗更少的 token,但注意企业微信的 webhook 仍需自行提供。

当前消息分为四种(详细的模板可根据自身需求在脚本里进行进一步调整):

  • ✅ Codex 本轮已结束:包含项目、目录、原始任务和最终回复。
  • ⏳ Codex 已制定 plan,等待决策:包含任务和计划正文,提醒回到 Codex 选择执行或修改。
  • ⏳ Codex 等待你的决策:由提问工具触发;能否显示完整问题和选项取决于参数格式。
  • 🔐 Codex 等待权限审批:包含申请原因、工具以及命令摘要。

需要先强调:企业微信消息只负责通知,不能直接在群里回答问题或批准权限。 收到提醒后,仍然要回到 Codex CLI 中操作。

1. 创建企业微信群机器人

新建一个企业微信群,类型选择企业(不要选择个人组建团队,经尝试该选项创建的群聊不能添加群通知)。

Key 的格式大致如下:

1
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

这个地址里的 key 相当于机器人的密码,任何拿到它的人都可以向群里发消息,因此注意不要直接把 webhook 放在容易泄露的位置。将该 key 保存到本地的某个文件中,以在后续提供给通知脚本使用。

2. 编写统一通知脚本

点击此处获取脚本并将其保存到 ~/.codex/codex_notify_wecom.py(使用 '另存为' 功能以避免乱码),复制时请修改 WEBHOOK_FILESESSIONS_DIR 以吻合本地路径。

赋予脚本仅当前用户可执行、可读写的权限:

1
chmod 700 ~/.codex/codex_notify_wecom.py

3. 配置任务完成通知

打开用户级配置文件 ~/.codex/config.toml,在顶层添加:

1
notify = ["python3", "/你的绝对路径/.codex/codex_notify_wecom.py"]

例如 Linux 用户目录是 /home/alice 时,应写为:

1
notify = ["python3", "/home/alice/.codex/codex_notify_wecom.py"]

如果 config.toml 已经有其他配置,只增加这一行即可,不需要覆盖原文件。

4. 配置等待回答和权限审批通知

~/.codex/hooks.json 中写入(请对 command 字段的路径进行调整):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
"description": "Forward Codex user-input and permission requests to WeCom.",
"hooks": {
"PreToolUse": [
{
"matcher": "^request_user_input(_async)?$",
"hooks": [
{
"type": "command",
"command": "python3 /你的绝对路径/.codex/codex_notify_wecom.py --hook",
"async": true,
"timeout": 15,
"statusMessage": "Sending WeCom decision notification"
}
]
}
],
"PermissionRequest": [
{
"hooks": [
{
"type": "command",
"command": "python3 /你的绝对路径/.codex/codex_notify_wecom.py --hook",
"async": true,
"timeout": 15,
"statusMessage": "Sending WeCom approval notification"
}
]
}
]
}
}

这里的几个字段分别表示:

  • PreToolUse:在 Codex 调用受支持的本地工具之前触发。
  • matcher:正则表达式,只匹配 request_user_inputrequest_user_input_async,避免每次工具调用都发消息。
  • PermissionRequest:Codex 即将向用户请求权限时触发。省略 matcher 表示匹配该事件的所有工具。
  • async: true:在后台执行通知脚本,避免企业微信网络延迟卡住 Codex。
  • timeout: 15:通知脚本最多运行 15 秒。
  • statusMessage:Hook 运行时在 Codex 中展示的状态文字。

根据 OpenAI 官方文档,Codex 可以从 ~/.codex/hooks.json~/.codex/config.toml 以及项目内对应的 .codex/ 配置中加载 Hooks,而且不同来源中匹配的 Hooks 会同时执行。因此如果出现重复通知,要检查是否在多个配置层写了同一套规则。

5. 检查并信任 Hooks

先做不会联网的语法和预览检查:

1
2
3
python3 -m py_compile ~/.codex/codex_notify_wecom.py
python3 -m json.tool ~/.codex/hooks.json >/dev/null
python3 ~/.codex/codex_notify_wecom.py --preview

--preview 只在终端输出普通完成、等待决策和权限审批三种样例。确认预览排版正常后,可自行发送一条真实测试消息(--test 只发送普通完成样例):

1
python3 ~/.codex/codex_notify_wecom.py --test

接下来重新启动 Codex CLI,并输入:

1
/hooks

非托管 Hook 第一次运行前需要人工检查和信任。Codex 会按照 Hook 内容的哈希记录信任状态;以后只要修改了命令或配置,原有信任就会失效,需要再次进入 /hooks 检查。完成信任后,可以依次验证:

  1. 随便让 Codex 完成一个简单任务,检查 完成通知。
  2. 在 Plan 模式下让 Codex 制定计划,检查“已制定 plan,等待决策”消息。
  3. 让 Codex 调用提问工具,检查 决策通知,并留意异步工具参数格式的限制。
  4. 在正常工作中遇到一次确实需要审批的命令,检查 🔐 权限通知。不要为了测试而执行危险命令。
运行效果示例

后记

由于博主本人喜欢在下班吃饭前跑上一个 session,但往往又因为前几次点开都还没到要人工审批的时候而忘记这个 session,后面惊觉再看已经卡在一个地方很久……。添加了企业微信通知后就再也没遇到过这个问题,什么时候来通知了(或 plan 做决策了),就远程操控电脑审查通过一下。

个人感觉以上操作应该也能非常方便地迁移到飞书 / 电报之类的消息平台,所以有需要的小伙伴也可以再做进一步调整(包括模板等具有个人审美要求的元素也可以做修改),反正可以全部让 Codex CLI 来干(笑)。

参考资料