【More than Coding】被爆火的 Codex 桌面宠物种草后,我用 SOLO 自己复刻了一个

1. 摘要

最近 OpenAI Codex 上线的桌面宠物功能火了,一只像素风小宠物住在屏幕角落,实时反映编程状态。我觉得太酷了,但它是 Codex 专属的——于是我用 TRAE SOLO 从零搭建了一个独立的跨平台桌面宠物应用,兼容 Codex Pet 精灵图格式。


2. 背景

我是一名非技术岗位的职场人,平时的工作和写代码没什么关系。前几天刷到 OpenAI Codex 推出的桌面宠物功能,会根据你的编程状态切换动画:运行时跑来跑去、等待时乖巧站立、代码出错时一脸沮丧,让我想起了上古时代的回形针和瑞星小狮子。

现在桌宠的应用非常多,最难的在于素材的生成,好在codex里面已经有了具体的图片生成的SKILL——hatch-runs,以及各种开发者自己在社区上传的各种格式的素材皮肤。

这就让问题变得简单了,基于这些标准的素材文件,能不能做一个独立的桌面宠物,不依赖任何编程工具,任何人的电脑上都能跑?

SOLO 让我觉得这件事也许可行。


3. 实践过程

3.1 第一步:调研——搞清楚 Codex 宠物是怎么实现的 :magnifying_glass_tilted_left:

我没有急着让 SOLO 写代码,而是先让它帮我调研 Codex 桌面宠物的技术原理。这一步非常关键,因为只有理解了底层逻辑,后面才能做出正确的技术决策。

SOLO 帮我梳理出了几个核心发现:

  • Codex 宠物本质上是一个「始终置顶的浮动状态面板」,类似 iOS 的 Live Activities
  • 动画采用经典的精灵图集(Sprite Sheet)方式,规格为 1536×1872 像素,8 列 × 9 行网格,每格 192×208
  • 9 行分别对应 9 种状态:idle、running-right、running-left、waving、jumping、failed、waiting、running、review
  • 宠物动画和 Agent 状态通过状态机严格绑定,不是随机播放
  • 宠物资产格式有明确的工程规范(Codex Pet Contract),包括透明背景、固定尺寸等

这些信息让我心里有了底:核心就是一个状态机驱动的精灵图动画悬浮窗。技术门槛没有想象中那么高。

3.2 第二步:任务拆解——把大目标拆成可执行的小步骤 :puzzle_piece:

调研完成后,SOLO 自动生成了一个结构化的任务清单:

  • :white_check_mark: 项目初始化:搭建 Electron 项目结构
  • :white_check_mark: 精灵图动画引擎:加载图集、状态机驱动动画播放
  • :white_check_mark: 透明置顶悬浮窗 + 拖拽交互
  • :white_check_mark: AI 对话功能:气泡 UI + LLM API 调用
  • :white_check_mark: 系统托盘 + 设置面板
  • :white_check_mark: 下载宠物资源并集成

看到这个清单的时候我其实有点惊讶——SOLO 不仅理解了我要做什么,还自动补全了我没想到的细节,比如系统托盘、设置面板这些。

3.3 第三步:技术选型——一个意外的转折 :high_voltage:

我最初想用 Tauri V2(Rust + Web 前端),因为打包体积小、性能好。SOLO 也按这个方向开始搭建项目。但很快遇到了第一个坑:当前环境没有安装 Rust 工具链,而 Rust 的安装过程超时了。

这时候 SOLO 展现了很强的适应能力——它立刻评估了替代方案,发现 Node.js 环境可用,于是果断切换到 Electron 方案,并解释了为什么 Electron 同样适合这个场景:生态成熟、跨平台支持完善、开发资料丰富。

这个决策过程让我印象深刻:SOLO 不是死板地执行指令,而是在遇到障碍时主动寻找最优解。

3.4 第四步:核心开发——精灵图动画引擎 :artist_palette:

整个项目最核心的部分是精灵图动画引擎。SOLO 生成了一个完整的 PetEngine 类,实现了:

  • 精灵图集加载:支持 PNG/WebP 格式,兼容 Codex Pet Contract 规范
  • 状态机驱动:9 种状态精确映射到精灵图的不同行
  • 帧率控制:每种状态有独立的 FPS 设置(idle 4fps、running 8fps 等)
  • Canvas 渲染:使用 HTML5 Canvas 逐帧绘制,支持像素风缩放
  • 一次性动画:支持 playOnce() 方法播放挥手、跳跃等临时动画后自动回到之前状态

