soulbot

sampps/soulbot

Otheropenclawby sampps

Summary

OpenClaw plugin exposing 0 skills.

Install to Claude Code

openclaw plugin add sampps/soulbot

Run in Claude Code. Add the marketplace first with /plugin marketplace add sampps/soulbot if you haven't already.

README.md

一个插件,让你的飞书 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% 概率跟着复读但故意改成阴阳怪气版:

  • 短文本专属改写:66你妈哈哈笑你妈笑牛逼牛逼个鬼
  • 长文本随机策略:加问号、加"个鬼"、"你们复读机是吧"
  • 延迟 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

Related plugins

Browse all →