diff --git a/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreTester.tsx b/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreTester.tsx index 5c59334fa4d..91ad252e6c9 100644 --- a/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreTester.tsx +++ b/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreTester.tsx @@ -1,13 +1,18 @@ import React, { useState } from "react"; -import { Button, Input, Card, Typography, Spin, Divider } from "antd"; +import { Button } from "@/components/ui/button"; +import { Card } from "@/components/ui/card"; +import { Textarea } from "@/components/ui/textarea"; import MessageManager from "@/components/molecules/message_manager"; -import { SendOutlined, DatabaseOutlined, LoadingOutlined, DownOutlined, RightOutlined } from "@ant-design/icons"; +import { + ChevronDown, + ChevronRight, + Database, + Loader2, + Send, +} from "lucide-react"; import { vectorStoreSearchCall } from "../networking"; import NotificationsManager from "../molecules/notifications_manager"; -const { TextArea } = Input; -const { Text, Title } = Typography; - interface VectorStoreContent { text: string; type: string; @@ -18,6 +23,7 @@ interface VectorStoreResult { content: VectorStoreContent[]; file_id?: string; filename?: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any attributes?: Record; } @@ -33,7 +39,10 @@ interface VectorStoreTesterProps { className?: string; } -export const VectorStoreTester: React.FC = ({ vectorStoreId, accessToken, className = "" }) => { +export const VectorStoreTester: React.FC = ({ + vectorStoreId, + accessToken, +}) => { const [query, setQuery] = useState(""); const [isLoading, setIsLoading] = useState(false); const [searchHistory, setSearchHistory] = useState< @@ -43,7 +52,9 @@ export const VectorStoreTester: React.FC = ({ vectorStor timestamp: number; }[] >([]); - const [expandedResults, setExpandedResults] = useState>({}); + const [expandedResults, setExpandedResults] = useState< + Record + >({}); const handleSearch = async () => { if (!query.trim()) { @@ -54,7 +65,11 @@ export const VectorStoreTester: React.FC = ({ vectorStor setIsLoading(true); try { - const response = await vectorStoreSearchCall(accessToken, vectorStoreId, query); + const response = await vectorStoreSearchCall( + accessToken, + vectorStoreId, + query, + ); const historyEntry = { query, @@ -101,15 +116,21 @@ export const VectorStoreTester: React.FC = ({ vectorStor
{/* Header */} -
+
- - + {/* eslint-disable-next-line litellm-ui/no-raw-tailwind-colors */} + <Database className="mr-2 text-blue-500 h-4 w-4" /> + <h4 className="text-base font-semibold m-0"> Test Vector Store - +
{searchHistory.length > 0 && ( - )} @@ -118,9 +139,11 @@ export const VectorStoreTester: React.FC = ({ vectorStor {/* Results Area */}
{searchHistory.length === 0 ? ( -
- - Test your vector store by entering a search query below +
+ + + Test your vector store by entering a search query below +
) : (
@@ -128,10 +151,13 @@ export const VectorStoreTester: React.FC = ({ vectorStor
{/* User Query */}
-
+ {/* eslint-disable-next-line litellm-ui/no-raw-tailwind-colors */} +
Query - {formatTimestamp(entry.timestamp)} + + {formatTimestamp(entry.timestamp)} +
{entry.query}
@@ -139,85 +165,128 @@ export const VectorStoreTester: React.FC = ({ vectorStor {/* Vector Store Response */}
-
+
- - Vector Store Results + {/* eslint-disable-next-line litellm-ui/no-raw-tailwind-colors */} + + + Vector Store Results + {entry.response && ( - + {entry.response.data?.length || 0} results )}
- {entry.response && entry.response.data && entry.response.data.length > 0 ? ( + {entry.response && + entry.response.data && + entry.response.data.length > 0 ? (
{entry.response.data.map((result, resultIndex) => { - const isExpanded = expandedResults[`${index}-${resultIndex}`] || false; + const isExpanded = + expandedResults[`${index}-${resultIndex}`] || + false; return ( -
+
{/* Clickable Header */}
toggleResultExpansion(index, resultIndex)} + className="flex justify-between items-center p-3 cursor-pointer hover:bg-muted/70 transition-colors" + onClick={() => + toggleResultExpansion(index, resultIndex) + } >
{isExpanded ? ( - + ) : ( - - )} - Result {resultIndex + 1} - {/* Show preview of content when collapsed */} - {!isExpanded && result.content && result.content[0] && ( - - - {result.content[0].text.substring(0, 100)}... - + )} + + Result {resultIndex + 1} + + {!isExpanded && + result.content && + result.content[0] && ( + + -{" "} + {result.content[0].text.substring( + 0, + 100, + )} + ... + + )}
- + {/* eslint-disable-next-line litellm-ui/no-raw-tailwind-colors */} + Score: {result.score.toFixed(4)}
- {/* Expandable Content */} {isExpanded && ( -
- {/* Content */} +
{result.content && - result.content.map((content, contentIndex) => ( -
-
Content ({content.type})
-
- {content.text} + result.content.map( + (content, contentIndex) => ( +
+
+ Content ({content.type}) +
+
+ {content.text} +
-
- ))} + ), + )} - {/* Metadata */} - {(result.file_id || result.filename || result.attributes) && ( -
-
Metadata
+ {(result.file_id || + result.filename || + result.attributes) && ( +
+
+ Metadata +
{result.file_id && ( -
- File ID: {result.file_id} +
+ + File ID: + {" "} + {result.file_id}
)} {result.filename && ( -
- Filename: {result.filename} -
- )} - {result.attributes && Object.keys(result.attributes).length > 0 && ( -
- Attributes: -
-                                                {JSON.stringify(result.attributes, null, 2)}
-                                              
+
+ + Filename: + {" "} + {result.filename}
)} + {result.attributes && + Object.keys(result.attributes) + .length > 0 && ( +
+ + Attributes: + +
+                                                  {JSON.stringify(
+                                                    result.attributes,
+                                                    null,
+                                                    2,
+                                                  )}
+                                                
+
+ )}
)} @@ -228,12 +297,16 @@ export const VectorStoreTester: React.FC = ({ vectorStor })}
) : ( -
No results found
+
+ No results found +
)}
- {index < searchHistory.length - 1 && } + {index < searchHistory.length - 1 && ( +
+ )}
))}
@@ -241,32 +314,35 @@ export const VectorStoreTester: React.FC = ({ vectorStor {isLoading && (
- } /> +
)}
{/* Input Area */} -
-
+
+
-