import React, { useState } from "react"; import { Card, Form, Button, Tooltip, Typography, Select as AntdSelect, Modal } from "antd"; import type { FormInstance } from "antd"; import type { UploadProps } from "antd/es/upload"; import LiteLLMModelNameField from "./litellm_model_name"; import ConditionalPublicModelName from "./conditional_public_model_name"; import ProviderSpecificFields from "./provider_specific_fields"; import AdvancedSettings from "./advanced_settings"; import { Providers, providerLogoMap, getPlaceholder } from "../provider_info_helpers"; import type { Team } from "../key_team_helpers/key_list"; import { CredentialItem } from "../networking"; import ConnectionErrorDisplay from "./model_connection_test"; import { TEST_MODES } from "./add_model_modes"; import { Row, Col } from "antd"; import { Text, TextInput } from "@tremor/react"; import TeamDropdown from "../common_components/team_dropdown"; import { all_admin_roles } from "@/utils/roles"; interface AddModelTabProps { form: FormInstance; handleOk: () => void; selectedProvider: Providers; setSelectedProvider: (provider: Providers) => void; providerModels: string[]; setProviderModelsFn: (provider: Providers) => void; getPlaceholder: (provider: Providers) => string; uploadProps: UploadProps; showAdvancedSettings: boolean; setShowAdvancedSettings: (show: boolean) => void; teams: Team[] | null; credentials: CredentialItem[]; accessToken: string; userRole: string; } const { Title, Link } = Typography; const AddModelTab: React.FC = ({ form, handleOk, selectedProvider, setSelectedProvider, providerModels, setProviderModelsFn, getPlaceholder, uploadProps, showAdvancedSettings, setShowAdvancedSettings, teams, credentials, accessToken, userRole, }) => { // State for test mode and connection testing const [testMode, setTestMode] = useState("chat"); const [isResultModalVisible, setIsResultModalVisible] = useState(false); const [isTestingConnection, setIsTestingConnection] = useState(false); // Using a unique ID to force the ConnectionErrorDisplay to remount and run a fresh test const [connectionTestId, setConnectionTestId] = useState(""); // Test connection when button is clicked const handleTestConnection = async () => { setIsTestingConnection(true); // Generate a new test ID (using timestamp for uniqueness) // This forces React to create a new instance of ConnectionErrorDisplay setConnectionTestId(`test-${Date.now()}`); // Show the modal with the fresh test setIsResultModalVisible(true); }; const isAdmin = all_admin_roles.includes(userRole); return ( <> Add new model
<> {/* Provider Selection */} { setSelectedProvider(value); setProviderModelsFn(value); form.setFieldsValue({ model: [], model_name: undefined }); }} > {Object.entries(Providers).map(([providerEnum, providerDisplayName]) => (
{`${providerEnum} { // Create a div with provider initial as fallback const target = e.target as HTMLImageElement; const parent = target.parentElement; if (parent) { const fallbackDiv = document.createElement('div'); fallbackDiv.className = 'w-5 h-5 rounded-full bg-gray-200 flex items-center justify-center text-xs'; fallbackDiv.textContent = providerDisplayName.charAt(0); parent.replaceChild(fallbackDiv, target); } }} /> {providerDisplayName}
))}
{/* Conditionally Render "Public Model Name" */} {/* Select Mode */} setTestMode(value)} options={TEST_MODES} /> Optional - LiteLLM endpoint to use when health checking this model Learn more {/* Credentials */}
Either select existing credentials OR enter new provider credentials below
(option?.label ?? '').toLowerCase().includes(input.toLowerCase()) } options={[ { value: null, label: 'None' }, ...credentials.map((credential) => ({ value: credential.credential_name, label: credential.credential_name })) ]} allowClear />
OR
prevValues.litellm_credential_name !== currentValues.litellm_credential_name || prevValues.provider !== currentValues.provider } > {({ getFieldValue }) => { const credentialName = getFieldValue('litellm_credential_name'); console.log("🔑 Credential Name Changed:", credentialName); // Only show provider specific fields if no credentials selected if (!credentialName) { return ( ); } return (
Using existing credentials - no additional provider fields needed
); }}
Team Settings
Need Help?
{/* Test Connection Results Modal */} { setIsResultModalVisible(false); setIsTestingConnection(false); }} footer={[ ]} width={700} > {/* Only render the ConnectionErrorDisplay when modal is visible and we have a test ID */} {isResultModalVisible && ( { setIsResultModalVisible(false); setIsTestingConnection(false); }} onTestComplete={() => setIsTestingConnection(false)} /> )} ); }; export default AddModelTab;