Cyber-Yichen/hermes-feishu-group-context
Local Feishu/Lark group chat archiving and on-demand context for Hermes Agent.
readme
[!IMPORTANT] AI Agent / Coding Agent:请先阅读 AGENTS.md。 该文档包含架构约束、数据流、测试方法和修改规则。不要只根据 README 猜测实现。
Hermes Feishu Group Context
为 Hermes Agent 提供飞书 / Lark 群聊本地归档、按时间范围检索和按需上下文能力。
这个项目解决一个很具体的问题:
- 希望 Hermes 能保留群聊记录;
- 不希望每条群消息都触发 Agent 或消耗模型 Token;
- 正常情况下,只有
@机器人才应该回复; - 当群里只发送一个单独的
@机器人时,希望它自动参考最近的聊天; - 当
@机器人并附带问题时,只在近期消息明显相关时补充少量上下文; - 当用户要求“复盘今天聊了什么”时,只在这一次请求中读取指定范围的群聊记录。
项目使用本地 SQLite 保存群消息。普通群消息不会被发送给模型,只有明确触发上下文功能时,选中的记录才会进入模型输入。
[!WARNING] 本项目会在本机以明文 SQLite 数据库保存群聊内容。请确认你有权保存相关群成员的消息,并妥善保护 Hermes 数据目录。
功能概览
| 场景 | 是否归档 | 是否调用模型 | 是否回复 |
|---|---|---|---|
| 群内普通消息,没有 @机器人 | 是 | 否 | 否 |
@机器人 并附带正常问题 |
是 | 是,相关时附带最近 5 条 | 是 |
只发送一个单独的 @机器人 |
是 | 是,自动附带最近 N 条 | 是 |
@机器人 复盘今天聊了什么 |
是 | 是,按需查询今天的归档 | 是 |
| 私聊机器人 | 不属于本插件的群归档范围 | 由 Hermes 权限配置决定 | 由 Hermes 权限配置决定 |
核心能力:
- 在 Hermes 的
@机器人过滤之前归档群消息; - SQLite 持久化,Hermes 重启后记录仍然存在;
- 飞书历史消息 API 回填安装前的聊天记录;
- 按今天、昨天、最近 N 小时或自定义时间范围读取;
- 单独 @机器人时自动加载最近消息,默认 20 条;
- @机器人并附带内容时,默认检查最近 5 条;无明显关联时不注入;
- 若候选历史全部是 @机器人消息,则忽略历史并直接处理当前消息;
- 每个群可独立修改两类自动上下文条数,
0表示关闭; - 默认删除 30 天前的本群归档,可设为
0永久保留; - 不在普通请求中持续注入群聊历史;
- 安装前自动备份 Hermes Feishu 适配器;
- 补丁器可重复运行,不会重复插入代码。
技术栈
| 技术 | 用途 | 是否需要额外部署 |
|---|---|---|
| Python 3.10+ | 插件逻辑、SQLite 读写、历史回填、适配器补丁 | 不需要,使用 Hermes 自带虚拟环境 |
| Python 标准库 | sqlite3、urllib、json、zoneinfo、文件与时间处理 |
不需要安装第三方包;Windows 缺少 IANA 时区数据时自动回退到 UTC+8 |
| SQLite 3 + WAL | 本地保存群聊消息,支持并发读写和按群、时间查询 | 不需要数据库服务 |
| PowerShell 5.1 / 7+ | Windows 安装、备份、启用插件、重启 Gateway | Windows 自带或使用 PowerShell 7 |
| Hermes Plugin API | 注册 Hook、Agent 工具和 /group-context 指令 |
由 Hermes Agent 提供 |
| Hermes Feishu Adapter | 接收消息事件、执行 @ 过滤、发送回复 | 由 Hermes Agent 提供 |
lark-oapi |
Hermes 通过 WebSocket 接收飞书事件 | 由 Hermes Feishu 平台依赖提供 |
| Feishu Open API | 获取访问令牌、回填群聊历史 | 使用飞书应用凭据,无需单独服务 |
| JSON | 保存每个群的上下文条数和归档保留天数 | 本地文件 |
项目不需要:
- Node.js、npm 或前端构建;
- Redis、MySQL、PostgreSQL 等数据库服务;
- Docker;
- ORM;
- 常驻的额外 Web 服务;
- 单独安装 Python 依赖。
运行时主体仍然是 Hermes Gateway。本项目只是一个用户插件,加上三处受控的适配器 Hook。
工作原理
flowchart TD
A["飞书群消息事件"] --> B["Hermes Feishu Adapter"]
B --> C["过滤前归档 Hook"]
C --> D[("本地 SQLite")]
B --> E{"是否 @机器人"}
E -- "否" --> F["停止,不调用模型"]
E -- "是且包含文字" --> L["检查最近 5 条的关联性"]
L -- "相关且并非全部已 @" --> G["附带可选上下文"]
L -- "无关或全部已 @" --> M["直接处理当前消息"]
E -- "只有一个纯 @" --> H["读取最近 N 条归档"]
H --> G
M --> I
G --> I["模型生成回复"]
I --> J["发送到飞书群"]
G -. "用户明确要求复盘" .-> K["feishu_group_history 工具"]
K --> D
项目由两部分组成:
- Hermes 用户插件
- 监听
feishu_group_message_received,将群消息写入 SQLite; - 监听
feishu_group_empty_mention,处理纯 @; - 监听
feishu_group_content_mention,处理 @并附带内容的相关上下文; - 提供
feishu_group_history工具; - 注册
/group-context设置指令和过期消息清理。
- 监听
- 适配器补丁
- 在 Hermes 丢弃非 @ 或空文本之前调用插件 Hook;
- 不改动 Hermes 的模型、会话、发送消息和权限系统。
环境要求
- Windows 10 / Windows 11;
- 已安装并可运行 Hermes Agent;
- Hermes 已配置飞书 / Lark 平台;
- Python 使用 Hermes 自带虚拟环境即可;
- 飞书应用已启用机器人能力;
- 飞书应用使用
im.message.receive_v1消息事件; - 机器人已加入需要归档的群聊。
默认示例假设:
Hermes Home: D:\env\hermes
Hermes Repo: D:\env\hermes\hermes-agent
如果你的 Hermes 位于其他目录,请在安装时通过 -HermesHome 指定。
飞书权限
为了接收和回填群聊消息,飞书应用通常需要以下应用身份权限:
im:message.group_msg:获取群组中所有消息;im:message:readonly或im:message:读取历史消息;im:message:send_as_bot:以机器人身份回复;im:message.p2p_msg:readonly:接收私聊消息,可按实际需要启用。
事件订阅至少需要:
im.message.receive_v1
im:message.group_msg 属于敏感权限,可能需要管理员审核。修改权限或事件订阅后,需要发布新的飞书应用版本才会生效。
安装
1. 克隆仓库
Set-Location E:\Git
git clone https://github.com/Cyber-Yichen/hermes-feishu-group-context.git
Set-Location .\hermes-feishu-group-context
2. 确认 Hermes 已连接飞书
Hermes 的 .env 中应已经存在:
FEISHU_APP_ID=你的应用ID
FEISHU_APP_SECRET=你的应用密钥
FEISHU_CONNECTION_MODE=websocket
不要把真实 .env、App Secret 或访问令牌提交到本仓库。
仓库中的 .env.example 可以作为字段参考,但真实值必须保存在 HERMES_HOME\.env。
3. 执行安装
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
.\install.ps1 -HermesHome D:\env\hermes
安装脚本会:
- 检查 Hermes、Python、CLI 和 Feishu 适配器路径;
- 检查当前适配器是否兼容补丁;
- 备份已有插件和 Feishu 适配器;
- 安装插件到 Hermes 用户插件目录;
- 添加过滤前归档和纯 @ Hook;
- 启用
feishu-context-archive插件; - 重启 Hermes Gateway。
安装完成后检查:
$env:HERMES_HOME = 'D:\env\hermes'
D:\env\hermes\hermes-agent\venv\Scripts\hermes.exe plugins list --plain --no-bundled
D:\env\hermes\hermes-agent\venv\Scripts\hermes.exe gateway status
预期能看到:
enabled user 1.2.0 feishu-context-archive
回填已有群聊记录
插件安装后会自动记录新消息。若要导入安装前的历史消息,可运行:
D:\env\hermes\hermes-agent\venv\Scripts\python.exe `
.\scripts\backfill_history.py `
--hermes-home D:\env\hermes `
--chat-id <飞书群 chat_id>
chat_id 通常以 oc_ 开头。可以在 Hermes 日志中的以下记录找到:
[Feishu] Bot added to chat: oc_xxxxxxxxx
也可以同时回填多个群:
D:\env\hermes\hermes-agent\venv\Scripts\python.exe `
.\scripts\backfill_history.py `
--hermes-home D:\env\hermes `
--chat-id <群一 chat_id> `
--chat-id <群二 chat_id>
按飞书秒级时间戳限制范围:
D:\env\hermes\hermes-agent\venv\Scripts\python.exe `
.\scripts\backfill_history.py `
--hermes-home D:\env\hermes `
--chat-id <飞书群 chat_id> `
--start-time 1782662400 `
--end-time 1782748800
回填操作以 message_id 去重,可以安全地重复执行。
使用方法
普通群聊
没有 @机器人的消息只会进入本地归档,不会调用模型,也不会回复。
正常 @机器人
@机器人 帮我解释一下这个问题
按照普通 Hermes 请求处理,不会自动附加全部群聊历史。
纯 @机器人
@机器人
当消息中只有一个 @,没有其他文字时,插件会:
- 排除当前纯 @ 消息;
- 读取这个群之前最近 N 条归档;
- 按时间顺序提供给 Hermes;
- 让 Hermes 根据近期讨论回应;
- 如果意图仍不明确,只问一个简短的澄清问题。
默认 N 为 20。
按范围复盘
可以自然地提出:
@机器人 复盘我们今天聊了什么
@机器人 总结昨天的群聊
@机器人 看一下最近 3 小时的讨论
@机器人 总结 2026-06-29 09:00 到 18:00 的消息
Hermes 会在需要时调用 feishu_group_history 工具。工具支持:
todayyesterdaylast_hoursrecentcustom
修改上下文与保留设置
设置按群保存。指令需要在群里 @机器人:
@机器人 /group-context
@机器人 /group-context status
@机器人 /group-context pure 20
@机器人 /group-context content 5
@机器人 /group-context retention 30
@机器人 /group-context set 20 5 30
@机器人 /group-context off
@机器人 /group-context on
@机器人 /group-context reset
指令说明:
| 指令 | 作用 |
|---|---|
/group-context |
查看当前群设置 |
/group-context status |
查看当前群设置 |
/group-context pure 20 |
纯 @ 时读取最近 20 条 |
/group-context content 5 |
@并附带内容时最多读取最近 5 条 |
/group-context retention 30 |
删除 30 天前的本群消息 |
/group-context set 20 5 30 |
一次设置纯 @、有内容 @、保留天数 |
/group-context 30 |
兼容旧语法,设置纯 @ 为 30 条 |
/group-context off |
关闭当前群的纯 @ 自动上下文 |
/group-context on |
重新开启 |
/group-context reset |
恢复默认值 |
两类上下文均可设置为 0 到 100 条,0 表示不读取。保留天数可设置为 0 到 3650 天,0 表示不自动删除。
过期清理在新消息归档时每个群最多每 6 小时执行一次。修改保留天数或恢复默认设置时,会立即尝试清理当前群的过期记录。
@并附带内容时,插件先执行轻量相关性判断。当前消息包含“上面”“刚才”“继续”等承接词,或与近期消息存在共同的中英文关键词时,才会注入上下文。若候选消息全部曾经 @机器人,则直接忽略历史。该判断用于降低无关 Token 消耗,不是语义检索模型。
数据与备份位置
默认归档数据库:
D:\env\hermes\archives\feishu_group_messages.sqlite3
群上下文与保留设置:
D:\env\hermes\archives\feishu_context_settings.json
适配器和旧插件备份:
D:\env\hermes\backups\feishu-context-archive
数据库使用 WAL 模式,运行期间可能同时看到:
feishu_group_messages.sqlite3
feishu_group_messages.sqlite3-wal
feishu_group_messages.sqlite3-shm
这是 SQLite 的正常行为。
更新
Set-Location E:\Git\hermes-feishu-group-context
git pull
.\install.ps1 -HermesHome D:\env\hermes
安装脚本是幂等的:
- 已存在的归档 Hook 不会重复添加;
- 已存在的纯 @ Hook 不会重复添加;
- 更新插件前会备份旧插件;
- 修改适配器前会创建带时间戳的备份。
停用与恢复
先停用插件:
$env:HERMES_HOME = 'D:\env\hermes'
D:\env\hermes\hermes-agent\venv\Scripts\hermes.exe plugins disable feishu-context-archive
D:\env\hermes\hermes-agent\venv\Scripts\hermes.exe gateway restart
停用后,归档和纯 @ 上下文不会运行,但适配器中的 Hook 调用仍然存在。没有已启用插件监听 Hook 时,这些调用不会产生业务效果。
若希望彻底恢复适配器:
- 停止 Gateway;
- 在
D:\env\hermes\backups\feishu-context-archive中找到正确时间点的adapter.py...bak; - 核对备份时间和内容;
- 将该文件恢复为 Hermes 的
plugins\platforms\feishu\adapter.py; - 重新启动 Gateway。
不要未经核对就恢复最旧或最新备份,因为 Hermes 适配器可能还包含其他本地修改。
隐私与安全
- 群聊记录保存在本机,不会由本插件上传到第三方服务;
- 只有进入模型上下文的选定记录会发送给当前配置的模型服务;
- SQLite 数据库当前不加密;
- 默认自动删除 30 天前的记录;如需永久保留,必须显式把保留天数设为
0; - 不要提交
.env、数据库、备份、日志和真实群 ID; - 公开部署前,应向群成员说明消息归档行为;
- 请通过磁盘权限、BitLocker 或其他系统级措施保护 Hermes 数据目录。
故障排查
普通群消息没有进入归档
检查:
- 机器人是否已加入群;
- 是否开通
im:message.group_msg; - 是否订阅
im.message.receive_v1; - 飞书应用的新版本是否已发布;
- 插件是否为
enabled; - Gateway 是否使用正确的
HERMES_HOME。
纯 @ 没有回复
检查日志中是否出现:
[Feishu] Pure group mention expanded with archived context
若没有:
- 重新运行
install.ps1; - 确认补丁器显示
features=archive,archive_mention_flag,empty_mention,content_mention; - 确认机器人身份能被 Hermes 正确识别;
- 运行
/group-context status检查是否被关闭。
回填报权限错误
确认机器人仍在群内,并检查:
im:message.group_msgim:message:readonly或im:message
Hermes 更新后补丁检查失败
不要强制字符串替换。Hermes 上游可能修改了适配器结构。请:
- 保留当前错误输出;
- 对比新的
_handle_message_event_data和_process_inbound_message; - 更新
scripts/patch_adapter.py的插入点; - 重新运行语法和功能测试。
开发验证
Python 语法检查:
D:\env\hermes\hermes-agent\venv\Scripts\python.exe -m py_compile `
.\plugin\__init__.py `
.\scripts\patch_adapter.py `
.\scripts\backfill_history.py
功能测试:
$env:PYTHONDONTWRITEBYTECODE = '1'
D:\env\hermes\hermes-agent\venv\Scripts\python.exe -m unittest discover -s tests -v
检查当前 Hermes 适配器是否可安装:
D:\env\hermes\hermes-agent\venv\Scripts\python.exe `
.\scripts\patch_adapter.py `
D:\env\hermes\hermes-agent\plugins\platforms\feishu\adapter.py `
--check
项目结构:
.
├── .env.example
├── AGENTS.md
├── LICENSE
├── README.md
├── install.ps1
├── plugin
│ ├── __init__.py
│ └── plugin.yaml
└── scripts
├── backfill_history.py
└── patch_adapter.py
代码以 Python 标准库为主,不提供 requirements.txt,因为插件不会引入额外的 PyPI 依赖。
已知限制
- 当前安装脚本面向 Windows PowerShell;
- 本地数据库未加密;
- 没有可视化管理界面;
- 相关性判断是轻量关键词规则,可能忽略只有隐含语义关联的历史;
- 发送者在模型上下文中使用 ID 后缀区分,暂未自动解析群成员姓名;
- Hermes 上游大幅修改 Feishu 适配器后,补丁插入点可能需要更新;
- 纯 @ 只能读取消息发送之前的记录,不可能读取未来消息。
许可证
本项目采用 MIT License。
项目状态
当前插件版本:1.2.0
本项目是社区扩展,不隶属于 NousResearch、Hermes Agent、飞书或字节跳动。