graphrag-cli
A modern Terminal User Interface (TUI) for GraphRAG operations, built with Ratatui.
Features
- Multi-pane TUI — Results viewer, Raw results, tabbed Info panel (Stats / Sources / History)
- Markdown rendering — LLM answers rendered with bold, italic, headers, bullet points, code blocks
- Three query modes — ASK (fast), EXPLAIN (confidence + sources), REASON (query decomposition)
- Zero-LLM support — Algorithmic pipeline with hash embeddings, no model required
- Vim-style navigation — j/k scrolling, Ctrl+1/2/3/4 focus switching
- Slash command system —
/config,/load,/mode,/reason,/export,/workspace, and more - Query history — Tracked per session, exportable to Markdown
- Workspace persistence — Save/load knowledge graphs to disk
- Direct integration — Uses
graphrag-coreas a library (no HTTP server needed)
Installation
cd graphrag-rs
# Debug build (fast compile)
cargo build -p graphrag-cli
# Release build (optimized)
cargo build -p graphrag-cli --release
Quick Start — Zero LLM (Symposium example)
Build a knowledge graph from Plato’s Symposium with no LLM required — pure algorithmic extraction using regex patterns, TF-IDF, BM25, and PageRank.
Option A — Interactive TUI
cd /home/dio/graphrag-rs
cargo run -p graphrag-cli -- tui
Then inside the TUI:
/config tests/e2e/configs/algo_hash_medium__symposium.json5
/load docs-example/Symposium.txt
Who is Socrates and what is his role in the Symposium?
Graph builds in ~3-5 seconds. No Ollama needed.
Option B — TUI with config pre-loaded
cargo run -p graphrag-cli -- tui \
--config tests/e2e/configs/algo_hash_medium__symposium.json5
Then just:
/load docs-example/Symposium.txt
What is Eros according to Aristophanes?
Option C — Benchmark (non-interactive, JSON output)
cargo run -p graphrag-cli -- bench \
--config tests/e2e/configs/algo_hash_medium__symposium.json5 \
--book docs-example/Symposium.txt \
--questions "Who is Socrates?|What is love according to Aristophanes?|What is the Ladder of Beauty?"
Outputs structured JSON with timings, entity counts, answers, confidence scores, and source references.
Available configs
| Config | Graph building | Embeddings | LLM synthesis | Speed |
|---|---|---|---|---|
algo_hash_small__symposium.json5 | NLP/regex | Hash (256d) | ❌ none | ~1-2s |
algo_hash_medium__symposium.json5 | NLP/regex | Hash (384d) | ❌ none | ~3-5s |
algo_nlp_mistral__symposium.json5 | NLP/regex | nomic-embed-text | ✅ mistral-nemo | ~5-15s* |
kv_no_gleaning_mistral__symposium.json5 | LLM single-pass | nomic-embed-text | ✅ mistral-nemo | ~30-60s |
* build ~5s, synthesis ~5-10s per question (with KV cache after the first)
algo_nlp_mistral__symposium.json5 is the recommended config for anyone who wants:
- a graph built quickly with classic NLP methods (no LLM at build time)
- real semantic search with
nomic-embed-text - answers synthesized by Mistral at query time with KV cache enabled
Quick Start — With Ollama (full semantic pipeline)
Requires Ollama running with nomic-embed-text and an LLM (e.g. mistral-nemo:latest).
cargo run -p graphrag-cli -- tui \
--config tests/e2e/configs/kv_no_gleaning_mistral__symposium.json5
Inside TUI:
/load docs-example/Symposium.txt
/mode explain
How does Diotima describe the ascent to absolute beauty?
The EXPLAIN mode shows confidence score and source references in the Sources tab (Ctrl+4 → Ctrl+N).
CLI Commands
graphrag-cli [OPTIONS] [COMMAND]
Options:
-c, --config <FILE> Configuration file to pre-load
-w, --workspace <NAME> Workspace name
-d, --debug Enable debug logging
--format <text|json> Output format (default: text)
Commands:
tui Start interactive TUI (default)
setup Interactive wizard to create a config file
validate Validate a configuration file
bench Run full E2E benchmark (Init → Load → Query)
workspace Manage workspaces (list, create, info, delete)
bench example
cargo run -p graphrag-cli -- bench \
-c my_config.json5 \
-b my_document.txt \
-q "Question 1?|Question 2?|Question 3?"
Output JSON includes: init_ms, build_ms, total_query_ms, entities, relationships, chunks, per-query answer, confidence, sources.
TUI Layout
┌─────────────────────────────────────────────────────────────┐
│ Query Input (Ctrl+1) (type queries or /commands here) │
├────────────────────────────────────┬────────────────────────┤
│ Results Viewer (Ctrl+2) │ Info Panel (Ctrl+4) │
│ Markdown-rendered LLM answer │ ┌─Stats─┬─Sources─┬ │
│ with confidence header in EXPLAIN │ │ │History │ │
│ mode: [EXPLAIN | 85% ████████░░] │ └───────┴─────────┘ │
├────────────────────────────────────┤ Ctrl+N cycles tabs │
│ Raw Results (Ctrl+3) │ (when Info focused) │
│ Sources list / search results │ │
│ before LLM processing │ │
└────────────────────────────────────┴────────────────────────┘
│ Status Bar [mode badge] ℹ status message │
└─────────────────────────────────────────────────────────────┘
Keyboard Shortcuts
Global (IDE-Safe)
| Key | Action |
|---|---|
? / Ctrl+H | Toggle help overlay |
Ctrl+C | Quit |
Ctrl+N | Cycle focus forward (Input → Results → Raw → Info) |
Ctrl+P | Cycle focus backward |
Ctrl+1 | Focus Query Input |
Ctrl+2 | Focus Results Viewer |
Ctrl+3 | Focus Raw Results |
Ctrl+4 | Focus Info Panel |
Ctrl+N (Info Panel focused) | Cycle tabs: Stats → Sources → History |
Esc | Return focus to input |
Input Box
| Key | Action |
|---|---|
Enter | Submit query or /command |
Ctrl+D | Clear input |
Scrolling (when viewer focused)
| Key | Action |
|---|---|
j / ↓ | Scroll down one line |
k / ↑ | Scroll up one line |
Alt+↓ / Alt+↑ | Scroll down/up (works even from input) |
PageDown / Ctrl+D | Scroll down one page |
PageUp / Ctrl+U | Scroll up one page |
Home / End | Jump to top / bottom |
Slash Commands
| Command | Description |
|---|---|
/config <file> | Load a config file (JSON5, JSON, TOML) |
/config show | Display the currently loaded config |
/load <file> | Load and process a document |
/load <file> --rebuild | Force full rebuild before loading |
/clear | Clear graph (keep documents) |
/rebuild | Re-extract from loaded documents |
/stats | Show entity/relationship/chunk counts |
/entities [filter] | List entities, optionally filtered |
/mode ask|explain|reason | Switch query mode (sticky) |
/reason <query> | One-shot reasoning query (decomposition) |
/export <file.md> | Export query history to Markdown |
/workspace list | List saved workspaces |
/workspace save <name> | Save current graph to disk |
/workspace <name> | Load a saved workspace |
/workspace delete <name> | Delete a workspace |
/help | Show full command help |
Query Modes
Switch with /mode <mode> or the badge in the status bar shows the active mode.
| Mode | Command | What it does |
|---|---|---|
ASK (default) | /mode ask | Plain answer, fastest |
EXPLAIN | /mode explain | Answer + confidence score + source references; Sources tab auto-opens |
REASON | /mode reason | Query decomposition — splits complex questions into sub-queries |
One-shot override (doesn’t change sticky mode):
/reason Compare the main arguments of each speaker about love
Architecture
graphrag-cli/src/
├── main.rs # CLI entry point (clap)
├── app.rs # Main event loop, action routing
├── action.rs # Action enum, QueryMode, QueryExplainedPayload
├── commands/mod.rs # Slash command parser
├── config.rs # Config file loading (JSON5/JSON/TOML)
├── theme.rs # Dark/light color themes
├── tui.rs # Terminal setup/teardown
├── query_history.rs # Per-session query history
├── workspace.rs # Workspace metadata management
├── mode.rs # Input mode detection
├── handlers/
│ ├── graphrag.rs # Thread-safe GraphRAG wrapper (Arc<Mutex<>>)
│ ├── bench.rs # Benchmark runner (JSON output)
│ └── file_ops.rs # File utilities
└── ui/
├── markdown.rs # Markdown → ratatui Line<'static> parser
├── spinner.rs # Braille spinner animation
└── components/
├── query_input.rs # Text input widget
├── results_viewer.rs # Markdown-rendered answer + scrollbar
├── raw_results_viewer.rs # Raw search results
├── info_panel.rs # 3-tab panel (Stats/Sources/History)
├── status_bar.rs # Status + query mode badge
└── help_overlay.rs # Modal help popup
Technology Stack
- Ratatui 0.29 — TUI framework (immediate mode rendering)
- Crossterm 0.28 — Cross-platform terminal events
- tui-textarea 0.7 — Multi-line input widget
- Tokio 1.32 — Async runtime
- Clap 4.5 — CLI argument parsing
- Dialoguer 0.11 — Interactive setup wizard
- color-eyre 0.6 — Error reporting
- graphrag-core — Knowledge graph engine (direct library call)
License
Same license as the parent graphrag-rs project.