import { useState, useEffect, useMemo } from 'react'; import { toast } from 'sonner'; import { Label } from '@/components/ui/label'; import { Button } from '@/components/ui/button'; import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { useSettings } from 'state/useSettings'; import { useEnabledPiModels, getProviderDisplayName, type ModelOption } from 'state/useModels'; function buildGroups(models: ModelOption[]) { const groups: Record = {}; for (const m of models) { const provider = m.provider ?? 'Other'; if (!groups[provider]) groups[provider] = []; groups[provider]!.push({ id: m.id, name: m.name }); } return Object.entries(groups) .sort(([a], [b]) => a.localeCompare(b)) .map(([provider, models]) => ({ provider, models: models.sort((a, b) => a.name.localeCompare(b.name)) })); } const NONE = '__none__'; export const AIModels = () => { const { settings, saveSettings } = useSettings(); const piModels = useEnabledPiModels(); const [isSaving, setIsSaving] = useState(false); const [chatModel, setChatModel] = useState(settings.chat.defaultModel); const [projectModel, setProjectModel] = useState(settings.chat.defaultProjectModel); const [taskModel, setTaskModel] = useState(settings.tasks.defaultModel); useEffect(() => { setChatModel(settings.chat.defaultModel); setProjectModel(settings.chat.defaultProjectModel); setTaskModel(settings.tasks.defaultModel); }, [settings]); const groups = useMemo(() => buildGroups(piModels), [piModels]); const handleSave = async () => { if (isSaving) return; setIsSaving(true); try { await saveSettings({ ...settings, chat: { ...settings.chat, defaultModel: chatModel, defaultProjectModel: projectModel }, tasks: { ...settings.tasks, defaultModel: taskModel }, }); toast.success('AI model defaults saved'); } catch { toast.error('Failed to save settings'); } finally { setIsSaving(false); } }; const renderModelSelect = (value: string | null, onChange: (v: string | null) => void, placeholder: string) => ( ); return (
); };