// // SPDX-FileCopyrightText: Copyright (c) 1993-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // "use client"; import { useState, useEffect } from "react"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import Link from "next/link"; import { ArrowLeft, BarChart2, Database, Clock, Target, AlertTriangle } from "lucide-react"; import { useToast } from "@/components/ui/use-toast"; import { NvidiaIcon } from "@/components/nvidia-icon"; interface MetricsData { totalTriples: number; totalEntities: number; avgQueryTime: number; avgRelevance: number; precision: number; recall: number; f1Score: number; topQueries: { query: string; count: number }[]; queryTimesByMode?: Record; queryLogStats?: { totalQueryLogs: number; totalExecutions: number; lastQueriedAt?: string; }; } export default function MetricsPage() { const { toast } = useToast(); const [metrics, setMetrics] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchMetrics = async () => { setIsLoading(true); setError(null); try { // Fetch real metrics from the API endpoint const response = await fetch('/api/metrics'); if (!response.ok) { throw new Error(`Failed to fetch metrics: ${response.statusText}`); } const data = await response.json(); setMetrics(data); } catch (error) { console.error("Error fetching metrics:", error); const errorMessage = error instanceof Error ? error.message : "Unknown error occurred"; setError(errorMessage); toast({ title: "Failed to load metrics", description: "Could not retrieve performance data.", variant: "destructive", }); } finally { setIsLoading(false); } }; fetchMetrics(); }, [toast]); // Function to refresh metrics data const refreshMetrics = async () => { setIsLoading(true); setError(null); try { const response = await fetch('/api/metrics'); if (!response.ok) { throw new Error(`Failed to refresh metrics: ${response.statusText}`); } const data = await response.json(); setMetrics(data); toast({ title: "Metrics refreshed", description: "Performance metrics have been updated", }); } catch (error) { console.error("Error refreshing metrics:", error); const errorMessage = error instanceof Error ? error.message : "Unknown error occurred"; setError(errorMessage); toast({ title: "Failed to refresh metrics", description: "Could not update performance data", variant: "destructive", }); } finally { setIsLoading(false); } }; return (
{/* Modern Gradient Header */}
Back to RAG Query

RAG Performance Metrics

{/* Fix Logs Button */}
{isLoading ? (
) : error ? (

Failed to load metrics

{error}

) : metrics ? (
{/* Knowledge Base Stats */} Knowledge Base
Total Triples
{metrics.totalTriples.toLocaleString()}
Unique Entities
{metrics.totalEntities.toLocaleString()}
{/* Performance Stats */} Query Performance
{metrics.avgQueryTime > 0 ? (
Avg. Query Time
{Math.round(metrics.avgQueryTime)} ms
) : (
Avg. Query Time
No data
)} {metrics.avgRelevance > 0 ? (
Avg. Relevance Score
{(metrics.avgRelevance * 100).toFixed(1)}%
) : (
Avg. Relevance Score
No data
)}
{/* Precision Metrics - Only show if we have real data */} {(metrics.precision > 0 || metrics.recall > 0) && ( Retrieval Metrics
Precision
{metrics.precision > 0 ? `${(metrics.precision * 100).toFixed(1)}%` : "No data"}
Recall
{metrics.recall > 0 ? `${(metrics.recall * 100).toFixed(1)}%` : "No data"}
F1 Score
{metrics.f1Score > 0 ? `${(metrics.f1Score * 100).toFixed(1)}%` : "No data"}
)} {/* Top Queries */} Top Queries
{metrics.topQueries.length === 0 ? (
No queries have been logged yet. Try running some queries!
) : metrics.topQueries.every(item => item.count === 0) ? (
Query logs exist but have 0 counts. Try refreshing or making new queries.
) : ( metrics.topQueries.map((item, i) => (
{item.query}
{item.count}
)) )}
{/* Query Log Stats - For Debugging */} {metrics.queryLogStats && ( Query Log Stats (Debug)
Total Query Logs
{metrics.queryLogStats.totalQueryLogs}
Total Query Executions
{metrics.queryLogStats.totalExecutions}
Last Queried At
{metrics.queryLogStats.lastQueriedAt ? new Date(metrics.queryLogStats.lastQueriedAt).toLocaleString() : 'Never' }

If you see query logs but 0 counts, try these steps:

  1. Visit /api/query-log/test?query=Test%20query to manually add a test query
  2. Click the refresh button above to update the metrics
  3. Make new queries using the RAG Query page
)}
) : (

No metrics data available

)}
); }