import { UIConfigField, ConfigModelProvider } from '@/lib/config/types'; import { cn } from '@/lib/utils'; import { AnimatePresence, motion } from 'framer-motion'; import { AlertCircle, Plug2, Plus, Pencil, Trash2, X } from 'lucide-react'; import { useState } from 'react'; import { toast } from 'sonner'; import AddModel from './AddModelDialog'; import UpdateProvider from './UpdateProviderDialog'; import DeleteProvider from './DeleteProviderDialog'; const ModelProvider = ({ modelProvider, setProviders, fields, }: { modelProvider: ConfigModelProvider; fields: UIConfigField[]; setProviders: React.Dispatch>; }) => { const [open, setOpen] = useState(true); const handleModelDelete = async ( type: 'chat' | 'embedding', modelKey: string, ) => { try { const res = await fetch(`/api/providers/${modelProvider.id}/models`, { method: 'DELETE', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ key: modelKey, type: type }), }); if (!res.ok) { throw new Error('Failed to delete model: ' + (await res.text())); } setProviders( (prev) => prev.map((provider) => { if (provider.id === modelProvider.id) { return { ...provider, ...(type === 'chat' ? { chatModels: provider.chatModels.filter( (m) => m.key !== modelKey, ), } : { embeddingModels: provider.embeddingModels.filter( (m) => m.key !== modelKey, ), }), }; } return provider; }) as ConfigModelProvider[], ); toast.success('Model deleted successfully.'); } catch (err) { console.error('Failed to delete model', err); toast.error('Failed to delete model.'); } }; const modelCount = modelProvider.chatModels.filter((m) => m.key !== 'error').length + modelProvider.embeddingModels.filter((m) => m.key !== 'error').length; const hasError = modelProvider.chatModels.some((m) => m.key === 'error') || modelProvider.embeddingModels.some((m) => m.key === 'error'); return (

{modelProvider.name}

{modelCount > 0 && (

{modelCount} model{modelCount !== 1 ? 's' : ''} configured

)}

Chat Models

{!modelProvider.chatModels.some((m) => m.key === 'error') && ( )}
{modelProvider.chatModels.some((m) => m.key === 'error') ? (
{ modelProvider.chatModels.find((m) => m.key === 'error') ?.name }
) : modelProvider.chatModels.filter((m) => m.key !== 'error') .length === 0 && !hasError ? (

No chat models configured

) : modelProvider.chatModels.filter((m) => m.key !== 'error') .length > 0 ? (
{modelProvider.chatModels.map((model, index) => (
{model.name}
))}
) : null}

Embedding Models

{!modelProvider.embeddingModels.some((m) => m.key === 'error') && ( )}
{modelProvider.embeddingModels.some((m) => m.key === 'error') ? (
{ modelProvider.embeddingModels.find((m) => m.key === 'error') ?.name }
) : modelProvider.embeddingModels.filter((m) => m.key !== 'error') .length === 0 && !hasError ? (

No embedding models configured

) : modelProvider.embeddingModels.filter((m) => m.key !== 'error') .length > 0 ? (
{modelProvider.embeddingModels.map((model, index) => (
{model.name}
))}
) : null}
); }; export default ModelProvider;