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 { useUserVisibleModels, getProviderDisplayName, type ModelOption } from 'state/useModels'; import { useTranslation } from '@/lib/i18n'; 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 { t } = useTranslation(); const { settings, saveSettings } = useSettings(); const piModels = useUserVisibleModels(); 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(t('settings.profile.models.aiDefaultsSaved')); } catch { toast.error(t('settings.profile.models.saveFailed')); } finally { setIsSaving(false); } }; const renderModelSelect = (value: string | null, onChange: (v: string | null) => void, placeholder: string) => ( ); return (
); };