diff --git a/modules/story-summary/data/config.js b/modules/story-summary/data/config.js index 77d6832..fea6aaf 100644 --- a/modules/story-summary/data/config.js +++ b/modules/story-summary/data/config.js @@ -1,56 +1,62 @@ -// ═══════════════════════════════════════════════════════════════════════════ -// Story Summary - Config (v2 简化版) -// ═══════════════════════════════════════════════════════════════════════════ - import { extension_settings } from "../../../../../../extensions.js"; import { EXT_ID } from "../../../core/constants.js"; import { xbLog } from "../../../core/debug-core.js"; import { CommonSettingStorage } from "../../../core/server-storage.js"; -const MODULE_ID = 'summaryConfig'; -const SUMMARY_CONFIG_KEY = 'storySummaryPanelConfig'; +const MODULE_ID = "summaryConfig"; +const SUMMARY_CONFIG_KEY = "storySummaryPanelConfig"; + +const DEFAULT_FILTER_RULES = [ + { start: "", end: "" }, + { start: "", end: "" }, + { start: "```", end: "```" }, +]; export function getSettings() { - const ext = extension_settings[EXT_ID] ||= {}; + const ext = (extension_settings[EXT_ID] ||= {}); ext.storySummary ||= { enabled: true }; return ext; } -const DEFAULT_FILTER_RULES = [ - { start: '', end: '' }, - { start: '', end: '' }, -]; - export function getSummaryPanelConfig() { const defaults = { - api: { provider: 'st', url: '', key: '', model: '', modelCache: [] }, + api: { provider: "st", url: "", key: "", model: "", modelCache: [] }, gen: { temperature: null, top_p: null, top_k: null, presence_penalty: null, frequency_penalty: null }, trigger: { enabled: false, interval: 20, - timing: 'before_user', - role: 'system', + timing: "before_user", + role: "system", useStream: true, maxPerRun: 100, - wrapperHead: '', - wrapperTail: '', + wrapperHead: "", + wrapperTail: "", forceInsertAtEnd: false, }, + textFilterRules: [...DEFAULT_FILTER_RULES], vector: null, }; try { - const raw = localStorage.getItem('summary_panel_config'); + const raw = localStorage.getItem("summary_panel_config"); if (!raw) return defaults; const parsed = JSON.parse(raw); + const textFilterRules = Array.isArray(parsed.textFilterRules) + ? parsed.textFilterRules + : (Array.isArray(parsed.vector?.textFilterRules) + ? parsed.vector.textFilterRules + : defaults.textFilterRules); + const result = { api: { ...defaults.api, ...(parsed.api || {}) }, gen: { ...defaults.gen, ...(parsed.gen || {}) }, trigger: { ...defaults.trigger, ...(parsed.trigger || {}) }, + textFilterRules, + vector: parsed.vector || null, }; - if (result.trigger.timing === 'manual') result.trigger.enabled = false; + if (result.trigger.timing === "manual") result.trigger.enabled = false; if (result.trigger.useStream === undefined) result.trigger.useStream = true; return result; @@ -61,35 +67,27 @@ export function getSummaryPanelConfig() { export function saveSummaryPanelConfig(config) { try { - localStorage.setItem('summary_panel_config', JSON.stringify(config)); + localStorage.setItem("summary_panel_config", JSON.stringify(config)); CommonSettingStorage.set(SUMMARY_CONFIG_KEY, config); } catch (e) { - xbLog.error(MODULE_ID, '保存面板配置失败', e); + xbLog.error(MODULE_ID, "保存面板配置失败", e); } } -// ═══════════════════════════════════════════════════════════════════════════ -// 向量配置(简化版 - 只需要 key) -// ═══════════════════════════════════════════════════════════════════════════ - export function getVectorConfig() { try { - const raw = localStorage.getItem('summary_panel_config'); + const raw = localStorage.getItem("summary_panel_config"); if (!raw) return null; + const parsed = JSON.parse(raw); const cfg = parsed.vector || null; + if (!cfg) return null; - if (cfg && !cfg.textFilterRules) { - cfg.textFilterRules = [...DEFAULT_FILTER_RULES]; - } - - // 简化:统一使用硅基 - if (cfg) { - cfg.engine = 'online'; - cfg.online = cfg.online || {}; - cfg.online.provider = 'siliconflow'; - cfg.online.model = 'BAAI/bge-m3'; - } + // Keep vector side normalized to online + siliconflow. + cfg.engine = "online"; + cfg.online = cfg.online || {}; + cfg.online.provider = "siliconflow"; + cfg.online.model = "BAAI/bge-m3"; return cfg; } catch { @@ -98,31 +96,31 @@ export function getVectorConfig() { } export function getTextFilterRules() { - const cfg = getVectorConfig(); - return cfg?.textFilterRules || DEFAULT_FILTER_RULES; + const cfg = getSummaryPanelConfig(); + return Array.isArray(cfg?.textFilterRules) + ? cfg.textFilterRules + : DEFAULT_FILTER_RULES; } export function saveVectorConfig(vectorCfg) { try { - const raw = localStorage.getItem('summary_panel_config') || '{}'; + const raw = localStorage.getItem("summary_panel_config") || "{}"; const parsed = JSON.parse(raw); - // 简化配置 parsed.vector = { - enabled: vectorCfg?.enabled || false, - engine: 'online', + enabled: !!vectorCfg?.enabled, + engine: "online", online: { - provider: 'siliconflow', - key: vectorCfg?.online?.key || '', - model: 'BAAI/bge-m3', + provider: "siliconflow", + key: vectorCfg?.online?.key || "", + model: "BAAI/bge-m3", }, - textFilterRules: vectorCfg?.textFilterRules || DEFAULT_FILTER_RULES, }; - localStorage.setItem('summary_panel_config', JSON.stringify(parsed)); + localStorage.setItem("summary_panel_config", JSON.stringify(parsed)); CommonSettingStorage.set(SUMMARY_CONFIG_KEY, parsed); } catch (e) { - xbLog.error(MODULE_ID, '保存向量配置失败', e); + xbLog.error(MODULE_ID, "保存向量配置失败", e); } } @@ -130,12 +128,12 @@ export async function loadConfigFromServer() { try { const savedConfig = await CommonSettingStorage.get(SUMMARY_CONFIG_KEY, null); if (savedConfig) { - localStorage.setItem('summary_panel_config', JSON.stringify(savedConfig)); - xbLog.info(MODULE_ID, '已从服务器加载面板配置'); + localStorage.setItem("summary_panel_config", JSON.stringify(savedConfig)); + xbLog.info(MODULE_ID, "已从服务端加载面板配置"); return savedConfig; } } catch (e) { - xbLog.warn(MODULE_ID, '加载面板配置失败', e); + xbLog.warn(MODULE_ID, "加载面板配置失败", e); } return null; } diff --git a/modules/story-summary/generate/generator.js b/modules/story-summary/generate/generator.js index 0a80e9b..09734a6 100644 --- a/modules/story-summary/generate/generator.js +++ b/modules/story-summary/generate/generator.js @@ -5,6 +5,7 @@ import { getContext } from "../../../../../../extensions.js"; import { xbLog } from "../../../core/debug-core.js"; import { getSummaryStore, saveSummaryStore, addSummarySnapshot, mergeNewData, getFacts } from "../data/store.js"; import { generateSummary, parseSummaryJson } from "./llm.js"; +import { filterText } from "../vector/utils/text-filter.js"; const MODULE_ID = 'summaryGenerator'; const SUMMARY_SESSION_ID = 'xb9'; @@ -168,7 +169,8 @@ export function buildIncrementalSlice(targetMesId, lastSummarizedMesId, maxPerRu const text = slice.map((m, i) => { const speaker = m.name || (m.is_user ? userLabel : charLabel); - return `#${start + i + 1} 【${speaker}】\n${m.mes}`; + const filteredMessage = filterText(m.mes || ""); + return `#${start + i + 1} 【${speaker}】\n${filteredMessage}`; }).join('\n\n'); return { text, count: slice.length, range: `${start + 1}-${end + 1}楼`, endMesId: end }; diff --git a/modules/story-summary/story-summary-ui.js b/modules/story-summary/story-summary-ui.js index 6a4d5cb..461667f 100644 --- a/modules/story-summary/story-summary-ui.js +++ b/modules/story-summary/story-summary-ui.js @@ -87,6 +87,7 @@ api: { provider: 'st', url: '', key: '', model: '', modelCache: [] }, gen: { temperature: null, top_p: null, top_k: null, presence_penalty: null, frequency_penalty: null }, trigger: { enabled: false, interval: 20, timing: 'before_user', role: 'system', useStream: true, maxPerRun: 100, wrapperHead: '', wrapperTail: '', forceInsertAtEnd: false }, + textFilterRules: [...DEFAULT_FILTER_RULES], vector: { enabled: false, engine: 'online', local: { modelId: 'bge-small-zh' }, online: { provider: 'siliconflow', url: '', key: '', model: '' } } }; @@ -123,6 +124,9 @@ Object.assign(config.api, p.api || {}); Object.assign(config.gen, p.gen || {}); Object.assign(config.trigger, p.trigger || {}); + config.textFilterRules = Array.isArray(p.textFilterRules) + ? p.textFilterRules + : (Array.isArray(p.vector?.textFilterRules) ? p.vector.textFilterRules : [...DEFAULT_FILTER_RULES]); if (p.vector) config.vector = p.vector; if (config.trigger.timing === 'manual' && config.trigger.enabled) { config.trigger.enabled = false; @@ -137,6 +141,11 @@ Object.assign(config.api, cfg.api || {}); Object.assign(config.gen, cfg.gen || {}); Object.assign(config.trigger, cfg.trigger || {}); + config.textFilterRules = Array.isArray(cfg.textFilterRules) + ? cfg.textFilterRules + : (Array.isArray(cfg.vector?.textFilterRules) + ? cfg.vector.textFilterRules + : (Array.isArray(config.textFilterRules) ? config.textFilterRules : [...DEFAULT_FILTER_RULES])); if (cfg.vector) config.vector = cfg.vector; if (config.trigger.timing === 'manual') config.trigger.enabled = false; localStorage.setItem('summary_panel_config', JSON.stringify(config)); @@ -145,7 +154,10 @@ function saveConfig() { try { const settingsOpen = $('settings-modal')?.classList.contains('active'); - if (settingsOpen) config.vector = getVectorConfig(); + if (settingsOpen) { + config.vector = getVectorConfig(); + config.textFilterRules = collectFilterRules(); + } if (!config.vector) { config.vector = { enabled: false, engine: 'online', online: { provider: 'siliconflow', key: '', model: 'BAAI/bge-m3' } }; } @@ -169,7 +181,6 @@ key: $('vector-api-key')?.value?.trim() || '', model: 'BAAI/bge-m3', }, - textFilterRules: collectFilterRules(), }; } @@ -182,7 +193,6 @@ $('vector-api-key').value = cfg.online.key; } - renderFilterRules(cfg?.textFilterRules || DEFAULT_FILTER_RULES); } // ═══════════════════════════════════════════════════════════════════════════ @@ -471,6 +481,7 @@ updateProviderUI(config.api.provider); if (config.vector) loadVectorConfig(config.vector); + renderFilterRules(Array.isArray(config.textFilterRules) ? config.textFilterRules : DEFAULT_FILTER_RULES); // Initialize sub-options visibility const autoSummaryOptions = $('auto-summary-options'); @@ -520,6 +531,7 @@ config.trigger.wrapperHead = $('trigger-wrapper-head').value; config.trigger.wrapperTail = $('trigger-wrapper-tail').value; config.trigger.forceInsertAtEnd = $('trigger-insert-at-end').checked; + config.textFilterRules = collectFilterRules(); config.vector = getVectorConfig(); saveConfig(); diff --git a/modules/story-summary/story-summary.html b/modules/story-summary/story-summary.html index 4e92395..22d5ee1 100644 --- a/modules/story-summary/story-summary.html +++ b/modules/story-summary/story-summary.html @@ -334,6 +334,32 @@ + +
+
+ 文本过滤规则 · 0 + + + +
+ +
+
- - -
-
- 文本过滤规则 · 0 - - - -
- -
-