cxuan-ai-labs

AI Agent 与编程工具 ·

Codex 的桌面宠物,比 Claude Code 的好用多了

什么桌宠、挂件、电子宠物、Q 版 mascot,在我脑子里基本都属于同一个分类:

进入动态阅读模式 ↗

一开始我看到 Codex 桌面宠物的时候,内心是拒绝的。

不是说它不好看,而是我对这种东西有天然偏见。

什么桌宠、挂件、电子宠物、Q 版 mascot,在我脑子里基本都属于同一个分类:

看着热闹,用处不大。

尤其是前面 Claude Code 也搞过类似的宠物,我玩了一下,感觉更多是一个彩蛋系统。抽一个宠物,挂在那里,给你一点情绪价值。你说它没用吧,也不是完全没用;你说它有用吧,又很难说服自己真的有用。

所以 Codex 上线这个桌面宠物之后,我并没有第一时间去玩。

直到今天群里有个读者朋友问我:

你怎么没玩 Codex 的桌面宠物?

我当时还挺疑惑。

这玩意有什么好玩的?

然后他给我发了一个视频。

我看完第一反应是:哦,这不就是一个 skill 的事儿吗?一分钟搞定。

一分钟之后。

我沉默了。

因为这东西不是我想象中的“卖萌挂件”。

这玩意儿,还真有用。


它表面是宠物,本质是一个悬浮状态面板

先说怎么用。

在 Codex 里找到 skills,搜索 Hatch Pet。

image-20260508161507350

默认角色是一只蓝色 Q 版电脑人,非常符合 Agent 产品的审美:可爱、无害、像一个刚刚学会干活的小工具人。

fc268ab04adfe3f4429b079e23231775

它的气质有点像《爱,死亡和机器人》第一季第二集里的那个小机器人。

image-20260508163736839

如果只是这样,那我大概率看两眼就关了。

但 Codex 这个宠物真正有意思的地方在于:它不是一个单纯的装饰物。

它是一个浮在桌面上的工作状态入口。

当 Codex 有任务在跑的时候,它可以显示当前任务状态;当有需要你处理的上下文时,它可以弹出提示;你甚至可以直接通过它做快捷回复。

image-20260508164044488

这个点,对多任务用户非常重要。

现在的 AI Agent 不再是“你问一句,它答一句”的玩具形态。它越来越像后台工人:你给它一个任务,它去跑命令、改文件、查资料、等结果、再回来找你确认。

问题来了:当你同时开几个线程、几个项目、几个 Agent 的时候,你怎么知道谁正在干活,谁卡住了,谁需要你回一句话?

传统 CLI 的体验是:你得回到那个窗口里看。

Codex 这个桌宠的价值就在这里。

它把 Agent 的状态从“窗口内部”提到了“桌面表层”。


它能做什么,不能做什么

先把边界说清楚。

Codex Pet 不是另一个 AI 助手。

它不能自己聊天,不能替你写代码,不能独立调用 API,也不能像插件那样给 Codex 增加新能力。

它真正能做的是这些:

  • 待机陪伴:平时在桌面上显示一个小角色,有 idle 动画。
  • 表现状态:运行、等待、失败、审阅、跳跃、挥手,不同状态可以切换不同动作。
  • 任务提醒:当 Codex 有活动或需要你关注时,它可以作为浮窗入口。
  • 快捷回复:某些场景下可以直接在浮窗里处理消息。
  • 自定义形象:可以把它做成小猫、小机器人、小火球、植物、鸭子,或者你指定的角色风格。
  • 本地安装:打包后放到 ~/.codex/pets/<pet-name>/,Codex 就能识别。

这也是它比 Claude Code 那套宠物更让我愿意玩的地方。

Claude Code 的 CLI 宠物更像游戏彩蛋,有稀有度,有抽卡感。普通宠物大概率就是 common,看两眼就索然无味。

当然,我也不是没折腾过。

我甚至还撸过一个 buddy 重抽,可以直接抽金色品质宠物:

https://github.com/crisxuan/buddy-reroll

但说实话,那个方向本质上还是“抽到一个更好看的东西”。

Codex 这边不一样。

它的宠物不只是皮肤,它和桌面端的任务状态连上了。

也就是说,它有一点点“产品入口”的味道。

别小看这点。

一个东西从“装饰”变成“入口”,性质就变了。


然后我开始给它整 2B

默认蓝色小人虽然不错,但这玩意儿都支持自定义了,我怎么可能只用默认款。

我比较喜欢《尼尔:机械纪元》里的角色,所以第一反应就是:整一个 2B。

