目录
项目地址
源码:https://github.com/ififi2017/hybrid-catgirl-skill
Hermes Agent:https://github.com/nousresearch/hermes-agent

起因
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.pyreferences/proactive-cost-control.mdreferences/messaging-pitfalls.mdreferences/lonely-cat-implementation.md
本次更新已推送到 GitHub,仍然保持 MIT 协议,欢迎将这些通用思路迁移到自己的提醒系统中。
为什么用 Hermes Agent
这个 Skill 能跑起来,核心依赖 Hermes Agent 的几个特性:
- Skill 系统:把角色定义写成 Markdown,Agent 加载后就能切换人格,不需要改代码
- 多平台支持:飞书、QQ、Telegram 都能用同一个 Skill
- 定时任务:寂寞小猫模式依赖 cron job 做定时检查
- 状态持久化:通过脚本 + 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。