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; }; 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 { const options = new Map(); 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): ReadonlyArray { 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, })); }