koishi-plugin-memesluna 0.5.8 → 0.5.10

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.
package/README.md CHANGED
@@ -1,57 +1,243 @@
1
- # koishi-plugin-memesluna
2
-
3
- MemesLuna 是一个 Koishi 表情路由插件,提供:
4
-
5
- - 表情合集管理(本地图片 / 外链)
6
- - 端点管理(302 重定向)
7
- - Console 管理页面入口
8
- - ChatLuna 变量注入(`{memesluna}`)
9
- - 路由清单命令:`memesluna.list`
10
-
11
- ## 安装
12
-
13
- ```bash
14
- npm i koishi-plugin-memesluna
15
- ```
16
-
17
- ## 基础配置
18
-
19
- - `backendPath`:后端路径前缀(默认 `/memesluna`)
20
- - `storagePath`:本地表情合集目录(默认 `data/memesluna`)
21
- - `selfUrl`:服务公开地址(为空时使用 server.selfUrl)
22
- - `injectVariables`:是否注入 ChatLuna 变量
23
- - `variableRefreshIntervalMs`:变量刷新间隔
24
-
25
- ## 命令
26
-
27
- ### `memesluna.list`
28
-
29
- 输出当前可用路由清单(合集 + 端点),格式例如:
30
-
31
- ```text
32
- atri atri表情包
33
- vrchat vrchat表情包
34
- doro doro表情包
35
- ```
36
-
37
- ## 路由说明
38
-
39
- 默认后端路径前缀是 `/memesluna`:
40
-
41
- - `/memesluna/`:主页
42
- - `/memesluna/admin`:管理页入口(兼容路由)
43
- - `/memesluna/admin/endpoint`:端点页入口(兼容路由)
44
- - `/memesluna/:name`:合集或端点访问
45
-
46
- ## 开发
47
-
48
- ```bash
49
- npm install
50
- npm run typecheck
51
- ```
52
-
53
- > 仓库不提交编译产物(`lib/`、`dist/`),发布时由本地打包产出。
54
-
55
- ## License
56
-
57
- MIT
1
+ # koishi-plugin-memesluna
2
+
3
+ MemesLuna 是一个用于 Koishi 的表情图片路由与管理插件。它可以把本地表情包、外部图片端点和 ChatLuna 提示词变量连接起来,让机器人按固定路由发送表情图。
4
+
5
+ ## 功能概览
6
+
7
+ - 表情包合集管理:支持本地图片、外链图片、描述、移动、删除和批量上传。
8
+ - 端点转发:将自定义路由 302 重定向到外部图片 API。
9
+ - Console 管理页:在 Koishi 控制台中管理合集、图片、端点、暂缓区、标签和别名。
10
+ - ChatLuna 变量注入:注入 `{endpoint}`、`{tag_routes}` 和 `{memesluna}`,让模型知道可用图片路由。
11
+ - 情感标签路由:可选开启 `/memesluna/标签名` 跨合集随机返图。
12
+ - 合集内检索:支持 `/memesluna/合集名?q=关键词`,按别名、标签或文件名检索指定合集。
13
+ - AI 自动标注:可使用 ChatLuna 模型为图片生成 `tags` 和 `aliases`。
14
+ - 暂缓区:可暂存被上传过滤器拦截或自动收集到的候选图片,人工复核后再归档。
15
+ - 高频图片自动收集:可监听群聊中高频出现的图片并放入暂缓区。
16
+
17
+ ## 安装
18
+
19
+ ```bash
20
+ npm i koishi-plugin-memesluna
21
+ ```
22
+
23
+ 插件依赖 Koishi 的 `database`、`server` 和 `chatluna` 服务。Console 管理页需要启用 `@koishijs/plugin-console`。
24
+
25
+ ## 基础配置
26
+
27
+ - `backendPath`:HTTP 路由前缀,默认 `/memesluna`。
28
+ - `selfUrl`:对外公开访问地址。留空时使用 `server.selfUrl`;如果机器人需要把图片 URL 发到外部平台,建议配置成可被平台访问的完整地址。
29
+ - `injectVariables`:是否向 ChatLuna 注入 `{endpoint}` 和 `{memesluna}`,默认开启。
30
+ - `variableRefreshIntervalMs`:ChatLuna 变量刷新间隔。
31
+ - `injectVariablesPrompt`:注入到 `{memesluna}` 的提示词模板。
32
+ - `enableEmotionTags`:是否启用情感标签路由和 `{tag_routes}` 注入,默认关闭。
33
+
34
+ 本地表情合集固定保存在 Koishi 数据目录下的 `data/memesluna`。不再提供单独的存储目录配置项。
35
+
36
+ ## Console 用法
37
+
38
+ 启用插件后,Koishi 控制台会出现 `MemesLuna` 页面。
39
+
40
+ 常见流程:
41
+
42
+ 1. 在“表情包管理”中新建合集。
43
+ 2. 进入合集详情,上传本地图片或导入外链。
44
+ 3. 在“分发管理”中新建端点,将路由转发到外部图片 API。
45
+ 4. 在“预览”中查看当前可注入给 ChatLuna 的路由清单和提示词。
46
+ 5. 在“暂缓区”中复核自动收集或被过滤的候选图片,再归档到指定合集。
47
+
48
+ 图片卡片菜单中可以打开“编辑标签”,手动维护:
49
+
50
+ - `tags`:图片的路由标签,通常是一个情绪或内容主标签。
51
+ - `aliases`:图片的检索别名,用于 `?q=关键词` 合集搜索。
52
+
53
+ 也可以选中多张图片后使用“设置标签”进行批量编辑。
54
+
55
+ ## 路由说明
56
+
57
+ 假设 `backendPath` 为默认值 `/memesluna`:
58
+
59
+ - `/memesluna/`:跳转到 Console 页面。
60
+ - `/memesluna/admin`:兼容管理入口,会跳转到 Console 页面。
61
+ - `/memesluna/:name`:访问合集、端点或标签路由。
62
+ - `/memesluna/:collection/:filename`:直接访问指定本地图片。
63
+ - `/memesluna/api/homepage-data`:获取路由清单和提示词预览数据。
64
+
65
+ ### 合集路由
66
+
67
+ 如果存在名为 `doro` 的合集:
68
+
69
+ ```text
70
+ /memesluna/doro
71
+ ```
72
+
73
+ 会从该合集中随机返回一张本地图片或外链图片。
74
+
75
+ ### 端点路由
76
+
77
+ 如果创建名为 `ycy` 的端点,目标 URL 为 `https://t.alcy.cc/ycy`:
78
+
79
+ ```text
80
+ /memesluna/ycy
81
+ ```
82
+
83
+ 会 302 重定向到对应外部 URL。
84
+
85
+ ### 合集搜索
86
+
87
+ ```text
88
+ /memesluna/合集名?q=关键词
89
+ ```
90
+
91
+ 合集搜索会在指定合集内按 `aliases`、`tags` 和文件名打分匹配。它不是向量检索,而是基于已维护标注的关键词检索。
92
+
93
+ 当前评分规则:
94
+
95
+ - 完整短语命中 `aliases`:`+12`
96
+ - 完整短语命中 `tags`:`+8`
97
+ - 完整短语命中文件名:`+4`
98
+ - 分词或同义词命中 `aliases`:`+6`
99
+ - 分词或同义词命中 `tags`:`+4`
100
+ - 分词或同义词命中文件名:`+2`
101
+ - 命中词数不少于 2 个:额外 `+2`
102
+ - 命中词数不少于 3 个:再额外 `+2`
103
+
104
+ 只有分数达到 `6` 的图片才会进入候选。没有匹配候选时,会退回合集随机返图。
105
+
106
+ ## 情感标签路由
107
+
108
+ 情感标签路由默认关闭,需要在“情感标签配置”中开启 `enableEmotionTags`。
109
+
110
+ 开启后,插件才会启用:
111
+
112
+ ```text
113
+ /memesluna/开心
114
+ /memesluna/无语
115
+ /memesluna/生气
116
+ ```
117
+
118
+ 这类跨合集标签路由。标签路由会在所有合集里查找带有对应 `tags` 的图片,并随机返回一张。
119
+
120
+ 重要规则:
121
+
122
+ - 仅在 `enableEmotionTags` 开启后,标签路由才会生效。
123
+ - 仅配置了同义词组但没有任何图片实际使用这些标签时,不会向 ChatLuna 注入对应路径。
124
+ - `{tag_routes}` 只会列出已有图片实际使用过的标签组,避免模型看到不存在的路径。
125
+ - 合集名和标签名重名时,合集优先匹配。
126
+
127
+ 注入格式示例:
128
+
129
+ ```text
130
+ 【情绪/标签】(每行为同一组,组内任意词均可作为路由)
131
+ 幸福 / 开心 / 高兴 / 快乐 / 治愈 / 满足
132
+ 委屈 / 难过 / 伤心 / 沮丧 / 流泪 / 大哭
133
+ 生气 / 愤怒 / 炸毛 / 不爽 / 恼火 / 气愤
134
+ 标签路由格式:/memesluna/标签名
135
+ ```
136
+
137
+ ## ChatLuna 变量注入
138
+
139
+ 开启 `injectVariables` 后,插件会向 ChatLuna 注入:
140
+
141
+ - `{endpoint}`:合集和端点路由清单。
142
+ - `{tag_routes}`:情感标签路由清单,仅在 `enableEmotionTags` 开启且存在真实标签时有内容。
143
+ - `{memesluna}`:完整的 MemesLuna 使用说明,由 `injectVariablesPrompt` 模板渲染得到。
144
+
145
+ 默认模板支持这些占位符:
146
+
147
+ - `{endpoint}`:合集和端点路由。
148
+ - `{base_url}`:服务公开地址。
149
+ - `{tag_routes}`:情感标签路由块。
150
+ - `{tags}`:当前可用标签词。
151
+
152
+ ## AI 标注
153
+
154
+ 如果在配置中选择了 ChatLuna 模型,可以开启 `autoAnnotate`。上传或归档本地图片后,插件会异步生成:
155
+
156
+ - `tags`:一个候选情感标签。
157
+ - `aliases`:多个检索短语,用于合集搜索。
158
+
159
+ 相关配置:
160
+
161
+ - `model`:用于标注的 ChatLuna 模型。
162
+ - `autoAnnotate`:上传图片后自动标注。
163
+ - `annotatePrompt`:标注提示词。
164
+ - `synonymGroups`:允许使用的标签候选词和同义词组。
165
+ - `aiConcurrency`:AI 标注并发数。
166
+ - `aiBatchDelay`:批量标注间隔。
167
+ - `aiMaxAttempts`:失败重试次数。
168
+ - `aiBackoffBase`:重试退避基数。
169
+
170
+ 命令:
171
+
172
+ ```text
173
+ memesluna.tagall
174
+ memesluna.tagall -f
175
+ memesluna.untagall
176
+ memesluna.untagall -c 合集名
177
+ ```
178
+
179
+ ## 自动收集与暂缓区
180
+
181
+ 开启 `autoCollect` 后,插件会监听群聊图片。某张图片在指定时间窗口内出现达到阈值后,会进入暂缓区等待人工复核。
182
+
183
+ 相关配置:
184
+
185
+ - `autoCollect`:启用高频图片自动暂存。
186
+ - `whitelistGroups`:只监听指定群;留空表示监听所有群。
187
+ - `emojiFrequencyWindowMinutes`:统计窗口。
188
+ - `emojiFrequencyThreshold`:同一张图触发暂存所需次数。
189
+ - `minEmojiSize` / `maxEmojiSize`:自动暂存图片大小范围。
190
+ - `groupAutoCollectLimit`:每个群每日自动暂存上限。
191
+ - `similarityThreshold`:暂缓区相似图片聚合阈值。
192
+ - `stagingRetentionDays`:暂缓区自动过期天数,`0` 表示永久保留。
193
+
194
+ 暂缓区图片不会参与随机路由。只有在 Console 中手动归档到某个合集后,才会成为正式表情包图片。
195
+
196
+ ## 命令
197
+
198
+ ### `memesluna.list`
199
+
200
+ 查看当前可用合集和端点:
201
+
202
+ ```text
203
+ memesluna.list
204
+ ```
205
+
206
+ ### `memesluna.add`
207
+
208
+ 创建表情包合集:
209
+
210
+ ```text
211
+ memesluna.add doro Doro 表情包
212
+ ```
213
+
214
+ 别名:
215
+
216
+ ```text
217
+ memesluna.create
218
+ memesluna.creat
219
+ ```
220
+
221
+ ### `memesluna.stole`
222
+
223
+ 引用一条包含图片的消息后,将图片保存到指定合集:
224
+
225
+ ```text
226
+ memesluna.stole doro
227
+ ```
228
+
229
+ 如果合集不存在会自动创建。重复上传同一张图片时,会覆盖旧图片,但保留旧图片的 `tags` 和 `aliases`。
230
+
231
+ ## 开发
232
+
233
+ ```bash
234
+ npm install
235
+ npm run typecheck
236
+ npx yakumo build
237
+ ```
238
+
239
+ 发布包包含 `lib/**/*.js`、`lib/**/*.d.ts` 和 `dist`。源码中的 `client` 会由 Yakumo 构建为 Console 前端产物。
240
+
241
+ ## License
242
+
243
+ MIT