Hatch Pet 默认生成的风格比较偏 Q 萌。

比如这样:

image-20260508134254072

不是说不好。

但这完全不符合我对 2B 的人物理解。

2B 是什么?冷感、克制、黑色礼服、战斗人偶、压迫感和优雅感并存。

你给我整成 Q 萌小手办,这就不对味了。

我不允许。

于是我重新描述角色风格,强调不要 Q 版,要更接近原版比例,更御姐一点,更有黑色哥特礼服和机械感。

然后就出了这个版本:

image-20260508134537875

这就对了。

审美终于在线了。

说实话,GPT-image-2 在这种角色审美上的能力确实很强。。。。。。

但是还有一个问题。

桌宠不适合带背景。

带一块背景板浮在桌面上,看起来就很像网页截图被硬塞进桌面,廉价感立刻上来了。

所以我又让它生成透明背景版本。

image-20260508140747053

然后熟悉的事情发生了。。。。。。风格漂移了。。。。。。

你让它去掉背景,它顺手把人物味道也换了。

这就是生成图最烦人的地方:你以为自己只改 A,它顺手把 B、C、D 也全改了。

于是我继续 PUA 它,强调保持上一版人物风格,只处理透明背景,不要改脸,不要改比例,不要改服装气质。

终于得到了我想要的版本:

image-20260508141002744

到这里,我已经开始上头了。

这不比蓝色小电脑人有意思多了?

直接当桌面宠物。

image-20260508141613077

装上以后,我发现了一个非常严重的问题。

2B 最重要的是什么?那必须得是腿。

结果桌面宠物显示出来,下半身被裁掉了,这必须忍不了。

一开始我以为问题出在宠物素材包。

Hatch Pet 的标准格式是一个 8x9 的 spritesheet,每一格是 192x208。不同的行对应不同状态,比如 idle、running、waiting、failed、review 等。

宠物包本身确实能控制角色在格子里占多少,也能决定透明背景、帧排列、状态动画。

但它控制不了桌面端最终把这个宠物显示多大。

这就是第一层坑。

Hatch Pet 管的是“宠物资产怎么生成、怎么打包、怎么被 Codex 识别”。

桌面端显示层管的是“这个宠物浮窗多大、外层容器多大、主进程怎么测量和摆放”。

这两个不是一回事。

我前面就是把这两件事混在一起了。

于是我开始改 Codex 桌面端。

这一步,普通用户真的别学。

我当时的想法很简单:既然 CSS 里写着 width: 7.04rem,那我把它改成三倍,比如 21.1rem,不就完事了吗?

事实证明,事情没这么简单。

更精彩的是,我还把 Codex 改崩了。

一打开就崩。

传出去就是:

Codex 把自己玩死了。


Codex 为什么会被我改崩

一个兄弟挂了,只能让另一个兄弟上。

CC,启动。

我让 Claude Code 帮我分析崩溃原因。

image-20260508144250046

排查过程很长,我就不展开折磨大家了。

直接说结论:

我在 dangerFullAccessapprovalPolicy: never 的权限下,让 Codex 直接修改了 /Applications/Codex.app/Contents/Resources/app.asar 里的 CSS。

问题是 Electron App 的 app.asar 不是普通文件。

你改了它,Info.plist 里的 ASAR 完整性 hash 也要同步更新,否则 Electron 启动时会发现 hash 不匹配,然后直接 FATAL。

也就是说,CSS 本身不是罪魁祸首。

真正让 Codex 起不来的,是:

改了 ASAR,但没有同步完整性校验。

这就像你把保险柜里的文件偷偷换了,但封条还贴着旧编号。系统一开门,发现编号不对,直接报警。

后来修复方式也很明确:

  • 备份原始 app.asar
  • 修改 ASAR
  • 重新计算 hash
  • 写回 Info.plist
  • 重新 codesign
  • 准备 rollback 脚本

这一步之后,我才敢继续折腾。

因为最怕的不是改错。

最怕的是改错以后没退路。


只改 21.1rem 为什么没用

修好以后,我继续尝试把宠物放大。

我先把 codex-avatar-root7.04rem 改到 21.1rem

理论上应该变大三倍。

结果没变。

这就很离谱。

我让 Codex 继续排查,最后终于抓到了幕后黑手。

整个链路是这样的:

  1. codex-avatar-root 的 CSS 宽度确实被改成了 21.1rem
  2. 但它外面还有一层 React wrapper。
  3. 这层 wrapper 的 class 写死了 size-20
  4. 在 Tailwind 里,size-20 大约就是 80px x 80px

所以之前的情况其实是:

里面的图想变大,外面的盒子不让它变大。

