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 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 + "(system:注意不要重复之前的内容)";
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] || 0;
1154
- if (dialoguesContent.length > usageLimit) {
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 > 0)
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
- return session.text("commands.sat.messages.usage", [userUsage, maxUsage]);
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.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",