Persistent Chat Plugin for AstrBot
版本: 0.2.6.0
作者: komeiji_shiki
一个为 AstrBot 设计的强大插件,可以持久化保存聊天记录(包括图片),为多模态LLM提供带图文的上下文,并提供了一套完整的聊天记录管理命令。
✨ 核心功能
- 持久化聊天记录: 将群聊和私聊的对话(包括文本和图片)保存到本地SQLite数据库中,实现永久记忆。
- 多模态上下文注入: 在向LLM(如Gemini)发起请求时,能将历史聊天中的图片和文本一起注入,让AI“看懂”之前的对话内容。
- 智能图片处理:
- 自动下载对话中的图片并保存在本地。
- 在注入上下文时,将图片转换为Base64格式,符合多模态模型的要求。
- 智能识别纯图片消息:当用户只发送图片时,会自动生成一条提示性文本(如
[用户最新消息只发送了图片]),帮助LLM理解用户意图。
- 防止消息重复: 采用了精确的事件优先级和职责分离逻辑,完美解决了聊天上下文被重复注入的问题。
- 灵活的配置: 用户可以通过配置文件自由开关各项功能,如是否记录私聊、是否注入上下文等。
- 强大的管理命令: 提供了一套简单易用的命令来查看、清除当前会话或所有会话的聊天记录。
⚙️ 配置
| log_private_messages | false | true 为开启私聊记录,false 为关闭。 |
| log_group_messages | true | true 为开启群聊记录,false 为关闭。 |
| log_self_messages | true | true 为记录机器人自己的回复,false 为关闭。 |
| inject_context | true | true 为开启上下文注入功能,false 为关闭。 |
| max_history_messages | 20 | 控制每次请求时,最多回顾多少条历史消息。设置为 0 可禁用注入。 |
📖 使用方法 (命令)
插件提供了一组命令来管理聊天记录。
基础命令: /chathistory
view - 查看历史记录
查看当前会话(群聊或私聊)的最近聊天记录。
- 用法:
/chathistory view [条数] - 别名:
查看 - 示例:
/chathistory view(默认查看最近5条)/pchat view 15(查看最近15条)
- 说明: 为了防止刷屏,结果将以图片形式发送。最大可查看50条。
clear - 清空当前会话记录
清空当前会话的所有聊天记录以及关联的本地图片文件。
- 用法:
/chathistory clear - 别名:
清空 - 示例:
/聊天历史 clear - 注意: 此操作不可逆,但只会影响你发送命令所在的群聊或私聊。
clear_all - 清空所有记录 (仅管理员)
清空数据库中所有会话的聊天记录,并删除所有已保存的图片。
- 用法:
/chathistory clear_all - 别名:
清空全部 - 权限: 仅限管理员 (Admin)
- 警告: 这是一个非常危险的操作,会删除所有人的聊天记忆。请谨慎使用!
🔧 技术实现简述
本插件通过监听两个关键的AstrBot事件来工作:
@filter.event_message_type(priority=10): 当用户或机器人发送消息时,此函数会以较高的优先级(数字越大优先级越低)执行,将消息内容(文本和图片链接)处理后存入SQLite数据库。@filter.on_llm_request(priority=1): 当AstrBot准备向LLM发送请求时,此函数会以非常低的优先级(数字越小优先级越高)执行。它会:
a. 从数据库中读取历史消息。
b. 从数据库中读取当前用户的消息,分析其内容(纯文本、纯图片或图文混合)。
c. 根据预设规则,增强由框架提供的当前消息上下文(例如,为其添加图片或提示文本)。
d. 将历史记录与增强后的当前消息合并,构建一个完整、无重复的多模态上下文,再交由LLM处理。
这种职责分离的设计确保了插件既能提供丰富的历史上下文,又不会与AstrBot核心的上下文处理机制冲突,从而避免了消息的重复注入。
📜 更新日志
- v0.2.6.0 (最新):
- 修复: 彻底解决了因插件与框架双重注入导致的当前消息重复问题。
- 优化: 重构了上下文注入逻辑,实现了插件只负责注入历史和增强当前消息的清晰职责划分。
- 实现: 完美实现了对纯图片、纯文本、图文混合消息的差异化处理。
- v0.2.5.0: 尝试将数据库作为唯一上下文来源,解决了纯图片消息的处理,但引入了消息重复问题。
- v0.2.3.1 - v0.2.4.0: 修复了与Gemini Provider的兼容性问题,并首次尝试优化图片处理逻辑。
- v0.2.2.0 - v0.2.3.0: 修复了因事件优先级导致的初始消息重复问题,并为私聊上下文添加了用户名。