WIP::私聊功能实现

This commit is contained in:
XokoukioX 2025-11-06 00:31:17 +08:00
parent 483917811c
commit ffecb9ecfa
4 changed files with 510 additions and 57 deletions

View file

@ -8,7 +8,7 @@
# nonebot-plugin-llmchat
_✨ 支持多API预设、MCP协议、内置工具、联网搜索、视觉模型的AI群聊插件 ✨_
_✨ 支持多API预设、MCP协议、内置工具、联网搜索、视觉模型、群聊&私聊的AI对话插件 ✨_
<a href="./LICENSE">
@ -48,6 +48,12 @@ _✨ 支持多API预设、MCP协议、内置工具、联网搜索、视觉模型
- 支持处理回复消息
- 群聊消息顺序处理,防止消息错乱
1. **群聊和私聊支持**
- 支持群聊场景(默认启用)
- 支持私聊场景(可选启用)
- 分别管理群聊和私聊的对话记忆
- 灵活的权限配置
1. **分群聊上下文记忆管理**
- 分群聊保留对话历史记录(可配置保留条数)
- 自动合并未处理消息降低API用量
@ -120,6 +126,8 @@ _✨ 支持多API预设、MCP协议、内置工具、联网搜索、视觉模型
| LLMCHAT__BLACKLIST_USER_IDS | 否 | [] | 黑名单用户ID列表机器人将不会处理黑名单用户的消息 |
| LLMCHAT__IGNORE_PREFIXES | 否 | [] | 需要忽略的消息前缀列表,匹配到这些前缀的消息不会处理 |
| LLMCHAT__MCP_SERVERS | 否 | {} | MCP服务器配置具体见下表 |
| LLMCHAT__ENABLE_PRIVATE_CHAT | 否 | False | 是否启用私聊功能 |
| LLMCHAT__PRIVATE_CHAT_PRESET | 否 | off | 私聊默认使用的预设名称 |
### 内置OneBot工具
@ -241,7 +249,7 @@ LLMCHAT__MCP_SERVERS同样为一个dictkey为服务器名称value配置的
配置完成后@机器人即可手动触发回复,另外在机器人收到群聊消息时会根据`LLMCHAT__RANDOM_TRIGGER_PROB`配置的概率或群聊中使用指令设置的概率随机自动触发回复。
### 指令表
### 群聊指令表
以下指令均仅对发送的群聊生效,不同群聊配置不互通。
@ -253,6 +261,40 @@ LLMCHAT__MCP_SERVERS同样为一个dictkey为服务器名称value配置的
| 切换思维输出 | 管理 | 否 | 群聊 | 无 | 切换是否输出AI的思维过程的开关需模型支持 |
| 设置主动回复概率 | 管理 | 否 | 群聊 | 主动回复概率 | 主动回复概率需为 [0, 1] 的浮点数0为完全关闭主动回复 |
### 私聊指令表
以下指令仅在启用私聊功能(`LLMCHAT__ENABLE_PRIVATE_CHAT=true`)后可用,这些指令均只对发送者的私聊生效。
| 指令 | 权限 | 参数 | 说明 |
|:-----:|:----:|:----:|:----:|
| 私聊API预设 | 主人 | [预设名] | 查看或修改私聊使用的API预设 |
| 私聊修改设定 | 主人 | 设定 | 修改私聊机器人的设定 |
| 私聊记忆清除 | 主人 | 无 | 清除私聊的机器人记忆 |
| 私聊切换思维输出 | 主人 | 无 | 切换是否输出私聊AI的思维过程的开关需模型支持 |
**私聊功能说明:**
- 私聊消息默认触发回复(无需@或随机触发
- 私聊和群聊的对话记忆独立管理
- OneBot群操作工具如禁言、撤回等在私聊中不可用
## 📝 私聊功能启用示例
`.env` 文件中添加以下配置以启用私聊功能:
```bash
LLMCHAT__ENABLE_PRIVATE_CHAT=true
LLMCHAT__PRIVATE_CHAT_PRESET="deepseek-v1"
```
然后你可以在私聊中与机器人交互。使用以下命令管理私聊:
- 切换预设:`私聊API预设 aliyun-deepseek-v3`
- 清除记忆:`私聊记忆清除`
- 修改设定:`私聊修改设定 你是一个有趣的AI助手`
| 切换思维输出 | 管理 | 否 | 群聊 | 无 | 切换是否输出AI的思维过程的开关需模型支持 |
| 设置主动回复概率 | 管理 | 否 | 群聊 | 主动回复概率 | 主动回复概率需为 [0, 1] 的浮点数0为完全关闭主动回复 |
### 效果图
![](img/mcp_demo.jpg)
![](img/demo.png)