SOLO 还在代码中写入了完整的 Codex Pet 精灵图格式规范注释,方便后续扩展。这种「工程化思维」让我觉得它不只是帮我写了代码,更是在教我怎么做一个合格的项目。

PixPin_2026-05-04_09-26-50

3.5 第五步:交互体验——拖拽 + AI 对话 :speech_balloon:

动画引擎搞定后,SOLO 继续构建了交互层:

  • 拖拽移动:通过 mousedown/mousemove/mouseup 事件链实现,区分拖拽和点击(移动距离 < 2px 视为点击)
  • 单击挥手、双击打开对话面板:用计时器区分单击和双击
  • 右键菜单:快速切换状态、打开设置
  • AI 对话:支持 OpenAI 兼容 API(OpenAI、DeepSeek、通义千问等),带打字动画和气泡提示

AI 对话的 system prompt 也很有趣——SOLO 自动给宠物设定了人设:「你是一只住在纸箱里的桌面宠物,喜欢陪伴主人编程,请用简短可爱的方式回答」。


4. 成果展示 :trophy:

最终产出了一个完整的跨平台桌面宠物应用,以下是核心功能:

功能 说明
9 种动画状态 idle、running、waving、jumping、failed、waiting、review 等
透明置顶悬浮窗 始终在所有窗口之上,不影响其他操作
拖拽移动 鼠标拖拽宠物到桌面任意位置
AI 对话 支持 OpenAI/DeepSeek/通义千问等兼容 API
智能行为调度 键盘/鼠标/剪贴板事件自动触发不同动作
自定义皮肤 兼容 Codex Pet 格式,可直接使用 PetDex 上的宠物
跨平台 支持 Windows、macOS、Linux
系统托盘 最小化到托盘,右键快速操作

项目结构:

desktop-pet/
├── main.js              # Electron 主进程
├── preload.js           # 安全桥接层
├── src/
│   ├── index.html       # 宠物主界面
│   ├── settings.html    # 设置页面
│   ├── pet-engine.js    # 精灵图动画引擎
│   ├── chat.js          # AI 对话模块
│   └── app.js           # 主应用逻辑
├── pets/
│   └── boxcat/          # 内置宠物
│       ├── pet.json
│       └── spritesheet.webp
└── assets/
    └── tray-icon.png

PixPin_2026-05-04_09-32-27

PixPin_2026-05-04_09-34-15

PixPin_2026-05-04_09-42-52

PixPin_2026-05-04_09-35-57

PixPin_2026-05-04_09-37-20


5. 效果与总结 :bar_chart:

效率对比

维度 传统方式 使用 SOLO
开发时间 3-5 天 不到 1 小时
技术门槛 需掌握 Electron + Canvas + 状态机 会用自然语言描述需求即可
代码质量 取决于个人水平 结构清晰、注释完整、工程化
跨平台适配 需要分别调试 Electron 一次构建,三端运行

SOLO 在这个项目中的角色

回顾整个过程,SOLO 承担的不只是「写代码」的角色,更像是一个全栈搭档:

  • :magnifying_glass_tilted_left: 调研分析师:帮我梳理 Codex 宠物的技术原理和资产规范
  • :building_construction: 架构师:规划项目结构、拆解任务、选择技术方案
  • :man_technologist: 工程师:编写精灵图引擎、状态机、拖拽交互、AI 对话等核心模块
  • :fire_extinguisher: 问题解决者:遇到 Rust 安装超时,主动切换到 Electron 方案
  • :clipboard: 产品经理:补充了我没想到的功能(系统托盘、设置面板、右键菜单)

个人思考

这个项目让我对「AI + 非技术人」有了新的理解。以前我觉得不会写代码就做不了软件,但 SOLO 改变了这个认知。它不是替我写代码那么简单,而是在整个过程中引导我思考:先调研再动手、遇到问题灵活调整、关注用户体验细节。

最重要的是,它让我体验到了创造的乐趣。从「被种草」到「自己造一个」,这种从消费者到创造者的转变,是 AI 赋能非技术人最打动我的地方。 :sparkles:


互动 :speech_balloon:

:heart: 觉得有帮助的话,点个赞支持一下~

:bookmark: 欢迎收藏和分享给感兴趣的朋友!