94 lines
2.6 KiB
TypeScript
94 lines
2.6 KiB
TypeScript
import type { SessionEntry } from "../config/sessions.js";
|
|
|
|
export function formatProviderModelRef(providerRaw: string, modelRaw: string): string {
|
|
const provider = String(providerRaw ?? "").trim();
|
|
const model = String(modelRaw ?? "").trim();
|
|
if (!provider) {
|
|
return model;
|
|
}
|
|
if (!model) {
|
|
return provider;
|
|
}
|
|
const prefix = `${provider}/`;
|
|
if (model.toLowerCase().startsWith(prefix.toLowerCase())) {
|
|
const normalizedModel = model.slice(prefix.length).trim();
|
|
if (normalizedModel) {
|
|
return `${provider}/${normalizedModel}`;
|
|
}
|
|
}
|
|
return `${provider}/${model}`;
|
|
}
|
|
|
|
type ModelRef = {
|
|
provider: string;
|
|
model: string;
|
|
label: string;
|
|
};
|
|
|
|
function normalizeModelWithinProvider(provider: string, modelRaw: string): string {
|
|
const model = String(modelRaw ?? "").trim();
|
|
if (!provider || !model) {
|
|
return model;
|
|
}
|
|
const prefix = `${provider}/`;
|
|
if (model.toLowerCase().startsWith(prefix.toLowerCase())) {
|
|
const withoutPrefix = model.slice(prefix.length).trim();
|
|
if (withoutPrefix) {
|
|
return withoutPrefix;
|
|
}
|
|
}
|
|
return model;
|
|
}
|
|
|
|
function normalizeModelRef(
|
|
rawModel: string,
|
|
fallbackProvider: string,
|
|
parseEmbeddedProvider = false,
|
|
): ModelRef {
|
|
const trimmed = String(rawModel ?? "").trim();
|
|
const slashIndex = parseEmbeddedProvider ? trimmed.indexOf("/") : -1;
|
|
if (slashIndex > 0) {
|
|
const provider = trimmed.slice(0, slashIndex).trim();
|
|
const model = trimmed.slice(slashIndex + 1).trim();
|
|
if (provider && model) {
|
|
return {
|
|
provider,
|
|
model,
|
|
label: `${provider}/${model}`,
|
|
};
|
|
}
|
|
}
|
|
const provider = String(fallbackProvider ?? "").trim();
|
|
const dedupedModel = normalizeModelWithinProvider(provider, trimmed);
|
|
return {
|
|
provider,
|
|
model: dedupedModel || trimmed,
|
|
label: provider ? formatProviderModelRef(provider, dedupedModel || trimmed) : trimmed,
|
|
};
|
|
}
|
|
|
|
export function resolveSelectedAndActiveModel(params: {
|
|
selectedProvider: string;
|
|
selectedModel: string;
|
|
sessionEntry?: Pick<SessionEntry, "modelProvider" | "model">;
|
|
}): {
|
|
selected: ModelRef;
|
|
active: ModelRef;
|
|
activeDiffers: boolean;
|
|
} {
|
|
const selected = normalizeModelRef(params.selectedModel, params.selectedProvider);
|
|
const runtimeModel = params.sessionEntry?.model?.trim();
|
|
const runtimeProvider = params.sessionEntry?.modelProvider?.trim();
|
|
|
|
const active = runtimeModel
|
|
? normalizeModelRef(runtimeModel, runtimeProvider || selected.provider, !runtimeProvider)
|
|
: selected;
|
|
const activeDiffers = active.provider !== selected.provider || active.model !== selected.model;
|
|
|
|
return {
|
|
selected,
|
|
active,
|
|
activeDiffers,
|
|
};
|
|
}
|