import React from 'react'; import { Typography, Space, Button, Divider, message } from 'antd'; import { WarningOutlined, InfoCircleOutlined, CopyOutlined } from '@ant-design/icons'; import { testConnectionRequest } from "../networking"; import { prepareModelAddRequest } from "./handle_add_model_submit"; const { Text } = Typography; interface ModelConnectionTestProps { formValues: Record; accessToken: string; testMode: string; modelName?: string; onClose?: () => void; onTestComplete?: () => void; } const ModelConnectionTest: React.FC = ({ formValues, accessToken, testMode, modelName = "this model", onClose, onTestComplete }) => { const [error, setError] = React.useState(null); const [rawRequest, setRawRequest] = React.useState(null); const [rawResponse, setRawResponse] = React.useState(null); const [isLoading, setIsLoading] = React.useState(true); const [isSuccess, setIsSuccess] = React.useState(false); const [showDetails, setShowDetails] = React.useState(false); const testModelConnection = async () => { setIsLoading(true); setShowDetails(false); setError(null); setRawRequest(null); setRawResponse(null); setIsSuccess(false); // Add a small delay to ensure form values are fully populated await new Promise(resolve => setTimeout(resolve, 100)); try { console.log("Testing connection with form values:", formValues); const result = await prepareModelAddRequest(formValues, accessToken, null); if (!result) { console.log("No result from prepareModelAddRequest"); setError("Failed to prepare model data. Please check your form inputs."); setIsSuccess(false); setIsLoading(false); return; } console.log("Result from prepareModelAddRequest:", result); const { litellmParamsObj, modelInfoObj, modelName: returnedModelName } = result[0]; const response = await testConnectionRequest(accessToken, litellmParamsObj, modelInfoObj?.mode); if (response.status === "success") { message.success("Connection test successful!"); setError(null); setIsSuccess(true); } else { const errorMessage = response.result?.error || response.message || "Unknown error"; setError(errorMessage); setRawRequest(litellmParamsObj); setRawResponse(response.result?.raw_request_typed_dict); setIsSuccess(false); } } catch (error) { console.error("Test connection error:", error); setError(error instanceof Error ? error.message : String(error)); setIsSuccess(false); } finally { setIsLoading(false); if (onTestComplete) onTestComplete(); } }; React.useEffect(() => { // Run the test once when component mounts // Add a small timeout to ensure form values are ready const timer = setTimeout(() => { testModelConnection(); }, 200); return () => clearTimeout(timer); }, []); // Empty dependency array means this runs once on mount const getCleanErrorMessage = (errorMsg: string) => { if (!errorMsg) return "Unknown error"; const mainError = errorMsg.split('stack trace:')[0].trim(); const cleanedError = mainError.replace(/^litellm\.(.*?)Error: /, ''); return cleanedError; }; const errorMessage = typeof error === 'string' ? getCleanErrorMessage(error) : error?.message ? getCleanErrorMessage(error.message) : "Unknown error"; const formatCurlCommand = (apiBase: string, requestBody: Record, requestHeaders: Record) => { const formattedBody = JSON.stringify(requestBody, null, 2) .split('\n') .map(line => ` ${line}`) .join('\n'); const headerString = Object.entries(requestHeaders) .map(([key, value]) => `-H '${key}: ${value}'`) .join(' \\\n '); return `curl -X POST \\ ${apiBase} \\ ${headerString ? `${headerString} \\\n ` : ''}-H 'Content-Type: application/json' \\ -d '{ ${formattedBody} }'`; }; const curlCommand = rawResponse ? formatCurlCommand( rawResponse.raw_request_api_base, rawResponse.raw_request_body, rawResponse.raw_request_headers || {} ) : ''; return (
{isLoading ? (
{/* Simple CSS spinner */}
Testing connection to {modelName}...
) : isSuccess ? (
Connection to {modelName} successful!
) : ( <>
Connection to {modelName} failed
Error: {errorMessage} {error && (
)}
{showDetails && (
Troubleshooting Details
                  {typeof error === 'string' ? error : JSON.stringify(error, null, 2)}
                
)}
API Request
                {curlCommand || "No request data available"}
              
)}
); }; export default ModelConnectionTest;