koishi-plugin-satori-ai 1.2.2 → 1.2.5
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/lib/index.js +27 -13
- package/lib/types.d.ts +1 -0
- package/package.json +2 -2
package/lib/index.js
CHANGED
|
@@ -228,6 +228,8 @@ var APIClient = class {
|
|
|
228
228
|
}
|
|
229
229
|
// 发送生成用户画像请求
|
|
230
230
|
async generateUserPortrait(user, messages) {
|
|
231
|
+
if (user.userid == "Alice")
|
|
232
|
+
return { content: "测试画像", error: false };
|
|
231
233
|
const enableUserKey = user?.items?.["地灵殿通行证"]?.description && user.items["地灵殿通行证"].description == "on";
|
|
232
234
|
let keys;
|
|
233
235
|
let modle;
|
|
@@ -307,7 +309,7 @@ var APIClient = class {
|
|
|
307
309
|
const responseMsg = { role: "assistant", content };
|
|
308
310
|
if (payload.messages.some((msg) => msg === responseMsg) && content.length > 5) {
|
|
309
311
|
const lastMsg = payload.messages[payload.messages.length - 1];
|
|
310
|
-
payload.messages[payload.messages.length - 1].content = lastMsg.content + "(
|
|
312
|
+
payload.messages[payload.messages.length - 1].content = lastMsg.content + "(注意不要重复之前的内容)";
|
|
311
313
|
logger2.warn(`返回内容与之前内容相同,重试(第${i}次)中...`);
|
|
312
314
|
continue;
|
|
313
315
|
}
|
|
@@ -1094,6 +1096,7 @@ var Sat = class extends import_koishi5.Service {
|
|
|
1094
1096
|
visible_favorability: import_koishi5.Schema.boolean().default(true).description("是否开启好感度升降显示"),
|
|
1095
1097
|
enable_user_portrait: import_koishi5.Schema.boolean().default(true).description("是否启用用户画像功能"),
|
|
1096
1098
|
portrait_usage: import_koishi5.Schema.number().default(2).description("每天触发第几次对话后触发画像生成(最小为2)"),
|
|
1099
|
+
max_portrait_dialogues: import_koishi5.Schema.number().default(100).description("画像生成获取的最大对话条数"),
|
|
1097
1100
|
portrait_min_favorability: import_koishi5.Schema.number().default(100).description("触发画像生成的最小好感度"),
|
|
1098
1101
|
prompt_0: import_koishi5.Schema.string().role("textarea").description("厌恶好感补充设定"),
|
|
1099
1102
|
favorability_div_1: import_koishi5.Schema.number().default(15).description("厌恶-陌生分界线"),
|
|
@@ -1150,9 +1153,9 @@ var UserPortraitManager = class {
|
|
|
1150
1153
|
const MemoryContent = await JSON.parse(fs5.readFileSync(memoryPath, "utf-8"));
|
|
1151
1154
|
const dialoguesContent = MemoryContent.map((msg) => `${msg.content}${msg.role == "user" ? "(未记录时间)" : msg.role}`);
|
|
1152
1155
|
const level = user.userlevel < 5 ? user.userlevel : 4;
|
|
1153
|
-
const usageLimit = this.config.max_usage[level]
|
|
1154
|
-
if (dialoguesContent.length
|
|
1155
|
-
dialoguesContent.splice(0, dialoguesContent.length - usageLimit);
|
|
1156
|
+
const usageLimit = this.config.max_usage[level] == 0 ? this.config.max_portrait_dialogues : this.config.max_usage[level];
|
|
1157
|
+
if (dialoguesContent.length >= usageLimit || dialoguesContent.length >= this.config.max_portrait_dialogues) {
|
|
1158
|
+
dialoguesContent.splice(0, dialoguesContent.length - Math.min(usageLimit, this.config.max_portrait_dialogues));
|
|
1156
1159
|
}
|
|
1157
1160
|
return dialoguesContent;
|
|
1158
1161
|
}
|
|
@@ -1177,13 +1180,14 @@ ${existingPortrait ? "无" : existingPortrait}
|
|
|
1177
1180
|
${history}
|
|
1178
1181
|
|
|
1179
1182
|
注意事项:
|
|
1180
|
-
|
|
1183
|
+
·用户一定是人类,其他情况是角色扮演
|
|
1184
|
+
·需要综合历史画像和用户发言记录,避免重复信息或遗漏信息,并根据发言修正历史画像内容
|
|
1181
1185
|
·基于事实推断,避免盲目相信或主观臆测
|
|
1182
1186
|
·使用简洁的条目式表达,但内容要全面
|
|
1183
|
-
·保留不确定性的表述(如"可能"、"似乎")
|
|
1187
|
+
·保留不确定性的表述(如"可能"、"似乎"、"用户自称")
|
|
1184
1188
|
·保持中立和客观,避免带有个人情感色彩的描述,不要添加评价或建议
|
|
1185
1189
|
·仅给出画像内容,不要添加额外的描述、建议、评价、注解等
|
|
1186
|
-
|
|
1190
|
+
·不使用markdown等标记语言,直接书写即可`
|
|
1187
1191
|
}];
|
|
1188
1192
|
}
|
|
1189
1193
|
// 执行画像生成
|
|
@@ -1199,13 +1203,12 @@ ${history}
|
|
|
1199
1203
|
const userlevel = getFavorabilityLevel(user, this.getFavorabilityConfig());
|
|
1200
1204
|
const messages = this.buildMessage(userlevel, dialogues.join("\n"), existing);
|
|
1201
1205
|
logger5.info(`用户 ${user.userid} 画像生成中...`);
|
|
1202
|
-
logger5.info(`${messages[0].content}`);
|
|
1203
1206
|
try {
|
|
1204
1207
|
const response = await apiClient.generateUserPortrait(user, messages);
|
|
1205
1208
|
if (response && !response.error) {
|
|
1206
1209
|
this.savePortrait(user, response.content);
|
|
1207
|
-
if (user.usage >
|
|
1208
|
-
session.send(
|
|
1210
|
+
if (user.usage > this.config.portrait_usage - 1)
|
|
1211
|
+
session.send("用户画像更新成功。");
|
|
1209
1212
|
logger5.success(`用户 ${user.userid} 画像更新成功`);
|
|
1210
1213
|
}
|
|
1211
1214
|
} catch (error) {
|
|
@@ -1437,7 +1440,7 @@ var SAT = class extends Sat {
|
|
|
1437
1440
|
}
|
|
1438
1441
|
// 前置检查
|
|
1439
1442
|
performPreChecks(session, prompt) {
|
|
1440
|
-
if (prompt
|
|
1443
|
+
if (!prompt || prompt.length == 0)
|
|
1441
1444
|
return session.text("commands.sat.messages.no-prompt");
|
|
1442
1445
|
if (prompt.length > this.config.max_tokens)
|
|
1443
1446
|
return session.text("commands.sat.messages.tooLong");
|
|
@@ -1642,10 +1645,10 @@ ${payload}`);
|
|
|
1642
1645
|
const userId = options.id || session.userId;
|
|
1643
1646
|
const level = options.level || 1;
|
|
1644
1647
|
const user = await ensureUserExists(this.ctx, userId, session.username);
|
|
1645
|
-
await updateUserLevel(this.ctx, user, level);
|
|
1646
1648
|
const enableUserKey = user?.items?.["地灵殿通行证"]?.description && user.items["地灵殿通行证"].description == "on";
|
|
1647
1649
|
if (enableUserKey)
|
|
1648
1650
|
await this.portraitManager.generatePortrait(session, user, this.apiClient);
|
|
1651
|
+
await updateUserLevel(this.ctx, user, level);
|
|
1649
1652
|
return session.text("commands.sat.messages.update_level_succeed", [level]);
|
|
1650
1653
|
}
|
|
1651
1654
|
// 处理查询用户使用次数
|
|
@@ -1653,7 +1656,18 @@ ${payload}`);
|
|
|
1653
1656
|
const user = await ensureUserExists(this.ctx, session.userId, session.username);
|
|
1654
1657
|
const userUsage = user.usage || 0;
|
|
1655
1658
|
const maxUsage = this.config.max_usage[user.userlevel || 0] || 0;
|
|
1656
|
-
|
|
1659
|
+
const enableUserKey = user?.items?.["地灵殿通行证"]?.description && user.items["地灵殿通行证"].description == "on";
|
|
1660
|
+
let result = "";
|
|
1661
|
+
result += "用户等级:" + user.userlevel + "\n";
|
|
1662
|
+
if (enableUserKey)
|
|
1663
|
+
result += session.text("commands.sat.messages.usage", [userUsage, "∞"]) + "\n地灵殿通行证生效中\n";
|
|
1664
|
+
else
|
|
1665
|
+
result += session.text("commands.sat.messages.usage", [userUsage, maxUsage]) + "\n";
|
|
1666
|
+
if (this.portraitManager.hasPortrait(user.userid))
|
|
1667
|
+
result += "用户画像生效中\n";
|
|
1668
|
+
else
|
|
1669
|
+
result += "用户画像未生效\n";
|
|
1670
|
+
return result;
|
|
1657
1671
|
}
|
|
1658
1672
|
// 随机中间件转接
|
|
1659
1673
|
async handleRandomMiddleware(session, prompt) {
|
package/lib/types.d.ts
CHANGED
|
@@ -199,6 +199,7 @@ export declare namespace Sat {
|
|
|
199
199
|
offset_of_fafavorability: number;
|
|
200
200
|
visible_favorability: boolean;
|
|
201
201
|
enable_user_portrait: boolean;
|
|
202
|
+
max_portrait_dialogues: number;
|
|
202
203
|
portrait_usage: number;
|
|
203
204
|
portrait_min_favorability: number;
|
|
204
205
|
prompt_0: string;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koishi-plugin-satori-ai",
|
|
3
|
-
"description": "基于 Satori
|
|
4
|
-
"version": "1.2.
|
|
3
|
+
"description": "基于 Satori 适配器的智能对话插件,具备用户画像、长期记忆、常识管理和好感度系统",
|
|
4
|
+
"version": "1.2.5",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"typings": "lib/index.d.ts",
|
|
7
7
|
"types": "lib/index.d.ts",
|