diff --git a/ui/litellm-dashboard/src/components/add_model/add_model_tab.tsx b/ui/litellm-dashboard/src/components/add_model/add_model_tab.tsx index 59f5ed5cbe4..362870b5621 100644 --- a/ui/litellm-dashboard/src/components/add_model/add_model_tab.tsx +++ b/ui/litellm-dashboard/src/components/add_model/add_model_tab.tsx @@ -1,5 +1,5 @@ -import React from "react"; -import { Card, Form, Button, Tooltip, Typography, Select as AntdSelect } from "antd"; +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"; @@ -29,6 +29,17 @@ interface AddModelTabProps { const { Title, Link } = Typography; +// Define the available test modes +const TEST_MODES = [ + { value: "chat", label: "Chat" }, + { value: "completion", label: "Completion" }, + { value: "embedding", label: "Embedding" }, + { value: "audio_speech", label: "Audio Speech" }, + { value: "audio_transcription", label: "Audio Transcription" }, + { value: "image_generation", label: "Image Generation" }, + { value: "rerank", label: "Rerank" } +]; + const AddModelTab: React.FC = ({ form, handleOk, @@ -44,166 +55,204 @@ const AddModelTab: React.FC = ({ credentials, accessToken, }) => { + // Add state for test mode + const [testMode, setTestMode] = useState("chat"); + const [isTestModalVisible, setIsTestModalVisible] = useState(false); + // Add a function to handle test connection const handleTestConnection = async () => { const formValues = form.getFieldsValue(); - await testModelConnection(formValues, accessToken); + await testModelConnection(formValues, accessToken, testMode); + setIsTestModalVisible(false); + }; + + // Show test modal with mode selection + const showTestModal = () => { + setIsTestModalVisible(true); }; return ( <> Add new model -
+ <> + {/* Provider Selection */} + + { + setSelectedProvider(value); + setProviderModelsFn(value); + form.setFieldsValue({ + model: [], + model_name: undefined + }); + }} > - <> - {/* 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" */} - - - {/* 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 -
- ); - }} -
- - - -
- - - Need Help? - - -
- - +
+ {`${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" */} + + + {/* 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
- - - - + ); + }} +
+ + + +
+ + + Need Help? + + +
+ + +
+
+ + + + {/* Test Connection Modal */} + setIsTestModalVisible(false)} + footer={[ + , + + ]} + > +
+ Select the mode to test this model with: +
+ setTestMode(value)} + options={TEST_MODES} + /> +
+ + Different models support different modes. Choose the appropriate mode for your model. + +
+
); };