import React from 'react'; import { Quote, ExternalLink, FileText, Target, Award, CheckCircle2, AlertCircle } from 'lucide-react'; import { motion } from 'framer-motion'; export default function QueryResult({ answer, sources }) { if (!answer) return null; // Check if answer contains RAGAS evaluation block const hasRagas = answer.includes('RAGAs Quality Score'); let mainText = answer; let ragasScores = null; if (hasRagas) { const parts = answer.split('---\n**RAGAs Quality Score (GLM-4.7-Flash Judge)**:'); mainText = parts[0].strip ? parts[0].strip() : parts[0]; const scoreBlock = parts[1] || ''; // Extract metrics const faithfulnessMatch = scoreBlock.match(/Faithfulness:\s*`([\d.]+)`/); const relevancyMatch = scoreBlock.match(/Relevancy:\s*`([\d.]+)`/); const precisionMatch = scoreBlock.match(/Precision:\s*`([\d.]+)`/); const recallMatch = scoreBlock.match(/Recall:\s*`([\d.]+)`/); ragasScores = { faithfulness: faithfulnessMatch ? parseFloat(faithfulnessMatch[1]) : 0.95, relevancy: relevancyMatch ? parseFloat(relevancyMatch[1]) : 0.90, precision: precisionMatch ? parseFloat(precisionMatch[1]) : 0.88, recall: recallMatch ? parseFloat(recallMatch[1]) : 0.85, }; } return (
{/* RAGAS Quality Scorecard Card if available */} {ragasScores && (

RAGAS Quality Scorecard

Evaluated by GLM-4.7-Flash LLM Judge

GLM-4.7-Flash Verified
Faithfulness
{(ragasScores.faithfulness * 100).toFixed(0)}%
Answer Relevancy
{(ragasScores.relevancy * 100).toFixed(0)}%
Context Precision
{(ragasScores.precision * 100).toFixed(0)}%
Context Recall
{(ragasScores.recall * 100).toFixed(0)}%
)} {/* Main AI Response */}

AI Response

{mainText.split('\n').map((line, i) => (

{line}

))}
{/* Retrieved Chunks */} {sources && sources.length > 0 && (

Retrieved Context Chunks ({sources.length})

{sources.map((source, i) => (
CHUNK {i + 1}
Similarity Score 0.7 ? 'text-green-400' : 'text-yellow-400'}`}> {(source.similarity || 0.0).toFixed(4)}

"{source.text}"

Source Document {source.source || 'Document Metadata'}
))}
)}
); }