"use client"; import * as React from "react"; import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem, SelectGroup, SelectLabel } from "@/components/ui/select"; import { ProviderIcon } from "@/components/brand/provider-icon"; import { useApp } from "@/components/app/store"; import { PROVIDERS, PROVIDER_ORDER } from "@/lib/client/providers"; import type { PolyModel, ProviderId } from "@/lib/client/types"; const NONE = "__none__"; export interface ModelSelectProps { value: string | null; onChange: (key: string | null) => void; /** Only list models whose provider has a valid key (default true). */ connectedOnly?: boolean; includeDeprecated?: boolean; allowNone?: boolean; noneLabel?: string; placeholder?: string; disabled?: boolean; id?: string; className?: string; } /** Model picker grouped by provider, with provider glyphs. Shows a disabled hint when nothing is connected. */ export function ModelSelect({ value, onChange, connectedOnly = true, includeDeprecated = false, allowNone, noneLabel = "None", placeholder = "Choose a model", disabled, id, className }: ModelSelectProps) { const { models, modelsByKey, connectedProviders } = useApp(); const groups = React.useMemo(() => { const out: { provider: ProviderId; models: PolyModel[] }[] = []; for (const p of PROVIDER_ORDER) { if (connectedOnly && !connectedProviders.has(p)) continue; const list = models.filter((m) => m.provider === p && (includeDeprecated || m.status !== "deprecated")); if (list.length) out.push({ provider: p, models: list }); } return out; }, [models, connectedProviders, connectedOnly, includeDeprecated]); const selected = value ? modelsByKey.get(value) : undefined; const empty = groups.length === 0; // Keep a stale/unknown selection visible so the user understands what is stored. const unknownSelected = value && !selected; return ( ); }