98 lines · 2.9 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 providerDriver: string;  readonly providerLabel: string;  readonly selection: ModelSelection;}; export type ProviderGroup = {  readonly providerKey: string;  readonly providerDriver: 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 = provider.displayName ?? providerDisplayLabel(provider.driver);    for (const model of provider.models) {      const key = `${provider.instanceId}:${model.slug}`;      options.set(key, {        key,        label: model.name,        subtitle: providerLabel,        providerKey: provider.instanceId,        providerDriver: provider.driver,        providerLabel,        selection: {          instanceId: provider.instanceId,          model: model.slug,        },      });    }  }   if (fallbackModelSelection) {    const key = `${fallbackModelSelection.instanceId}:${fallbackModelSelection.model}`;    if (!options.has(key)) {      const providerLabel = providerDisplayLabel(fallbackModelSelection.instanceId);      options.set(key, {        key,        label: fallbackModelSelection.model,        subtitle: providerLabel,        providerKey: fallbackModelSelection.instanceId,        providerDriver: fallbackModelSelection.instanceId,        providerLabel,        selection: fallbackModelSelection,      });    }  }   return [...options.values()];} export function groupByProvider(options: ReadonlyArray<ModelOption>): ReadonlyArray<ProviderGroup> {  const groups = new Map<    string,    { providerDriver: 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, {        providerDriver: option.providerDriver,        providerLabel: option.providerLabel,        models: [option],      });    }  }   return [...groups.entries()].map(([providerKey, group]) => ({    providerKey,    providerDriver: group.providerDriver,    providerLabel: group.providerLabel,    models: group.models,  }));}