diff --git a/ui/litellm-dashboard/package-lock.json b/ui/litellm-dashboard/package-lock.json index f0656e8eb0a..aa8402dba6c 100644 --- a/ui/litellm-dashboard/package-lock.json +++ b/ui/litellm-dashboard/package-lock.json @@ -8,6 +8,7 @@ "name": "litellm-dashboard", "version": "0.1.0", "dependencies": { + "@anthropic-ai/sdk": "^0.54.0", "@headlessui/react": "^1.7.18", "@headlessui/tailwindcss": "^0.2.0", "@heroicons/react": "^1.0.6", @@ -138,6 +139,14 @@ "react": ">=16.9.0" } }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.54.0.tgz", + "integrity": "sha512-xyoCtHJnt/qg5GG6IgK+UJEndz8h8ljzt/caKXmq3LfBF81nC/BW6E4x2rOWCZcvsLyVW+e8U5mtIr6UCE/kJw==", + "bin": { + "anthropic-ai-sdk": "bin/cli" + } + }, "node_modules/@babel/runtime": { "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", diff --git a/ui/litellm-dashboard/package.json b/ui/litellm-dashboard/package.json index cc7e0f73f5b..6c7a7bf1ae4 100644 --- a/ui/litellm-dashboard/package.json +++ b/ui/litellm-dashboard/package.json @@ -9,6 +9,7 @@ "lint": "next lint" }, "dependencies": { + "@anthropic-ai/sdk": "^0.54.0", "@headlessui/react": "^1.7.18", "@headlessui/tailwindcss": "^0.2.0", "@heroicons/react": "^1.0.6", diff --git a/ui/litellm-dashboard/src/components/chat_ui.tsx b/ui/litellm-dashboard/src/components/chat_ui.tsx index 5fa575aad4e..673924a0e53 100644 --- a/ui/litellm-dashboard/src/components/chat_ui.tsx +++ b/ui/litellm-dashboard/src/components/chat_ui.tsx @@ -29,6 +29,7 @@ import { makeOpenAIChatCompletionRequest } from "./chat_ui/llm_calls/chat_comple import { makeOpenAIImageGenerationRequest } from "./chat_ui/llm_calls/image_generation"; import { makeOpenAIImageEditsRequest } from "./chat_ui/llm_calls/image_edits"; import { makeOpenAIResponsesRequest } from "./chat_ui/llm_calls/responses_api"; +import { makeAnthropicMessagesRequest } from "./chat_ui/llm_calls/anthropic_messages"; import { fetchAvailableModels, ModelGroup } from "./chat_ui/llm_calls/fetch_models"; import { litellmModeMapping, ModelMode, EndpointType, getEndpointType } from "./chat_ui/mode_endpoint_mapping"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; @@ -123,12 +124,7 @@ const ChatUI: React.FC = ({ if (uniqueModels.length > 0) { setModelInfo(uniqueModels); setSelectedModel(uniqueModels[0].model_group); - - // Auto-set endpoint based on the first model's mode - if (uniqueModels[0].mode) { - const initialEndpointType = determineEndpointType(uniqueModels[0].model_group, uniqueModels); - setEndpointType(initialEndpointType); - } + } } catch (error) { console.error("Error fetching model info:", error); @@ -407,6 +403,23 @@ const ChatUI: React.FC = ({ selectedVectorStores.length > 0 ? selectedVectorStores : undefined, selectedGuardrails.length > 0 ? selectedGuardrails : undefined ); + } else if (endpointType === EndpointType.ANTHROPIC_MESSAGES) { + const apiChatHistory = [...chatHistory.filter(msg => !msg.isImage).map(({ role, content }) => ({ role, content })), newUserMessage]; + + await makeAnthropicMessagesRequest( + apiChatHistory, + (role, delta, model) => updateTextUI(role, delta, model), + selectedModel, + effectiveApiKey, + selectedTags, + signal, + updateReasoningContent, + updateTimingData, + updateUsageData, + traceId, + selectedVectorStores.length > 0 ? selectedVectorStores : undefined, + selectedGuardrails.length > 0 ? selectedGuardrails : undefined + ); } } } catch (error) { @@ -449,18 +462,10 @@ const ChatUI: React.FC = ({ console.log(`selected ${value}`); setSelectedModel(value); - // Use the utility function to determine the endpoint type - if (value !== 'custom') { - const newEndpointType = determineEndpointType(value, modelInfo); - setEndpointType(newEndpointType); - } setShowCustomModelInput(value === 'custom'); }; - const handleEndpointChange = (value: string) => { - setEndpointType(value); - }; const antIcon = ; @@ -543,7 +548,7 @@ const ChatUI: React.FC = ({ @@ -762,8 +767,10 @@ const ChatUI: React.FC = ({ onChange={(e) => setInputMessage(e.target.value)} onKeyDown={handleKeyDown} placeholder={ - endpointType === EndpointType.CHAT || endpointType === EndpointType.RESPONSES - ? "Type your message... (Shift+Enter for new line)" + endpointType === EndpointType.CHAT || + endpointType === EndpointType.RESPONSES || + endpointType === EndpointType.ANTHROPIC_MESSAGES + ? "Type your message... (Shift+Enter for new line)" : endpointType === EndpointType.IMAGE_EDITS ? "Describe how you want to edit the image..." : "Describe the image you want to generate..." @@ -785,10 +792,21 @@ const ChatUI: React.FC = ({ )} diff --git a/ui/litellm-dashboard/src/components/chat_ui/EndpointSelector.tsx b/ui/litellm-dashboard/src/components/chat_ui/EndpointSelector.tsx index 73e6c5d7aa0..97f11849a45 100644 --- a/ui/litellm-dashboard/src/components/chat_ui/EndpointSelector.tsx +++ b/ui/litellm-dashboard/src/components/chat_ui/EndpointSelector.tsx @@ -21,6 +21,7 @@ const EndpointSelector: React.FC = ({ const endpointOptions = [ { value: EndpointType.CHAT, label: '/v1/chat/completions' }, { value: EndpointType.RESPONSES, label: '/v1/responses' }, + { value: EndpointType.ANTHROPIC_MESSAGES, label: '/v1/messages' }, { value: EndpointType.IMAGE, label: '/v1/images/generations' }, { value: EndpointType.IMAGE_EDITS, label: '/v1/images/edits' }, ]; @@ -29,6 +30,7 @@ const EndpointSelector: React.FC = ({
Endpoint Type: