53 lines
1.9 KiB
TypeScript
53 lines
1.9 KiB
TypeScript
import type { ModelOption } from './modelService';
|
|
|
|
const normalized = (value: string) => value.trim().toLocaleLowerCase();
|
|
|
|
const matchScore = (model: ModelOption, query: string) => {
|
|
const name = normalized(model.name);
|
|
const alias = normalized(model.alias ?? '');
|
|
if (!query) return 10;
|
|
if (name === query) return 0;
|
|
if (alias === query) return 1;
|
|
if (name.startsWith(query)) return 2;
|
|
if (alias.startsWith(query)) return 3;
|
|
if (name.includes(query)) return 4;
|
|
if (alias.includes(query)) return 5;
|
|
return Number.POSITIVE_INFINITY;
|
|
};
|
|
|
|
export function filterAgentModels(models: ModelOption[], search: string): ModelOption[] {
|
|
const query = normalized(search);
|
|
return models
|
|
.map((model, index) => ({ model, index, score: matchScore(model, query) }))
|
|
.filter((item) => Number.isFinite(item.score))
|
|
.sort((left, right) => (
|
|
left.score - right.score
|
|
|| left.model.name.localeCompare(right.model.name, undefined, { sensitivity: 'base' })
|
|
|| left.index - right.index
|
|
))
|
|
.map((item) => item.model);
|
|
}
|
|
|
|
export function hasExactAgentModel(models: ModelOption[], value: string): boolean {
|
|
const query = normalized(value);
|
|
if (!query) return false;
|
|
return models.some((model) => (
|
|
normalized(model.name) === query || normalized(model.alias ?? '') === query
|
|
));
|
|
}
|
|
|
|
export function agentModelAlias(models: ModelOption[], value: string): string {
|
|
const query = normalized(value);
|
|
return models.find((model) => normalized(model.name) === query)?.alias ?? '';
|
|
}
|
|
|
|
export function findAgentModel(models: ModelOption[], value: string): ModelOption | null {
|
|
const query = normalized(value);
|
|
if (!query) return null;
|
|
return models.find((model) => normalized(model.name) === query) ?? null;
|
|
}
|
|
|
|
export function resolveAgentModelSelection(models: ModelOption[], previous: string): string {
|
|
return findAgentModel(models, previous)?.name ?? models[0]?.name.trim() ?? '';
|
|
}
|