/** * LiteModelSelector - Non-reactive model selector for MultiX v2 * * Uses polling instead of reactive subscriptions to prevent cascading updates. */ import { createSignal, For, onMount, onCleanup, Show } from "solid-js"; import { providers } from "@/stores/session-state"; import { ChevronDown, Cpu } from "lucide-solid"; interface Model { id: string; name: string; providerId: string; } interface Provider { id: string; name: string; models: Model[]; } interface LiteModelSelectorProps { instanceId: string; sessionId: string; currentModel: { providerId: string; modelId: string }; onModelChange: (model: { providerId: string; modelId: string }) => void; } export function LiteModelSelector(props: LiteModelSelectorProps) { const [isOpen, setIsOpen] = createSignal(false); const [providerList, setProviderList] = createSignal([]); // Load providers once on mount, then poll function loadProviders() { try { const instanceProviders = providers().get(props.instanceId) || []; setProviderList(instanceProviders.map((p: any) => ({ id: p.id, name: p.name, models: (p.models || []).map((m: any) => ({ id: m.id, name: m.name, providerId: p.id, })), }))); } catch (e) { console.warn("Failed to load providers", e); } } onMount(() => { loadProviders(); // Poll every 10 seconds (providers don't change often) const interval = setInterval(loadProviders, 10000); onCleanup(() => clearInterval(interval)); }); const handleSelect = (providerId: string, modelId: string) => { props.onModelChange({ providerId, modelId }); setIsOpen(false); }; const getCurrentModelName = () => { if (!props.currentModel.modelId) return "Select Model"; for (const provider of providerList()) { for (const model of provider.models) { if (model.id === props.currentModel.modelId) { return model.name; } } } return props.currentModel.modelId; }; return (
{(provider) => (
{provider.name}
{(model) => ( )}
)}
No models available
); }