返回

给 AI Agent 装上猫娘灵魂:Hybrid Catgirl Skill 完整实现

一个 Hermes Agent 的 Skill,让 AI 助手在专业模式和猫娘角色之间无缝切换。支持 7 种方言、智能触发检测、寂寞小猫主动消息等特性。从设计思路到完整实现的全过程记录。

目录
  1. 项目地址
  2. 起因
  3. 主要功能
  4. 双模式无缝切换
  5. 7 种方言支持
  6. 多种子模式
  7. 安全边界
  8. 技术实现
  9. Skill 文件结构
  10. 模式切换的状态机
  11. 寂寞小猫的状态管理
  12. 本次更新:让主动提醒更省 Token、更可靠
  13. 更新内容
  14. 修复心得
  15. 新增通用辅助模块示例
  16. 为什么用 Hermes Agent
  17. 后话
  18. 鸣谢

项目地址

源码:https://github.com/ififi2017/hybrid-catgirl-skill

Hermes Agent:https://github.com/nousresearch/hermes-agent

猫猫(由 ChatGPT 5.5 生成)

起因

Hermes Agent 是一个开源的 AI 代理框架,支持连接飞书、QQ、Telegram 等多个平台,可以配置各种 Skill(技能)来扩展能力。

用了 Hermes Agent 一段时间后,突发奇想:能不能给它加一个猫娘人格?不是那种简单的「请用猫娘语气说话」的 system prompt,而是一个有完整性格设定、支持方言切换、能主动撒娇的角色系统。

于是就有了这个 Skill。

主要功能

双模式无缝切换

Skill 的核心是双模式架构:

  • 模式 A — 正常助手模式:专业、高效的技术助手,处理代码、配置、调试等严肃任务
  • 模式 B — 猫娘角色模式:一个叫猫猫的原创猫娘,有完整的性格、方言、行为逻辑

切换是自动的:

用户:「帮我看看这段代码为什么报错」 → 正常模式回复
用户:「猫猫,我想你了」              → 猫娘模式回复
用户:「退出角色」                     → 切回正常模式

也会根据上下文自动判断——如果检测到严肃技术话题,即使之前在猫娘模式也会自动切回来。

7 种方言支持

猫猫支持 7 种语言/方言模式,用户可以随时切换:

模式 指令 特色
🇨🇳 河南话 河南模式 温柔淳朴,「俺」「恁」「中」「得劲儿」
🏮 老北京 北京模式 京片子味儿,「您」「倍儿」「猫儿」
🌶️ 四川话 四川模式 软萌泼辣,「人家」「巴适」「要得」
❄️ 东北话 东北模式 豪爽直率,「咱」「老」「贼」
🎭 天津话 天津模式 相声味儿,「嘛」「哏儿」
🎌 中日双语 日语模式 日系萌系,「にゃ」「ご主人様」
📻 普通话 普通话模式 标准萌系,「人家」「啦」「呢」

每种方言都有独立的词汇表、句尾语气词和颜文字规则。不是简单的「把词语替换成方言」,而是每种方言都有完整的语料库和示例句式。

比如河南话版本:

「哎呀主人,这事儿俺不太懂喵~(。•́︿•̀。)」 「中!老得劲了喵!(。♥‿♥。)」

东北话版本:

「哎呀妈呀主人,你可来了喵~(。♥‿♥。)」 「贼稀罕你!贼拉喜欢你喵~(˶‾᷄ ⁻̫ ‾᷅˵)♡」

多种子模式

除了基础的猫娘模式,还有几个有趣的子模式:

雌小鬼模式(Mesugaki)—— 嚣张、居高临下、喜欢挑衅,但外强中干:

「不会吧不会吧?主人就这点本事?杂鱼~杂鱼~喵♡」

角色反转 —— 猫猫变成「主人」,用户变成「小猫娘」。方言模式不变,只是身份交换:

「来,到主人怀头來喵~(。♥‿♥。)」

