You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.3 KiB
74 lines
2.3 KiB
import type { SelectedModel } from "@/types";
|
|
import type { ProviderModel } from "@/lib/providers/types";
|
|
|
|
export function toSelectedModel(model: ProviderModel): SelectedModel {
|
|
return {
|
|
provider: model.provider,
|
|
modelId: model.id,
|
|
displayName: model.name,
|
|
capabilities: model.capabilities,
|
|
metadata: model.metadata,
|
|
};
|
|
}
|
|
|
|
function hasValue(value: unknown): boolean {
|
|
return value !== undefined && value !== null && value !== "";
|
|
}
|
|
|
|
function selectedModelIdentifiers(model: SelectedModel | undefined): Set<string> {
|
|
const identifiers = new Set<string>();
|
|
if (!model) return identifiers;
|
|
|
|
for (const value of [
|
|
model.modelId,
|
|
model.displayName,
|
|
model.metadata?.aiModelId,
|
|
model.metadata?.aiModelCode,
|
|
model.metadata?.aiModelCodeAlias,
|
|
]) {
|
|
if (hasValue(value)) {
|
|
identifiers.add(String(value));
|
|
}
|
|
}
|
|
return identifiers;
|
|
}
|
|
|
|
function providerModelMatchesSelectedModel(model: ProviderModel, selected: SelectedModel | undefined): boolean {
|
|
if (!selected || model.provider !== selected.provider) return false;
|
|
|
|
const identifiers = selectedModelIdentifiers(selected);
|
|
if (identifiers.size === 0) return false;
|
|
|
|
return [
|
|
model.id,
|
|
model.name,
|
|
model.metadata?.aiModelId,
|
|
model.metadata?.aiModelCode,
|
|
model.metadata?.aiModelCodeAlias,
|
|
].some((value) => hasValue(value) && identifiers.has(String(value)));
|
|
}
|
|
|
|
export function shouldUpdateSelectedModelFromProviderModel(
|
|
current: SelectedModel | undefined,
|
|
model: ProviderModel
|
|
): boolean {
|
|
if (!current) return true;
|
|
if (current.provider !== model.provider || current.modelId !== model.id) return true;
|
|
if (model.provider !== "popiserver") return false;
|
|
|
|
const currentMetadata = current.metadata ?? {};
|
|
const nextMetadata = model.metadata ?? {};
|
|
return ["billingMethod", "aiModelId", "type", "subType", "aiModelCode", "aiModelCodeAlias"].some(
|
|
(key) => !hasValue(currentMetadata[key]) && hasValue(nextMetadata[key])
|
|
);
|
|
}
|
|
|
|
export function chooseModelFromList(
|
|
models: ProviderModel[],
|
|
preferred?: SelectedModel
|
|
): SelectedModel | null {
|
|
const model = models.find((item) => providerModelMatchesSelectedModel(item, preferred))
|
|
?? models.find((item) => item.metadata?.isDefault === 1)
|
|
?? models[0];
|
|
return model ? toSelectedModel(model) : null;
|
|
}
|
|
|