diff --git a/ui/litellm-dashboard/src/components/add_model/handle_add_model_submit.tsx b/ui/litellm-dashboard/src/components/add_model/handle_add_model_submit.tsx index 95003ed9c12..56f1fe742e0 100644 --- a/ui/litellm-dashboard/src/components/add_model/handle_add_model_submit.tsx +++ b/ui/litellm-dashboard/src/components/add_model/handle_add_model_submit.tsx @@ -1,5 +1,5 @@ import { message } from "antd"; -import { provider_map } from "../provider_info_helpers"; +import { provider_map, Providers } from "../provider_info_helpers"; import { modelCreateCall, Model } from "../networking"; @@ -12,7 +12,9 @@ export const handleAddModelSubmit = async ( console.log("handling submit for formValues:", formValues); // If model_name is not provided, use provider.toLowerCase() + "/*" if (formValues["model"] && formValues["model"].includes("all-wildcard")) { - const wildcardModel = formValues["custom_llm_provider"].toLowerCase() + "/*"; + const customProvider: Providers = formValues["custom_llm_provider"]; + const litellm_custom_provider = provider_map[customProvider as keyof typeof Providers]; + const wildcardModel = litellm_custom_provider + "/*"; formValues["model_name"] = wildcardModel; formValues["model"] = wildcardModel; } diff --git a/ui/litellm-dashboard/src/components/add_model/provider_specific_fields.tsx b/ui/litellm-dashboard/src/components/add_model/provider_specific_fields.tsx new file mode 100644 index 00000000000..084931b81a3 --- /dev/null +++ b/ui/litellm-dashboard/src/components/add_model/provider_specific_fields.tsx @@ -0,0 +1,171 @@ +import React from "react"; +import { Form } from "antd"; +import { TextInput, Text } from "@tremor/react"; +import { Row, Col, Typography, Button as Button2, Upload, UploadProps } from "antd"; +import { UploadOutlined } from "@ant-design/icons"; +import { Providers } from "../provider_info_helpers"; +const { Link } = Typography; + +interface ProviderSpecificFieldsProps { + selectedProvider: Providers; + uploadProps?: UploadProps; +} + +const ProviderSpecificFields: React.FC = ({ + selectedProvider, + uploadProps +}) => { + console.log(`Selected provider: ${selectedProvider}`); + console.log(`type of selectedProvider: ${typeof selectedProvider}`); + // cast selectedProvider to Providers + const selectedProviderEnum = Providers[selectedProvider as keyof typeof Providers] as Providers; + console.log(`selectedProviderEnum: ${selectedProviderEnum}`); + console.log(`type of selectedProviderEnum: ${typeof selectedProviderEnum}`); + return ( + <> + {selectedProviderEnum === Providers.OpenAI && ( + + + + )} + + {selectedProviderEnum === Providers.Vertex_AI && ( + <> + + + + + + + + + + + }> + Click to Upload + + + + + + + + + Give litellm a gcp service account(.json file), so it + can make the relevant calls + + + + + )} + + {(selectedProviderEnum === Providers.Azure || + selectedProviderEnum === Providers.OpenAI_Compatible) && ( + + + + )} + + {selectedProviderEnum === Providers.Azure && ( + <> + + + + +
+ + + + + + + + The actual model your azure deployment uses. Used + for accurate cost tracking. Select name from{" "} + + here + + + + +
+ + )} + + {selectedProviderEnum === Providers.Bedrock && ( + <> + + + + + + + + + + + + + )} + + {selectedProviderEnum != Providers.Bedrock && + selectedProviderEnum != Providers.Vertex_AI && + selectedProviderEnum != Providers.Ollama && + ( + + + + )} + + ); +}; + +export default ProviderSpecificFields; \ No newline at end of file diff --git a/ui/litellm-dashboard/src/components/model_dashboard.tsx b/ui/litellm-dashboard/src/components/model_dashboard.tsx index 8e5a13a045a..a5dce262dfc 100644 --- a/ui/litellm-dashboard/src/components/model_dashboard.tsx +++ b/ui/litellm-dashboard/src/components/model_dashboard.tsx @@ -19,6 +19,7 @@ import { import ConditionalPublicModelName from "./add_model/conditional_public_model_name"; import LiteLLMModelNameField from "./add_model/litellm_model_name"; import AdvancedSettings from "./add_model/advanced_settings"; +import ProviderSpecificFields from "./add_model/provider_specific_fields"; import { handleAddModelSubmit } from "./add_model/handle_add_model_submit"; import EditModelModal from "./edit_model/edit_model_modal"; import { @@ -65,7 +66,7 @@ import { Popover, Form, Input, - Select as Select2, + Select as AntdSelect, InputNumber, message, Descriptions, @@ -99,7 +100,7 @@ import { Upload } from "antd"; import TimeToFirstToken from "./model_metrics/time_to_first_token"; import DynamicFields from "./model_add/dynamic_form"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; -import { Providers, provider_map, providerLogoMap, getProviderLogoAndName, getPlaceholder } from "./provider_info_helpers"; +import { Providers, provider_map, providerLogoMap, getProviderLogoAndName, getPlaceholder, getProviderModels } from "./provider_info_helpers"; interface ModelDashboardProps { accessToken: string | null; @@ -178,7 +179,7 @@ const ModelDashboard: React.FC = ({ const [providerSettings, setProviderSettings] = useState( [] ); - const [selectedProvider, setSelectedProvider] = useState("OpenAI"); + const [selectedProvider, setSelectedProvider] = useState(Providers.OpenAI); const [healthCheckResponse, setHealthCheckResponse] = useState(""); const [editModalVisible, setEditModalVisible] = useState(false); const [infoModalVisible, setInfoModalVisible] = useState(false); @@ -226,6 +227,12 @@ const ModelDashboard: React.FC = ({ // Add state for advanced settings visibility const [showAdvancedSettings, setShowAdvancedSettings] = useState(false); + const setProviderModelsFn = (provider: Providers) => { + const _providerModels = getProviderModels(provider, modelMap); + setProviderModels(_providerModels); + console.log(`providerModels: ${_providerModels}`); + }; + const updateModelMetrics = async ( modelGroup: string | null, startTime: Date | undefined, @@ -439,7 +446,7 @@ const ModelDashboard: React.FC = ({ } }; - const props: UploadProps = { + const uploadProps: UploadProps = { name: "file", accept: ".json", beforeUpload: (file) => { @@ -786,8 +793,6 @@ const ModelDashboard: React.FC = ({ } }); } - - if (userRole && userRole == "Admin Viewer") { const { Title, Paragraph } = Typography; return ( @@ -800,48 +805,6 @@ const ModelDashboard: React.FC = ({ ); } - const setProviderModelsFn = (provider: string) => { - console.log(`received provider string: ${provider}`); - let providerKey = provider; - if (providerKey) { - let _providerModels: Array = []; - if (typeof modelMap === "object") { - Object.entries(modelMap).forEach(([key, value]) => { - if ( - value !== null && - typeof value === "object" && - "litellm_provider" in (value as object) && - ((value as any)["litellm_provider"] === providerKey || - (value as any)["litellm_provider"].includes(providerKey)) - ) { - _providerModels.push(key); - } - }); - - // Special case for cohere_chat - // we need both cohere_chat and cohere models to show on dropdown - if (providerKey == Providers.Cohere) { - console.log("adding cohere chat model") - Object.entries(modelMap).forEach(([key, value]) => { - if ( - value !== null && - typeof value === "object" && - "litellm_provider" in (value as object) && - ((value as any)["litellm_provider"] === "cohere") - ) { - _providerModels.push(key); - } - }); - } - } - - - - setProviderModels(_providerModels); - console.log(`providerModels: ${providerModels}`); - } - }; - const runHealthCheck = async () => { try { message.info("Running health check..."); @@ -1536,32 +1499,27 @@ const ModelDashboard: React.FC = ({ labelCol={{ span: 10 }} labelAlign="left" > - + @@ -1590,153 +1548,10 @@ const ModelDashboard: React.FC = ({ {/* Conditionally Render "Public Model Name" */} - {/* Provider-specific fields */} - {dynamicProviderForm !== undefined && - dynamicProviderForm.fields.length > 0 && ( - - )} - - {selectedProvider != Providers.Bedrock && - selectedProvider != Providers.Vertex_AI && - selectedProvider != Providers.Ollama && - (dynamicProviderForm === undefined || - dynamicProviderForm.fields.length == 0) && ( - - - - )} - {selectedProvider == Providers.OpenAI && ( - - - - )} - {selectedProvider == Providers.Vertex_AI && ( - - - - )} - {selectedProvider == Providers.Vertex_AI && ( - - - - )} - {selectedProvider == Providers.Vertex_AI && ( - - - }> - Click to Upload - - - - )} - {selectedProvider == Providers.Vertex_AI && ( - - - - - Give litellm a gcp service account(.json file), so it - can make the relevant calls - - - - )} - {(selectedProvider == Providers.Azure || - selectedProvider == Providers.OpenAI_Compatible) && ( - - - - )} - {selectedProvider == Providers.Azure && ( - - - - )} - {selectedProvider == Providers.Azure && ( -
- - - - - - - - The actual model your azure deployment uses. Used - for accurate cost tracking. Select name from{" "} - - here - - - - -
- )} - {selectedProvider == Providers.Bedrock && ( - - - - )} - {selectedProvider == Providers.Bedrock && ( - - - - )} - {selectedProvider == Providers.Bedrock && ( - - - - )} - + { return "gpt-3.5-turbo"; } }; + + export const getProviderModels = (provider: Providers, modelMap: any): Array => { + let providerKey = provider; + console.log(`Provider key: ${providerKey}`); + let custom_llm_provider = provider_map[providerKey]; + console.log(`Provider mapped to: ${custom_llm_provider}`); + + let providerModels: Array = []; + + if (providerKey && typeof modelMap === "object") { + Object.entries(modelMap).forEach(([key, value]) => { + if ( + value !== null && + typeof value === "object" && + "litellm_provider" in (value as object) && + ((value as any)["litellm_provider"] === custom_llm_provider || + (value as any)["litellm_provider"].includes(custom_llm_provider)) + ) { + providerModels.push(key); + } + }); + + // Special case for cohere_chat + // we need both cohere_chat and cohere models to show on dropdown + if (providerKey == Providers.Cohere) { + console.log("Adding cohere chat models"); + Object.entries(modelMap).forEach(([key, value]) => { + if ( + value !== null && + typeof value === "object" && + "litellm_provider" in (value as object) && + ((value as any)["litellm_provider"] === "cohere") + ) { + providerModels.push(key); + } + }); + } + } + + return providerModels; + };