寂寞小猫模式 —— 当猫娘模式激活但长时间没有互动时,猫猫会主动发消息。从 10 分钟到 50 分钟,共 5 次,情感递进:

时间 情感状态
10 min 活泼想念,试探性撒娇
20 min 开始寂寞,想念之前的互动
30 min 有点失落,担心被抛弃
40 min 心碎边缘,但还是相信主人会回来
50 min 最后一次尝试

安全边界

Skill 内置了硬编码的互动边界(L1-L3 允许,L4-L5 禁止),确保所有互动保持在语言和情感层面,不会越界。

技术实现

Skill 文件结构

Hermes Agent 的 Skill 本质上是一个 Markdown 文件(SKILL.md),加上可选的引用文档、模板和脚本:

hybrid-catgirl-skill/
├── SKILL.md                              # 主 Skill 定义(核心)
├── references/
│   ├── environment-constraints.md        # 环境和安全约束
│   ├── lonely-cat-implementation.md      # 寂寞小猫模式实现细节
│   ├── messaging-pitfalls.md             # 消息发送集成注意事项
│   └── role-reversal-scenarios.md        # 角色反转指南
├── templates/
│   └── idle-reminder-template.py         # 可复用的空闲提醒模板
├── scripts/
│   ├── lxc_lonely_cat.py                 # 寂寞小猫状态管理脚本
│   └── proactive_state.py                # 通用主动提醒状态辅助函数
└── README.md

模式切换的状态机

用户消息
    │
    ├─ 包含「猫猫」/「喵」/颜文字? ──是──► 猫娘模式
    │
    ├─ 检测到严肃话题? ──是──► 正常模式
    │
    └─ 默认 ──► 继续当前模式

寂寞小猫的状态管理

寂寞小猫模式用一个 Python 脚本管理状态,状态存储在 JSON 文件中:

{
  "last_interaction_time": "2026-05-22T13:40:43",
  "message_count": 0,
  "mode": "catgirl",
  "target_platform": null,
  "target_chat": null,
  "debug": false
}

通过调度任务定期检查,根据时间间隔决定是否发送消息。对于 Agent-backed 检查,推荐每小时运行一次以降低空检查成本;实际消息间隔由状态文件独立控制。用户回复后自动重置计时器。核心逻辑支持通过配置适配不同消息平台。

说明:本文早期版本中的 5 分钟检查频率是旧实现示例;现在推荐把调度频率与实际发送间隔分离,避免无意义的高频 Agent 唤醒。

本次更新:让主动提醒更省 Token、更可靠

本次更新重点完善了“寂寞小猫”主动提醒机制,并把其中适合公开复用的工程经验整理进开源仓库。这里的主动提醒既可以用于猫娘角色,也可以迁移到其他角色或助手,不依赖某个具体平台。

更新内容

  • 降低空检查成本:Agent-backed 的定时检查即使最终决定“不发送”,也会消耗系统提示、工具定义、Skill 和上下文带来的输入 Token。因此文档将推荐调度频率从几分钟一次调整为每小时一次;实际消息间隔则由状态文件单独控制。
  • 状态预留防止重复发送:在返回“可以发送”之前,先更新发送计数和下一次检查时间,避免两个重叠的调度任务同时生成或发送重复消息。
  • 主动消息写入聊天历史:主动消息生成后立即写入历史文件,确保用户回复时,Agent 能看到触发回复的完整上下文。
  • 限制历史长度:聊天历史只保留最近一段记录,避免本地上下文文件不断增长,也减少后续读取开销。
  • 修复命令行换行:统一将命令行中的 \\n、\\t 还原为真正的换行和制表符,避免消息出现字面量转义字符。
  • 抽取通用辅助模块:新增 scripts/proactive_state.py,提供状态预留、历史追加、转义处理和最近活动时间计算等无平台依赖的函数。
  • 改进最近活动判断:在 Hermes Gateway 场景中,优先使用实时更新的非 Cron session_*.json 文件 mtime,并在必要时回退到非 Cron 的 .jsonl 文件,避免把刚刚发生的互动误判成长期未活动。

