Hermes 飞书流式卡片插件把 Hermes Agent Gateway 的飞书/Lark 回复变成一张持续更新的交互式卡片。思考过程、工具调用、最终答案、授权确认、选项选择、系统提示和运行统计会收束在卡片内,而不是散落成多条灰色原生消息。
它面向真实飞书使用场景:流式内容漏字/乱序、长表格和代码块变成 raw markdown、工具过程不可见、approval/clarify 需要手工回复、话题里卡片不更新、多 bot / 多 profile 难排查,以及 Hermes 升级后 hook 兼容不确定。
| 运行中 | 等待用户 |
|---|---|
![]() |
![]() |
| 失败 | 已完成 |
![]() |
![]() |
运行时 Header 跟随 Hermes 的真实工具动作更新,公开阶段输出继续在正文流式呈现;完成后只保留飞书原生回复引用,不再叠加一层 Hermes Agent 卡片标题。
- 一张持续更新的飞书卡片:
thinking.delta、answer.delta、tool.updated、message.completed会合并到同一张卡片。 - 运行态 Header 看见当前动作:Header title 保留用户自定义标题(默认
Hermes Agent),subtitle 将工具名与tool.updated.detail整理为实时动作摘要;完整命令留在 timeline。 - 主答案和过程分区:最终答案留在正文区,pre-tool answer、工具调用、系统 notice 进入“思考与工具” timeline。
- 卡片内交互:approval / clarify choices 渲染为按钮;
/new、/reset、/undo、/model等独立命令使用原生 interactive card。V4 的/model与 Hermes CLI 使用同一 Provider/模型列表,按 Provider → Model 两级选择,不再把全部模型挤进一个下拉框。 - 飞书话题一致体验:话题里的后续流式事件通过
reply_to_message_id回到原卡片,系统提示不再重复外溢。 - 群聊诊断更清楚:
/hfc status会提示群内 chat binding 状态、绑定命令和 slash command 行为边界。 - 运维卡有明确边界:
/hfc doctor可给出诊断、两步安全修复和重启确认;私聊不比较操作者,群聊只允许发起者确认。运维卡不可用时继续使用 CLI,不改变普通流式卡的 layout 或 footer。 - 长内容保护:长 Markdown 表格、fenced code block 按结构边界拆分,降低 raw markdown 和半截围栏问题。
- 可诊断、可恢复:
doctor、/hfc status、/healthmetrics、runtime import 检查、safe repair/restore/uninstall 覆盖常见故障。
| 你遇到的问题 | 插件做的事 |
|---|---|
| 飞书里只看到最终文本,看不到 Agent 过程 | 把思考、工具、答案、footer 统计放进同一张卡片 |
运行中不断出现 Working、压缩提示、skill loading、自我改进 review |
识别为 system.notice,进入当前卡片或独立小卡片 |
| 话题回复里卡片发出来了,但 timeline 不更新 | 用 source.message_id / reply_to_message_id 锚定同一张话题卡片 |
| 授权、选择、模型切换要手工回编号 | 优先使用飞书按钮或下拉选择,失败时再退回文本 fallback |
| Hermes 升级后不知道 hook 是否兼容 | doctor --explain 展示 version_source、hook_strategy、compatibility、anchors 和建议 |
macOS / Linux:
curl -fsSL https://raw.githubusercontent.com/baileyh8/hermes-feishu-streaming-card/main/install.sh | bashWindows PowerShell:
irm https://raw.githubusercontent.com/baileyh8/hermes-feishu-streaming-card/main/install.ps1 | iex安装脚本会安装或升级插件、读取/提示飞书凭据、写入本地 .env,并调用整合安装器:
python3 -m hermes_feishu_card.cli setup \
--hermes-dir ~/.hermes/hermes-agent \
--config ~/.hermes/config.yaml \
--yes安装完成后检查 sidecar:
python3 -m hermes_feishu_card.cli status --config ~/.hermes/config.yaml更完整的安装包、Release 下载、Docker 和 PEP 668/uv 说明见 README-install.md 与 详细使用手册。
复制 config.yaml.example 到本地使用,不要提交真实凭据。
server:
host: 127.0.0.1
port: 8765
feishu:
app_id: ""
app_secret: ""
card:
title: Hermes Agent
footer_fields: [duration, model, input_tokens, output_tokens, context]需要显示 Codex 订阅剩余额度时,把 subscription_usage 加入 footer_fields。插件仅在显式启用后,通过 Hermes 原生 fetch_account_usage("openai-codex") 查询;旧 Hermes、未登录或网络失败时静默隐藏,不影响卡片完成。
飞书凭据也可以放在配置同目录 .env:
FEISHU_APP_ID=cli_xxx
FEISHU_APP_SECRET=xxx
FEISHU_CONNECTION_MODE=websocket
FEISHU_HOME_CHANNEL=oc_xxx多 bot、群聊绑定、bindings.chats、multi profile、profile-aware routing、footer 字段和 no-op client 说明见 详细使用手册。
确认 streaming.enabled 为 true,并让 Hermes 使用 edit transport。
确保 Hermes config.yaml 中启用流式编辑:
streaming:
enabled: true
transport: edit不要设置 display.platforms.feishu.streaming: false。也不要把 display.show_reasoning 当成本插件必需开关;它可能把 reasoning 追加到最终回复里,反而干扰卡片流式体验。插件会直接处理 Hermes 的 thinking.delta / answer.delta。
Hermes v2026.4.23 起的旧版和 Hermes 0.13.0+/0.14.0/0.15.x/0.17.x/0.18.x 均有兼容策略;doctor 会优先读取 VERSION 或 Git tag v2026.4.23+,也会在版本 metadata 不完整或不可解析时用 gateway/run.py anchors 兜底。升级 Hermes 或插件后建议重新执行 setup 或 install --hermes-dir ... --yes。
已有 Hermes 容器优先使用:
export FEISHU_APP_ID=cli_xxx
export FEISHU_APP_SECRET=xxx
export HFC_VERSION=v4.0.6
bash install-docker.sh默认路径:
| 变量 | 默认值 |
|---|---|
HERMES_DIR |
/opt/hermes |
HFC_CONFIG |
/opt/data/config.yaml |
HFC_ENV_FILE |
/opt/data/.env |
HFC_VERSION |
latest |
docker-compose.example.yml 是适配示例,不是官方镜像。V3.8.6 起,Docker/source-stripped Hermes 缺少 VERSION 和 .git 时也会用 Gateway anchors 兜底判断 gateway_run_013_plus。
| 命令 | 说明 |
|---|---|
setup --hermes-dir ... --yes |
一键配置、检测、安装 hook、启动 sidecar |
doctor --config ... --hermes-dir ... --explain |
诊断 Hermes 版本、runtime import、hook strategy、anchors 和建议 |
install --hermes-dir ... --yes |
安装插件到 Hermes runtime venv,并安装 hook |
repair --hermes-dir ... --yes |
修复可验证的 hook manifest/backup 状态 |
setup --repair ... --yes / --no-repair |
自动修复已知安全状态,或显式关闭自动修复 |
restore --hermes-dir ... --yes |
恢复原始 Hermes 文件 |
start --config ... / status --config ... / stop --config ... |
sidecar 进程管理和 /health 检查 |
smoke-feishu-card --profile-id ... --chat-id ... |
真实飞书卡片 smoke test |
| `bots list | show |
高频流式调优通常不需要改。遇到 DeepSeek burst、token-by-token 或长上下文压力时再看:
| 变量 | 默认值 | 用途 |
|---|---|---|
HERMES_FEISHU_CARD_DELTA_COALESCE_MS |
250 |
Gateway 内 delta 最大合并等待时间 |
HERMES_FEISHU_CARD_DELTA_COALESCE_CHARS |
600 |
pending delta 达到字符数后立即 flush |
HERMES_FEISHU_CARD_DELTA_COALESCE_MAX_PENDING |
128 |
pending delta session 上限 |
| 版本 | 重点 |
|---|---|
| v4.0.6 | 修复 Hermes 0.18.x 完成 hook、队列完成 hook,以及无灰色原生输出且可正确收束的 background 通知卡片;新增显式且 fail-closed 的 Hermes 升级恢复 |
| v4.0.5 | 修复升级后 Gateway venv 仍加载旧插件的问题;安装器会比较 runtime 版本、自动同步并在安装后复核版本与路径 |
| v4.0.4 | 修复 Markdown MEDIA: 字面量、SDK 预绑定旧 callback 的交互转发,以及 Codex 只返回单个限额窗口时的错误 5h 标签 |
| v4.0.3 | 修复仅升级包并重启、但仍保留 V4.0.0 completion hook 时的媒体回答灰色正文重复;匹配正文只抑制一次,原生图片/文件继续发送 |
| v4.0.2 | 修复 manifest 与 backup 均可信时,合法旧 owned hook 仍被拒绝升级的问题;保留 v4.0.1 的媒体正文去重修复 |
| v4.0.1 | 修复 MEDIA: 图片/文件完成卡之后重复发送原生正文;原生通道仅投递媒体,卡片隐藏内部本地路径 |
| v4.0.0 | 运行态 Header 实时显示 Hermes 工具 preview,正文独立流式显示公开阶段输出;等待、失败、完成状态自然衔接并保持现有 Footer/引用边界 |
| v3.10.0 | 裸 /resume 使用原生会话下拉卡并沿用 Hermes 安全恢复路径;模型 footer 增加转义后的轻量语义色,不改变布局和字段顺序 |
| v3.9.1 | 可靠性热修:完成答案不截断、打断任务终态串行化、模型选择回调异步化,以及可验证的 marker-only 安装损坏恢复;普通流式卡 footer/layout 保持不变 |
| v3.9.0 | 运维与可靠性基础:PR #84 / @Zanetach 的卡片 progress-status 路由与 .env 白名单扩展的 profile 环境支持、安全修复/重启运维卡与 CLI fallback;普通流式卡的 footer/layout 保持不变 |
| v3.8.18 | cron 卡片携带 thread_id 回到飞书话题原线程(PR #91,贡献者 @colinaaa) |
| v3.8.17 | cron deliver=origin/all 等路由意图会解析到飞书目标并发送卡片 |
| v3.8.16 | 话题群连续消息复用 message_id 时,第二条及后续消息会重新发送卡片 |
| v3.8.15 | 输入 .docx/files 上下文只做卡片附件摘要,不再放行重复原生最终 reply |
| v3.8.14 | WebSocket 长连接下 agent clarify/approval 按钮通过 interaction.select 原生 card action 闭环 |
| v3.8.13 | Hermes v2026.7.7.2 / 0.18.2 升级后可用 anchors 兜底并修复 stale install state |
| v3.8.12 | 修复带 colors.csv / styles.csv 等附件摘要的完成卡片仍重复发送原生 reply 的问题 |
| v3.8.11 | /hfc status 卡片接管后不再同时触发灰色 Unknown command /hfc 原生回复 |
| v3.8.10 | 群聊 /hfc status 自动提示 chat binding 与 slash command 边界;工具详情显示参数、耗时和失败原因 |
| v3.8.9 | 飞书/Lark 话题内卡片连续更新,system.notice 不再重复外溢 |
| v3.8.8 | Hermes 原生系统提示卡片化:Working、上下文压缩、skill loading、自我改进 review |
| v3.8.7 | 新版 Hermes 缺少 message.started 时也能从首个 delta/completed 事件创建卡片 |
| v3.8.6 | Docker/source-stripped Hermes 缺 VERSION 时用 Gateway anchors 兜底,兼容 Hermes v0.18.0 |
| v3.8.5 | /new、/model 等直通命令执行结果保持卡片反馈 |
完整版本历史见 CHANGELOG.md,更长的历史说明保留在 详细使用手册。
Hermes Gateway
-> minimal hook in gateway/run.py
-> hermes_feishu_card.hook_runtime
-> HTTP POST /events
-> sidecar server
-> CardSession state
-> Feishu CardKit send/update
-> retry / coalescing / metrics / /health
这是 sidecar-only 设计:Hermes hook 保持 fail-open,飞书发送、更新、状态机、重试、诊断都在 sidecar 中运行。历史 V2 实现归档在 legacy/,不是 active runtime。
- 详细使用手册:中文 / English
- 安装包说明:README-install.md
- 架构说明:中文 / English
- 事件协议:中文 / English
- 安装安全:中文 / English
- 迁移说明:中文 / English
- 端到端验证:中文 / English
- 发布准备:中文 / English
- 测试说明:中文 / English
- 项目维护 Wiki:docs/wiki
- gischuck - PR #12 Accept-Encoding 修复
- gischuck - PR #76 思考与工具 timeline 体验建议与实现探索
- fengs2021 - PR #17 锁架构优化与更新间隔改进
- colinaaa - PR #87 WebSocket
interaction.selectclarify/approval 卡片交互支持 - colinaaa - PR #88 话题群
message_id复用下第二轮消息新卡片修复 - colinaaa - PR #91 cron 结果回到飞书话题群原线程的
thread_id路由修复 - zayn-0101 - PR #77 cron
deliver=origin/all路由意图卡片投递修复 - Zanetach - PR #84 卡片 progress-status 路由与
.env白名单扩展的 profile 环境支持(V3.9.0) - colinaaa - PR #93 打断任务后将旧卡片可靠收束为终态;PR #97 保留完整完成答案(V3.9.1)
- charles5g - PR #98 模型选择回调异步化与原卡片状态更新(V3.9.1)
- wjiemin49-ux - PR #52 loopback 健康检查代理问题的诊断与修复方向(V3.9.1 采用)
- colinaaa - Issue #94 裸
/resume原生会话选择器的需求、交互流程与安全边界(V3.10.0) - charles5g / jackmim - PR #98 模型 footer 语义色创意;主线实现补充 HTML 转义并保持布局不变(V3.10.0)
- tianqiii - Issue #107 Codex 订阅配额 footer 的需求、Hermes 原生接口方案与展示格式(V4.0.2)
- sthnow - Issue #110 Markdown 代码中的
MEDIA:字面量误解析复现、根因与期望边界(V4.0.4) - zkyken - Issue #112 lark SDK 预绑定 callback 下交互按钮失效的日志、根因线索与修复方向(V4.0.4)
- ShakuOvO / blakejia - Issue #106 与 #111 图片回答灰色正文重复的报告、复测与截图(V4.0.1–V4.0.3);另感谢 blakejia 在 #115 提供 Gateway venv 旧版本证据、完整升级步骤与复测指标(V4.0.5);感谢 nasvip / hzy / lRoccoon 贡献 V4.0.6 的 Hermes 升级恢复复现、background 通知卡片实现,以及 Hermes 0.18.x completion hook 生产诊断与修复
不要把 App Secret、tenant token、真实 chat_id、未脱敏截图提交到仓库。效果图仅用于展示卡片体验,生产凭据应保存在本机配置或环境变量中。
MIT License,详见 LICENSE。






