"use client"; import { useState } from "react"; const SECTIONS = [ { id: "quickstart", title: "Quick Start", icon: "πŸš€", content: [ { heading: "Prerequisites", body: `Before running GraphRAG, make sure you have: - Python 3.10+ - Node.js 18+ - Docker (optional, for containerized deployment) - A TigerGraph Cloud account (free tier available) - At least one LLM API key (Claude, OpenAI, etc.)`, }, { heading: "Installation", code: `# Clone the repository git clone https://github.com/MUTHUKUMARAN-K-1/graphrag-inference-hackathon cd graphrag-inference-hackathon # Backend setup pip install -r requirements.txt # Frontend setup cd web npm install npm run dev # Or use Docker docker build -t graphrag . docker run -p 3000:3000 -p 8000:8000 graphrag`, }, { heading: "Environment Variables", code: `# web/.env (copy from web/.env.example) # TigerGraph TG_HOST=https://your-instance.i.tgcloud.io TG_TOKEN=your_bearer_token TG_GRAPH=GraphRAG # LLM β€” set at least one OPENAI_API_KEY=sk-... OPENAI_BASE_URL=https://models.botlearn.ai/v1 # optional: botlearn.ai / other proxy LLM_MODEL=gemini-2.5-flash # optional: override default model # Embeddings (for live TigerGraph retrieval) HF_TOKEN=hf_... # Optional additional providers ANTHROPIC_API_KEY=sk-ant-... GEMINI_API_KEY=AI... GROQ_API_KEY=gsk_...`, }, ], }, { id: "api", title: "API Reference", icon: "πŸ“‘", content: [ { heading: "POST /api/compare", body: "Run a side-by-side comparison of Baseline RAG and GraphRAG pipelines.", code: `// Request POST /api/compare { "query": "What theory describes gravity as the curvature of spacetime?", "provider": "openai", "model": "gemini-2.5-flash", "adaptiveRouting": true, "topK": 5 } // Response β€” 3 pipelines run in parallel { "llmOnly": { "answer": "General relativity.", "tokens": 84, "latencyMs": 820, "costUsd": 0.000013 }, "baseline": { "answer": "General relativity, published by Einstein in 1915...", "tokens": 290, "latencyMs": 1100, "costUsd": 0.000044, "retrievedChunks": 5, "contextTokens": 240 }, "graphrag": { "answer": "General relativity (Einstein, 1915).", "tokens": 163, "latencyMs": 950, "costUsd": 0.000025, "entities": ["General Relativity (THEORY, Einstein 1915)"], "relations": [], "retrievedChunks": 5, "contextTokens": 112 }, "complexity": 0.2, "queryType": "factoid", "recommended": "baseline", "totalTimeMs": 2700 }`, }, { heading: "POST /api/benchmark", body: "Run batch evaluation on 10 science questions from the ingested Wikipedia corpus. All samples run in parallel.", code: `// Request POST /api/benchmark { "numSamples": 10, "provider": "openai", "model": "gemini-2.5-flash" } // Response { "aggregate": { "numSamples": 10, "llmOnly": { "avgF1": 0.7000, "avgEM": 0.70, "avgTokens": 84, "avgLatency": 820 }, "baseline": { "avgF1": 0.5800, "avgEM": 0.50, "avgTokens": 290, "avgLatency": 1100 }, "graphrag": { "avgF1": 0.7467, "avgEM": 0.60, "avgTokens": 163, "avgLatency": 950 }, "tokenReductionVsBaseline": 44, "graphragF1WinRate": 0.90 }, "demoMode": false, "note": "TigerGraph live retrieval attempted; corpus passages used as fallback." }`, }, { heading: "GET /api/providers", body: "List all available LLM providers and their models.", code: `// Response { "providers": [ { "id": "anthropic", "name": "Anthropic Claude", "isLocal": false, "hasApiKey": true, "defaultModel": "claude-sonnet-4-20250514", "models": [ { "id": "claude-sonnet-4-20250514", "name": "Claude Sonnet 4", "speed": "medium", "quality": "high" } ] }, ... ] }`, }, ], }, { id: "architecture", title: "Architecture", icon: "πŸ—οΈ", content: [ { heading: "4-Layer AI Factory Model", body: `The system follows an AI Factory architecture with four distinct layers: **Layer 1 β€” Graph Layer (TigerGraph Cloud)** Stores the knowledge graph with typed vertices and edges. Supports GSQL queries for multi-hop traversal. **Layer 2 β€” Orchestration Layer** Routes queries through the Adaptive Router, which scores complexity and classifies query types (bridge, comparison, factoid). **Layer 3 β€” LLM Layer (12 Providers)** Universal LLM abstraction supporting Claude, GPT-4, Gemini, Llama, Mistral, DeepSeek, Grok, Cohere, and more. **Layer 4 β€” Evaluation Layer (RAGAS)** Automated evaluation with F1, Exact Match, token counting, cost tracking, and latency measurement.`, }, { heading: "3-Pipeline Design", body: `Every query runs through all three pipelines concurrently (parallel execution): **Pipeline 1 β€” LLM-Only** Query β†’ LLM β†’ Answer - Fewest tokens (~84/query). Pure parametric knowledge, no retrieval. **Pipeline 2 β€” Basic RAG** Query β†’ Embed β†’ TigerGraph vector search β†’ Full chunk text β†’ LLM - More tokens (~290/query). Industry-standard retrieval baseline. **Pipeline 3 β€” GraphRAG** Query β†’ Embed β†’ TigerGraph vector search β†’ Compact entity descriptions (pre-indexed) β†’ LLM - Fewest retrieval tokens (~163/query). βˆ’44% vs Basic RAG, +28.7% F1. - Entity descriptions extracted once at ingest time β€” amortized cost.`, }, ], }, { id: "novelties", title: "Novel Features", icon: "✨", content: [ { heading: "1. Adaptive Query Router", body: `Analyzes query complexity (0.0–1.0) using: - Entity count β€” more entities = higher complexity - Multi-hop indicators β€” "both", "same", "compared to" - Question word analysis β€” "which" and "who" patterns - Dependency chain length Routes simple queries to Baseline RAG (fast, cheap) and complex queries to GraphRAG (precise, traceable).`, }, { heading: "2. Schema-Bounded Extraction", body: `Traditional NER extracts arbitrary entity types. Our system constrains extraction to TigerGraph's actual schema: - Only PERSON, LOCATION, WORK, CONCEPT, etc. (valid vertex types) - Eliminates hallucinated node types that would fail on graph lookup - Ensures every extracted entity maps to a real vertex in the graph`, }, { heading: "3. Dual-Level Keywords", body: `Extracts keywords at two granularity levels: - **High-level**: Concepts, themes, categories (e.g., "nationality", "American cinema") - **Low-level**: Specific entities, names, dates (e.g., "Scott Derrickson", "1962") Enables graph traversal at multiple levels for richer context retrieval.`, }, { heading: "4. Graph Reasoning Paths", body: `Traces explicit entityβ†’relationβ†’entity chains: - Scott Derrickson β†’ BORN_IN β†’ Denver, CO β†’ LOCATED_IN β†’ United States - Ed Wood β†’ BORN_IN β†’ Poughkeepsie, NY β†’ LOCATED_IN β†’ United States These paths are included in the LLM prompt as structured evidence, making answers verifiable and explainable.`, }, { heading: "5. Real-Time Cost Tracking", body: `Measures per-query economics: - Input/output tokens counted per provider's tokenization - USD cost calculated using current provider pricing - Latency measured end-to-end (graph + LLM) - Interactive projections: "What would 100K queries/month cost?"`, }, ], }, { id: "deployment", title: "Deployment", icon: "🐳", content: [ { heading: "Docker Deployment", code: `# Build the image docker build -t graphrag . # Run with environment variables docker run -d \\ -p 3000:3000 \\ -e TG_HOST=https://your-instance.i.tgcloud.io \\ -e TG_TOKEN=your_bearer_token \\ -e OPENAI_API_KEY=sk-... \\ -e HF_TOKEN=hf_... \\ graphrag`, }, { heading: "TigerGraph Cloud Setup", body: `1. Create a free account at tgcloud.io 2. Create a new cluster (free tier: 50MB storage) 3. Install the GraphRAG schema: - Go to GraphStudio - Import the schema from graphrag/setup_tigergraph.py 4. Set TIGERGRAPH_HOST, TIGERGRAPH_GRAPH, TIGERGRAPH_SECRET in .env`, }, { heading: "Running Locally", code: `# Backend (Python) cd graphrag-inference-hackathon pip install -r requirements.txt python -m graphrag.main # Frontend (Next.js) cd web npm install npm run dev # Open http://localhost:3000`, }, ], }, ]; export function DocsContent() { const [activeSection, setActiveSection] = useState("quickstart"); const section = SECTIONS.find(s => s.id === activeSection) || SECTIONS[0]; return (
{/* Sidebar */} {/* Mobile Tabs */}
{SECTIONS.map((s) => ( ))}
{/* Content */}
{section.icon}

{section.title}

{section.content.map((block, i) => (

{block.heading}

{block.body && (
{block.body.split(/(\*\*[^*]+\*\*)/).map((part, j) => { if (part.startsWith("**") && part.endsWith("**")) { return {part.slice(2, -2)}; } return {part}; })}
)} {block.code && (
                    {block.code}
                  
)}
))}
); }