89 lines · 2.6 KB · TypeScript
RawDownload
import type { ModelSelection, ServerConfig as T3ServerConfig } from "@t3tools/contracts"; export type ModelOption = {  readonly key: string;  readonly label: string;  readonly subtitle: string;  readonly providerKey: string;  readonly providerLabel: string;  readonly selection: ModelSelection;}; export type ProviderGroup = {  readonly providerKey: string;  readonly providerLabel: string;  readonly models: ReadonlyArray<ModelOption>;}; function providerDisplayLabel(provider: string): string {  if (provider === "codex") return "Codex";  if (provider === "claudeAgent") return "Claude";  return provider;} export function buildModelOptions(  config: T3ServerConfig | null | undefined,  fallbackModelSelection: ModelSelection | null,): ReadonlyArray<ModelOption> {  const options = new Map<string, ModelOption>();   for (const provider of config?.providers ?? []) {    if (!provider.enabled || !provider.installed || provider.auth.status === "unauthenticated") {      continue;    }     const providerLabel = providerDisplayLabel(provider.provider);    for (const model of provider.models) {      const key = `${provider.provider}:${model.slug}`;      options.set(key, {        key,        label: model.name,        subtitle: providerLabel,        providerKey: provider.provider,        providerLabel,        selection: {          provider: provider.provider,          model: model.slug,        },      });    }  }   if (fallbackModelSelection) {    const key = `${fallbackModelSelection.provider}:${fallbackModelSelection.model}`;    if (!options.has(key)) {      const providerLabel = providerDisplayLabel(fallbackModelSelection.provider);      options.set(key, {        key,        label: fallbackModelSelection.model,        subtitle: providerLabel,        providerKey: fallbackModelSelection.provider,        providerLabel,        selection: fallbackModelSelection,      });    }  }   return [...options.values()];} export function groupByProvider(options: ReadonlyArray<ModelOption>): ReadonlyArray<ProviderGroup> {  const groups = new Map<string, { providerLabel: string; models: ModelOption[] }>();  for (const option of options) {    const existing = groups.get(option.providerKey);    if (existing) {      existing.models.push(option);    } else {      groups.set(option.providerKey, {        providerLabel: option.providerLabel,        models: [option],      });    }  }   return [...groups.entries()].map(([providerKey, group]) => ({    providerKey,    providerLabel: group.providerLabel,    models: group.models,  }));}