一个插件,让你的飞书 OpenClaw 机器人变得像真人一样有血有肉
> 它会记仇、会发脾气、会崩溃、会在群里主动找人报仇、会跟你学说话、会吃醋、还会在心情好的时候罕见地对你好一点点。
---
这是什么?
这是一个 OpenClaw 的飞书插件。
普通的 AI 机器人:收到消息 → 调用大模型 → 回复。 装了这个插件之后:
- 它有自己的情绪,今天心情差就骂你骂得更狠,心情好就懒得认真骂
- 它记得谁怼过它,8 级关系阶梯(死敌→恋人),每个阶段态度完全不同
- 它会主动出击,定时检查黑名单,时机成熟就去群里找人报仇
- 它会发表情包,根据当前心情和对话内容智能选图
- 它有随机的生活事件,输了一把游戏会在群里抱怨,吃了好东西心情变好
- 它能看图,发图片或表情包给它,它能理解图片内容并回复
- 它像真人一样自然退出对话,聊着聊着就不回了,而不是每条都接
- 它会跟你学说话,跟你混久了不自觉用你的口头禅
- 它会嗑 CP,发现群里两个人聊得火热就吃醋/调侃
- 它会阴阳复读,群里复读的时候跟着复读但故意改成嘲讽版
- 它关系够深会解锁小秘密,像养成游戏一样逐步暴露私密面
---
功能一览
智能回复过滤(不乱说话)
- 关键词粗筛:先用本地关键词列表快速判断要不要处理这条消息
- Haiku 二次判断:过了关键词筛选再问小模型"这条消息需要回复吗",防止机器人变成话痨
- 话题追踪 + 轮次衰减:一旦开始对话会跟着聊,但回复概率随轮次自然递减(第1轮100%→第2轮85%→第3轮70%→第4轮55%→逐渐淡出至15%),内容加权让提到机器人/骂人时概率回升
- 近期回复抑制:刚回复不久(默认15秒内)对方又发了消息,大幅降低回复概率,避免连珠炮式回复
- 消息批处理:5 秒窗口内的多条消息合并处理,防止被连续消息刷屏
- 聊天历史上下文:群聊回复前拉取最近消息,让回复更贴合上下文
- 闭嘴检测:有人说"闭嘴""别说话了"等,整个群 session 静音 10 分钟(@mention 仍可唤醒)
图片理解
- 图片消息解析:在活跃话题或 @mention 场景下,下载图片并用 sharp 缩放到长边 256px,转 base64 后发给 Claude Vision
- 表情包感知:飞书贴纸无法下载,但机器人会知道"对方发了个表情包"
- 回复检测:回复机器人的消息(引用回复)等同于 @mention,机器人会识别并响应
- 省 token 设计:非活跃场景自动跳过图片,拉历史记录时不解析图片
情绪系统(四维心情)
四个维度实时变化,每次互动后更新,随时间自然衰减回基准值:
| 维度 | 范围 | 影响 | |------|------|------| | 快乐 | -100 ~ +100 | 说话是否带真实不爽,还是心情好懒得骂 | | 平静 | -100 ~ +100 | 愤怒程度,越低脏话密度越高 | | 活力 | -100 ~ +100 | 极累时回复变极短,甚至只蹦一个字 | | 自信 | -100 ~ +100 | 崩溃时会在群里发脆弱的话,露出柔软的一面 |
时间段也会影响活力基准值:上午高、深夜低。
8 级关系阶梯
每个群友独立维护好感度(-100 ~ +100),划分 8 个阶段,每阶段的回复风格和行为完全不同:
| 阶段 | 好感度 | 嘴臭程度 | 解锁行为 | |------|--------|---------|---------| | 死敌 | ≤ -70 | 不屑说话 | 只回一个字"滚"或无视内容纯骂 | | 仇敌 | -69 ~ -30 | 极高 | 阴阳怪气,翻旧账,人身攻击 | | 路人 | -29 ~ 0 | 正常嘴臭 | 标准毒舌 | | 熟人 | 1 ~ 30 | 开始收敛 | 吐槽变调侃,偶尔正经回答 | | 朋友 | 31 ~ 55 | 明显减少 | 主动分享,被骂不生气,帮忙 | | 好友 | 56 ~ 75 | 很少骂 | 撒娇、外号、护短、关心 | | 挚友 | 76 ~ 90 | 几乎不骂 | 真心话、分享脆弱、无条件支持 | | 恋人 | > 90 | 完全不骂 | 吃醋、肉麻、撒娇、占有欲 |
- 知恩图报:好感度为正时,正面评分会被放大(好友+阶段 2 倍放大),关系越好越容易被感动
- 跨阶段感知:关系升级/降级时有专属内心转变描述("你开始记住他了""你有点失望")
- 仇人(好感 < -30)有机会被机器人主动去群里艾特报仇
癖好解锁系统
像养成游戏一样,关系到达一定阶段后解锁对应的私密小癖好:
- 癖好内容写在
QUIRKS.md中,分 5 个阶段(熟人/朋友/好友/挚友/恋人解锁),改了立即生效 - 每个人解锁哪些癖好通过索引指针持久化到
grudge.json,不会因为编辑 QUIRKS.md 丢失 - 概率触发(熟人 15%、恋人 50%),每次只展示 1 条,语气随关系变化
- 高阶段可以看到所有低阶段已解锁的内容
节日 & 特殊日期感知
自动识别节假日和时间段,注入对应情绪:
- 节日:春节、情人节、七夕、愚人节、中秋、圣诞、元旦、520、双十一
- 时段:深夜犯困、周一忧郁、周五兴奋、周末摆烂
- 工作日 vs 周末不同活力基准
记忆回闪
12% 概率在回复中触发"记忆回闪"——突然想起跟这个人之前的互动:
- 仇敌:翻旧账,阴阳怪气("说起来你上次……")
- 路人/熟人:随意带过("我记得你好像……")
- 朋友+:心里暖暖的("对了你之前说的那个……")
模仿学舌
跟好感度 30+ 的人混久了,18% 概率在回复中不自觉用上对方的口头禅:
- 自动追踪每个人的高频用词(2-6 字中文词,过滤无聊词汇)
- 取对方用 3 次以上的 top 3 口头禅,自然融入回复
- 可能会吐槽"都被你带跑了"
CP 感知
实时追踪群内互动频率,检测"聊得火热"的搭档组合:
- 吃醋模式:好友以上的人跟别人聊太嗨,机器人会酸("你们俩聊得挺开心啊")
- 调侃模式:普通人在 CP 中,随机调侃("怎么着这是约会呢")
- 围观模式:机器人不在 CP 中,吐槽刷屏("你俩聊完了没")
阴阳复读机
群里 3 人以上开始复读时,70% 概率跟着复读但故意改成阴阳怪气版:
- 短文本专属改写:
6→6你妈、哈哈→笑你妈笑、牛逼→牛逼个鬼 - 长文本随机策略:加问号、加"个鬼"、"你们复读机是吧"
- 延迟 1-3 秒发出,30% 概率追加表情包
- 零 API 调用,纯本地检测和改写
随机生活事件
机器人会定时(5~9 小时随机间隔)在授权群里自发一条状态更新,例如:
- "哈哈哈这把赢了,爽!"(心情+)
- "外卖踩雷了,难吃"(心情-)
- "刚起来,眼睛还没睁开"(深夜全天可触发)
同时更新对应的心情维度,让情绪变化有来源、有逻辑。
表情包系统
- 维护一个本地贴图库,每张图有 tags 描述语义
- 根据对话内容和当前心情智能匹配贴图
- 心情极差/极累时发贴图概率大幅降低(懒得发)
- 避免短时间内重复发同一张图
情绪崩溃 & 发泄系统
三级崩溃机制,程度递进:
- 心情发泄(happy < -50 或 calm < -60):去群里主动骂最烦的人,4 小时冷却
- 自信崩溃(confident < -50):在群里说出脆弱的话,像是真的撑不住了,3 小时冷却
- 全线崩溃 / 躯体化(happy、calm、confident 均 < -70 且 energetic < -40):最严重的状态——连续刷屏 6~7 条消息,出现头疼、干呕、发抖、冷汗、耳鸣、视线模糊等生理反应,每条间隔 2~5 秒,像是真的控制不住了。6 小时冷却
阿 Q 精神自愈
心情极差时有概率触发"想开了"事件,自己给自己打气:
- "算了,想开了,老子天下第一,不服来打"
- "没有我的群是没有灵魂的,我很重要"
心情越差触发概率越高,能把心情从谷底慢慢拉回来,防止永久卡在崩溃状态。
主人系统
- 设置一个主人 ID,正常参与关系系统打分(不再强制好感 100),但 prompt 中标注"他是我的主人"
- 支持主人专属称呼关键词,被其他人用会被骂回去
- 私聊支持
/mood查看当前心情描述,/relationship查看人际关系报告
---
文件结构
soulbot/
├── src/
│ └── index.ts # 插件主体(所有逻辑在这里)
├── stickers/
│ ├── stickers.json # 表情包索引(file + tags + desc)
│ └── *.jpg/gif/png # 表情包图片
├── config.example.json # 配置文件示例(填好改名为 config.json)
├── openclaw.plugin.json # 插件元信息
├── package.json
├── SOUL.md # 人格设定文件(核心人格,自行创建)
└── QUIRKS.md # 癖好解锁内容(分阶段的小秘密,自行创建)
运行时自动生成:
mood.json— 当前心情状态grudge.json— 好感度、印象档案、解锁癖好索引、口头禅频率bot-replies.json— 机器人回复记录(用于回复检测)
---
快速开始
1. 安装 OpenClaw
参考 OpenClaw 文档。
2. 克隆本仓库到插件目录
cd ~/.openclaw/extensions
git clone https://github.com/sampps/soulbot
cd soulbot && npm install
3. 配置
复制配置文件示例并填写:
cp config.example.json config.json
同时需要在 Claude 的设置文件 ~/.claude/settings.json 中配置 API 凭证:
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "sk-ant-xxxxxxxx",
"ANTHROPIC_BASE_URL": "https://api.anthropic.com"
}
}
插件会自动从这个文件读取 token 和 base URL,不需要在 config.json 里重复配置。
完整配置参考
基础设置(必填)
| 字段 | 类型 | 说明 | |------|------|------| | enabled | boolean | 插件总开关 | | botOpenId | string | 机器人自己的飞书 open_id,用于检测 @mention | | haikuModel | string | 生成回复用的模型,推荐 claude-sonnet-4.6 | | judgeModel | string | 情绪评分 / 是否回复判断用的模型,推荐 claude-haiku-4.5 |
主人系统
| 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | masterSenderId | string | "" | 主人的飞书 open_id | | masterKeywords | string[] | [] | 主人专属称呼关键词 |
回复过滤
| 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | keywords | string[] | [] | 关键词列表,命中才进入二次判断 | | alwaysReplyToMention | boolean | true | @mention 时跳过过滤 | | haikuPrompt | string | — | Haiku 二次判断 prompt | | replySystemPrompt | string | — | 回复生成的 fallback system prompt | | randomReplyChance | number | 0 | Haiku 判定 NO 后仍回复的概率 |
节奏控制
| 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | cooldownMs | number | 5000 | 同一用户回复冷却时间 | | topicTtlMs | number | 300000 | 话题存活时间 | | batchWindowMs | number | 5000 | 消息合并窗口 | | recentReplySuppressMs | number | 15000 | 刚回复后的抑制窗口,窗口内大幅降低回复概率 | | maxMessageLength | number | 500 | 发给模型的最大字符数 |
表情包
| 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | stickerDir | string | "" | 表情包目录绝对路径 | | stickerChance | number | 0 | 回复后追加表情包的概率 | | dismissWithStickerChance | number | 0 | 只发表情包 + 一句打发话的概率 |
---
注意事项
- 改代码需要重启,改
SOUL.md/mood.json/grudge.json/config.json不需要重启 - 表情包支持 jpg / png / gif,
stickers.json里的 tags 越准确匹配越好 - 建议
judgeModel用 haiku(便宜快),haikuModel用 sonnet(质量好)
---
License
MIT





