"use client"; import { useState, useMemo } from "react"; import { XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend, AreaChart, Area, } from "recharts"; const MODELS = [ { id: "claude-sonnet", label: "Claude Sonnet 4", inputPer1k: 0.003, outputPer1k: 0.015 }, { id: "claude-haiku", label: "Claude Haiku 4", inputPer1k: 0.00025, outputPer1k: 0.00125 }, { id: "gpt-4o-mini", label: "GPT-4o-mini", inputPer1k: 0.00015, outputPer1k: 0.0006 }, { id: "gpt-4o", label: "GPT-4o", inputPer1k: 0.0025, outputPer1k: 0.01 }, ]; export function CostAnalysis() { const [numQueries, setNumQueries] = useState(10000); const [modelIdx, setModelIdx] = useState(0); const model = MODELS[modelIdx]; const baselineAvgTokens = 950; const graphragAvgTokens = 2400; const baselineCostPerQ = (800 / 1000) * model.inputPer1k + (150 / 1000) * model.outputPer1k; const graphragCostPerQ = (2200 / 1000) * model.inputPer1k + (200 / 1000) * model.outputPer1k; const cumulativeData = useMemo(() => { const points: { queries: number; Baseline: number; GraphRAG: number }[] = []; const step = Math.max(Math.floor(numQueries / 50), 1); for (let q = 0; q <= numQueries; q += step) { points.push({ queries: q, Baseline: +(baselineCostPerQ * q).toFixed(4), GraphRAG: +(graphragCostPerQ * q).toFixed(4), }); } return points; }, [numQueries, baselineCostPerQ, graphragCostPerQ]); return (
{/* Controls */}
Cost & Token Projections
setNumQueries(+e.target.value)} className="w-full mt-2 accent-[#FF6B00]" />
{numQueries.toLocaleString()}
{MODELS.map((m, i) => ( ))}
{(graphragAvgTokens / baselineAvgTokens).toFixed(1)}x
GraphRAG / Baseline
{/* Summary Cards */}
{[ { label: "Cost/Query (Baseline)", value: "$" + baselineCostPerQ.toFixed(6), color: "#0072CE" }, { label: "Cost/Query (GraphRAG)", value: "$" + graphragCostPerQ.toFixed(6), color: "#FF6B00" }, { label: `Total (${(numQueries / 1000).toFixed(0)}K)`, value: "$" + (baselineCostPerQ * numQueries).toFixed(2), color: "#0072CE" }, { label: `Total (${(numQueries / 1000).toFixed(0)}K)`, value: "$" + (graphragCostPerQ * numQueries).toFixed(2), color: "#FF6B00" }, { label: "Annual (1K qpd)", value: "$" + (graphragCostPerQ * 1000 * 365).toFixed(0), color: "#cc785c" }, ].map((m, i) => (
{m.value}
{m.label}
))}
{/* Cumulative Cost Chart */}
Cumulative Cost — {model.label}
(Number(v) >= 1000 ? `${Number(v) / 1000}K` : String(v))} /> `$${v}`} />
{/* Insight Card */}
💡 Key Insight

GraphRAG uses {(graphragAvgTokens / baselineAvgTokens).toFixed(1)}× more tokens per query, but delivers +13% higher F1 on complex multi-hop questions. The Adaptive Router eliminates this overhead for simple queries by routing them to Baseline RAG — achieving the best of both worlds.

); }