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

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;
}