import { FlaskConical, Loader2, Search } from 'lucide-react'; import { useState } from 'react'; import type { VectorSearchResult } from '@/api'; import { Badge } from '@/components/ui/badge.tsx'; import { Button } from '@/components/ui/button.tsx'; import { Empty, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, } from '@/components/ui/empty.tsx'; import { Input } from '@/components/ui/input.tsx'; import { Label } from '@/components/ui/label.tsx'; import { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, } from '@/components/ui/sheet.tsx'; import { Textarea } from '@/components/ui/textarea.tsx'; import { useKnowledgeBases } from '@/hooks/useKnowledgeBases'; import { useTranslation } from '@/i18n/useI18n.ts'; interface Props { open: boolean; onOpenChange: (open: boolean) => void; knowledgeBaseId: string; knowledgeBaseName: string; } /** * Right-side drawer for ad-hoc retrieval testing on a knowledge base. * The user types a query, picks `top_k`, and inspects ranked chunks. */ export function KnowledgeSearchDrawer({ open, onOpenChange, knowledgeBaseId, knowledgeBaseName, }: Props) { const { t } = useTranslation(); const { search } = useKnowledgeBases(); const [query, setQuery] = useState(''); const [topK, setTopK] = useState(5); const [loading, setLoading] = useState(false); const [results, setResults] = useState(null); const [error, setError] = useState(null); const handleSearch = async () => { const trimmed = query.trim(); if (!trimmed) return; setLoading(true); setError(null); try { const res = await search(knowledgeBaseId, { query: trimmed, top_k: topK, }); setResults(res.results); } catch (e) { setError((e as Error).message || String(e)); setResults(null); } finally { setLoading(false); } }; return ( {t('knowledge.test.title')} {t('knowledge.test.description', { name: knowledgeBaseName })}