import { useState, useEffect } from "react"; import { X, ExternalLink, Info, Eye, EyeOff } from "lucide-react"; import { api } from "../api"; const MODEL_TYPES = [ { value: "chat", label: "Chat / Instruct" }, { value: "completion", label: "Text Completion" }, { value: "embedding", label: "Embedding" }, { value: "image", label: "Image Generation" }, { value: "audio", label: "Audio / Speech" }, ]; export default function ModelForm({ initial, onSave, onClose }) { const isEdit = !!initial; const [form, setForm] = useState({ displayName: initial?.displayName || "", provider: initial?.provider || "", litellmModel:initial?.litellmModel|| "", apiBase: initial?.apiBase || "", apiKey: "", description: initial?.description || "", modelType: initial?.modelType || "chat", tags: initial?.tags?.join(", ") || "", }); const [providers, setProviders] = useState([]); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const [showKey, setShowKey] = useState(false); const [selectedProvider, setSelectedProvider] = useState(null); useEffect(() => { api.getProviders().then(r => setProviders(r.data)).catch(() => {}); }, []); const set = (k) => (e) => setForm(f => ({ ...f, [k]: e.target.value })); const handleProviderSelect = (e) => { const prov = providers.find(p => p.id === e.target.value); setSelectedProvider(prov || null); if (prov) { setForm(f => ({ ...f, provider: prov.id, apiBase: prov.defaultApiBase || "", litellmModel: prov.exampleModels?.[0] || "", modelType: prov.modelTypes?.[0] || "chat", })); } }; const handleSubmit = async () => { if (!form.displayName.trim() || !form.provider.trim() || !form.litellmModel.trim()) { setError("Display name, provider, and LiteLLM model are required."); return; } setSaving(true); setError(null); try { await onSave({ ...form, tags: form.tags.split(",").map(t => t.trim()).filter(Boolean), apiKey: form.apiKey || undefined, }); } catch (e) { setError(e.message); } finally { setSaving(false); } }; return (
{isEdit ? "Update model configuration." : "Add any AI model to the gateway."}
Used to build the OpenAI model alias: provider/model
Leave blank to use LiteLLM's default for this provider.