From 973d0287fd6f99c35bbc9c5a23b025e0dea4d2ed Mon Sep 17 00:00:00 2001 From: Wx-2025 <351320169@qq.com> Date: Thu, 23 Oct 2025 22:10:13 +0800 Subject: [PATCH] Update api.js --- core/api.js | 1142 +++++++++++++++++++-------------------------------- 1 file changed, 428 insertions(+), 714 deletions(-) diff --git a/core/api.js b/core/api.js index 74bfb78..2f41563 100644 --- a/core/api.js +++ b/core/api.js @@ -1,760 +1,474 @@ import { extension_settings, getContext } from "/scripts/extensions.js"; -import { characters } from "/script.js"; -import { world_names } from "/scripts/world-info.js"; +import { characters, eventSource, event_types } from "/script.js"; +import { loadWorldInfo, createNewWorldInfo, createWorldInfoEntry, saveWorldInfo, world_names } from "/scripts/world-info.js"; +import { compatibleWriteToLorebook, safeLorebooks, safeCharLorebooks, safeLorebookEntries } from "./tavernhelper-compatibility.js"; import { extensionName } from "../utils/settings.js"; -import { extractContentByTag, replaceContentByTag, extractFullTagBlock } from '../utils/tagProcessor.js'; -import { - getCombinedWorldbookContent, - findLatestSummaryLore, - DEDICATED_LOREBOOK_NAME, - getChatIdentifier, -} from "./lore.js"; - -import { - isGoogleEndpoint, - convertToGoogleRequest, - parseGoogleResponse, - buildGoogleApiUrl -} from '../core/utils/googleAdapter.js'; - -import { - intelligentPoll, - createGooglePollingTask, - progressTracker -} from '../core/utils/pollingManager.js'; - -import { - buildGoogleEmbeddingRequest, - parseGoogleEmbeddingResponse, - buildGoogleEmbeddingApiUrl -} from './utils/googleAdapter.js'; - -import { getRequestHeaders } from '/script.js'; -let ChatCompletionService = undefined; -try { - const module = await import('/scripts/custom-request.js'); - ChatCompletionService = module.ChatCompletionService; - console.log('[Amily2号-外交部] 已成功召唤“皇家信使”(ChatCompletionService)。'); -} catch (e) { - console.warn("[Amily2号-外交部] 未能召唤“皇家信使”,部分高级功能(如Claw代理)将受限。请考虑更新SillyTavern版本。", e); -} - -const UPDATE_CHECK_URL = - "https://raw.githubusercontent.com/Wx-2025/ST-Amily2-Chat-Optimisation/refs/heads/main/amily2_update_info.json"; +export const LOREBOOK_PREFIX = "Amily2档案-"; +export const DEDICATED_LOREBOOK_NAME = "Amily2号-国史馆"; +export const INTRODUCTORY_TEXT = + "【Amily2号自动档案】\n此卷宗由Amily2号优化助手自动生成并维护,记录核心事件脉络。\n---\n"; -const MESSAGE_BOARD_URL = - "https://raw.githubusercontent.com/Wx-2025/ST-Amily2-Chat-Optimisation/refs/heads/main/amily2_message_board.json"; - -export async function fetchMessageBoardContent() { - if (!MESSAGE_BOARD_URL) { - console.log('[Amily2号-内务府] 任务取消:陛下尚未配置留言板URL。'); - return null; - } +export async function getChatIdentifier() { + let attempts = 0; + const maxAttempts = 50; + const interval = 100; + + while (attempts < maxAttempts) { try { - const response = await fetch(MESSAGE_BOARD_URL, { cache: 'no-store' }); - if (!response.ok) { - throw new Error(`服务器响应异常: ${response.status}`); + const context = getContext(); + if (context && context.characterId) { + const character = characters[context.characterId]; + if (character && character.avatar) { + return `char-${character.avatar.replace(/\.(png|webp|jpg|jpeg|gif)$/, "")}`; } - const data = await response.json(); - return data; + return `char-${context.characterId}`; + } + if (context && context.chat_filename) { + const fileName = context.chat_filename.split(/[\\/]/).pop(); + return fileName.replace(/\.jsonl?$/, ""); + } } catch (error) { - console.error('[Amily2号-内务府] 获取留言板内容失败:', error); - return null; + console.warn( + `[Amily2-户籍管理处] 等待上下文时发生轻微错误 (尝试次数 ${attempts + 1}):`, + error.message, + ); } -} - -export async function checkForUpdates() { - if (!UPDATE_CHECK_URL || UPDATE_CHECK_URL.includes('YourUsername')) { - console.log('[Amily2号-外交部] 任务取消:陛下尚未配置情报来源URL。'); - return null; - } - - - try { - console.log('[Amily2号-外交部] 已派遣使者前往云端获取最新情报...'); - const response = await fetch(UPDATE_CHECK_URL, { - method: 'GET', - cache: 'no-store', - mode: 'cors' - }); - - - - if (!response.ok) { - throw new Error(`远方服务器响应异常,状态: ${response.status}`); - } - - const data = await response.json(); - console.log('[Amily2号-外交部] 情报已成功获取并解析。'); - return data; - - } catch (error) { - console.error('[Amily2号-外交部] 紧急军情:外交任务失败!', error); - return null; - } -} - -function normalizeApiResponse(responseData) { - let data = responseData; - if (typeof data === 'string') { - try { - data = JSON.parse(data); - } catch (e) { - console.error(`[${extensionName}] API响应JSON解析失败:`, e); - return { error: { message: 'Invalid JSON response' } }; - } - } - if (data && typeof data.data === 'object' && data.data !== null && !Array.isArray(data.data)) { - if (Object.hasOwn(data.data, 'data')) { - data = data.data; - } - } - if (data && data.choices && data.choices[0]) { - return { content: data.choices[0].message?.content?.trim() }; - } - if (data && data.content) { - return { content: data.content.trim() }; - } - if (data && data.data) { - return { data: data.data }; - } - if (data && data.error) { - return { error: data.error }; - } - return data; + await new Promise((resolve) => setTimeout(resolve, interval)); + attempts++; + } + + console.error("[Amily2-国史馆] 户籍管理处在长时间等待后,仍无法确定户籍。"); + toastr.warning( + "Amily2号无法确定当前聊天身份,世界书功能将受影响。", + "上下文错误", + ); + return "unknown_chat_timeout"; } - -export async function fetchModels() { - if (window.AMILY2_LOCK_MODEL_FETCHING) { - console.warn("[Amily2号-使节团] 上次任务尚未完成,本次任务取消。"); - toastr.info("上次任务尚未完成,请稍后再试。", "任务排队中"); - return []; - } - - window.AMILY2_LOCK_MODEL_FETCHING = true; - - try { - const apiProvider = $("#amily2_api_provider").val() || 'openai'; - const apiUrl = $("#amily2_api_url").val().trim(); - const apiKey = $("#amily2_api_key").val().trim(); - const $button = $("#amily2_refresh_models"); - const $selector = $("#amily2_model"); - - console.log(`[Amily2号-使节团] 使用 API 提供商: ${apiProvider}`); - - $button.prop("disabled", true).html(' 加载中'); - $selector.empty().append($('