import { Card, CardHeader, CardTitle, CardDescription, } from "@/components/ui/card"; import { useNavigate } from "@tanstack/react-router"; import { providerSettingsRoute } from "@/routes/settings/providers/$provider"; import type { LanguageModelProvider } from "@/ipc/ipc_types"; import { useLanguageModelProviders } from "@/hooks/useLanguageModelProviders"; import { useCustomLanguageModelProvider } from "@/hooks/useCustomLanguageModelProvider"; import { GiftIcon, PlusIcon, MoreVertical, Trash2, Edit } from "lucide-react"; import { Skeleton } from "./ui/skeleton"; import { Alert, AlertDescription, AlertTitle } from "./ui/alert"; import { AlertTriangle } from "lucide-react"; import { useState } from "react"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Button } from "@/components/ui/button"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { CreateCustomProviderDialog } from "./CreateCustomProviderDialog"; export function ProviderSettingsGrid() { const navigate = useNavigate(); const [isDialogOpen, setIsDialogOpen] = useState(false); const [editingProvider, setEditingProvider] = useState(null); const [providerToDelete, setProviderToDelete] = useState(null); const { data: providers, isLoading, error, isProviderSetup, refetch, } = useLanguageModelProviders(); const { deleteProvider, isDeleting } = useCustomLanguageModelProvider(); const handleProviderClick = (providerId: string) => { navigate({ to: providerSettingsRoute.id, params: { provider: providerId }, }); }; const handleDeleteProvider = async () => { if (providerToDelete) { await deleteProvider(providerToDelete); setProviderToDelete(null); refetch(); } }; const handleEditProvider = (provider: LanguageModelProvider) => { setEditingProvider(provider); setIsDialogOpen(true); }; if (isLoading) { return (

AI Providers

{[1, 2, 3, 4, 5].map((i) => ( ))}
); } if (error) { return (

AI Providers

Error Failed to load AI providers: {error.message}
); } return (

AI Providers

{providers ?.filter((p) => p.type !== "local") .map((provider: LanguageModelProvider) => { const isCustom = provider.type === "custom"; return ( handleProviderClick(provider.id)} > {provider.name} {isProviderSetup(provider.id) ? ( Ready ) : ( Needs Setup )} {provider.hasFreeTier && ( Free tier available )} {isCustom && (
e.stopPropagation()} >
)}
); })} {/* Add custom provider button */} setIsDialogOpen(true)} > Add custom provider Connect to a custom LLM API endpoint
{ setIsDialogOpen(false); setEditingProvider(null); }} onSuccess={() => { setIsDialogOpen(false); refetch(); setEditingProvider(null); }} editingProvider={editingProvider} /> !open && setProviderToDelete(null)} > Delete Custom Provider This will permanently delete this custom provider and all its associated models. This action cannot be undone. Cancel {isDeleting ? "Deleting..." : "Delete Provider"}
); }