feat(story-summary): make vector APIs configurable
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user