Files
ST-Bionic-Memory-Ecology/llm-preset-utils.js
2026-04-07 11:20:15 +08:00

111 lines
2.9 KiB
JavaScript

function normalizeLlmConfigValue(value) {
return String(value || "").trim();
}
export function isSameLlmConfigSnapshot(left = {}, right = {}) {
return (
normalizeLlmConfigValue(left?.llmApiUrl) ===
normalizeLlmConfigValue(right?.llmApiUrl) &&
normalizeLlmConfigValue(left?.llmApiKey) ===
normalizeLlmConfigValue(right?.llmApiKey) &&
normalizeLlmConfigValue(left?.llmModel) ===
normalizeLlmConfigValue(right?.llmModel)
);
}
export function normalizeLlmPresetMap(rawPresets = {}) {
const normalizedPresets = {};
let changed =
!rawPresets ||
typeof rawPresets !== "object" ||
Array.isArray(rawPresets);
if (!changed) {
for (const [name, preset] of Object.entries(rawPresets)) {
const normalizedName = String(name || "").trim();
if (!normalizedName) {
changed = true;
continue;
}
if (
!preset ||
typeof preset !== "object" ||
Array.isArray(preset) ||
typeof preset.llmApiUrl !== "string" ||
typeof preset.llmApiKey !== "string" ||
typeof preset.llmModel !== "string"
) {
changed = true;
continue;
}
normalizedPresets[normalizedName] = {
llmApiUrl: normalizeLlmConfigValue(preset.llmApiUrl),
llmApiKey: normalizeLlmConfigValue(preset.llmApiKey),
llmModel: normalizeLlmConfigValue(preset.llmModel),
};
if (normalizedName !== name) {
changed = true;
}
}
}
return {
presets: normalizedPresets,
changed,
};
}
export function sanitizeLlmPresetSettings(settings = {}) {
const normalized = settings && typeof settings === "object" ? settings : {};
const { presets, changed: presetChanged } = normalizeLlmPresetMap(
normalized.llmPresets,
);
let activePreset =
typeof normalized.llmActivePreset === "string"
? normalized.llmActivePreset
: "";
let changed = presetChanged || typeof normalized.llmActivePreset !== "string";
if (
activePreset &&
!Object.prototype.hasOwnProperty.call(presets, activePreset)
) {
activePreset = "";
changed = true;
}
return {
presets,
activePreset,
changed,
};
}
export function resolveActiveLlmPresetName(settings = {}) {
const normalized = settings && typeof settings === "object" ? settings : {};
const { presets, activePreset } = sanitizeLlmPresetSettings(normalized);
const snapshot = {
llmApiUrl: normalizeLlmConfigValue(normalized.llmApiUrl),
llmApiKey: normalizeLlmConfigValue(normalized.llmApiKey),
llmModel: normalizeLlmConfigValue(normalized.llmModel),
};
if (
activePreset &&
presets[activePreset] &&
isSameLlmConfigSnapshot(snapshot, presets[activePreset])
) {
return activePreset;
}
const matchingPresets = Object.keys(presets).filter((name) =>
isSameLlmConfigSnapshot(snapshot, presets[name]),
);
if (matchingPresets.length === 1) {
return matchingPresets[0];
}
return "";
}