'use client'; import React, { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { useTranslation } from 'react-i18next'; import { httpClient } from '@/app/infra/http/HttpClient'; import { RetrieveResult, KnowledgeBaseFile } from '@/app/infra/entities/api'; import { toast } from 'sonner'; interface KBRetrieveProps { kbId: string; } export default function KBRetrieve({ kbId }: KBRetrieveProps) { const { t } = useTranslation(); const [query, setQuery] = useState(''); const [results, setResults] = useState([]); const [files, setFiles] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { const loadFiles = async () => { try { const response = await httpClient.getKnowledgeBaseFiles(kbId); setFiles(response.files); } catch (error) { console.error('Failed to load files:', error); } }; loadFiles(); }, [kbId]); const handleRetrieve = async () => { if (!query.trim()) return; setLoading(true); try { setResults([]); const response = await httpClient.retrieveKnowledgeBase(kbId, query); setResults(response.results); } catch (error) { console.error('Retrieve failed:', error); toast.error(t('knowledge.retrieveError')); } finally { setLoading(false); } }; const getFileName = (fileId?: string) => { if (!fileId) return ''; const file = files.find((f) => f.uuid === fileId); return file?.file_name || fileId; }; /** * Extract text content from the content array * The content array may contain multiple items with type 'text' */ const extractTextFromContent = (result: RetrieveResult): string => { // First try to get content from the new format if (result.content && Array.isArray(result.content)) { const textParts = result.content .filter((item) => item.type === 'text' && item.text) .map((item) => item.text); if (textParts.length > 0) { return textParts.join('\n\n'); } } // Fallback to metadata.text for backward compatibility if (result.metadata?.text) { return result.metadata.text as string; } return ''; }; return (
setQuery(e.target.value)} placeholder={t('knowledge.queryPlaceholder')} onKeyPress={(e) => e.key === 'Enter' && handleRetrieve()} />
{results.length === 0 && !loading && (

{t('knowledge.noResults')}

)} {loading ? (

{t('common.loading')}

) : ( results.map((result) => ( {getFileName(result.metadata.file_id)} {t('knowledge.distance')}: {result.distance.toFixed(4)}

{extractTextFromContent(result)}

)) )}
); }