evOo-local/packages/core/src/model-providers.ts
cynarAI 6c7eed7580 Initial clean evOo-local from f00577b
Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline
(Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/*
packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
2026-09-20 17:15:16 +02:00

45 lines
1.7 KiB
TypeScript

import type { ModelCatalogEntry } from "@rakazo/contracts";
export const POPULAR_MODEL_PROVIDER_IDS = [
"openrouter",
"openai-codex",
"anthropic",
"openai",
"google",
"vercel-ai-gateway",
] as const;
const DEFAULT_PROVIDER_COUNT = POPULAR_MODEL_PROVIDER_IDS.length;
const POPULAR_MODEL_PROVIDER_ID_SET = new Set<string>(POPULAR_MODEL_PROVIDER_IDS);
/** Keep provider selection short while ensuring a deployment's current default is never hidden. */
export function featuredModelProviders(
providers: readonly ModelCatalogEntry[],
selectedProvider: string,
): ModelCatalogEntry[] {
const byId = new Map(providers.map((entry) => [entry.provider, entry]));
const ordered = [
...POPULAR_MODEL_PROVIDER_IDS.map((id) => byId.get(id)).filter(
(entry): entry is ModelCatalogEntry => entry !== undefined,
),
...providers.filter((entry) => !POPULAR_MODEL_PROVIDER_ID_SET.has(entry.provider)),
];
const featured = ordered.slice(0, DEFAULT_PROVIDER_COUNT);
const selected = byId.get(selectedProvider);
if (!selected || featured.some((entry) => entry.provider === selectedProvider)) return featured;
return [...featured.slice(0, DEFAULT_PROVIDER_COUNT - 1), selected];
}
/** Return the active choice separately when it is not one of the search results. */
export function selectedProviderOutsideSearchResults(
filteredProviders: readonly ModelCatalogEntry[],
allProviders: readonly ModelCatalogEntry[],
selectedProvider: string,
): ModelCatalogEntry | undefined {
if (filteredProviders.some((entry) => entry.provider === selectedProvider)) {
return undefined;
}
return allProviders.find((entry) => entry.provider === selectedProvider);
}