mirror of
https://github.com/SilenceLurker/ST-Amily2-Chat-Optimisation.git
synced 2026-06-06 15:55:50 +00:00
Merge branch 'Wx-2025:main' into main
This commit is contained in:
@@ -10,7 +10,7 @@
|
|||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
border: 1px solid #444;
|
border: 1px solid #444;
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
padding: 12px 12px 100px 12px;
|
padding: 12px 12px 150px 12px;
|
||||||
background: #2a2a2a;
|
background: #2a2a2a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -202,7 +202,15 @@ export function loadActivePreset() {
|
|||||||
localStorage.setItem(SETTINGS_KEY, JSON.stringify(presetManager));
|
localStorage.setItem(SETTINGS_KEY, JSON.stringify(presetManager));
|
||||||
toastr.info("Amily2 提示词预设已自动更新以支持最新功能。");
|
toastr.info("Amily2 提示词预设已自动更新以支持最新功能。");
|
||||||
}
|
}
|
||||||
|
const novelProcessorOrder = currentMixedOrder.novel_processor || [];
|
||||||
|
const hasChapterContent = novelProcessorOrder.some(item => item.type === 'conditional' && item.id === 'chapterContent');
|
||||||
|
|
||||||
|
if (!hasChapterContent) {
|
||||||
|
console.log("Amily2: 检测到 novel_processor 缺少 chapterContent 条件块,正在执行迁移...");
|
||||||
|
currentPresets.novel_processor = JSON.parse(JSON.stringify(defaultPrompts.novel_processor));
|
||||||
|
currentMixedOrder.novel_processor = JSON.parse(JSON.stringify(defaultMixedOrder.novel_processor));
|
||||||
|
isMigrated = true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
const firstPresetName = Object.keys(presetManager.presets)[0];
|
const firstPresetName = Object.keys(presetManager.presets)[0];
|
||||||
if (firstPresetName) {
|
if (firstPresetName) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { extension_settings, getContext } from "/scripts/extensions.js";
|
import { extension_settings, getContext } from "/scripts/extensions.js";
|
||||||
import { saveSettingsDebounced, eventSource, event_types } from "/script.js";
|
import { saveSettingsDebounced, eventSource, event_types } from "/script.js";
|
||||||
import { world_names } from "/scripts/world-info.js";
|
|
||||||
import { extensionName } from "../utils/settings.js";
|
import { extensionName } from "../utils/settings.js";
|
||||||
|
import { safeLorebooks } from '../core/tavernhelper-compatibility.js';
|
||||||
import { testSybdApiConnection, fetchSybdModels } from '../core/api/SybdApi.js';
|
import { testSybdApiConnection, fetchSybdModels } from '../core/api/SybdApi.js';
|
||||||
import { handleFileUpload, processNovel } from './index.js';
|
import { handleFileUpload, processNovel } from './index.js';
|
||||||
import { SETTINGS_KEY as PRESET_SETTINGS_KEY } from '../PresetSettings/config.js';
|
import { SETTINGS_KEY as PRESET_SETTINGS_KEY } from '../PresetSettings/config.js';
|
||||||
@@ -542,29 +542,11 @@ function bindNovelProcessEvents() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function isTavernHelperAvailable() {
|
|
||||||
return typeof window.TavernHelper !== 'undefined' &&
|
|
||||||
window.TavernHelper !== null &&
|
|
||||||
typeof window.TavernHelper.getLorebooks === 'function';
|
|
||||||
}
|
|
||||||
|
|
||||||
async function safeLorebooks() {
|
|
||||||
try {
|
|
||||||
if (isTavernHelperAvailable()) {
|
|
||||||
return await window.TavernHelper.getLorebooks();
|
|
||||||
}
|
|
||||||
return [...world_names];
|
|
||||||
} catch (error) {
|
|
||||||
console.error('[Amily2-兼容性] 获取世界书列表失败:', error);
|
|
||||||
return [...world_names];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function loadWorldBooks() {
|
async function loadWorldBooks() {
|
||||||
const select = document.getElementById('novel-world-book-select');
|
const select = document.getElementById('novel-world-book-select');
|
||||||
if (!select) return;
|
if (!select) return;
|
||||||
|
|
||||||
const { extension_settings } = window;
|
|
||||||
const savedBook = extension_settings[extensionName]?.selectedWorldBook;
|
const savedBook = extension_settings[extensionName]?.selectedWorldBook;
|
||||||
moduleState.selectedWorldBook = savedBook || '';
|
moduleState.selectedWorldBook = savedBook || '';
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,7 @@ import { callSybdAI } from '../core/api/SybdApi.js';
|
|||||||
import { extensionName } from '../utils/settings.js';
|
import { extensionName } from '../utils/settings.js';
|
||||||
import { getPresetPrompts, getMixedOrder } from '../PresetSettings/index.js';
|
import { getPresetPrompts, getMixedOrder } from '../PresetSettings/index.js';
|
||||||
import { generateRandomSeed } from '../core/api.js';
|
import { generateRandomSeed } from '../core/api.js';
|
||||||
|
import { safeLorebookEntries, safeUpdateLorebookEntries, compatibleWriteToLorebook } from '../core/tavernhelper-compatibility.js';
|
||||||
const { TavernHelper } = window;
|
|
||||||
|
|
||||||
function buildContextFromEntries(entries) {
|
function buildContextFromEntries(entries) {
|
||||||
if (!entries || entries.length === 0) {
|
if (!entries || entries.length === 0) {
|
||||||
@@ -11,10 +10,10 @@ function buildContextFromEntries(entries) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const mappedContent = entries.map(entry => {
|
const mappedContent = entries.map(entry => {
|
||||||
if (!Array.isArray(entry.keyword) || entry.keyword.length < 2) {
|
if (!Array.isArray(entry.keys) || entry.keys.length < 2) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const name = entry.keyword[1];
|
const name = entry.keys[1];
|
||||||
return `[--START_TABLE--]\n[name]:${name}\n${entry.content}\n[--END_TABLE--]`;
|
return `[--START_TABLE--]\n[name]:${name}\n${entry.content}\n[--END_TABLE--]`;
|
||||||
}).filter(Boolean).join('\n\n');
|
}).filter(Boolean).join('\n\n');
|
||||||
|
|
||||||
@@ -54,7 +53,7 @@ export async function executeNovelProcessing(processingState, updateStatusCallba
|
|||||||
throw new Error('请先在设置中选择一个目标世界书。');
|
throw new Error('请先在设置中选择一个目标世界书。');
|
||||||
}
|
}
|
||||||
|
|
||||||
const allEntries = (await TavernHelper.getLorebookEntries(bookName)) || [];
|
const allEntries = (await safeLorebookEntries(bookName)) || [];
|
||||||
const managedEntries = allEntries.filter(e => e.comment?.startsWith('[Amily2小说处理]') || e.comment?.startsWith('[Amily2-Glossary]'));
|
const managedEntries = allEntries.filter(e => e.comment?.startsWith('[Amily2小说处理]') || e.comment?.startsWith('[Amily2-Glossary]'));
|
||||||
const localManagedEntries = [...managedEntries];
|
const localManagedEntries = [...managedEntries];
|
||||||
|
|
||||||
@@ -132,7 +131,7 @@ export async function executeNovelProcessing(processingState, updateStatusCallba
|
|||||||
keys = [`小说处理`, title, `第${nextPart}部分`];
|
keys = [`小说处理`, title, `第${nextPart}部分`];
|
||||||
const newEntryData = { keys, content, comment, enabled: true, order: 100, position: 'before_char' };
|
const newEntryData = { keys, content, comment, enabled: true, order: 100, position: 'before_char' };
|
||||||
entriesToCreate.push(newEntryData);
|
entriesToCreate.push(newEntryData);
|
||||||
localManagedEntries.push({ uid: -1, ...newEntryData, keyword: keys });
|
localManagedEntries.push({ uid: -1, ...newEntryData, keys: keys });
|
||||||
nextPart++;
|
nextPart++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -150,19 +149,26 @@ export async function executeNovelProcessing(processingState, updateStatusCallba
|
|||||||
|
|
||||||
if (existingEntry) {
|
if (existingEntry) {
|
||||||
entriesToUpdate.push({ uid: existingEntry.uid, ...loreData });
|
entriesToUpdate.push({ uid: existingEntry.uid, ...loreData });
|
||||||
Object.assign(existingEntry, { ...loreData, keyword: keys });
|
Object.assign(existingEntry, { ...loreData, keys: keys });
|
||||||
} else {
|
} else {
|
||||||
entriesToCreate.push(loreData);
|
entriesToCreate.push(loreData);
|
||||||
localManagedEntries.push({ uid: -1, ...loreData, keyword: keys });
|
localManagedEntries.push({ uid: -1, ...loreData, keys: keys });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entriesToUpdate.length > 0) {
|
if (entriesToUpdate.length > 0) {
|
||||||
await TavernHelper.setLorebookEntries(bookName, entriesToUpdate);
|
await safeUpdateLorebookEntries(bookName, entriesToUpdate);
|
||||||
updateStatusCallback(`更新了 ${entriesToUpdate.length} 个世界书条目。`, 'info');
|
updateStatusCallback(`更新了 ${entriesToUpdate.length} 个世界书条目。`, 'info');
|
||||||
}
|
}
|
||||||
if (entriesToCreate.length > 0) {
|
if (entriesToCreate.length > 0) {
|
||||||
await TavernHelper.createLorebookEntries(bookName, entriesToCreate);
|
for (const entry of entriesToCreate) {
|
||||||
|
await compatibleWriteToLorebook(bookName, entry.comment, () => entry.content, {
|
||||||
|
keys: entry.keys,
|
||||||
|
isConstant: false,
|
||||||
|
insertion_position: 'before_char',
|
||||||
|
depth: 100,
|
||||||
|
});
|
||||||
|
}
|
||||||
updateStatusCallback(`创建了 ${entriesToCreate.length} 个新世界书条目。`, 'success');
|
updateStatusCallback(`创建了 ${entriesToCreate.length} 个新世界书条目。`, 'success');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user