更关键的是,Codex 桌面端主进程会根据这个 wrapper 的实际尺寸来摆放宠物。

当时全局状态里已经能看到证据:

{
  "width": 712,
  "height": 640,
  "mascot": {
    "width": 80,
    "height": 87
  }
}

这说明外层窗口已经变大了,但宠物本体测量出来还是 80x87

真正限制大小的不是 codex-avatar-root

而是 data-avatar-mascot 那层 wrapper。

最后真正生效的修复是把:

relative flex size-20 ...

改成类似:

relative h-96 w-80 ...

也就是让宠物本体容器从约 80x80 放大到约 320x384

这一步之后,桌宠才真正变大。

所以这次最有意思的地方不是“我把宠物放大了”。

而是它暴露了一个很典型的前端问题:

你看到的那个样式,未必是最终限制你的那个样式。

很多时候你改了子元素,父容器还在掐脖子。

这事儿写前端的人应该都懂。


但这里要说清楚:我这不是 Hatch Pet 的标准玩法

严格来说,我后面这些操作,已经不是 Hatch Pet 的正统流程了。

Hatch Pet 的原始逻辑是:

从 concept、reference images 或二者结合开始,用 Image Gen 生成 base,再生成带参考约束的每一行动画 row strip,先生成 running-right,再判断 running-left 是否可以安全镜像,然后用 skill 自带的 deterministic scripts 去 ingest、validate、assemble spritesheet,最后打包到 ${CODEX_HOME:-$HOME/.codex}/pets/<pet-name>/

也就是说,Hatch Pet 正规做的是一条资产生成流水线。

它关心的是:

  • 角色是谁
  • 每个状态怎么动
  • 每一帧有没有越界
  • spritesheet 是否符合 8x9
  • pet.json 是否正确
  • 能不能被 Codex 识别

而我后面做的是另一条线:

  • 改 Codex App 的显示尺寸
  • 改 React wrapper
  • 改 overlay 主进程几何
  • 改 ASAR hash
  • 重新签名

这已经是桌面端显示层改造了。

所以如果你只是想做一个正常宠物,不要学我这样改 App。

你应该老老实实走 Hatch Pet 的标准流程。

但如果你的诉求是“我要让桌面宠物在屏幕上整体变大”,那 Hatch Pet 本身解决不了,因为它只负责宠物资产,不负责 Codex 桌面端怎么显示这个资产。

这就是这次折腾最重要的结论。


为什么我说 Codex 这个宠物比 CC 的好用

因为它不只是情绪价值。

情绪价值当然有。

默认蓝色小人很可爱,自定义成 2B 也很爽。

但真正让我觉得它有价值的,是它和 Codex 的工作流连在了一起。

它能告诉你任务在跑。

它能提醒你哪里需要处理。

它能作为一个浮在桌面上的轻量入口。

这就让它从“宠物”变成了“Agent 工作状态的可视化外壳”。

Claude Code 的宠物更像一个彩蛋。

Codex 的宠物更像一个 UI 层。

彩蛋会腻。

UI 层不会。

因为只要你的工作流还在,它就还有存在价值。

这也是为什么我一开始看不上它,后来又真香。

它不是因为可爱才值得玩。

它是因为刚好站在了一个非常微妙的位置:

Agent 越来越后台化,而用户需要一个前台感知层。

桌面宠物就是这个前台感知层的一种形态。

你可以觉得它幼稚。

但你不能否认,它确实解决了一部分“我不知道 Agent 现在在干嘛”的问题。


最后

这次折腾下来,我对 Codex 桌面宠物的评价变了。

一开始我以为它是一个玩具。

后来发现它是一个状态入口。

再后来我把它改崩了。

最后我意识到,它其实暴露了 Codex 桌面端产品设计里一个很有意思的方向:

AI Agent 不能永远躲在终端里。

它需要有状态。

需要有存在感。

需要在你不盯着它的时候,也能告诉你“我还在干活”“我卡住了”“你该回我了”。

这不是简单的萌宠问题。

这是 Agent 产品形态的问题。

当然,做自定义宠物也是真的费额度。

我这次是因为领了 GPT 给我的 Pro 20x 权益,所以才能一路猛夯。

image-20260508133941909

普通用户慎重。

别看我这里写得轻松,背后其实是:

生成图反复漂移、透明背景反复调、spritesheet 要符合格式、桌面端还可能被你改崩。

但话又说回来。

这不就是 AI 工具现在最有意思的地方吗?

它不是完美产品。

它是一个可以被你当场掰开、重组、改坏、修好、再继续玩的东西。

这才叫真的好玩。