"use client" import { Bot, Check, ChevronDown, Server, Settings2 } from "lucide-react" import { useMemo, useState } from "react" import { ModelSelectorContent, ModelSelectorEmpty, ModelSelectorGroup, ModelSelectorInput, ModelSelectorItem, ModelSelectorList, ModelSelectorLogo, ModelSelectorName, ModelSelector as ModelSelectorRoot, ModelSelectorSeparator, ModelSelectorTrigger, } from "@/components/ai-elements/model-selector" import { ButtonWithTooltip } from "@/components/button-with-tooltip" import { useDictionary } from "@/hooks/use-dictionary" import type { FlattenedModel } from "@/lib/types/model-config" import { cn } from "@/lib/utils" interface ModelSelectorProps { models: FlattenedModel[] selectedModelId: string | undefined onSelect: (modelId: string | undefined) => void onConfigure: () => void disabled?: boolean } // Map our provider names to models.dev logo names const PROVIDER_LOGO_MAP: Record = { openai: "openai", anthropic: "anthropic", google: "google", azure: "azure", bedrock: "amazon-bedrock", openrouter: "openrouter", deepseek: "deepseek", siliconflow: "siliconflow", gateway: "vercel", } // Group models by providerLabel (handles duplicate providers) function groupModelsByProvider( models: FlattenedModel[], ): Map { const groups = new Map< string, { provider: string; models: FlattenedModel[] } >() for (const model of models) { const key = model.providerLabel const existing = groups.get(key) if (existing) { existing.models.push(model) } else { groups.set(key, { provider: model.provider, models: [model] }) } } return groups } export function ModelSelector({ models, selectedModelId, onSelect, onConfigure, disabled = false, }: ModelSelectorProps) { const dict = useDictionary() const [open, setOpen] = useState(false) // Only show validated models in the selector const validatedModels = useMemo( () => models.filter((m) => m.validated === true), [models], ) const groupedModels = useMemo( () => groupModelsByProvider(validatedModels), [validatedModels], ) // Find selected model for display const selectedModel = useMemo( () => models.find((m) => m.id === selectedModelId), [models, selectedModelId], ) const handleSelect = (value: string) => { if (value === "__configure__") { onConfigure() } else if (value === "__server_default__") { onSelect(undefined) } else { onSelect(value) } setOpen(false) } const tooltipContent = selectedModel ? `${selectedModel.modelId} ${dict.modelConfig.clickToChange}` : `${dict.modelConfig.usingServerDefault} ${dict.modelConfig.clickToChange}` return ( {selectedModel ? selectedModel.modelId : dict.modelConfig.default} {validatedModels.length === 0 && models.length > 0 ? dict.modelConfig.noVerifiedModels : dict.modelConfig.noModelsFound} {/* Server Default Option */} {dict.modelConfig.serverDefault} {/* Configured Models by Provider */} {Array.from(groupedModels.entries()).map( ([ providerLabel, { provider, models: providerModels }, ]) => ( {providerModels.map((model) => ( handleSelect(model.id)} className="cursor-pointer" > {model.modelId} ))} ), )} {/* Configure Option */} {dict.modelConfig.configureModels} {/* Info text */}
{dict.modelConfig.onlyVerifiedShown}
) }