Files
EasyCLIProxyAPI/src/services/agentModelPicker.ts
T
lzt404 efc8811d0c feat: refine WebUI access and Claude Desktop model mappings
- add a shortcut to open the management WebUI
- hide redundant runtime credential identifiers
- simplify health check descriptions
- use existing Claude model aliases directly
- preserve context capabilities from original models
2026-08-02 16:14:25 +08:00

80 lines
2.8 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 filterAgentModelsByAlias(
models: ModelOption[],
aliasesOnly: boolean,
): ModelOption[] {
return models.filter((model) => Boolean(model.isAlias) === aliasesOnly);
}
export function resolveAgentModelForAliasMode(
models: ModelOption[],
current: string,
aliasesOnly: boolean,
): string {
const candidates = filterAgentModelsByAlias(models, aliasesOnly);
const selected = findAgentModel(models, current);
if (selected && Boolean(selected.isAlias) === aliasesOnly) return selected.name;
if (selected && aliasesOnly) {
const alias = candidates.find((candidate) => normalized(candidate.alias ?? '') === normalized(selected.name));
if (alias) return alias.name;
}
if (selected?.isAlias && !aliasesOnly) {
const original = candidates.find((candidate) => normalized(candidate.name) === normalized(selected.alias ?? ''));
if (original) return original.name;
}
return candidates[0]?.name ?? '';
}
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() ?? '';
}