import { extension_settings, getContext } from "/scripts/extensions.js"; import { characters } from "/script.js"; import { getSlotProfile } from './api/api-resolver.js'; import { configManager } from '../utils/config/ConfigManager.js'; import { world_names } from "/scripts/world-info.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 { compatibleTriggerSlash } from "./tavernhelper-compatibility.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"; const MESSAGE_BOARD_URL = "https://amilyservice.amily49.cc/amily2_message_board.json"; const PROXIES = [ "https://corsproxy.io/?", "https://api.allorigins.win/raw?url=", "https://api.codetabs.com/v1/proxy?quest=" ]; let lastMessageId = null; export async function fetchMessageBoardContent() { if (!MESSAGE_BOARD_URL) { console.log('[Amily2号-内务府] 任务取消:陛下尚未配置留言板URL。'); return null; } const processResponse = async (response) => { if (response.status === 304) { console.log('[Amily2号-内务府] 留言板内容未变更 (304)。'); return null; } if (!response.ok) { throw new Error(`服务器响应异常: ${response.status}`); } const data = await response.json(); if (data && data.id) { lastMessageId = data.id; } return data; }; // 1. 尝试直连 try { let url = MESSAGE_BOARD_URL; if (lastMessageId) { const separator = url.includes('?') ? '&' : '?'; url += `${separator}nowId=${encodeURIComponent(lastMessageId)}`; } const response = await fetch(url, { cache: 'no-store' }); return await processResponse(response); } catch (error) { console.warn('[Amily2号-内务府] 直连失败,开始尝试代理链...', error); } // 2. 尝试代理链 for (const proxyPrefix of PROXIES) { try { let targetUrl = MESSAGE_BOARD_URL; if (lastMessageId) { const separator = targetUrl.includes('?') ? '&' : '?'; targetUrl += `${separator}nowId=${encodeURIComponent(lastMessageId)}`; } let proxyUrl; // corsproxy.io 支持直接拼接,其他通常需要编码 if (proxyPrefix.includes('corsproxy.io')) { proxyUrl = proxyPrefix + targetUrl; } else { proxyUrl = proxyPrefix + encodeURIComponent(targetUrl); } console.log(`[Amily2号-内务府] 尝试代理: ${proxyPrefix}`); const response = await fetch(proxyUrl, { cache: 'no-store' }); const data = await processResponse(response); console.log(`[Amily2号-内务府] 代理成功: ${proxyPrefix}`); return data; } catch (e) { console.warn(`[Amily2号-内务府] 代理失败: ${proxyPrefix}`, e); } } console.error('[Amily2号-内务府] 所有通道均已失效,无法获取留言板内容。'); return null; } 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; } export async function fetchModels() { if (window.AMILY2_LOCK_MODEL_FETCHING) { console.warn("[Amily2号-使节团] 上次任务尚未完成,本次任务取消。"); toastr.info("上次任务尚未完成,请稍后再试。", "任务排队中"); return []; } window.AMILY2_LOCK_MODEL_FETCHING = true; try { const apiSettings = await getApiSettings('main'); const apiProvider = apiSettings.apiProvider || 'openai'; const apiUrl = apiSettings.apiUrl; const apiKey = apiSettings.apiKey; const $button = $("#amily2_refresh_models"); const $selector = $("#amily2_model"); console.log(`[Amily2号-使节团] 使用 API 提供商: ${apiProvider}`); $button.prop("disabled", true).html(' 加载中'); $selector.empty().append($('