这是 oh-my-efb 系列的第三篇。前两篇:oh-my-efb,在Ehforwardbot中用AI总结聊天:EFB 本体的安装,以及最早的群聊总结oh-my-efb,给 EFB 转发过的聊天记录做一个可搜索的网页:聊天记录网页这段时间仓库里又加了几个中间件,本文把它们放在一起讲:怎么装、怎么在 EFB 里启用、日常怎么用。EFB 本体(微信从端、Telegram 主端、话题群)的安装见第一篇,本文默认这些已经跑起来了。0. 中间件设计理念以前,EFB配置好以后,所有微信消息都是通过bot发过来的,好在jiz4oh在EFB 新玩法:用 Telegram 话题(Topic)分类管理微信群消息这篇文章里将Telegram的话题分流消息引入telegram-master后,从Bot发过来的消息就少了。那么Bot间的对话留着干什么呢?做些中间件吧!什么提醒呀,AI呀,走Bot发过来,让他变成一个聊天助手,我觉得蛮有意思的。尽量避免在微信中漏消息命令、表现为自动回复,降低封号风险1. 有哪些中间件中间件模块 ID做什么依赖AI 公共配置`specialhua.ai`集中保存大模型接口地址、API key、默认模型和 Jev 的 key,给其他中间件用无群聊总结 + 问答`specialhua.summary`定时或随时用 AI 总结群聊(`/summary`);`/ask` 让 AI 回答问题,审核后以你的名义发到微信`specialhua.ai`待办提醒`specialhua.todo`回复一条消息发 `/todo` 设为待办,到时间 bot 私聊提醒AI 提取时需要 `specialhua.ai`聊天记录补名字`specialhua.chatlog`给聊天记录网页记下会话名和发言人名网页服务,见第二篇它们的关系很简单:specialhua.ai 最开始是specialhua.summary的配置里有AI相关的,以后我想做更多AI相关的中间件,所以就想单独抽一个模块出来管AI的配置,它负责“用哪个模型、key 是什么”,其余用到 AI 的中间件都从它那里取,自己只写提示词、换不换模型这类设置Warning隐私提醒用到 AI 的功能会把聊天内容原文发给你配置的接口服务方:总结发送群聊记录,/ask 发送问题和被引用的消息(包括图片),/todo 的 AI 提取发送原文和来源名称。介意的话选一个信得过的服务,或者只用手动模式。请注意,你不应当把比较私密的群、工作群等会导致别人信息泄漏的群聊天记录拿来投喂AI,理论上你应该征得群内每个人的同意才能使用总结功能。建议使用方向为几百人的聊天吹水大群。因使用AI导致泄漏个人信息、工作秘密、国家机密的与本项目无关2. 安装先更新仓库,再装进 EFB 所在的 venv。路径沿用第一篇:仓库在 ~/oh-my-efb,venv 在 ~/efb-venv。BASH复制cd ~/oh-my-efb git pull source ~/efb-venv/bin/activate pip install -e ./ai-middleware pip install -e ./summary-middleware pip install -e ./todo-middleware用的是可编辑安装(-e),以后更新只要 git pull 再重启 EFB。装完可以确认一下 EFB 能找到它们:BASH复制pip list 2>/dev/null | grep -i efb能看到 efb-ai-middleware、efb-summary-middleware、efb-todo-middleware 就对了。3. 启用EFB 的中间件要在主配置里登记才会加载。编辑 ~/.ehforwarderbot/profiles/default/config.yaml,在 middlewares 下按顺序写上:YAML复制master_channel: blueset.telegram slave_channels: - blueset.wechat middlewares: - specialhua.ai # 放在最前面 - specialhua.summary # 群聊总结和 /ask - specialhua.todo # 待办提醒 # - specialhua.chatlog # 用了聊天记录网页时再加几点说明:specialhua.ai 放在用到它的中间件前面。严格来说不写它也能用,其他中间件会直接读它的配置文件;写上的好处是配置有错时 EFB 启动就报错,日志里还会列出读到了哪些服务。master_channel、slave_channels 是你原来就有的,不用动,只加 middlewares 这一段。每个中间件的配置文件放在 ~/.ehforwarderbot/profiles/default/模块ID/config.yaml,下面逐个写。全部写好之后重启 EFB:BASH复制systemctl restart ehforwarderbot journalctl -u ehforwarderbot -f启动后如果某个中间件配置写错了(缺配置文件、key 为空、群没写对),EFB 会直接报错退出,错误信息里会带模块 ID,照着改就行。4. AI 公共配置(specialhua.ai)这是其他中间件的基础,先配它。新建配置文件:BASH复制mkdir -p ~/.ehforwarderbot/profiles/default/specialhua.ai nano ~/.ehforwarderbot/profiles/default/specialhua.ai/config.yaml最小配置只要三行:YAML复制base_url: https://api.deepseek.com # 写到 /v1 为止,会自动拼上 /chat/completions api_key: sk-xxxx model: deepseek-chat # 默认模型任何兼容 OpenAI /chat/completions 的服务都能用,DeepSeek、各类中转站都行。文件里有 API key,记得改权限:BASH复制chmod 600 ~/.ehforwarderbot/profiles/default/specialhua.ai/config.yaml4.1 配多个服务有时一个模型不够用,比如 DeepSeek 便宜但不能识图,/ask 想看图就得换一个。这时用 providers 再加几个服务,起个名字:YAML复制base_url: https://api.deepseek.com api_key: sk-xxxx model: deepseek-chat providers: vision: base_url: https://example.com/v1 api_key: sk-yyyy model: gpt-4o-mini顶层那三项就是名为 default 的默认服务。其他中间件的配置里写 provider: vision 就会改用这个服务,不写就用默认的。4.2 Jev(可选)Jev 是 TypeSafe 的分类模型,群聊总结可以用它在总结前筛掉闲聊、附和、广告,并标出最值得提的消息。配了它,总结会自动开启筛选:YAML复制jev: api_key: ts-xxxx # model: jev-latest不需要的话不写这一段就行。4.3 从旧版本升级以前 base_url、api_key、jev.api_key 是写在群聊总结的配置里的。这种旧写法仍然有效,不迁移也能照常运行。想迁移的话,把这几行剪切到 specialhua.ai/config.yaml,总结的配置里删掉即可。5. 群聊总结(specialhua.summary)5.1 配置BASH复制mkdir -p ~/.ehforwarderbot/profiles/default/specialhua.summary nano ~/.ehforwarderbot/profiles/default/specialhua.summary/config.yamlYAML复制interval_days: 3 # 每 3 天自动汇总一次 lookback_days: 3 # 只取最近 3 天的消息 max_messages: 10000 # 最多取 10000 条 chats: - 某个群 # 只写名字:用上面的默认值 - a1b2c3d4 # 也可以写群的 8 位 ID - name: 另一个群 # 写成映射:单独覆盖默认值 interval_days: 7 lookback_days: 7群的 8 位 ID 在该群对应的 Telegram 话题里发 /info 可以看到。群名、备注名、ID 写哪个都行,任一匹配即可。每个群都要有 interval_days,lookback_days 和 max_messages 至少有一个,可以来自顶层默认值,也可以写在群自己的设置里。想换模型,在这个文件里加一行就行,接口和 key 仍然来自 AI 中间件:YAML复制# provider: vision # 用 AI 中间件里的哪个服务 # model: deepseek-chat # 换一个模型改配置不用重启。中间件每分钟检查一次配置文件(包括 AI 中间件的),变了就重新读取,增减群、换模型、改提示词都即时生效。新文件有错误时,bot 会发消息说明原因,并继续用之前的配置。5.2 定时汇总配好之后就不用管了。每个群各自计时,每满 interval_days 天汇总一次,结果发到这个群在 Telegram 里的位置:群绑定了 Telegram 群组:发到群组走话题分流:发到它的话题都找不到:发到和 bot 的私聊上次汇总的时间存在数据库里,重启不会打乱周期;停机期间错过的,启动后约一分钟补发。5.3 随时汇总在群对应的话题(或绑定的群组)里发命令,结果回复在同一处。命令会被拦下,不会发到微信群:命令效果`/summary`按该群配置的范围汇总`/summary 7`最近 7 天,仍受该群 `max_messages` 限制`/summary 500条`最近 500 条,不限天数注意命令名打错(比如 /sumary)会被当成普通消息发到微信群里,发之前看一眼。在和 bot 的私聊里也可以汇总:发 /extra,找到“立即汇总”对应的命令(形如 /1_summary)。不带参数汇总所有配置的群,/1_summary 群名 只汇总一个,结果发到私聊。手动汇总不影响定时周期。5.4 总结里有什么一次总结包括重点和话题、每个人说了什么、待办事项。太长时,消息里放前半部分,完整版作为 .html 附件跟在后面。配了 Jev 时,标题下会多一行统计“筛掉 N”,剩下的消息按〔安排〕〔提问〕〔回答〕〔信息〕分类,最值得提的前 20% 标 ★ 交给模型优先覆盖。刚启用时,库里已有的消息会分几轮补完分类,费用大约每 1000 条消息 0.04 美元。想先看看 Jev 分得准不准,再决定要不要用,可以离线试标,不用停 EFB:BASH复制~/efb-venv/bin/python -m efb_summary_middleware.jev_trial # 列出库里的群 ~/efb-venv/bin/python -m efb_summary_middleware.jev_trial --chat 某个群 --limit 200总结用了 Jev 之后不想要,在总结的配置里写一行 jev: false 即可关闭。5.5 数据保留只记录启用之后的消息,存在 specialhua.summary/messages.db,只存文字,图片、语音记为 [图片]、[语音] 占位。每次汇总后清理:设了 lookback_days 的群保留 lookback_days + 7 天。想用 /summary 30 回看更久,就加一行:YAML复制retention_days: 306. /ask 问答/ask 也在 specialhua.summary 里,默认开启,沿用总结的模型,不用额外配置。它和总结不同,任何微信群或私聊对应的话题里都能用,不需要写进 chats。因为给了答案之后,消息需要你审核,审核通过了再往群里发,或者替换到你的聊天框,你可以继续编辑。(注意把那个默认的@bot名称的开头去掉)只想用 /ask、不需要总结的话,specialhua.summary/config.yaml 可以留空,只要 AI 中间件里配好了 model。6.1 三种问法用法效果`/ask yandex是什么`直接回答这个问题回复群里某条消息,发 `/ask`回答那条消息里的问题,发到微信时会引用那条消息回复某条消息,发 `/ask 问题`把那条消息作为上下文来回答你的问题6.2 审核后再发命令本身不会发到微信。bot 先回一条“正在回答”,生成后变成“问题 + 答案”,下面带四个按钮:按钮作用✅ 发送以你的名义把答案发到微信✏️ 填入输入框把答案放进 Telegram 输入框,改好后自己发(超过 256 字时没有这个按钮)🔄 重新生成换一个答案❌ 取消不发了“以你的名义”指的是在微信里由你的账号发出,和你在 Telegram 里直接打字发到微信是一样的。Telegram 这边看到的始终是 bot 那条审核消息,因为 bot 不能冒充你在 Telegram 里发言。只有 ETM 管理员能按这些按钮。审核中的答案只放在内存里,EFB 重启或过了一天按钮就失效,重新 /ask 即可。被回复的消息的文字、链接标题和地址、图片和表情会一起交给模型。只有图片没有文字时,直接回复 /ask 会默认问“这条消息说的是什么?”。6.3 调整 /ask在 specialhua.summary/config.yaml 里加 ask 一段:YAML复制ask: max_chars: 150 # 回答最多多少字,简单问题仍会简短 provider: vision # 换一个能识图的服务 # model: gpt-4o-mini # timeout: 60DeepSeek 这类不能识图的模型,遇到图片时只按文字回答,审核消息里会注明。想让 /ask 看图,就像上面这样单独给它配一个识图的服务。不想要 /ask 时写 ask: false,此时 /ask 会被当成普通消息发到微信。7. 待办提醒(specialhua.todo)群里有人说“下周一交材料”“周五晚上七点聚餐”,回复那条消息发 /todo ,然后bot会引导你到bot私聊中设置待办信息,到提醒时间提醒你,并支持在bot中使用/todos 来列出所有待办事项。7.1 配置不需要单独配置文件也能用,只需要启用中间件即可,模型来自 AI 中间件。要换模型或时区时,新建 ~/.ehforwarderbot/profiles/default/specialhua.todo/config.yaml:YAML复制# provider: vision # model: deepseek-chat # timeout: 60 timezone: Asia/Shanghai # 时间按哪个时区理解和显示改了不用重启,下次 AI 提取时自动重新读取。7.2 设一个待办命令效果回复一条消息发 `/todo`把那条消息设为待办回复一条消息发 `/todo 提前一天提醒我`后面的文字作为补充说明交给 AI直接发 `/todo 明天下午三点开会`把这段文字本身设为待办`/todos`列出未完成的待办,可以标为完成或取消被回复的可以是别人的消息、你自己发的消息,或者转发给 bot 的消息,在话题、绑定群组、和 bot 的私聊里都能用。命令不会发到微信,原会话里只回一句“已在和 bot 的私聊中继续”,后面的步骤都在私聊里进行。私聊里会显示来源、消息时间和原文,问你用 AI 提取还是手动填写。那些没有隐私信息的消息,为了避免手动填写日期、事项这些,你可以直接让AI来返回todo的配置,然后你再审核修改;如果是隐私的信息,就可以完全手动填写。7.3 AI 提取模型拿到原文、当前时间和这条消息的发送时间,判断事项内容、开始时间、地点和备注。“明天”“下周一”按消息发送的时间推算,不是按你发 /todo 的时间。隔几天再补设待办也不会算错。没写具体时间的,按事项性质判断,比如交材料按上班时间。实在判断不出时间按当天 08:00;判断不出日期时,会请你改为手动填写。确认卡片上会显示提取结果和推算理由。提醒时间可以多选:前 1 天、前 6 小时、前 3 小时、前 1 小时、前 10 分钟(已经过去的不显示),也可以点“➕ 自定义时间”加几个。卡片上还能改事项时间和内容,至少选一个提醒时间才能保存。7.4 手动填写bot 一项一项问:提醒内容(必填)事项开始时间(选填),格式 2026-10-20 15:00,秒可以省略地点(选填)备注(选填)选填项点“跳过”或发 -。格式不对或时间已经过去会重新问。填了开始时间的,会预先选上当天 08:00 作为提醒时间。Tip填写期间私聊里的文字不会转到微信?ETM 平时会把私聊里的文字转给最近联系的微信会话,所以 bot 等你输入时会先拦下来。显示确认卡片、点“结束填写”、发 /cancel,或者 10 分钟没操作,都会恢复正常转发。7.5 到点提醒到了时间,bot 在私聊里发提醒:内容、时间、地点、备注、来源和原文。原消息在超级群或话题里时,附带“打开原消息”的链接,能直接跳回去。提醒下面有四个按钮:✅ 完成(剩下的提醒一起取消)、10 分钟后、1 小时后、明早 8 点。EFB 停机期间错过的提醒,启动后约半分钟内补发,并注明晚了多久。待办存在 specialhua.todo/todos.db,包括原文快照,原消息删了提醒里也还有。8. 聊天记录补名字(specialhua.chatlog)这个中间件只配合聊天记录网页使用,不改消息、不发消息,只记下会话名、群昵称和备注名,让网页上新消息的发言人显示名字而不是 8 位 ID。安装、网页服务和通行密钥登录见第二篇,启用就是在 middlewares 里加一行 specialhua.chatlog。9. 日常维护更新:BASH复制cd ~/oh-my-efb git pull source ~/efb-venv/bin/activate pip install -e ./ai-middleware -e ./summary-middleware -e ./todo-middleware systemctl restart ehforwarderbot只改了配置文件时不用重启:总结和 /ask 每分钟自动重读,待办在下次提取时重读。备份,配置和数据都在各自的目录里:BASH复制cd ~/.ehforwarderbot/profiles/default tar czf ~/middlewares-backup-$(date +%F).tgz specialhua.ai specialhua.summary specialhua.todospecialhua.ai/config.yaml 里有 API key,备份包不要外传。常见问题:现象处理EFB 启动报 `Config file of specialhua.summary does not exist`建 `specialhua.summary/config.yaml`,只用 `/ask` 时可以是空文件报 `"model" is set neither here nor for the service`AI 中间件或总结配置里都没写 `model`报 `"chats" must list at least one chat`写了 `ask: false` 又没配群,两者至少要有一个`/summary` 回复“这个群没有配置总结。”这个群不在 `chats` 里,或名字没对上,改用 `/info` 里的 8 位 ID`/ask` 不看图当前模型不能识图,给 `ask` 单独配一个识图的 `provider``/todo` 时间差了几个小时在 `specialhua.todo/config.yaml` 里设 `timezone`按钮点了没反应EFB 重启过或超过一天,重新发命令10. 最后到这里,oh-my-efb 在“转发”之外多了四件事:群聊太多看不过来就让 AI 总结,有人在群里提问就 /ask 帮忙答,有事要记就 /todo,要翻旧账就上聊天记录网页。AI 的接口集中在一个地方配,以后再加新功能也一样。仓库地址:specialhua/oh-my-efb。各中间件的完整配置项以仓库里的 README 为准:ai-middleware/README.mdsummary-middleware/README.mdtodo-middleware/README.md
这是 oh-my-efb 系列的第三篇。前两篇:
这段时间仓库里又加了几个中间件,本文把它们放在一起讲:怎么装、怎么在 EFB 里启用、日常怎么用。EFB 本体(微信从端、Telegram 主端、话题群)的安装见第一篇,本文默认这些已经跑起来了。
0. 中间件设计理念
1. 有哪些中间件
中间件
模块 ID
做什么
依赖
AI 公共配置
`specialhua.ai`
集中保存大模型接口地址、API key、默认模型和 Jev 的 key,给其他中间件用
无
群聊总结 + 问答
`specialhua.summary`
定时或随时用 AI 总结群聊(`/summary`);`/ask` 让 AI 回答问题,审核后以你的名义发到微信
`specialhua.ai`
待办提醒
`specialhua.todo`
回复一条消息发 `/todo` 设为待办,到时间 bot 私聊提醒
AI 提取时需要 `specialhua.ai`
聊天记录补名字
`specialhua.chatlog`
给聊天记录网页记下会话名和发言人名
网页服务,见第二篇
它们的关系很简单:specialhua.ai 最开始是specialhua.summary的配置里有AI相关的,以后我想做更多AI相关的中间件,所以就想单独抽一个模块出来管AI的配置,它负责“用哪个模型、key 是什么”,其余用到 AI 的中间件都从它那里取,自己只写提示词、换不换模型这类设置
隐私提醒
用到 AI 的功能会把聊天内容原文发给你配置的接口服务方:总结发送群聊记录,/ask 发送问题和被引用的消息(包括图片),/todo 的 AI 提取发送原文和来源名称。介意的话选一个信得过的服务,或者只用手动模式。
请注意,你不应当把比较私密的群、工作群等会导致别人信息泄漏的群聊天记录拿来投喂AI,理论上你应该征得群内每个人的同意才能使用总结功能。建议使用方向为几百人的聊天吹水大群。因使用AI导致泄漏个人信息、工作秘密、国家机密的与本项目无关
2. 安装
先更新仓库,再装进 EFB 所在的 venv。路径沿用第一篇:仓库在 ~/oh-my-efb,venv 在 ~/efb-venv。
用的是可编辑安装(-e),以后更新只要 git pull 再重启 EFB。
装完可以确认一下 EFB 能找到它们:
能看到 efb-ai-middleware、efb-summary-middleware、efb-todo-middleware 就对了。
3. 启用
EFB 的中间件要在主配置里登记才会加载。编辑 ~/.ehforwarderbot/profiles/default/config.yaml,在 middlewares 下按顺序写上:
几点说明:
全部写好之后重启 EFB:
启动后如果某个中间件配置写错了(缺配置文件、key 为空、群没写对),EFB 会直接报错退出,错误信息里会带模块 ID,照着改就行。
4. AI 公共配置(specialhua.ai)
这是其他中间件的基础,先配它。新建配置文件:
最小配置只要三行:
任何兼容 OpenAI /chat/completions 的服务都能用,DeepSeek、各类中转站都行。文件里有 API key,记得改权限:
4.1 配多个服务
有时一个模型不够用,比如 DeepSeek 便宜但不能识图,/ask 想看图就得换一个。这时用 providers 再加几个服务,起个名字:
顶层那三项就是名为 default 的默认服务。其他中间件的配置里写 provider: vision 就会改用这个服务,不写就用默认的。
4.2 Jev(可选)
Jev 是 TypeSafe 的分类模型,群聊总结可以用它在总结前筛掉闲聊、附和、广告,并标出最值得提的消息。配了它,总结会自动开启筛选:
不需要的话不写这一段就行。
4.3 从旧版本升级
以前 base_url、api_key、jev.api_key 是写在群聊总结的配置里的。这种旧写法仍然有效,不迁移也能照常运行。想迁移的话,把这几行剪切到 specialhua.ai/config.yaml,总结的配置里删掉即可。
5. 群聊总结(specialhua.summary)
5.1 配置
群的 8 位 ID 在该群对应的 Telegram 话题里发 /info 可以看到。群名、备注名、ID 写哪个都行,任一匹配即可。
每个群都要有 interval_days,lookback_days 和 max_messages 至少有一个,可以来自顶层默认值,也可以写在群自己的设置里。
想换模型,在这个文件里加一行就行,接口和 key 仍然来自 AI 中间件:
改配置不用重启。中间件每分钟检查一次配置文件(包括 AI 中间件的),变了就重新读取,增减群、换模型、改提示词都即时生效。新文件有错误时,bot 会发消息说明原因,并继续用之前的配置。
5.2 定时汇总
配好之后就不用管了。每个群各自计时,每满 interval_days 天汇总一次,结果发到这个群在 Telegram 里的位置:
上次汇总的时间存在数据库里,重启不会打乱周期;停机期间错过的,启动后约一分钟补发。
5.3 随时汇总
在群对应的话题(或绑定的群组)里发命令,结果回复在同一处。命令会被拦下,不会发到微信群:
命令
效果
`/summary`
按该群配置的范围汇总
`/summary 7`
最近 7 天,仍受该群 `max_messages` 限制
`/summary 500条`
最近 500 条,不限天数
注意命令名打错(比如 /sumary)会被当成普通消息发到微信群里,发之前看一眼。
在和 bot 的私聊里也可以汇总:发 /extra,找到“立即汇总”对应的命令(形如 /1_summary)。不带参数汇总所有配置的群,/1_summary 群名 只汇总一个,结果发到私聊。
手动汇总不影响定时周期。
5.4 总结里有什么
一次总结包括重点和话题、每个人说了什么、待办事项。太长时,消息里放前半部分,完整版作为 .html 附件跟在后面。
配了 Jev 时,标题下会多一行统计“筛掉 N”,剩下的消息按〔安排〕〔提问〕〔回答〕〔信息〕分类,最值得提的前 20% 标 ★ 交给模型优先覆盖。刚启用时,库里已有的消息会分几轮补完分类,费用大约每 1000 条消息 0.04 美元。
想先看看 Jev 分得准不准,再决定要不要用,可以离线试标,不用停 EFB:
总结用了 Jev 之后不想要,在总结的配置里写一行 jev: false 即可关闭。
5.5 数据保留
只记录启用之后的消息,存在 specialhua.summary/messages.db,只存文字,图片、语音记为 [图片]、[语音] 占位。每次汇总后清理:设了 lookback_days 的群保留 lookback_days + 7 天。想用 /summary 30 回看更久,就加一行:
6. /ask 问答
/ask 也在 specialhua.summary 里,默认开启,沿用总结的模型,不用额外配置。它和总结不同,任何微信群或私聊对应的话题里都能用,不需要写进 chats。因为给了答案之后,消息需要你审核,审核通过了再往群里发,或者替换到你的聊天框,你可以继续编辑。(注意把那个默认的@bot名称的开头去掉)
只想用 /ask、不需要总结的话,specialhua.summary/config.yaml 可以留空,只要 AI 中间件里配好了 model。
6.1 三种问法
用法
效果
`/ask yandex是什么`
直接回答这个问题
回复群里某条消息,发 `/ask`
回答那条消息里的问题,发到微信时会引用那条消息
回复某条消息,发 `/ask 问题`
把那条消息作为上下文来回答你的问题
6.2 审核后再发
命令本身不会发到微信。bot 先回一条“正在回答”,生成后变成“问题 + 答案”,下面带四个按钮:
按钮
作用
✅ 发送
以你的名义把答案发到微信
✏️ 填入输入框
把答案放进 Telegram 输入框,改好后自己发(超过 256 字时没有这个按钮)
🔄 重新生成
换一个答案
❌ 取消
不发了
“以你的名义”指的是在微信里由你的账号发出,和你在 Telegram 里直接打字发到微信是一样的。Telegram 这边看到的始终是 bot 那条审核消息,因为 bot 不能冒充你在 Telegram 里发言。
只有 ETM 管理员能按这些按钮。审核中的答案只放在内存里,EFB 重启或过了一天按钮就失效,重新 /ask 即可。
被回复的消息的文字、链接标题和地址、图片和表情会一起交给模型。只有图片没有文字时,直接回复 /ask 会默认问“这条消息说的是什么?”。
6.3 调整 /ask
在 specialhua.summary/config.yaml 里加 ask 一段:
DeepSeek 这类不能识图的模型,遇到图片时只按文字回答,审核消息里会注明。想让 /ask 看图,就像上面这样单独给它配一个识图的服务。
不想要 /ask 时写 ask: false,此时 /ask 会被当成普通消息发到微信。
7. 待办提醒(specialhua.todo)
群里有人说“下周一交材料”“周五晚上七点聚餐”,回复那条消息发 /todo ,然后bot会引导你到bot私聊中设置待办信息,到提醒时间提醒你,并支持在bot中使用/todos 来列出所有待办事项。
7.1 配置
不需要单独配置文件也能用,只需要启用中间件即可,模型来自 AI 中间件。要换模型或时区时,新建 ~/.ehforwarderbot/profiles/default/specialhua.todo/config.yaml:
改了不用重启,下次 AI 提取时自动重新读取。
7.2 设一个待办
命令
效果
回复一条消息发 `/todo`
把那条消息设为待办
回复一条消息发 `/todo 提前一天提醒我`
后面的文字作为补充说明交给 AI
直接发 `/todo 明天下午三点开会`
把这段文字本身设为待办
`/todos`
列出未完成的待办,可以标为完成或取消
被回复的可以是别人的消息、你自己发的消息,或者转发给 bot 的消息,在话题、绑定群组、和 bot 的私聊里都能用。命令不会发到微信,原会话里只回一句“已在和 bot 的私聊中继续”,后面的步骤都在私聊里进行。
私聊里会显示来源、消息时间和原文,问你用 AI 提取还是手动填写。那些没有隐私信息的消息,为了避免手动填写日期、事项这些,你可以直接让AI来返回todo的配置,然后你再审核修改;如果是隐私的信息,就可以完全手动填写。
7.3 AI 提取
模型拿到原文、当前时间和这条消息的发送时间,判断事项内容、开始时间、地点和备注。
确认卡片上会显示提取结果和推算理由。提醒时间可以多选:前 1 天、前 6 小时、前 3 小时、前 1 小时、前 10 分钟(已经过去的不显示),也可以点“➕ 自定义时间”加几个。卡片上还能改事项时间和内容,至少选一个提醒时间才能保存。
7.4 手动填写
bot 一项一项问:
选填项点“跳过”或发 -。格式不对或时间已经过去会重新问。填了开始时间的,会预先选上当天 08:00 作为提醒时间。
填写期间私聊里的文字不会转到微信?
ETM 平时会把私聊里的文字转给最近联系的微信会话,所以 bot 等你输入时会先拦下来。显示确认卡片、点“结束填写”、发 /cancel,或者 10 分钟没操作,都会恢复正常转发。
7.5 到点提醒
到了时间,bot 在私聊里发提醒:内容、时间、地点、备注、来源和原文。原消息在超级群或话题里时,附带“打开原消息”的链接,能直接跳回去。
提醒下面有四个按钮:✅ 完成(剩下的提醒一起取消)、10 分钟后、1 小时后、明早 8 点。
EFB 停机期间错过的提醒,启动后约半分钟内补发,并注明晚了多久。待办存在 specialhua.todo/todos.db,包括原文快照,原消息删了提醒里也还有。
8. 聊天记录补名字(specialhua.chatlog)
这个中间件只配合聊天记录网页使用,不改消息、不发消息,只记下会话名、群昵称和备注名,让网页上新消息的发言人显示名字而不是 8 位 ID。安装、网页服务和通行密钥登录见第二篇,启用就是在 middlewares 里加一行 specialhua.chatlog。
9. 日常维护
更新:
只改了配置文件时不用重启:总结和 /ask 每分钟自动重读,待办在下次提取时重读。
备份,配置和数据都在各自的目录里:
specialhua.ai/config.yaml 里有 API key,备份包不要外传。
常见问题:
现象
处理
EFB 启动报 `Config file of specialhua.summary does not exist`
建 `specialhua.summary/config.yaml`,只用 `/ask` 时可以是空文件
报 `"model" is set neither here nor for the service`
AI 中间件或总结配置里都没写 `model`
报 `"chats" must list at least one chat`
写了 `ask: false` 又没配群,两者至少要有一个
`/summary` 回复“这个群没有配置总结。”
这个群不在 `chats` 里,或名字没对上,改用 `/info` 里的 8 位 ID
`/ask` 不看图
当前模型不能识图,给 `ask` 单独配一个识图的 `provider`
`/todo` 时间差了几个小时
在 `specialhua.todo/config.yaml` 里设 `timezone`
按钮点了没反应
EFB 重启过或超过一天,重新发命令
10. 最后
到这里,oh-my-efb 在“转发”之外多了四件事:群聊太多看不过来就让 AI 总结,有人在群里提问就 /ask 帮忙答,有事要记就 /todo,要翻旧账就上聊天记录网页。AI 的接口集中在一个地方配,以后再加新功能也一样。
仓库地址:specialhua/oh-my-efb。各中间件的完整配置项以仓库里的 README 为准: