nonebot-plugin-aigf 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,304 @@
1
+ Metadata-Version: 2.1
2
+ Name: nonebot-plugin-aigf
3
+ Version: 0.1.1
4
+ Summary: 基于nonebot-plugin-nyaturingtest重构的群聊特化 LLM 聊天机器人,具有 LLM 驱动的记忆系统和表情包功能。
5
+ Home-page: https://github.com/Funny1Potato/nonebot-plugin-aigf
6
+ Author: Funny1Potato
7
+ Author-email: funny_potato@126.com
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: License :: OSI Approved :: GNU Affero General Public License v3
10
+ Classifier: Operating System :: OS Independent
11
+ Requires-Python: >=3.10
12
+ Description-Content-Type: text/markdown
13
+
14
+ <div align="center">
15
+ <a href="https://v2.nonebot.dev/store">
16
+ <img src="https://raw.githubusercontent.com/fllesser/nonebot-plugin-template/refs/heads/resource/.docs/NoneBotPlugin.svg" width="310" alt="logo"></a>
17
+
18
+ ## ✨ nonebot-plugin-aigf ✨
19
+
20
+ 群聊特化 LLM 聊天机器人,具有 LLM 驱动的记忆系统和表情包功能。
21
+
22
+ <p>
23
+ <a href="https://github.com/shadow3aaa/nonebot-plugin-nyaturingtest">
24
+ </a>
25
+ <a href="./LICENSE"><img src="https://img.shields.io/github/license/shadow3aaa/nonebot-plugin-nyaturingtest?style=flat-square" alt="license"></a>
26
+ <img src="https://img.shields.io/badge/python-3.10+-blue?style=flat-square&logo=python&logoColor=white" alt="python">
27
+ </p>
28
+ </div>
29
+
30
+ ## 📖 介绍
31
+
32
+ > 基于 [shadow3aaa/nonebot-plugin-nyaturingtest](https://github.com/shadow3aaa/nonebot-plugin-nyaturingtest) 重构,移除了 HippoRAG 和情绪系统,改为 LLM 自主管理记忆,并添加表情包存储和发送功能。
33
+
34
+ ### 特点:
35
+
36
+ - 🧠 **LLM 驱动的记忆系统**:短期记忆、长期记忆、群友信息,LLM 自主增删改
37
+ - 🖼️ **表情包功能**:AI 自主决定发表情包;自动从群聊中收藏表情包(缓存机制)
38
+ - 🔍 **图片理解**:通过 VLM 或多模态大模型理解群友发的图片和表情包
39
+ - 📝 **预设系统**:支持角色预设,含可编辑的默认预设
40
+ - ⚡ **轻量高效**:单次 LLM 调用完成对话 + 记忆管理,减少token消耗
41
+
42
+ ## 💿 安装
43
+
44
+ > [!IMPORTANT]
45
+ > 要使用本插件, 你至少需要
46
+ >
47
+ > - 一个有效的 openai 规范接口 api key (根据你的 base_url,可以不是 openai 的),你需要在 `.env` 文件中配置对应的 api 地址
48
+
49
+ <details open>
50
+ <summary>使用 nb-cli 安装</summary>
51
+ 在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装(暂时不行,还未上架)
52
+
53
+ nb plugin install nonebot-plugin-aigf --upgrade
54
+
55
+ </details>
56
+
57
+ <details>
58
+ <summary>使用包管理器安装</summary>
59
+
60
+ ```bash
61
+ pip install nonebot-plugin-aigf
62
+ ```
63
+
64
+ 在 `pyproject.toml` 中添加:
65
+
66
+ ```toml
67
+ [tool.nonebot]
68
+ plugins = ["nonebot-plugin-aigf"]
69
+ ```
70
+
71
+ </details>
72
+
73
+ ## 配置
74
+
75
+ 在 `.env.prod` 中添加:
76
+
77
+ ```env
78
+ # === 必填 ===
79
+ AIGF_CHAT_OPENAI_API_KEY="***" # LLM API Key
80
+ AIGF_CHAT_OPENAI_BASE_URL="***" # LLM API 地址
81
+ AIGF_CHAT_OPENAI_MODEL="***" # LLM 模型名称
82
+
83
+ # === 可选 ===
84
+ AIGF_ENABLED_GROUPS=[123456, 789012] # 启用的群号列表
85
+ AIGF_MEME_ENABLED=true # 是否启用表情包功能(默认 true)
86
+ AIGF_MEME_MAX_COUNT=200 # 自动收集的表情包最大数量(默认 200)
87
+ AIGF_DEFAULT_PRESET=default # 默认预设名称(默认 "default")
88
+
89
+ # === VLM 配置(图片理解) ===
90
+ # === 图片理解 ===
91
+ AIGF_IMAGE_MODE="vlm" # 图片模式: vlm=独立VLM分析, llm=LLM直接看图
92
+ AIGF_VLM_ENABLED=true # 是否启用VLM(仅 vlm 模式有效,默认 true)
93
+ AIGF_VLM_MODEL="Pro/Qwen/Qwen2.5-VL-7B-Instruct" # VLM 模型名称
94
+ AIGF_VLM_BASE_URL="https://api.siliconflow.cn/v1" # VLM API 地址
95
+ AIGF_VLM_API_KEY="***" # VLM API Key(为空时使用 chat 的 key)
96
+ ```
97
+
98
+ ## 命令
99
+
100
+ | 命令 | 说明 | 权限 |
101
+ |------|------|------|
102
+ | `help` / `帮助` | 显示帮助信息 | SUPERUSER |
103
+ | `status` / `状态` | 查看机器人状态(角色、最近消息) | SUPERUSER |
104
+ | `set_role <名字> <设定>` | 设置机器人角色 | SUPERUSER |
105
+ | `reset` / `重置` | 重置会话(清空所有记忆) | SUPERUSER |
106
+ | `presets` | 查看可用的角色预设 | SUPERUSER |
107
+ | `set_preset <预设名>` | 加载指定的角色预设 | SUPERUSER |
108
+ | `reload_meme` / `重载表情包` | 热重载表情包配置 | SUPERUSER |
109
+
110
+ ## 触发机制
111
+
112
+ - 攒够 **5 条**新消息,或最后一条消息后 **5 秒**内无新消息,触发一次处理
113
+ - 每次处理时,LLM 收到最近 **10 条**聊天记录 + 三层记忆 + 预设 + 表情包列表
114
+ - LLM 一次调用同时完成:回复决策 + 记忆管理 + 表情包选择
115
+
116
+ ## 记忆系统
117
+
118
+ 机器人拥有三层记忆,由 LLM 在每次回复时自主管理:
119
+
120
+ ### 短期记忆
121
+
122
+ 存储在 `<插件数据目录>/memory/short_term.json`,内容为 LLM 维护的信息列表,包括对话摘要、临时上下文、有趣的梗等。LLM 可以添加、修改、删除条目,内容可以详细一些。
123
+
124
+ ### 长期记忆
125
+
126
+ 存储在 `<插件数据目录>/memory/long_term.json`,内容为 LLM 认为值得长期记住的信息,如群内发生的事件、群规、群友分享的有用知识等。
127
+
128
+ ### 群友信息
129
+
130
+ 存储在 `<插件数据目录>/memory/friends/<QQ号>.json`,每个群友一个文件,以 QQ 号命名。LLM 记录群友的昵称、职业、爱好、说过的话、与其他群友的关系等。当群友修改昵称时,LLM 可通过 `update_name` 更新。
131
+
132
+ ## 表情包功能
133
+
134
+ ### 工作原理
135
+
136
+ ```
137
+ 群聊中有人发图片/表情包
138
+
139
+ 下载图片 → VLM 分析内容和情感
140
+
141
+ 保存到缓存目录(<缓存目录>/sticker_cache/)
142
+
143
+ 下一次消息处理时,LLM 在 Prompt 中看到缓存的表情包
144
+
145
+ LLM 决定是否收藏 → 保存到 memes 目录
146
+ ```
147
+
148
+ ### 表情包素材库
149
+
150
+ 存放在 `<插件数据目录>/memes/` 下:
151
+
152
+ ```
153
+ memes/
154
+ ├── memes.json ← 管理员手动配置
155
+ ├── collected.json ← 机器人自动收集
156
+ └── *.jpg/png/gif ← 表情包图片文件
157
+ ```
158
+
159
+ #### 管理员手动配置
160
+
161
+ 编辑 `memes.json`:
162
+
163
+ ```json
164
+ [
165
+ {
166
+ "id": "happy_spin",
167
+ "path": "happy_spin.jpg",
168
+ "keywords": ["开心", "高兴", "庆祝"],
169
+ "description": "开心到转圈的小人"
170
+ }
171
+ ]
172
+ ```
173
+
174
+ | 字段 | 必填 | 说明 |
175
+ |------|------|------|
176
+ | `id` | ✅ | 唯一标识符,AI 用这个选择表情包 |
177
+ | `path` | ✅ | 图片文件名(相对于 memes 目录) |
178
+ | `keywords` | ✅ | 适用场景关键词 |
179
+ | `description` | ✅ | 一句话描述内容 |
180
+
181
+ 修改后执行 `/重载表情包` 即可生效,无需重启。
182
+
183
+ #### 自动收集
184
+
185
+ 机器人收到图片时,VLM 分析后保存到缓存。LLM 在回复时看到缓存的表情包,决定是否收藏:
186
+
187
+ ```json
188
+ {
189
+ "memory": {
190
+ "save_meme": {"id": "a1b2c3d4e5f6", "description": "开心转圈的小人"}
191
+ }
192
+ }
193
+ ```
194
+
195
+ 支持一次收藏多个:
196
+ ```json
197
+ {
198
+ "memory": {
199
+ "save_meme": [
200
+ {"id": "a1b2c3d4e5f6", "description": "开心转圈"},
201
+ {"id": "e7f8g9h0i1j2", "description": "气鼓鼓"}
202
+ ]
203
+ }
204
+ }
205
+ ```
206
+
207
+ #### 缓存机制
208
+
209
+ - 图片缓存在 `<缓存目录>/sticker_cache/`,用图片内容的 MD5 作文件名,自动去重
210
+ - 超过 7 天的缓存文件会自动清理
211
+ - 自动收集的表情包超过 `AIGF_MEME_MAX_COUNT` 上限时,优先清理最近未使用的
212
+
213
+ #### 发送表情包
214
+
215
+ LLM 在回复中指定表情包 id(来自 memes.json 或 collected.json):
216
+
217
+ ```json
218
+ {"type": "meme", "id": "happy_spin"}
219
+ ```
220
+
221
+ ## 预设系统
222
+
223
+ 首次运行后在 `<插件配置目录>/presets/` 下生成 `default.json`:
224
+
225
+ ```json
226
+ {
227
+ "name": "小助手",
228
+ "role": "一个友好的群聊助手,会用轻松的语气和大家聊天",
229
+ "knowledges": [],
230
+ "hidden": false
231
+ }
232
+ ```
233
+
234
+ ### 预设字段
235
+
236
+ | 字段 | 说明 |
237
+ |------|------|
238
+ | `name` | 角色名称 |
239
+ | `role` | 角色设定 |
240
+ | `knowledges` | 预设知识列表(会注入 Prompt) |
241
+ | `hidden` | 是否在 `/presets` 中隐藏 |
242
+
243
+ ### 添加新预设
244
+
245
+ 在 `presets/` 目录下创建新的 JSON 文件,如 `猫娘.json`:
246
+
247
+ ```json
248
+ {
249
+ "name": "喵喵",
250
+ "role": "一个可爱的群猫娘,群里的其它人是你的主人",
251
+ "knowledges": [
252
+ "猫娘有猫耳和猫尾巴",
253
+ "猫娘喜欢吃鱼"
254
+ ],
255
+ "hidden": false
256
+ }
257
+ ```
258
+
259
+ 然后在群内执行 `set_preset 猫娘` 即可加载。
260
+
261
+ ## 消息格式
262
+
263
+ LLM 支持以下回复类型:
264
+
265
+ | 类型 | 格式 | 说明 |
266
+ |------|------|------|
267
+ | 文本 | `{"type": "text", "content": "..."}` | 纯文本消息 |
268
+ | @ | `{"type": "at", "name": "群友昵称"}` | 艾特群友 |
269
+ | 表情包 | `{"type": "meme", "id": "表情包id"}` | 发送表情包 |
270
+
271
+ 文本和 @ 会合并为一条消息发送,表情包单独发送。也可以直接用纯字符串代替 `{"type": "text", "content": "..."}`。
272
+
273
+ ## 图片理解模式
274
+
275
+ 支持两种图片理解模式,通过 `AIGF_IMAGE_MODE` 配置:
276
+
277
+ ### VLM 模式(默认)
278
+
279
+ ```
280
+ 图片 → VLM 分析 → 缓存描述 → 文字 prompt 给 LLM
281
+ ```
282
+
283
+ - LLM 不需要支持图片输入
284
+ - VLM 单独调用,消耗较少 token
285
+ - 适合 LLM 不支持视觉的场景
286
+
287
+ ### LLM 模式
288
+
289
+ ```
290
+ 图片 → 直接以 base64 附在 LLM prompt 中 → LLM 看图决策
291
+ ```
292
+
293
+ - LLM 直接看到图片,理解更准确
294
+ - 不需要配置 VLM
295
+ - 适合支持视觉的模型(如 GPT-4o、Qwen-VL)
296
+ - 图片 base64 会消耗更多 token
297
+
298
+ ## 依赖
299
+
300
+ - NoneBot2 + OneBot V11 适配器
301
+ - OpenAI 兼容 API(LLM)
302
+ - VLM API(图片理解,可选)
303
+ - Pillow(图片处理)
304
+ - httpx、anyio
@@ -0,0 +1,291 @@
1
+ <div align="center">
2
+ <a href="https://v2.nonebot.dev/store">
3
+ <img src="https://raw.githubusercontent.com/fllesser/nonebot-plugin-template/refs/heads/resource/.docs/NoneBotPlugin.svg" width="310" alt="logo"></a>
4
+
5
+ ## ✨ nonebot-plugin-aigf ✨
6
+
7
+ 群聊特化 LLM 聊天机器人,具有 LLM 驱动的记忆系统和表情包功能。
8
+
9
+ <p>
10
+ <a href="https://github.com/shadow3aaa/nonebot-plugin-nyaturingtest">
11
+ </a>
12
+ <a href="./LICENSE"><img src="https://img.shields.io/github/license/shadow3aaa/nonebot-plugin-nyaturingtest?style=flat-square" alt="license"></a>
13
+ <img src="https://img.shields.io/badge/python-3.10+-blue?style=flat-square&logo=python&logoColor=white" alt="python">
14
+ </p>
15
+ </div>
16
+
17
+ ## 📖 介绍
18
+
19
+ > 基于 [shadow3aaa/nonebot-plugin-nyaturingtest](https://github.com/shadow3aaa/nonebot-plugin-nyaturingtest) 重构,移除了 HippoRAG 和情绪系统,改为 LLM 自主管理记忆,并添加表情包存储和发送功能。
20
+
21
+ ### 特点:
22
+
23
+ - 🧠 **LLM 驱动的记忆系统**:短期记忆、长期记忆、群友信息,LLM 自主增删改
24
+ - 🖼️ **表情包功能**:AI 自主决定发表情包;自动从群聊中收藏表情包(缓存机制)
25
+ - 🔍 **图片理解**:通过 VLM 或多模态大模型理解群友发的图片和表情包
26
+ - 📝 **预设系统**:支持角色预设,含可编辑的默认预设
27
+ - ⚡ **轻量高效**:单次 LLM 调用完成对话 + 记忆管理,减少token消耗
28
+
29
+ ## 💿 安装
30
+
31
+ > [!IMPORTANT]
32
+ > 要使用本插件, 你至少需要
33
+ >
34
+ > - 一个有效的 openai 规范接口 api key (根据你的 base_url,可以不是 openai 的),你需要在 `.env` 文件中配置对应的 api 地址
35
+
36
+ <details open>
37
+ <summary>使用 nb-cli 安装</summary>
38
+ 在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装(暂时不行,还未上架)
39
+
40
+ nb plugin install nonebot-plugin-aigf --upgrade
41
+
42
+ </details>
43
+
44
+ <details>
45
+ <summary>使用包管理器安装</summary>
46
+
47
+ ```bash
48
+ pip install nonebot-plugin-aigf
49
+ ```
50
+
51
+ 在 `pyproject.toml` 中添加:
52
+
53
+ ```toml
54
+ [tool.nonebot]
55
+ plugins = ["nonebot-plugin-aigf"]
56
+ ```
57
+
58
+ </details>
59
+
60
+ ## 配置
61
+
62
+ 在 `.env.prod` 中添加:
63
+
64
+ ```env
65
+ # === 必填 ===
66
+ AIGF_CHAT_OPENAI_API_KEY="***" # LLM API Key
67
+ AIGF_CHAT_OPENAI_BASE_URL="***" # LLM API 地址
68
+ AIGF_CHAT_OPENAI_MODEL="***" # LLM 模型名称
69
+
70
+ # === 可选 ===
71
+ AIGF_ENABLED_GROUPS=[123456, 789012] # 启用的群号列表
72
+ AIGF_MEME_ENABLED=true # 是否启用表情包功能(默认 true)
73
+ AIGF_MEME_MAX_COUNT=200 # 自动收集的表情包最大数量(默认 200)
74
+ AIGF_DEFAULT_PRESET=default # 默认预设名称(默认 "default")
75
+
76
+ # === VLM 配置(图片理解) ===
77
+ # === 图片理解 ===
78
+ AIGF_IMAGE_MODE="vlm" # 图片模式: vlm=独立VLM分析, llm=LLM直接看图
79
+ AIGF_VLM_ENABLED=true # 是否启用VLM(仅 vlm 模式有效,默认 true)
80
+ AIGF_VLM_MODEL="Pro/Qwen/Qwen2.5-VL-7B-Instruct" # VLM 模型名称
81
+ AIGF_VLM_BASE_URL="https://api.siliconflow.cn/v1" # VLM API 地址
82
+ AIGF_VLM_API_KEY="***" # VLM API Key(为空时使用 chat 的 key)
83
+ ```
84
+
85
+ ## 命令
86
+
87
+ | 命令 | 说明 | 权限 |
88
+ |------|------|------|
89
+ | `help` / `帮助` | 显示帮助信息 | SUPERUSER |
90
+ | `status` / `状态` | 查看机器人状态(角色、最近消息) | SUPERUSER |
91
+ | `set_role <名字> <设定>` | 设置机器人角色 | SUPERUSER |
92
+ | `reset` / `重置` | 重置会话(清空所有记忆) | SUPERUSER |
93
+ | `presets` | 查看可用的角色预设 | SUPERUSER |
94
+ | `set_preset <预设名>` | 加载指定的角色预设 | SUPERUSER |
95
+ | `reload_meme` / `重载表情包` | 热重载表情包配置 | SUPERUSER |
96
+
97
+ ## 触发机制
98
+
99
+ - 攒够 **5 条**新消息,或最后一条消息后 **5 秒**内无新消息,触发一次处理
100
+ - 每次处理时,LLM 收到最近 **10 条**聊天记录 + 三层记忆 + 预设 + 表情包列表
101
+ - LLM 一次调用同时完成:回复决策 + 记忆管理 + 表情包选择
102
+
103
+ ## 记忆系统
104
+
105
+ 机器人拥有三层记忆,由 LLM 在每次回复时自主管理:
106
+
107
+ ### 短期记忆
108
+
109
+ 存储在 `<插件数据目录>/memory/short_term.json`,内容为 LLM 维护的信息列表,包括对话摘要、临时上下文、有趣的梗等。LLM 可以添加、修改、删除条目,内容可以详细一些。
110
+
111
+ ### 长期记忆
112
+
113
+ 存储在 `<插件数据目录>/memory/long_term.json`,内容为 LLM 认为值得长期记住的信息,如群内发生的事件、群规、群友分享的有用知识等。
114
+
115
+ ### 群友信息
116
+
117
+ 存储在 `<插件数据目录>/memory/friends/<QQ号>.json`,每个群友一个文件,以 QQ 号命名。LLM 记录群友的昵称、职业、爱好、说过的话、与其他群友的关系等。当群友修改昵称时,LLM 可通过 `update_name` 更新。
118
+
119
+ ## 表情包功能
120
+
121
+ ### 工作原理
122
+
123
+ ```
124
+ 群聊中有人发图片/表情包
125
+
126
+ 下载图片 → VLM 分析内容和情感
127
+
128
+ 保存到缓存目录(<缓存目录>/sticker_cache/)
129
+
130
+ 下一次消息处理时,LLM 在 Prompt 中看到缓存的表情包
131
+
132
+ LLM 决定是否收藏 → 保存到 memes 目录
133
+ ```
134
+
135
+ ### 表情包素材库
136
+
137
+ 存放在 `<插件数据目录>/memes/` 下:
138
+
139
+ ```
140
+ memes/
141
+ ├── memes.json ← 管理员手动配置
142
+ ├── collected.json ← 机器人自动收集
143
+ └── *.jpg/png/gif ← 表情包图片文件
144
+ ```
145
+
146
+ #### 管理员手动配置
147
+
148
+ 编辑 `memes.json`:
149
+
150
+ ```json
151
+ [
152
+ {
153
+ "id": "happy_spin",
154
+ "path": "happy_spin.jpg",
155
+ "keywords": ["开心", "高兴", "庆祝"],
156
+ "description": "开心到转圈的小人"
157
+ }
158
+ ]
159
+ ```
160
+
161
+ | 字段 | 必填 | 说明 |
162
+ |------|------|------|
163
+ | `id` | ✅ | 唯一标识符,AI 用这个选择表情包 |
164
+ | `path` | ✅ | 图片文件名(相对于 memes 目录) |
165
+ | `keywords` | ✅ | 适用场景关键词 |
166
+ | `description` | ✅ | 一句话描述内容 |
167
+
168
+ 修改后执行 `/重载表情包` 即可生效,无需重启。
169
+
170
+ #### 自动收集
171
+
172
+ 机器人收到图片时,VLM 分析后保存到缓存。LLM 在回复时看到缓存的表情包,决定是否收藏:
173
+
174
+ ```json
175
+ {
176
+ "memory": {
177
+ "save_meme": {"id": "a1b2c3d4e5f6", "description": "开心转圈的小人"}
178
+ }
179
+ }
180
+ ```
181
+
182
+ 支持一次收藏多个:
183
+ ```json
184
+ {
185
+ "memory": {
186
+ "save_meme": [
187
+ {"id": "a1b2c3d4e5f6", "description": "开心转圈"},
188
+ {"id": "e7f8g9h0i1j2", "description": "气鼓鼓"}
189
+ ]
190
+ }
191
+ }
192
+ ```
193
+
194
+ #### 缓存机制
195
+
196
+ - 图片缓存在 `<缓存目录>/sticker_cache/`,用图片内容的 MD5 作文件名,自动去重
197
+ - 超过 7 天的缓存文件会自动清理
198
+ - 自动收集的表情包超过 `AIGF_MEME_MAX_COUNT` 上限时,优先清理最近未使用的
199
+
200
+ #### 发送表情包
201
+
202
+ LLM 在回复中指定表情包 id(来自 memes.json 或 collected.json):
203
+
204
+ ```json
205
+ {"type": "meme", "id": "happy_spin"}
206
+ ```
207
+
208
+ ## 预设系统
209
+
210
+ 首次运行后在 `<插件配置目录>/presets/` 下生成 `default.json`:
211
+
212
+ ```json
213
+ {
214
+ "name": "小助手",
215
+ "role": "一个友好的群聊助手,会用轻松的语气和大家聊天",
216
+ "knowledges": [],
217
+ "hidden": false
218
+ }
219
+ ```
220
+
221
+ ### 预设字段
222
+
223
+ | 字段 | 说明 |
224
+ |------|------|
225
+ | `name` | 角色名称 |
226
+ | `role` | 角色设定 |
227
+ | `knowledges` | 预设知识列表(会注入 Prompt) |
228
+ | `hidden` | 是否在 `/presets` 中隐藏 |
229
+
230
+ ### 添加新预设
231
+
232
+ 在 `presets/` 目录下创建新的 JSON 文件,如 `猫娘.json`:
233
+
234
+ ```json
235
+ {
236
+ "name": "喵喵",
237
+ "role": "一个可爱的群猫娘,群里的其它人是你的主人",
238
+ "knowledges": [
239
+ "猫娘有猫耳和猫尾巴",
240
+ "猫娘喜欢吃鱼"
241
+ ],
242
+ "hidden": false
243
+ }
244
+ ```
245
+
246
+ 然后在群内执行 `set_preset 猫娘` 即可加载。
247
+
248
+ ## 消息格式
249
+
250
+ LLM 支持以下回复类型:
251
+
252
+ | 类型 | 格式 | 说明 |
253
+ |------|------|------|
254
+ | 文本 | `{"type": "text", "content": "..."}` | 纯文本消息 |
255
+ | @ | `{"type": "at", "name": "群友昵称"}` | 艾特群友 |
256
+ | 表情包 | `{"type": "meme", "id": "表情包id"}` | 发送表情包 |
257
+
258
+ 文本和 @ 会合并为一条消息发送,表情包单独发送。也可以直接用纯字符串代替 `{"type": "text", "content": "..."}`。
259
+
260
+ ## 图片理解模式
261
+
262
+ 支持两种图片理解模式,通过 `AIGF_IMAGE_MODE` 配置:
263
+
264
+ ### VLM 模式(默认)
265
+
266
+ ```
267
+ 图片 → VLM 分析 → 缓存描述 → 文字 prompt 给 LLM
268
+ ```
269
+
270
+ - LLM 不需要支持图片输入
271
+ - VLM 单独调用,消耗较少 token
272
+ - 适合 LLM 不支持视觉的场景
273
+
274
+ ### LLM 模式
275
+
276
+ ```
277
+ 图片 → 直接以 base64 附在 LLM prompt 中 → LLM 看图决策
278
+ ```
279
+
280
+ - LLM 直接看到图片,理解更准确
281
+ - 不需要配置 VLM
282
+ - 适合支持视觉的模型(如 GPT-4o、Qwen-VL)
283
+ - 图片 base64 会消耗更多 token
284
+
285
+ ## 依赖
286
+
287
+ - NoneBot2 + OneBot V11 适配器
288
+ - OpenAI 兼容 API(LLM)
289
+ - VLM API(图片理解,可选)
290
+ - Pillow(图片处理)
291
+ - httpx、anyio