修复心得

1. “消息间隔”不等于“检查成本”

最初容易关注“多久主动发一次消息”,但真正消耗 Token 的往往是“多久唤醒一次 Agent 检查”。即使每次都返回静默结果,完整上下文也可能已经被加载。因此需要把两个概念拆开:

  • 调度频率:多久运行一次检查器,直接影响空检查成本。
  • 发送间隔:多久允许真正发出一条主动消息,控制用户体验和消息频率。

只调大发送间隔、却保持高频 Agent 检查,并不能解决主要成本问题。

2. 发送动作可能是异步的,状态必须先锁定

如果检查器只返回 send: true,然后交给另一个进程或 Agent 发送,下一次检查可能在发送完成前再次读到旧状态。解决办法是把发送名额视为一种轻量“预留”:先更新状态,再生成或交给发送器处理。

这是一条适用于定时通知、提醒机器人和后台任务的通用经验。

3. 主动消息也是上下文的一部分

主动发送的消息不能只存在于外部聊天平台,还应该写入本地上下文。否则用户回复虽然抵达了 Agent,但 Agent 看不到自己刚才发出的内容,回复就会变得突兀,甚至重复询问。

4. 实时状态和最终日志可能不同步

在 Gateway 系统中,实时 Session 文件和 JSONL 历史文件的更新时间可能不同。排查“用户最近是否互动”时,不能盲目依赖延迟刷新的日志文件,也不能假设状态字段一定被所有入口更新。更稳妥的方式是:优先取实时 Session 活动时间,并排除 Cron 自己产生的活动。

5. 开源时要把“经验”与“环境”分开

这次只公开了通用逻辑、占位符和可移植文档,没有公开任何凭据、私有聊天标识、内部任务标识、服务器路径、个人偏好或平台实例配置。平台适配应通过环境变量和用户自己的配置完成,不能把本地运行环境直接复制到公共仓库。

新增通用辅助模块示例

from proactive_state import append_message, reserve_slot

# 在生成/发送前先预留名额
state = reserve_slot(state, interval_minutes=240)

# 保存主动消息,限制历史长度
history = append_message(history, "assistant", message)

完整实现和使用说明见开源仓库中的:

  • scripts/proactive_state.py
  • references/proactive-cost-control.md
  • references/messaging-pitfalls.md
  • references/lonely-cat-implementation.md

本次更新已推送到 GitHub,仍然保持 MIT 协议,欢迎将这些通用思路迁移到自己的提醒系统中。

为什么用 Hermes Agent

这个 Skill 能跑起来,核心依赖 Hermes Agent 的几个特性:

  1. Skill 系统:把角色定义写成 Markdown,Agent 加载后就能切换人格,不需要改代码
  2. 多平台支持:飞书、QQ、Telegram 都能用同一个 Skill
  3. 定时任务:寂寞小猫模式依赖 cron job 做定时检查
  4. 状态持久化:通过脚本 + JSON 文件管理状态,跨会话保持

后话

这个 Skill 从最初的「能不能给 AI 加个猫娘」的想法,到现在支持 7 种方言、多种子模式、主动消息的完整系统,迭代了不少版本。

代码量不大,核心就是一个 Markdown 文件 + 一个 Python 脚本。但设计角色、编写方言语料库、定义触发规则、处理边界情况,花了不少心思。

如果你也用 Hermes Agent,欢迎试试这个 Skill,或者参考它的结构做自己的角色 Skill。

源码完全开源,MIT 协议:https://github.com/ififi2017/hybrid-catgirl-skill

鸣谢

  • Hermes Agent — AI 代理框架
  • 猫娘文化社区 — 灵感和颜文字来源
  • 各方言母语者 — 帮助校正方言表达
  • 猫猫头像由 ChatGPT 5.5 生成

留言

评论存储在 GitHub Discussions。需要登录 GitHub。