import { useState } from "react"; import { RiSearchLine, RiArrowDownSLine, RiArrowRightSLine } from "react-icons/ri"; export interface OrModel { id: string; name: string; provider: string; } const PROVIDER_DISPLAY: Record = { google: "Google", anthropic: "Anthropic", openai: "OpenAI", mistral: "Mistral", qwen: "Qwen (Alibaba)", alibaba: "Alibaba", }; const PROVIDER_ORDER = ["google", "anthropic", "openai", "mistral", "qwen", "alibaba"]; interface ModelPickerProps { models: OrModel[]; value: string; onChange: (id: string) => void; placeholder?: string; } export function ModelPicker({ models, value, onChange, placeholder = "Select a model…" }: ModelPickerProps) { const [open, setOpen] = useState(false); const [search, setSearch] = useState(""); const [collapsedProviders, setCollapsedProviders] = useState>(new Set()); const isSearching = search.trim().length > 0; const filtered = models.filter(m => !isSearching || m.name.toLowerCase().includes(search.toLowerCase()) || m.id.toLowerCase().includes(search.toLowerCase()) ); const byProvider: Record = {}; for (const m of filtered) { (byProvider[m.provider] ??= []).push(m); } const providerOrder = [ ...PROVIDER_ORDER.filter(p => byProvider[p]), ...Object.keys(byProvider).filter(p => !PROVIDER_ORDER.includes(p)).sort(), ]; const selectedModel = models.find(m => m.id === value); function toggleProvider(p: string) { setCollapsedProviders(prev => { const n = new Set(prev); n.has(p) ? n.delete(p) : n.add(p); return n; }); } return (
{open && ( <>
{ setOpen(false); setSearch(""); }} />
setSearch(e.target.value)} className="w-full bg-base-200 rounded-lg px-3 py-1.5 text-sm focus:outline-none placeholder:text-base-content/30" />
{models.length === 0 ? (

No OpenRouter key configured

) : filtered.length === 0 ? (

No models match

) : providerOrder.map(provider => { const providerModels = byProvider[provider]; const isCollapsed = !isSearching && collapsedProviders.has(provider); const displayName = PROVIDER_DISPLAY[provider] ?? provider.charAt(0).toUpperCase() + provider.slice(1); return (
{!isCollapsed && providerModels.map(m => ( ))}
); })}
)}
); }