我们为什么需要一只 Codex 桌面宠物

跑一个长任务的时候,你通常在做什么?
大多数人的答案是:每隔几十秒瞟一眼终端,看 build 好了没、测试跑完了没、Agent 还在思考还是已经卡住等我批准了。这种人工轮询的姿势,本质上是把自己降级成了操作系统的调度器:进程忙不忙不知道,只能靠肉眼把 CPU 时间片让给它
Codex 桌面版最近上线的宠物(Pets)功能,它把进程状态从终端里翻出来,具象成一只小动物,还会在真正需要你的时候主动来喊你,通过这种事件驱动,避免你轮询去问
01 从人工轮询到事件通知
Agent 越来越好用,开发者跟 Agent 的协作模式,也正在从同步聊天变成了异步派单
早期用 ChatGPT/Claude 网页版,你发一句、它答一句,几秒钟内就闭环了,人一直在场是自然的。但 Codex / Claude Code 这类 Agent 一次跑几分钟到几十分钟很常见——跑测试、装依赖、跨仓库改代码。这时候如果你还坐在终端前,那就是用人的注意力去等机器的 IO,纯粹的浪费
要真正做到异步,就必须解决一个问题:任务完成了、或者卡住了,谁负责通知我?
以前的答案通常是我自己扫一眼,也就是轮询。轮询的问题不只是费时间,它还有隐性成本:
- 你没法真正切走做别的事,因为一切走注意力就再回不来
- 状态不稳定,你不知道现在瞟的这一眼里 Agent 究竟是在算还是卡在等你点确认
- 多任务并行时更惨,多个终端多个 tab,你在做眼动仪的活
Codex 宠物的解法是把这几种状态外化到桌面上一只固定位置的小图标。这只宠物用四种状态反映会话情况:
- Running: A chat is actively working.
- Needs input: A chat needs your approval, answer, or another decision.
- Ready: A chat has completed and has unread activity.
- Blocked: A chat failed or encountered a system error.
多个对话并发时,优先级是 needs input > blocked > ready > running,即最需要人介入的排最前
这四个状态背后的信号设计,把 Agent 的进程状态映射成了人的注意力优先级。你不用去数进程、看日志,只需要眼角余光扫一下桌面,小动物在跑步就是在忙,小动物在挥手就是要你,小动物在低头就是出问题了
这是一个从 pull 到 push 的范式转变
02 捏一只自己的 Codex 宠物
Codex 自带了几只官方宠物:Codex、Dewey、Fireball、Hoots、Rocky、Seedy,如果你不满意他们,你可以捏一只专属于自己的
流程很简单:Settings > Pets 里点创建,Codex 会挂载一个叫 hatch-pet 的内置技能并开新对话,你用提示词描述想要的宠物,它就会生成一整套 spritesheet(sprite 表,包含 idle / running / waving / jumping / failed / waiting / review / look 等多个动作),你回到设置里刷新一下就能选用了
例如,我给自己做了一只叫 Randy 的宠物。整个提示词长下面这样,创建之前需要确认哪些约束是必须提前锁死的,不然生成效果难以控制
生成模型很聪明但也很叛逆,如果不加约束难以生成符合预期的形象,所以提示词里我明确写了几类硬约束:
- 形象一致性:必须严格保留参考图的 IP 形象,不要重新设计角色
- 配色/风格:像素风、粗黑描边、红黄黑主配色、原图比例
- 禁止项:不要在 Q 字母、身体、护目镜上加额外符号;不要把四肢切开旋转、不要出现图片割裂或额外长出的手脚
- 背景:必须透明,不能有白底、黑底、阴影、光效、速度线、漂浮符号
另外每个动作也单独描述节奏:idle 是轻微上下呼吸不要静止、waving 保留张手造型只做手部小幅变化、failed 是轻微低落晃动
写提示词的一个实践经验:越是可爱、有个性的角色,越要用负面清单锁边界;正面描述容易撞到模型的先验,负面清单反而是把你的角色从它的先验里拉出来的绳子
模型跑完给出的 spritesheet 长这样,可以看到所有动作变体都在一张图里,风格保持一致:
回到 Settings > Pets,点右上角刷新按钮,Randy 就出现在列表里可以选择了:
从这一刻起,Codex 每次跑任务、每次需要审批、每次挂掉,我桌面上都会有一只戴红头盔的小家伙用对应的动作告诉我发生了什么
03 Claude Code 可以通过 Hooks 实现事件通知
Claude Code 通过 hooks 机制暴露了对应的事件,虽然没有可爱的动物,但留给你自己设置如何接系统通知
Claude Code 的 hooks 系统里,和事件通知最相关的两个事件是:
Notification:Claude 发通知的时候触发,可以用 matcher 精细区分permission_prompt(要你批准工具调用)、idle_prompt(等你输入)等Stop/SubagentStop:Claude 完成一轮回复时触发,天然适合做任务跑完了的提醒
配置写在 ~/.claude/settings.json 或项目级 .claude/settings.json 里
这是我自用的一个例子,让 Claude 在需要你的时候和跑完时都弹一个 macOS 原生通知:
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt|idle_prompt",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/notify.sh"
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/notify.sh"
}
]
}
]
}
}
.claude/hooks/notify.sh 大致长这样——从 stdin 拿到 JSON 里的 message 字段,扔给系统通知:
#!/bin/bash
input=$(cat)
message=$(echo "$input" | jq -r '.message // "任务执行完成"')
osascript -e "display notification \"${message}\" with title \"Claude Code\" sound name \"Glass\""
exit 0
配好以后测试一下,Claude Code 会在需要注意时弹出一条系统通知,效果大概是这样——右上角是 macOS 通知气泡,终端里也会明确显示当前通知的发送状态和原因:
04 结语
Codex 的宠物和 Claude Code 的 hooks,看起来是两个非常不同的东西:一个是漂亮的桌面 UI 一个是硬核的 JSON 配置,但底层做的其实是同一件事:给 Agent 加上一个专门为人的注意力服务的通知通道
这个通道的价值,在 Agent 越来越长时任务化的今天,会变得越来越重要。当一次工作循环从 30 秒变成 30 分钟,通知就从可有可无的糖变成刚需,它决定了你能不能真正把手从键盘上拿开、切走做别的事,而不是名义上派活给了 Agent、实际上被 Agent 拴在原地
解放自己,别再盯着终端了
参考
更多推荐



所有评论(0)