import React, { useState } from 'react'; import './App.css'; interface DocumentResponse { text: string; type: string; score?: number; } function App() { const [file, setFile] = useState(null); const [query, setQuery] = useState(''); const [results, setResults] = useState([]); const [loading, setLoading] = useState(false); const [message, setMessage] = useState(''); const [sessionId, setSessionId] = useState(null); const [currentAnswer, setCurrentAnswer] = useState(''); const handleFileChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files[0]) { setFile(e.target.files[0]); } }; const handleUpload = async () => { if (!file) { setMessage('Please select a file first'); return; } setLoading(true); const formData = new FormData(); formData.append('file', file); try { const response = await fetch('http://localhost:9000/upload', { method: 'POST', body: formData, }); if (!response.ok) { throw new Error('Upload failed'); } const data = await response.json(); setMessage(data.message); setSessionId(data.session_id); setResults([]); setCurrentAnswer(''); } catch (error) { setMessage('Error uploading file'); } finally { setLoading(false); } }; const handleQuery = async () => { if (!query.trim()) { setMessage('Please enter a query'); return; } if (!sessionId) { setMessage('Please upload a document first'); return; } setLoading(true); setCurrentAnswer(''); try { const response = await fetch(`http://localhost:9000/query/${sessionId}`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ text: query, k: 4 }), }); if (!response.ok) { throw new Error('Query failed'); } // Handle streaming response const reader = response.body?.getReader(); const decoder = new TextDecoder(); let buffer = ''; if (!reader) { throw new Error('No reader available'); } while (true) { const { done, value } = await reader.read(); if (done) break; buffer += decoder.decode(value, { stream: true }); const lines = buffer.split('\n'); buffer = lines.pop() || ''; for (const line of lines) { if (line.startsWith('data: ')) { const data = JSON.parse(line.slice(6)); if (data.type === 'token') { setCurrentAnswer(prev => prev + data.text); } else if (data.type === 'context') { setResults(data.context); } } } } } catch (error) { setMessage('Error querying documents'); } finally { setLoading(false); } }; return (

RAG System

Upload PDF Document

Query Documents

setQuery(e.target.value)} placeholder="Enter your query..." disabled={!sessionId} />
{message &&
{message}
}

Results

{currentAnswer && (

AI Response

{currentAnswer}

)} {results.length > 0 && (

Relevant Document Chunks

{results.map((result, index) => (

{result.text}

{result.score !== undefined && (

Relevance Score: {result.score.toFixed(2)}

)}
))}
)}
); } export default App;