'use client' import { useState } from 'react' import { useForm } from 'react-hook-form' import { CreateModelRequest, ProviderAvailability } from '@/lib/types/models' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' import { useCreateModel } from '@/lib/hooks/use-models' import { Plus } from 'lucide-react' interface AddModelFormProps { modelType: 'language' | 'embedding' | 'text_to_speech' | 'speech_to_text' providers: ProviderAvailability } export function AddModelForm({ modelType, providers }: AddModelFormProps) { const [open, setOpen] = useState(false) const createModel = useCreateModel() const { register, handleSubmit, formState: { errors }, reset, setValue, watch } = useForm({ defaultValues: { type: modelType } }) // Get available providers that support this model type const availableProviders = providers.available.filter(provider => providers.supported_types[provider]?.includes(modelType) ) const onSubmit = async (data: CreateModelRequest) => { await createModel.mutateAsync(data) reset() setOpen(false) } const getModelTypeName = () => { return modelType.replace(/_/g, ' ') } const getModelPlaceholder = () => { switch (modelType) { case 'language': return 'e.g., gpt-5-mini, claude, gemini' case 'embedding': return 'e.g., text-embedding-3-small' case 'text_to_speech': return 'e.g., tts-gpt-4o-mini-tts, tts-1-hd' case 'speech_to_text': return 'e.g., whisper-1' default: return 'Enter model name' } } if (availableProviders.length === 0) { return (
No providers available for {getModelTypeName()} models
) } const handleOpenChange = (isOpen: boolean) => { setOpen(isOpen) if (!isOpen) { reset() } } return ( Add {getModelTypeName()} Model Configure a new {getModelTypeName()} model from available providers.
{errors.provider && (

Provider is required

)}
{errors.name && (

{errors.name.message}

)}

{modelType === 'language' && watch('provider') === 'azure' && 'For Azure, use the deployment name as the model name'}

) }