// ======================================== // API Settings Page // ======================================== // Main page for managing LiteLLM API providers, endpoints, cache, model pools, and CLI settings import { useState, useMemo } from 'react'; import { useIntl } from 'react-intl'; import { Server, Link, Database, Layers, Settings as SettingsIcon, RefreshCw, } from 'lucide-react'; import { Card } from '@/components/ui/Card'; import { Button } from '@/components/ui/Button'; import { ProviderList, ProviderModal, EndpointList, EndpointModal, CacheSettings, ModelPoolList, ModelPoolModal, CliSettingsList, CliSettingsModal, MultiKeySettingsModal, ManageModelsModal, } from '@/components/api-settings'; import { useProviders, useEndpoints, useModelPools, useCliSettings } from '@/hooks/useApiSettings'; import { useNotifications } from '@/hooks/useNotifications'; import { cn } from '@/lib/utils'; // Tab type definitions type TabType = 'providers' | 'endpoints' | 'cache' | 'modelPools' | 'cliSettings'; // Tab configuration const TABS: { value: TabType; icon: React.ElementType }[] = [ { value: 'providers', icon: Server }, { value: 'endpoints', icon: Link }, { value: 'cache', icon: Database }, { value: 'modelPools', icon: Layers }, { value: 'cliSettings', icon: SettingsIcon }, ]; export function ApiSettingsPage() { const { formatMessage } = useIntl(); const { showNotification } = useNotifications(); const [activeTab, setActiveTab] = useState('providers'); // Get providers, endpoints, model pools, and CLI settings data const { providers } = useProviders(); const { endpoints } = useEndpoints(); const { pools } = useModelPools(); const { cliSettings } = useCliSettings(); // Modal states const [providerModalOpen, setProviderModalOpen] = useState(false); const [editingProviderId, setEditingProviderId] = useState(null); const [endpointModalOpen, setEndpointModalOpen] = useState(false); const [editingEndpointId, setEditingEndpointId] = useState(null); const [modelPoolModalOpen, setModelPoolModalOpen] = useState(false); const [editingPoolId, setEditingPoolId] = useState(null); const [cliSettingsModalOpen, setCliSettingsModalOpen] = useState(false); const [editingCliSettingsId, setEditingCliSettingsId] = useState(null); // Additional modal states for multi-key settings and model management const [multiKeyModalOpen, setMultiKeyModalOpen] = useState(false); const [multiKeyProviderId, setMultiKeyProviderId] = useState(null); const [manageModelsModalOpen, setManageModelsModalOpen] = useState(false); const [manageModelsProviderId, setManageModelsProviderId] = useState(null); // Find the provider being edited const editingProvider = useMemo( () => providers.find((p) => p.id === editingProviderId) || null, [providers, editingProviderId] ); // Find the endpoint being edited const editingEndpoint = useMemo( () => endpoints.find((e) => e.id === editingEndpointId) || null, [endpoints, editingEndpointId] ); // Find the pool being edited const editingPool = useMemo( () => pools.find((p) => p.id === editingPoolId) || null, [pools, editingPoolId] ); // Find the CLI settings being edited const editingCliSettings = useMemo( () => cliSettings.find((s) => s.id === editingCliSettingsId) || null, [cliSettings, editingCliSettingsId] ); // Provider modal handlers const handleAddProvider = () => { setEditingProviderId(null); setProviderModalOpen(true); }; const handleEditProvider = (providerId: string) => { setEditingProviderId(providerId); setProviderModalOpen(true); }; const handleCloseProviderModal = () => { setProviderModalOpen(false); setEditingProviderId(null); }; // Endpoint modal handlers const handleAddEndpoint = () => { setEditingEndpointId(null); setEndpointModalOpen(true); }; const handleEditEndpoint = (endpointId: string) => { setEditingEndpointId(endpointId); setEndpointModalOpen(true); }; const handleCloseEndpointModal = () => { setEndpointModalOpen(false); setEditingEndpointId(null); }; // Model pool modal handlers const handleAddPool = () => { setEditingPoolId(null); setModelPoolModalOpen(true); }; const handleEditPool = (poolId: string) => { setEditingPoolId(poolId); setModelPoolModalOpen(true); }; const handleClosePoolModal = () => { setModelPoolModalOpen(false); setEditingPoolId(null); }; // CLI Settings modal handlers const handleAddCliSettings = () => { setEditingCliSettingsId(null); setCliSettingsModalOpen(true); }; const handleEditCliSettings = (endpointId: string) => { setEditingCliSettingsId(endpointId); setCliSettingsModalOpen(true); }; const handleCloseCliSettingsModal = () => { setCliSettingsModalOpen(false); setEditingCliSettingsId(null); }; // Multi-key settings modal handlers const handleMultiKeySettings = (providerId: string) => { setMultiKeyProviderId(providerId); setMultiKeyModalOpen(true); }; const handleCloseMultiKeyModal = () => { setMultiKeyModalOpen(false); setMultiKeyProviderId(null); }; // Manage models modal handlers const handleManageModels = (providerId: string) => { setManageModelsProviderId(providerId); setManageModelsModalOpen(true); }; const handleCloseManageModelsModal = () => { setManageModelsModalOpen(false); setManageModelsProviderId(null); }; // Sync to CodexLens handler const handleSyncToCodexLens = async (providerId: string) => { try { // TODO: Implement actual sync API call // For now, just show a success message showNotification('success', formatMessage({ id: 'apiSettings.messages.configSynced' })); } catch (error) { showNotification('error', formatMessage({ id: 'apiSettings.providers.saveError' })); } }; // Render the active tab's main content const renderMainContent = () => { switch (activeTab) { case 'providers': return ( ); case 'endpoints': return ( ); case 'cache': return ; case 'modelPools': return ( ); case 'cliSettings': return ( ); default: return null; } }; return (
{/* Page Header */}

{formatMessage({ id: 'apiSettings.title' })}

{formatMessage({ id: 'apiSettings.description' })}

{/* Split Panel Layout */}
{/* Left Sidebar - Tabs */} {/* Right Main Panel - Content */}
{renderMainContent()}
{/* Modals */}
); } export default ApiSettingsPage;