import { AlertCircle, Check, Loader2, Plus, Star, Trash2, X, Zap, } from "lucide-react" import { useState } from "react" import { ProviderCredentialsFields } from "@/components/provider-credentials-fields" import { ProviderLogo } from "@/components/provider-logo" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, } from "@/components/ui/select" import { Switch } from "@/components/ui/switch" import { useDictionary } from "@/hooks/use-dictionary" import { formatMessage } from "@/lib/i18n/utils" import { FIXED_CRED_PROVIDERS, PROVIDER_INFO, type ProviderName, SUGGESTED_MODELS, } from "@/lib/types/model-config" import { cn } from "@/lib/utils" import { type AdminProvider, adminFetch, type EnvProvider, } from "./admin-shared" import { SecretInput } from "./setting-field" // ── Models section (mirrors the user ModelConfigDialog) ────────────── function ProviderDetail({ provider, disabled, password, onUpdate, onDelete, }: { provider: AdminProvider disabled: boolean password: string onUpdate: (patch: Partial) => void onDelete: () => void }) { const dict = useDictionary() const [modelInput, setModelInput] = useState("") const [deleteOpen, setDeleteOpen] = useState(false) const [testing, setTesting] = useState(null) const [testResults, setTestResults] = useState< Record >({}) const info = PROVIDER_INFO[provider.provider] const suggestions = (SUGGESTED_MODELS[provider.provider] || []).filter( (m) => !provider.models.includes(m), ) const addModel = (modelId: string) => { const trimmed = modelId.trim() if (!trimmed || provider.models.includes(trimmed)) return onUpdate({ models: [...provider.models, trimmed] }) setModelInput("") } const testModel = async (modelId: string) => { setTesting(modelId) try { const data = await adminFetch("/api/admin/test-model", password, { method: "POST", body: JSON.stringify({ provider, modelId }), }) setTestResults((prev) => ({ ...prev, [modelId]: data.valid ? { ok: true, message: formatMessage(dict.admin.testOk, { ms: data.responseTime, }), } : { ok: false, message: data.error || dict.admin.testFailed, }, })) } catch (err) { setTestResults((prev) => ({ ...prev, [modelId]: { ok: false, message: err instanceof Error ? err.message : dict.admin.testFailed, }, })) } finally { setTesting(null) } } return (

{info.label}

{provider.models.length === 0 ? dict.admin.noModelsConfigured : formatMessage( provider.models.length === 1 ? dict.admin.modelCount : dict.admin.modelCountPlural, { count: provider.models.length }, )}

{/* Credentials (shared with the user ModelConfigDialog) */} onUpdate({ [field]: value })} renderSecret={({ field, id }) => ( // Bare id keeps the shared component's
) } export function ModelsSection({ providers, envProviders, disabled, password, onChange, }: { providers: AdminProvider[] envProviders: EnvProvider[] disabled: boolean password: string onChange: (providers: AdminProvider[]) => void }) { const dict = useDictionary() const [selectedId, setSelectedId] = useState( providers[0]?.id ?? null, ) const selected = providers.find((p) => p.id === selectedId) const selectedEnv = envProviders.find((p) => `env:${p.name}` === selectedId) const addProvider = (provider: ProviderName) => { const newProvider: AdminProvider = { id: crypto.randomUUID(), provider, models: [], isDefault: providers.length === 0, } onChange([...providers, newProvider]) setSelectedId(newProvider.id) } const updateProvider = (id: string, patch: Partial) => { onChange( providers.map((p) => { if (p.id !== id) { // Only one default at a time return patch.isDefault ? { ...p, isDefault: false } : p } return { ...p, ...patch } }), ) } const deleteProvider = (id: string) => { const next = providers.filter((p) => p.id !== id) onChange(next) setSelectedId(next[0]?.id ?? null) } return (
{/* Provider list */}
{providers.length === 0 && envProviders.length === 0 && (

{dict.admin.addProviderHint}

)} {envProviders.map((p) => ( ))} {providers.map((p) => ( ))}
{/* Detail */}
{selected ? ( updateProvider(selected.id, patch)} onDelete={() => deleteProvider(selected.id)} /> ) : selectedEnv ? (

{selectedEnv.name}

{dict.admin.envReadOnly}

    {selectedEnv.models.map((modelId, index) => (
  • {modelId} {selectedEnv.isDefault && index === 0 && ( { dict.admin .defaultModel } )}
  • ))}
) : (

{dict.admin.selectProviderHint}

)}
) }