import React from "react"; import { Form, Select } 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 { provider_map, Providers } from "../provider_info_helpers"; import { CredentialItem } from "../networking"; const { Link } = Typography; interface ProviderSpecificFieldsProps { selectedProvider: Providers; uploadProps?: UploadProps; } interface ProviderCredentialField { key: string; label: string; placeholder?: string; tooltip?: string; required?: boolean; type?: "text" | "password" | "select" | "upload"; options?: string[]; defaultValue?: string; } export interface CredentialValues { key: string; value: string; } export const createCredentialFromModel = (provider: string, modelData: any): CredentialItem => { console.log("provider", provider); console.log("modelData", modelData); const enumKey = Object.keys(provider_map).find( key => provider_map[key].toLowerCase() === provider.toLowerCase() ); if (!enumKey) { throw new Error(`Provider ${provider} not found in provider_map`); } const providerEnum = Providers[enumKey as keyof typeof Providers]; const providerFields = PROVIDER_CREDENTIAL_FIELDS[providerEnum] || []; const credentialValues: object = {}; console.log("providerFields", providerFields); // Go through each field defined for this provider providerFields.forEach(field => { const value = modelData.litellm_params[field.key]; console.log("field", field); console.log("value", value); if (value !== undefined) { (credentialValues as Record)[field.key] = value.toString(); } }); const credential: CredentialItem = { credential_name: `${provider}-credential-${Math.floor(Math.random() * 1000000)}`, credential_values: credentialValues, credential_info: { custom_llm_provider: provider, description: `Credential for ${provider}. Created from model ${modelData.model_name}`, } } return credential; }; const PROVIDER_CREDENTIAL_FIELDS: Record = { [Providers.OpenAI]: [ { key: "api_base", label: "API Base", type: "select", options: [ "https://api.openai.com/v1", "https://eu.api.openai.com" ], defaultValue: "https://api.openai.com/v1" }, { key: "organization", label: "OpenAI Organization ID", placeholder: "[OPTIONAL] my-unique-org" }, { key: "api_key", label: "OpenAI API Key", type: "password", required: true } ], [Providers.OpenAI_Text]: [ { key: "api_base", label: "API Base", type: "select", options: [ "https://api.openai.com/v1", "https://eu.api.openai.com" ], defaultValue: "https://api.openai.com/v1" }, { key: "organization", label: "OpenAI Organization ID", placeholder: "[OPTIONAL] my-unique-org" }, { key: "api_key", label: "OpenAI API Key", type: "password", required: true } ], [Providers.Vertex_AI]: [ { key: "vertex_project", label: "Vertex Project", placeholder: "adroit-cadet-1234..", required: true }, { key: "vertex_location", label: "Vertex Location", placeholder: "us-east-1", required: true }, { key: "vertex_credentials", label: "Vertex Credentials", required: true, type: "upload" } ], [Providers.AssemblyAI]: [ { key: "api_base", label: "API Base", type: "select", required: true, options: [ "https://api.assemblyai.com", "https://api.eu.assemblyai.com" ] }, { key: "api_key", label: "AssemblyAI API Key", type: "password", required: true } ], [Providers.Azure]: [ { key: "api_base", label: "API Base", placeholder: "https://...", required: true }, { key: "api_version", label: "API Version", placeholder: "2023-07-01-preview", tooltip: "By default litellm will use the latest version. If you want to use a different version, you can specify it here" }, { key: "base_model", label: "Base Model", placeholder: "azure/gpt-3.5-turbo" }, { key: "api_key", label: "Azure API Key", type: "password", required: true } ], [Providers.Azure_AI_Studio]: [ { key: "api_base", label: "API Base", placeholder: "https://.openai.azure.com/openai/deployments/gpt-4o/chat/completions?api-version=2024-10-21", tooltip: "Enter your full Target URI from Azure Foundry here. Example: https://litellm8397336933.openai.azure.com/openai/deployments/gpt-4o/chat/completions?api-version=2024-10-21", required: true }, { key: "api_key", label: "Azure API Key", type: "password", required: true } ], [Providers.OpenAI_Compatible]: [ { key: "api_base", label: "API Base", placeholder: "https://...", required: true }, { key: "api_key", label: "OpenAI API Key", type: "password", required: true } ], [Providers.OpenAI_Text_Compatible]: [ { key: "api_base", label: "API Base", placeholder: "https://...", required: true }, { key: "api_key", label: "OpenAI API Key", type: "password", required: true } ], [Providers.Bedrock]: [ { key: "aws_access_key_id", label: "AWS Access Key ID", required: true, tooltip: "You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`)." }, { key: "aws_secret_access_key", label: "AWS Secret Access Key", required: true, tooltip: "You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`)." }, { key: "aws_region_name", label: "AWS Region Name", placeholder: "us-east-1", required: true, tooltip: "You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`)." } ], [Providers.Ollama]: [], // No specific fields needed [Providers.Anthropic]: [{ key: "api_key", label: "API Key", placeholder: "sk-", type: "password", required: true }], [Providers.Google_AI_Studio]: [{ key: "api_key", label: "API Key", placeholder: "aig-", type: "password", required: true }], [Providers.Groq]: [{ key: "api_key", label: "API Key", type: "password", required: true }], [Providers.MistralAI]: [{ key: "api_key", label: "API Key", type: "password", required: true }], [Providers.Deepseek]: [{ key: "api_key", label: "API Key", type: "password", required: true }], [Providers.Cohere]: [{ key: "api_key", label: "API Key", type: "password", required: true }], [Providers.Databricks]: [{ key: "api_key", label: "API Key", type: "password", required: true }], [Providers.xAI]: [{ key: "api_key", label: "API Key", type: "password", required: true }], [Providers.Cerebras]: [{ key: "api_key", label: "API Key", type: "password", required: true }], [Providers.Sambanova]: [{ key: "api_key", label: "API Key", type: "password", required: true }], [Providers.Perplexity]: [{ key: "api_key", label: "API Key", type: "password", required: true }], [Providers.TogetherAI]: [{ key: "api_key", label: "API Key", type: "password", required: true }], [Providers.Openrouter]: [{ key: "api_key", label: "API Key", type: "password", required: true }], [Providers.FireworksAI]: [{ key: "api_key", label: "API Key", type: "password", required: true }], [Providers.Triton]: [{ key: "api_key", label: "API Key", type: "password", required: false }, { key: "api_base", label: "API Base", placeholder: "http://localhost:8000/generate", required: false } ] }; const ProviderSpecificFields: React.FC = ({ selectedProvider, uploadProps }) => { const selectedProviderEnum = Providers[selectedProvider as keyof typeof Providers] as Providers; // Simply use the fields as defined in PROVIDER_CREDENTIAL_FIELDS const allFields = React.useMemo(() => { return PROVIDER_CREDENTIAL_FIELDS[selectedProviderEnum] || []; }, [selectedProviderEnum]); return ( <> {allFields.map((field) => ( {field.type === "select" ? ( ) : field.type === "upload" ? ( }>Click to Upload ) : ( )} {/* Special case for Vertex Credentials help text */} {field.key === "vertex_credentials" && ( Give litellm a gcp service account(.json file), so it can make the relevant calls )} {/* Special case for Azure Base Model help text */} {field.key === "base_model" && ( The actual model your azure deployment uses. Used for accurate cost tracking. Select name from{" "} here )} ))} ); }; export default ProviderSpecificFields;