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 @@
+
+
+
-
-
-
-