Files
ST-Amily2-Chat-Optimisation/core/events.js
2025-07-10 23:42:18 +08:00

103 lines
3.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { getContext, extension_settings } from "/scripts/extensions.js";
import { characters, saveChatConditional, reloadCurrentChat } from "/script.js";
import { extensionName } from "../utils/settings.js";
import { checkAndFixWithAPI } from "./api.js";
import { writeSummaryToLorebook, getChatIdentifier } from "./lore.js";
const pendingWriteData = {
summary: null,
targetLorebook: null,
chatIdentifier: null,
sourceAiMessageTimestamp: null,
};
export async function onMessageReceived(data) {
const context = getContext();
if ((data && data.is_user) || context.isWaitingForUserInput) {
return;
}
const settings = extension_settings[extensionName];
const chat = context.chat;
if (!chat || chat.length === 0) return;
const latestMessage = chat[chat.length - 1];
if (latestMessage.is_user || !settings.enabled) {
return;
}
if (chat.length < 2 || !chat[chat.length - 2].is_user) {
console.log("[Amily2号] 检测到消息并非AI对用户的直接回复可能是角色问候语或连续AI消息已跳过优化任务。");
return;
}
// =============================================================
if (pendingWriteData.summary) {
await writeSummaryToLorebook(pendingWriteData);
}
if (!settings.optimizationEnabled && !settings.summarizationEnabled) {
console.log("[Amily2号] 优化与总结功能均未启用,任务中止。");
return;
}
if (!settings.apiUrl) return;
const contextCount = settings.contextMessages || 2;
const startIndex = Math.max(0, chat.length - 1 - contextCount);
const previousMessages = chat.slice(startIndex, chat.length - 1);
const result = await checkAndFixWithAPI(latestMessage, previousMessages);
if (result) {
if (
result.optimizedContent &&
result.optimizedContent !== latestMessage.mes &&
settings.optimizationEnabled
) {
latestMessage.mes = result.optimizedContent;
await saveChatConditional();
if (settings.optimizationMode === "refresh") {
await reloadCurrentChat();
}
}
if (result.summary && settings.summarizationEnabled) {
pendingWriteData.summary = result.summary;
pendingWriteData.sourceAiMessageTimestamp = latestMessage.send_date;
pendingWriteData.targetLorebook = settings.lorebookTarget;
pendingWriteData.chatIdentifier = await getChatIdentifier();
if (settings.showOptimizationToast) {
let targetName = "独立中央档案";
if (settings.lorebookTarget === "character_main") {
const character = characters[context.characterId];
targetName = character?.data?.extensions?.world || "未绑定的主世界书";
}
toastr.info(
`已优化并将总结:“${result.summary}” 写入 “${targetName}`,
"Amily2号",
{ timeOut: 7000 },
);
}
}
}
}
export function onChatChanged() {
const context = getContext();
const chat = context.chat;
if (!chat || chat.length === 0) {
pendingWriteData.summary = null;
return;
}
const latestMessage = chat[chat.length - 1];
if (latestMessage.is_user && pendingWriteData.summary) {
console.log(
"[Amily2号-遗忘哨兵] 检测到AI回复被操作已清除待写入的过时总结。",
);
pendingWriteData.summary = null;
}
}