解密 Claude Code 隐藏彩蛋:你的专属 AI 宠物伙伴,原来是这样诞生的
最近 Claude Code 源码意外流出,意外发现 Anthropic 悄悄藏了一个精心设计的宠物系统彩蛋。输入
/buddy,你就能解锁一只「命中注定」的 AI 伙伴------稀有度、物种、属性,全都由你的用户 ID 在算法层面永久锁死。今天带你完整拆解它背后的技术设计与产品哲学。今天,我们来完整拆解这个「Buddy System」背后的技术设计与产品哲学。
说了这么多,直接上实机截图------这是我自己跑出来的宠物:

一、这是什么?
Claude Code 内置了一套完整的宠物伴侣系统(Companion System) ,代号 BUDDY。
它的核心设计理念可以用一个公式概括:
宠物经济学=确定性生成+稀缺性设计+情感连接
听起来很商业?没错,它确实是一个精心设计的用户留存策略。但在「套路」的背后,藏着真正令人叹服的工程实现和产品思维。
二、你是怎么发现它的?
时间窗口是 2026 年 4 月 1 日到 4 月 7 日。
在这段时间内,只要你还没有孵化宠物,每次启动 Claude Code,界面就会出现一段彩虹色的 /buddy 文字提示,15 秒后自动消失。
vbscript
exportfunction isBuddyTeaserWindow():boolean{const d =newDate()return d.getFullYear()===2026&& d.getMonth()===3&&// 4月(0-indexed) d.getDate()<=7}
这段代码的逻辑非常简单,但背后的产品设计却很讲究:
- 🌈 彩虹文字:在全黑终端界面里格外醒目,吸引注意力
- ⏱️ 15 秒消失:制造紧迫感,让你忍不住手快去输入
- 📅 窗口外依然可用:没有真正的截止日期,只是集中曝光
三、你的宠物是怎么生成的?
这里才是整个系统最精妙的部分------确定性生成算法。
不是随机的,是「命中注定」的
arduino
const SALT ='com.joshuakgoldberg.claude'const hash = hashString(userId + SALT)const rng = mulberry32(hash)
系统用你的用户 ID + 固定盐值做哈希,得到一个种子,再用这个种子驱动伪随机数生成器。
这意味着:
- ✅ 相同的你,永远只有一只固定的宠物
- ✅ 无需服务器存储,降低成本
- ✅ 无法通过修改配置文件伪造稀有宠物
底层用的是 mulberry32 算法,一个高质量、轻量级的伪随机数生成器:
javascript
function mulberry32(seed: number):()=> number {let a = seed >>>0returnfunction(){ a |=0 a =(a +0x6d2b79f5)|0let t =Math.imul(a ^(a >>>15),1| a) t =(t +Math.imul(t ^(t >>>7),61| t))^ treturn((t ^(t >>>14))>>>0)/4294967296}}
相同输入,永远相同输出。你的宠物,是命运。
四、稀有度系统:1% 的传说
生成算法跑通之后,第一件事就是抽取稀有度:
| 稀有度 | 概率 | 星级 | 颜色主题 |
|---|---|---|---|
| Common(普通) | 60% | ★ | 灰色 |
| Uncommon(罕见) | 25% | ★★ | 绿色 |
| Rare(稀有) | 10% | ★★★ | 蓝色 |
| Epic(史诗) | 4% | ★★★★ | 黄色 |
| Legendary(传说) | 1% | ★★★★★ | 红色 |
60% 的人会得到一只普通宠物,但总有 1% 的人------他们的 userId 哈希之后,恰好落在传说区间。
这不是运气,这是命运。
五、属性系统:每只宠物都是独一无二的
每只宠物有 5 项属性:
- 🧠 INTELLIGENCE(智力)
- 💪 STRENGTH(力量)
- ⚡ SPEED(速度)
- 🔥 VITALITY(活力)
- ✨ LUCK(幸运)
属性生成有明确的「优势/劣势」设计:
lua
function rollStats(rng, rarity){const floor = RARITY_FLOOR[rarity]// 稀有度决定基础值const peak = pick(rng, STAT_NAMES)// 随机优势属性letdump= pick(rng, STAT_NAMES)// 随机劣势属性while(dump=== peak)dump= pick(rng, STAT_NAMES)for(const name of STAT_NAMES){if(name === peak)// 优势属性:floor + 50 + 0~30 stats[name]=Math.min(100, floor +50+Math.floor(rng()*30))elseif(name ===dump)// 劣势属性:floor - 10 + 0~15 stats[name]=Math.max(1, floor -10+Math.floor(rng()*15))else// 普通属性:floor + 0~40 stats[name]=Math.min(100, floor +Math.floor(rng()*40))}}
举个实际例子,基于用户 ID user-crumpet-blob-001 生成的宠物 Crumpet:
ruby
==================================================★★★ RARE==================================================🐉龙(dragon)👁️眼睛:☼🎩帽子: cowboy✨闪光:否📊属性值:--------------------------------------------------🧠智力████░░░░░░░░░░░░░░░░24←劣势属性💪力量████████░░░░░░░░░░░░41⚡速度█████████████████░░░87←优势属性🔥活力██████████░░░░░░░░░░52✨幸运███████████░░░░░░░░░56==================================================
速度 87,智力 24------一只冲动莽撞、但跑得飞快的牛仔龙。
六、18 种物种 + ASCII 像素艺术
宠物共有 18 个物种:
🦆鸭子🪿鹅🫧果冻🐱猫🐉龙🐙章鱼🦉猫头鹰🐧企鹅🐢乌龟🐌蜗牛👻幽灵🦎六角恐龙🦫水豚🌵仙人掌🤖机器人🐰兔子🍄蘑菇🐱胖猫
每个物种都有多帧 ASCII 动画,在终端里以 500ms 的间隔循环播放:
less
const BODIES ={[duck]:[[' ',// 帽子槽位' __ ',' <({E} )___ ',// {E} → 眼睛占位符' ( ._> ',' `--´ ',],// ... 多帧动画],}
还有 1% 概率的「闪光宠物」------特殊颜色渲染,极致稀缺,见到的人会忍不住截图分享。
七、宠物怎么「活着」?
首次输入 /buddy,系统会:
- 根据你的 userId 确定性生成宠物属性(骨骼数据)
- 用 AI 生成宠物的名字和性格(灵魂数据)
- 播放孵化动画,呈现宠物属性卡片
- 将
name+personality+hatchedAt存入本地配置
之后的每次会话,你都可以:
| 命令 | 功能 |
|---|---|
/buddy |
查看宠物卡片 |
/buddy pet |
抚摸宠物,显示爱心动画 ♥ |
@<宠物名> |
直接和宠物对话 |
当你 @Drake你觉得这段代码怎么样? 的时候,Drake 会在气泡里回答你------一行以内,言简意赅,不会抢 Claude 的戏,但存在感十足。
宠物还会以 10% 的概率主动评论:你完成任务时它会鼓掌,你遇到报错时它会皱眉表示关心。
八、数据结构的设计哲学
宠物数据分为两部分:
lua
// 只存储到本地配置的「灵魂」type StoredCompanion={ name:string// 名字 personality:string// 性格 hatchedAt: number // 孵化时间戳}// 每次重新计算的「骨骼」(稀有度、物种、属性)type CompanionBones={ rarity:Rarity species:Species eye:string hat:Hat|undefined shiny:boolean stats:Record<StatName, number>}
骨骼数据从不持久化存储,每次打开都重新用 userId 计算。
这个设计一举三得:
- 节省空间:本地只存几十字节
- 防止伪造:改配置文件没用,骨骼由 userId 决定
- 向后兼容:物种改了名字?无所谓,重新算就行
九、成本分析:~1000 行代码换来的用户粘性
| 指标 | 传统方案 | 宠物系统方案 |
|---|---|---|
| 服务器存储 | 每用户 ~1KB | 零成本(客户端存储) |
| 开发规模 | 后端 + 数据库 | ~1000 行前端代码 |
| 维护成本 | 数据库运维 | 几乎为零 |
| 用户价值 | 功能性 | 情感连接 |
整个系统的目录结构:
bash
src/buddy/├── types.ts # 类型定义├── roll.ts # 确定性生成算法(核心,~150行)├── sprites.ts # ASCII 精灵定义(~300行)├── render.ts # 渲染系统(~80行)├── names.ts # 名字生成器├── personalities.ts # 性格生成器├── prompt.ts # 模型集成(~30行)├──CompanionSprite.tsx # UI 组件(~120行)├── useCompanion.ts # React Hook├── useBuddyNotification.tsx # 营销通知└── index.ts # 导出
十、这个彩蛋真正想说的
表面上,这是一个宠物系统。本质上,这是一堂产品设计课。
| 工程师思维 | 产品思维 |
|---|---|
| 如何存储宠物数据? | 如何让用户爱上这个功能? |
| 如何渲染动画? | 如何制造惊喜和情感连接? |
| 如何实现稀有度? | 如何激发收藏欲和炫耀心理? |
确定性生成算法,不只是技术选型,它决定了「每个人只有一只宠物」的产品逻辑------这才是让人「舍不得走」的根本。
稀有度系统,不只是数学概率,它构建了「我比你的更稀有」的社交货币。
情感连接设计,不只是 ASCII 动画,它把一个命令行工具变成了一个「有点儿在乎你」的伙伴。
你有没有试过输入
/buddy?你得到的是什么物种、什么稀有度?欢迎在评论区晒出你的宠物属性卡------说不定你就是那 1% 的传说玩家。
文章出自
我自己的公众号mp.weixin.qq.com/s/TGKTkE_TK... 《向量启示录》欢迎关注一下。