Production RAG system with multi-agent reasoning, knowledge graph, and hybrid search for Oracle DB 26ai
Project description
ragcli: a friendly interface to Oracle Autonomous 26ai
A production-ready RAG system using Oracle Database 26ai for vector search and Ollama for local LLM inference. Ships with multi-agent reasoning, knowledge graph extraction, hybrid search, feedback loops, session memory, evaluation suite, and live document sync.
pip install oracle-ragcli
Notebooks
Interactive Jupyter notebooks demonstrating ragcli capabilities:
Architecture
- Frontend: React (Vite) + TailwindCSS
- Backend: FastAPI (25 endpoints)
- Database: Oracle Database 26ai Free (17 tables, vector + graph store)
- LLM: Ollama (local inference, multi-agent CoT pipeline)
- Search: Hybrid BM25 + Vector + Knowledge Graph with RRF fusion
- Memory: Multi-turn session management with query rewriting
Features
v2.0 — Graph-Augmented, Self-Improving Knowledge Engine
| Feature | What it does |
|---|---|
| Multi-Agent CoT | 4-agent reasoning pipeline (Planner, Researcher, Reasoner, Synthesizer) with full trace storage |
| Knowledge Graph | LLM-powered entity/relationship extraction, Oracle graph store, multi-hop traversal |
| Hybrid Search | BM25 + Vector + Graph signals fused with Reciprocal Rank Fusion (RRF) |
| Feedback Loops | Wilson score chunk quality, graph edge tuning, search weight adjustment |
| Session Memory | Multi-turn conversations, query rewriting, rolling summarization |
| Eval Suite | Synthetic Q&A generation, 4 LLM-judged metrics (faithfulness, relevance, precision, recall) |
| Live Sync | Watchdog file monitoring, git polling, URL polling, diff-chunking |
Core
- Oracle Database 26ai: AI Vector Search with HNSW/IVF auto-indexing
- Ollama: Local LLM inference (default:
qwen3.5:35b-a3bfor chat,nomic-embed-textfor embeddings) - 25 API endpoints: Documents, query, models, feedback, eval, sync, sessions
- 9 CLI commands:
ragcli eval synthetic|replay|report|runs,ragcli sync add|list|status|remove|events - 17 database tables: Documents, chunks, queries, sessions, knowledge graph, traces, feedback, eval, sync
- React frontend: Google-style search, drag-drop upload, animated vector heatmaps
- Document processing: PDF, Markdown, Text with configurable chunking (1000 tokens, 10% overlap)
- Deployment: PyPI (
pip install ragcli), Docker Compose, standalone binary
Prerequisites Before starting with ragcli:
- Oracle Database 26ai: Set up with vector capabilities. You will need to provide the name, password, and DSN in the config.yaml.
- Ollama: Download and run
ollama serveto start the server. Pull models:ollama pull nomic-embed-text(embeddings),ollama pull gemma3:270m(chat). - Python 3.9+: With pip installed.
See Annex A: Detailed Prerequisites for links on how to do the setup.
Installation
One-command install — clone, configure, and run in a single step:
curl -fsSL https://raw.githubusercontent.com/jasperan/ragcli/main/install.sh | bashAdvanced options
Override install location:
PROJECT_DIR=/opt/myapp curl -fsSL https://raw.githubusercontent.com/jasperan/ragcli/main/install.sh | bashOr install manually:
git clone https://github.com/jasperan/ragcli.git cd ragcli # See below for setup instructions
From Source (Recommended)
git clone https://github.com/jasperan/ragcli.git
cd ragcli
pip install -r requirements.txt
Usage
python ragcli.py
Docker Compose (Recommended)
Full stack with ragcli API, and Ollama:
Create the .env file
echo "ORACLE_PASSWORD=your_password" > .env
Update the config.yaml file with your Oracle DSN
docker-compose up -d
Pull the Ollama models
docker exec ollama ollama pull nomic-embed-text
docker exec ollama ollama pull gemma3:270m
Access the services
- ragcli API: http://localhost:8000/docs
- Ollama: http://localhost:11434
Docker (ragcli API only)
Build the image
docker build -t ragcli .
Run the image
docker run -d -p 8000:8000 -v $(pwd)/config.yaml:/app/config.yaml ragcli
Quick Start
- Configure:
cp config.yaml.example config.yaml
# Edit config.yaml: Set oracle DSN/username/password (use ${ENV_VAR} for secrets), ollama endpoint.
# Export env vars if using: export ORACLE_PASSWORD=yourpass
- Initialize Database (run once):
python ragcli.py db init # Creates tables and indexes in Oracle
- Launch CLI (REPL):
python ragcli.py
Now has an interactive menu system:
╔════════════════════════════════════════════════════════════════╗
║ RAGCLI INTERFACE ║
║ Oracle DB 26ai RAG System v2.0.0 ║
╚════════════════════════════════════════════════════════════════╝
Select Objective:
[1] Ingest: Document Upload
[2] Inquiry: Contextual Ask
[3] Knowledge: Manage Assets
[4] Insight: Chain Visualization
[5] Authority: DB Orchestration
[6] Health: System Status
[7] Audit: Integration Tests
[0] Terminate Session
- Type
helpfor classic commands. - Example:
upload document.txt,ask "What is RAG?",models list,db browse.
- Launch API Server:
python ragcli.py api --port 8000
- API docs: http://localhost:8000/docs
- Launch Premium Frontend (Optional but Recommended):
cd frontend
npm install
npm run dev
- Access at: http://localhost:5173
- Featuring: Google-style search bar, drag-and-drop upload, and animated results.
- Functional CLI Example:
python ragcli.py upload path/to/doc.pdf
python ragcli.py ask "Summarize the document" --show-chain
CLI Usage
- REPL Mode:
python ragcli.py→ Interactive shell with arrow-key navigation.- Gemini-style Interface: Rich, colorful, and intuitive TUI.
- Interactive File Explorer: Select files to upload using a navigable directory tree.
- Format Validation: Automatically checks for supported formats (TXT, MD, PDF) and warns if incompatible.
- Functional Mode:
python ragcli.py [options]. python ragcli.py upload --recursive folder/- Upload with progress barspython ragcli.py ask "query" --docs doc1,doc2 --top-k 3python ragcli.py models list- Show all available Ollama modelspython ragcli.py status --verbose- Detailed vector statisticspython ragcli.py db browse --table DOCUMENTS- Browse database tablespython ragcli.py db query "SELECT * FROM DOCUMENTS"- Custom SQL queriespython ragcli.py eval synthetic- Generate synthetic Q&A pairs and evaluatepython ragcli.py eval replay- Re-run past queries through current pipelinepython ragcli.py eval report- Display evaluation reportpython ragcli.py eval runs- List all evaluation runspython ragcli.py sync add /path/to/docs --pattern "*.md"- Watch a directorypython ragcli.py sync add ~/git/project --type git- Watch a git repopython ragcli.py sync list- List sync sourcespython ragcli.py sync status- Show sync overviewpython ragcli.py sync events- Recent sync events- See
python ragcli.py --helpfor full options.
Premium Web Interface The project includes a stunning, minimalist frontend inspired by Google AI Studio.
Features:
- Google-Style Search: A clean, elevated search bar with real-time feedback.
- Fluid Animations: Powered by
framer-motionfor a premium feel. - Drag-and-Drop: Easy document ingestion with visual previews.
- Material 3 Design: Rounded corners, generous whitespace, and Google Sans typography.
- Visual Vector Search: Real-time heatmap of query vs result embeddings.
Usage:
- Ensure the backend is running:
ragcli api - Start the frontend:
cd frontend && npm run dev - Navigate to
http://localhost:5173
API Integration
- FastAPI Backend: RESTful API with Swagger documentation at
/docs - Docker Compose: One-command deployment with
docker-compose up -d - API Endpoints:
POST /api/documents/upload- Upload documentsGET /api/documents- List documentsPOST /api/query- RAG query (supportssession_idfor multi-turn)GET /api/models- List Ollama modelsGET /api/status- System healthGET /api/stats- Database statisticsPOST /api/feedback- Submit answer/chunk feedbackGET /api/feedback/stats- Feedback quality trendsPOST /api/eval/run- Trigger evaluation runGET /api/eval/runs- List eval runsGET /api/eval/runs/{id}- Run details with resultsPOST /api/sync/sources- Add sync sourceGET /api/sync/sources- List sync sourcesDELETE /api/sync/sources/{id}- Remove sync sourceGET /api/sync/events- Recent sync eventsGET /api/sessions- List sessionsGET /api/sessions/{id}/turns- Session history
Configuration
Edit config.yaml:
oracle:
dsn: "localhost:1521/FREEPDB1"
username: "rag_user"
password: "${ORACLE_PASSWORD}"
ollama:
endpoint: "http://localhost:11434"
chat_model: "gemma3:270m"
- api: Host, port (8000), CORS origins, Swagger docs.
- documents: Chunk size (1000), overlap (10%), max size (100MB).
- rag: Top-k (5), min similarity (0.5).
- search: Strategy (hybrid), RRF k (60), signal weights (bm25, vector, graph).
- memory: Session timeout (30min), max recent turns (5), summarize interval.
- knowledge_graph: Enabled, max entities per chunk (10), dedup threshold (0.9), max hops (2).
- feedback: Quality boost range (0.15), recalibrate threshold (50).
- evaluation: Pairs per chunk (2), max chunks per doc (20), live scoring toggle.
- sync: Poll interval (300s), debounce (2s), max file size (50MB).
- logging: Level (INFO), file rotation, detailed metrics.
Safe loading handles env vars (e.g., ${ORACLE_PASSWORD}) and validation.
New CLI Features
Enhanced Progress Tracking
Upload documents with real-time progress bars showing:
- File processing status
- File processing status
- Chunking progress
- Embedding generation with ETA
- Database insertion progress
Example:
python ragcli.py upload large_document.pdf
# ... progress bar animation ...
# Then displays summary:
# ╭───────────────────────────────────────────────────── Upload Summary ─────────────────────────────────────────────────────╮
# │ Document ID: 68b152f0-5c22-4952-a552-8bc47de29427 │
# │ Filename: test_document.txt │
# │ Format: TXT │
# │ Size: 0.11 KB │
# │ Chunks: 1 │
# │ Total Tokens: 22 │
# │ Upload Time: 826 ms │
# ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Interactive File Explorer
When running upload without arguments (or selecting "Ingest" from the menu), ragcli launches a TUI file explorer:
? Current Directory: /home/user/documents
.. (Go Up)
📁 reports/
📁 data/
❯ 📄 analysis.pdf
📄 notes.txt
❌ Cancel
- Navigate directories with Enter.
- Select files with Enter.
- Only shows validation-compliant files.
Detailed Status & Monitoring
python ragcli.py status --verbose
# ragcli Status
# ┏━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
# ┃ Component ┃ Status ┃ Details ┃
# ┡━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
# │ Database │ connected │ Oracle DB connected successfully │
# │ Documents │ ok │ 5 docs, 3 vectors │
# │ Ollama │ connected │ Ollama connected (24 models) │
# │ Overall │ issues │ Some issues detected │
# └────────────┴──────────────┴──────────────────────────────────────────────────────────────────────────────────────────────┘
#
# ═══ Vector Statistics ═══
# ... (tables for Vector Config, Storage, Performance)
Interactive Database Browser
python ragcli.py db browse --table DOCUMENTS --limit 20
# DOCUMENTS (Rows 1-5 of 6)
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
# ┃ ID ┃ Filename ┃ Format ┃ Size (KB) ┃ Chunks ┃ Tokens ┃ Uploaded ┃
# ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
# │ 68b152f0-5c22... │ test_document.txt │ TXT │ 0.11 │ 1 │ 22 │ 2026-01-05 16:34:47.038679 │
# └──────────────────────────────────┴───────────────────┴────────┴───────────┴────────┴────────┴────────────────────────────┘
ragcli db query "SELECT * FROM DOCUMENTS WHERE file_format='PDF'"
ragcli db stats
Browse tables with pagination, execute custom SQL queries, view database statistics.
Model Management
ragcli models list
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓
# ┃ Model Name ┃ Type ┃ Size ┃ Modified ┃
# ┡━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩
# │ gemma3:270m │ Chat/LLM │ 0.27 GB │ 2026-01-05T15:00:52 │
# │ nomic-embed-text:latest │ Embedding │ 0.26 GB │ 2025-11-14T21:38:46 │
# └─────────────────────────┴───────────┴──────────┴─────────────────────┘
ragcli models validate # Validate configured models
ragcli models check llama3 # Check if specific model exists
Oracle AI Vector Search Integration
ragcli now integrates langchain-oracledb for enhanced document processing:
- OracleTextSplitter: Database-side chunking.
- OracleDocLoader: Load documents using Oracle's loaders.
- OracleEmbeddings: Generate embeddings within the database (using loaded ONNX models or external providers).
- OracleSummary: Generate summaries using database tools.
Testing Oracle Integrations
A dedicated command group oracle-test is available to verify these features:
python ragcli.py oracle-test all # Run full test suite
python ragcli.py oracle-test loader /path/to/doc # Test document loader
python ragcli.py oracle-test splitter --text "..." # Test text splitter
python ragcli.py oracle-test summary "..." # Test summarization
python ragcli.py oracle-test embedding "..." # Test embedding generation
You can also access the Test Suite from the interactive REPL menu (Option 7).
Using Oracle In-Database Embeddings for Document Upload
By default, ragcli uses Ollama for embedding generation. To use langchain-oracledb's OracleEmbeddings for in-database embedding generation (using ONNX models loaded into Oracle DB), update your config.yaml:
vector_index:
use_oracle_embeddings: true
oracle_embedding_params:
provider: "database"
model: "ALL_MINILM_L12_V2" # ONNX model loaded in Oracle DB
This eliminates external API calls for embeddings and leverages Oracle's native AI capabilities.
Troubleshooting
- Ollama unreachable: Run
ollama serveand check endpoint. Useragcli models listto verify. - Oracle DPY-1005 (Busy Connection): Fixed! Ensure you are using the latest version which properly handles connection pooling and closure.
- Oracle ORA-01745/01484 (Vector Ingestion): Fixed! Vector ingestion now uses robust
TO_VECTORwith JSON-serialized input for maximum compatibility. - Looping/Stuck Upload: Fixed! Corrected infinite loop in
chunk_textfor small documents (<100 tokens). - Model not found: Run
ragcli models validatefor suggestions. Pull withollama pull. - API connection: Check
ragcli apiis running. Test withcurl http://localhost:8000/api/status. - Logs: Check
./logs/ragcli.logfor details (DEBUG mode for verbose).
For issues, run with --debug or set app.debug: true.
Annex A: Detailed Prerequisites
- Ollama: https://ollama.com/ -
curl -fsSL https://ollama.com/install.sh | sh - Oracle 26ai: Enable vector search; connect via oracledb (no wallet needed for TLS).
- Models: Ensure pulled in Ollama.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file oracle_ragcli-2.0.1.tar.gz.
File metadata
- Download URL: oracle_ragcli-2.0.1.tar.gz
- Upload date:
- Size: 102.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d04be4ec06087b5820f31bf420438c1febbd62464f81241799744cbcb365b174
|
|
| MD5 |
8673cadcc3941119c33fd86eafe0bd7c
|
|
| BLAKE2b-256 |
9290763cbd901a426eef435c294c2b49226434dbf68889ddf1673af1a4ec8ac0
|
File details
Details for the file oracle_ragcli-2.0.1-py3-none-any.whl.
File metadata
- Download URL: oracle_ragcli-2.0.1-py3-none-any.whl
- Upload date:
- Size: 130.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
12267637ecb2904f255d314229e01b36d246388b4989d5dbe77adfbfcca59237
|
|
| MD5 |
0ce572cca6b95164d38dbfb789d42dda
|
|
| BLAKE2b-256 |
7f44fb70c39519f2293f886d7f14dfdd5dfaa8e76cfbec8d01154f562e9a3af8
|