feat(story-summary): make vector APIs configurable

This commit is contained in:
2026-04-03 15:31:13 +08:00
parent 5424dae2d6
commit af7e0f689d
9 changed files with 468 additions and 187 deletions

View File

@@ -254,6 +254,12 @@ export const DEFAULT_SUMMARY_USER_CONFIRM_PROMPT = `怎么截断了!重新完
</Chat_History>`;
export const DEFAULT_SUMMARY_ASSISTANT_PREFILL_PROMPT = '下面重新生成完整JSON。';
const DEFAULT_VECTOR_PROVIDER = "siliconflow";
const DEFAULT_L0_URL = "https://api.siliconflow.cn/v1";
const DEFAULT_OPENROUTER_URL = "https://openrouter.ai/api/v1";
const DEFAULT_L0_MODEL = "Qwen/Qwen3-8B";
const DEFAULT_EMBEDDING_MODEL = "BAAI/bge-m3";
const DEFAULT_RERANK_MODEL = "BAAI/bge-reranker-v2-m3";
export function getSettings() {
const ext = (extension_settings[EXT_ID] ||= {});
@@ -261,6 +267,51 @@ export function getSettings() {
return ext;
}
function normalizeOpenAiCompatApiConfig(src, defaults = {}) {
const provider = String(src?.provider || defaults.provider || DEFAULT_VECTOR_PROVIDER).toLowerCase();
const defaultUrl = provider === "openrouter"
? DEFAULT_OPENROUTER_URL
: String(defaults.url || DEFAULT_L0_URL);
return {
provider,
url: String(src?.url || defaultUrl || "").trim(),
key: String(src?.key || defaults.key || "").trim(),
model: String(src?.model || defaults.model || "").trim(),
modelCache: Array.isArray(src?.modelCache) ? src.modelCache.filter(Boolean) : [],
};
}
function normalizeVectorConfig(rawVector = null) {
const legacyOnline = rawVector?.online || {};
const sharedProvider = String(legacyOnline.provider || DEFAULT_VECTOR_PROVIDER).toLowerCase();
const sharedUrl = String(legacyOnline.url || (sharedProvider === "openrouter" ? DEFAULT_OPENROUTER_URL : DEFAULT_L0_URL)).trim();
const sharedKey = String(legacyOnline.key || "").trim();
return {
enabled: !!rawVector?.enabled,
engine: "online",
l0Concurrency: Math.max(1, Math.min(50, Number(rawVector?.l0Concurrency) || 10)),
l0Api: normalizeOpenAiCompatApiConfig(rawVector?.l0Api, {
provider: sharedProvider,
url: sharedUrl,
key: sharedKey,
model: DEFAULT_L0_MODEL,
}),
embeddingApi: normalizeOpenAiCompatApiConfig(rawVector?.embeddingApi, {
provider: DEFAULT_VECTOR_PROVIDER,
url: DEFAULT_L0_URL,
key: sharedKey,
model: DEFAULT_EMBEDDING_MODEL,
}),
rerankApi: normalizeOpenAiCompatApiConfig(rawVector?.rerankApi, {
provider: DEFAULT_VECTOR_PROVIDER,
url: DEFAULT_L0_URL,
key: sharedKey,
model: DEFAULT_RERANK_MODEL,
}),
};
}
export function getSummaryPanelConfig() {
const clampKeepVisibleCount = (value) => {
const n = Number.parseInt(value, 10);
@@ -299,7 +350,7 @@ export function getSummaryPanelConfig() {
summaryAssistantPrefillPrompt: DEFAULT_SUMMARY_ASSISTANT_PREFILL_PROMPT,
memoryTemplate: DEFAULT_MEMORY_PROMPT_TEMPLATE,
},
vector: null,
vector: normalizeVectorConfig(),
};
try {
@@ -320,7 +371,7 @@ export function getSummaryPanelConfig() {
ui: { ...defaults.ui, ...(parsed.ui || {}) },
textFilterRules,
prompts: { ...defaults.prompts, ...(parsed.prompts || {}) },
vector: parsed.vector || null,
vector: normalizeVectorConfig(parsed.vector || null),
};
if (result.trigger.timing === "manual") result.trigger.enabled = false;
@@ -349,16 +400,7 @@ export function getVectorConfig() {
if (!raw) return null;
const parsed = JSON.parse(raw);
const cfg = parsed.vector || null;
if (!cfg) return null;
// 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;
return parsed.vector ? normalizeVectorConfig(parsed.vector) : normalizeVectorConfig();
} catch {
return null;
}
@@ -376,15 +418,7 @@ export function saveVectorConfig(vectorCfg) {
const raw = localStorage.getItem("summary_panel_config") || "{}";
const parsed = JSON.parse(raw);
parsed.vector = {
enabled: !!vectorCfg?.enabled,
engine: "online",
online: {
provider: "siliconflow",
key: vectorCfg?.online?.key || "",
model: "BAAI/bge-m3",
},
};
parsed.vector = normalizeVectorConfig(vectorCfg || null);
localStorage.setItem("summary_panel_config", JSON.stringify(parsed));
CommonSettingStorage.set(SUMMARY_CONFIG_KEY, parsed);