Spaces:
Paused
Paused
| 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<string, string>)[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, ProviderCredentialField[]> = { | |
| [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://<test>.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<ProviderSpecificFieldsProps> = ({ | |
| 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) => ( | |
| <React.Fragment key={field.key}> | |
| <Form.Item | |
| label={field.label} | |
| name={field.key} | |
| rules={field.required ? [{ required: true, message: "Required" }] : undefined} | |
| tooltip={field.tooltip} | |
| className={field.key === "vertex_credentials" ? "mb-0" : undefined} | |
| > | |
| {field.type === "select" ? ( | |
| <Select | |
| placeholder={field.placeholder} | |
| defaultValue={field.defaultValue} | |
| > | |
| {field.options?.map((option) => ( | |
| <Select.Option key={option} value={option}> | |
| {option} | |
| </Select.Option> | |
| ))} | |
| </Select> | |
| ) : field.type === "upload" ? ( | |
| <Upload {...uploadProps}> | |
| <Button2 icon={<UploadOutlined />}>Click to Upload</Button2> | |
| </Upload> | |
| ) : ( | |
| <TextInput | |
| placeholder={field.placeholder} | |
| type={field.type === "password" ? "password" : "text"} | |
| /> | |
| )} | |
| </Form.Item> | |
| {/* Special case for Vertex Credentials help text */} | |
| {field.key === "vertex_credentials" && ( | |
| <Row> | |
| <Col span={10}></Col> | |
| <Col span={10}> | |
| <Text className="mb-3 mt-1"> | |
| Give litellm a gcp service account(.json file), so it | |
| can make the relevant calls | |
| </Text> | |
| </Col> | |
| </Row> | |
| )} | |
| {/* Special case for Azure Base Model help text */} | |
| {field.key === "base_model" && ( | |
| <Row> | |
| <Col span={10}></Col> | |
| <Col span={10}> | |
| <Text className="mb-2"> | |
| The actual model your azure deployment uses. Used | |
| for accurate cost tracking. Select name from{" "} | |
| <Link | |
| href="https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json" | |
| target="_blank" | |
| > | |
| here | |
| </Link> | |
| </Text> | |
| </Col> | |
| </Row> | |
| )} | |
| </React.Fragment> | |
| ))} | |
| </> | |
| ); | |
| }; | |
| export default ProviderSpecificFields; |