SightRAG
See. Search. Retrieve.
A pluggable visual RAG system. Any detection model. Any embedding model. Any vector store. Three lines of code.
Quick Start
from sightrag import SightRAG
rag = SightRAG()
rag.index("./photos/")
results = rag.query("find empty shelf")
rag.show(results)
Install
pip install sightrag
For faster inference:
pip install sightrag[onnx] # 2x faster (any CPU)
For v0.4 features:
pip install sightrag[ocr] # reads text on images
pip install sightrag[multimodal] # LLM understanding
pip install sightrag[grounding-dino] # any domain detection
pip install sightrag[reid] # person tracking
pip install sightrag[cli] # terminal commands
pip install sightrag[qdrant] # large scale store
pip install sightrag[all] # everything
What's New in v0.4
- OCR integration : reads text on products, signs, labels, documents during indexing. "find Calgon 2kg" matches actual text on packaging. Zero query-time overhead.
- Multimodal LLM : optional semantic understanding at query time. Local models (Qwen2-VL) or API (GPT-4o). Use
understand=Truefor deep queries. - Text + visual hybrid search : OCR text match boosts CLIP visual scores automatically.
- All v0.3 features : Grounding DINO, Person Re-ID, CLI, Qdrant, re-ranking.
- Backward compatible : v0.1/v0.2/v0.3 code works unchanged.
What SightRAG Is
SightRAG is not a model. Not a wrapper. Not a framework plugin.
It is a complete visual retrieval system. You provide any detection model, any embedding model, any vector store. SightRAG handles the pipeline: load, detect, embed, index, retrieve.
All models and indexes are stored in ~/.sightrag/ : your project folder stays clean.
Project Structure
sightrag/
├── sightrag/
│ ├── core.py ← SightRAG main class
│ ├── backends/ ← auto-select fastest inference
│ │ ├── pytorch_backend.py ← default (works everywhere)
│ │ ├── onnx_backend.py ← 2x faster (any CPU)
│ │ ├── tensorrt_backend.py ← fastest (NVIDIA GPU)
│ │ └── openvino_backend.py ← Intel CPU optimized
│ ├── detectors/base.py ← plug custom detection model
│ ├── embedders/base.py ← plug custom embedding model
│ ├── store/ ← SQLite (default) + ChromaDB
│ ├── visualizer.py ← rag.show() with bounding boxes
│ ├── indexer.py ← C++ core with Python fallback
│ ├── retriever.py ← text + reference queries
│ └── api.py ← REST API (FastAPI)
│
├── cpp/ ← C++ speed core (optional)
├── demo_sightrag/ ← demo scripts + test data
│ ├── sightrag_images.py ← image folder demo
│ ├── sightrag_video.py ← video indexing demo
│ ├── sightrag_livecam.py ← webcam demo
│ ├── sightrag_restapi.py ← REST API demo
│ ├── input_images/ ← sample images
│ └── reference_images/ ← reference query images
├── notebooks/ ← Colab notebook
├── tests/ ← unit tests
└── docs/ ← documentation
How To Test
# Quick test
python test_sightrag.py
# Demo scripts
python demo_sightrag/sightrag_images.py
python demo_sightrag/sightrag_video.py
python demo_sightrag/sightrag_livecam.py
# Colab
Upload notebooks/SightRAG_v0.2_Demo.ipynb → Run All
# Unit tests
python -m pytest tests/ -v
Usage
Image Folder
rag = SightRAG()
rag.index("./shelf_photos/")
results = rag.query("find empty shelf")
rag.show(results)
Video File
rag = SightRAG()
rag.index("./cctv_footage.mp4")
results = rag.query("person near exit door")
rag.show(results, save="./evidence/")
Mixed Folder (images + videos)
rag = SightRAG()
rag.index("./my_data/")
Live Camera
rag = SightRAG()
rag.index(source="camera")
results = rag.query("find person")
Reference Image Query
results = rag.query(reference="./sample_shelf.jpg")
rag.show(results)
Custom Domain
rag = SightRAG(domain_hint="pcb defect solder joint")
rag.index("./circuit_boards/")
results = rag.query("find defective solder joint")
Visualize Results
results = rag.query("find person")
# Display on screen
rag.show(results)
# Save annotated images with bounding boxes
rag.show(results, save="./output/")
OCR Search : Read Text (NEW in v0.4)
SightRAG reads text on images during indexing. Query matches both visual features AND text content.
rag = SightRAG(ocr=True)
rag.index("./store_photos/")
results = rag.query("find Calgon") # matches OCR text on packaging
results = rag.query("find EXIT sign") # matches text on signs
results = rag.query("find plate AB1234") # matches license plate text
OCR runs at INDEX time only. Zero overhead at query time.
Multimodal Understanding (NEW in v0.4)
Optional LLM-powered semantic understanding. Runs on top candidates only, not all images.
# Local model (free, private)
rag = SightRAG(ocr=True, multimodal="qwen2-vl")
results = rag.query("find damaged product", understand=True)
# API model (most accurate)
rag = SightRAG(multimodal="gpt-4o", api_key="...")
results = rag.query("find suspicious activity", understand=True)
# Without understand=True, query is instant (no LLM call)
results = rag.query("find person") # fast, no LLM
Grounding DINO : Any Domain
Detect ANY object by text description. No training needed.
rag = SightRAG(detector="grounding-dino")
rag.index("./circuit_boards/")
results = rag.query("find cracked solder joint")
rag.show(results)
Works on any domain: medical, industrial, satellite, retail : just type what to find.
Person Re-ID : Cross-Camera Tracking
Track same person across multiple cameras.
rag = SightRAG(embedder="reid")
rag.index("./camera_01/")
rag.index("./camera_02/")
results = rag.query(reference="./suspect.jpg")
rag.show(results)
Returns every camera and timestamp where that person appeared.
CLI Tool
pip install sightrag[cli]
sightrag index ./photos/
sightrag index ./video.mp4 --fps 2
sightrag query "find person near exit"
sightrag query --reference ./suspect.jpg --top-k 10
sightrag show --query "find person" --save ./output/
sightrag status
sightrag clear
sightrag serve --port 8000
Re-ranking : Better Accuracy
Improves result quality on large similar datasets.
rag = SightRAG(rerank=True)
rag.index("./100k_shelf_images/")
results = rag.query("find empty shelf", top_k=5)
# Fetches top 100, re-ranks to best 5
Pluggable Models
Custom Detector
from sightrag import SightRAG
from sightrag.detectors.base import DetectorBase
class MyDetector(DetectorBase):
def __init__(self):
self.model = load_my_model()
def detect(self, image, confidence=0.25):
preds = self.model.predict(image)
return [
{"bbox": [p.x1, p.y1, p.x2, p.y2],
"label": p.label,
"confidence": p.score,
"crop": image.crop((p.x1, p.y1, p.x2, p.y2))}
for p in preds if p.score >= confidence
]
rag = SightRAG(detector=MyDetector())
Custom Embedder
from sightrag.embedders.base import EmbedderBase
import numpy as np
class MyEmbedder(EmbedderBase):
embed_dim = 768
def embed_image(self, image):
vec = self.model.encode_image(image)
return vec / np.linalg.norm(vec)
def embed_text(self, text, domain_hint=None):
vec = self.model.encode_text(text)
return vec / np.linalg.norm(vec)
rag = SightRAG(embedder=MyEmbedder())
Custom Store
from sightrag.store.base import VectorStoreBase
class MyStore(VectorStoreBase):
def add(self, id, embedding, metadata): ...
def search(self, query_vector, top_k): ...
def count(self): ...
def clear(self): ...
rag = SightRAG(store=MyStore())
Speed : Auto Backend Selection
SightRAG automatically picks the fastest available backend:
| Backend | Speed | Hardware | Install |
|---|---|---|---|
| PyTorch (default) | baseline | any | pip install sightrag |
| ONNX | ~2x faster | any CPU | pip install sightrag[onnx] |
| OpenVINO | ~1.5x faster | Intel CPU | pip install sightrag[openvino] |
| TensorRT | ~3-5x faster | NVIDIA GPU | pip install sightrag[tensorrt] |
No configuration needed. SightRAG auto-detects what's installed and picks the fastest.
REST API
pip install sightrag[api]
sightrag-server
| Method | Endpoint | Description |
|---|---|---|
| GET | / |
API info |
| GET | /status |
Index stats |
| POST | /index/folder |
Index images/videos |
| POST | /query/text |
Search with text |
| POST | /query/reference |
Search with image |
| DELETE | /index |
Clear index |
Result Format
{
"image_path": "./photos/shelf_042.jpg",
"score": 0.9134,
"label": "bottle",
"confidence": 0.8721,
"bbox": [120, 45, 380, 290],
"timestamp": "",
"source_type": "image"
}
Storage
| Store | Scale | Install |
|---|---|---|
| SQLite (default) | up to 100k images | built-in |
| ChromaDB | medium scale | pip install sightrag[chroma] |
| Qdrant (NEW) | 1M+ images | pip install sightrag[qdrant] |
| Custom | any | implement VectorStoreBase |
rag = SightRAG(store="sqlite") # default, up to 100k
rag = SightRAG(store="chroma") # medium scale
rag = SightRAG(store="qdrant") # production, 1M+
Architecture
Docker
docker-compose up
API at http://localhost:8000/docs
Three Library Ecosystem
| Library | Purpose | Status |
|---|---|---|
| SightRAG | Visual RAG : See. Search. Retrieve. | v0.4 |
| adaptive-intelligence | RL-based RAG orchestration | v4.0 |
| llmevalkit | LLM evaluation (78+ metrics) | Stable |
Roadmap
| Version | Focus |
|---|---|
| v0.1 | Core pipeline : image, video, camera, REST API |
| v0.2 | Speed : C++ core, auto backends, pluggable models, rag.show() |
| v0.4 | Intelligence : Grounding DINO, Person Re-ID, CLI, Qdrant, re-ranking |
| v0.4 (current) | Understanding : OCR reads text, multimodal LLM, hybrid search |
| v1.0 | Production : edge deployment, compliance, enterprise |
License
Apache 2.0
Author
Built by Venkatkumar Rajan
- GitHub: https://github.com/VK-Ant
- LinkedIn: https://linkedin.com/in/vk-ant
- Portfolio: https://vk-ant.github.io/Venkatkumar
Metadata
Release files for sightrag 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| sightrag-0.5.0.tar.gz | 59.7 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sightrag-0.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 129.9 kB
Release files / sightrag-0.5.0.tar.gz
| Download URL | sightrag-0.5.0.tar.gz |
|---|---|
| Size | 59.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e20e42ae5d1e89ade4e5aa0c785f82cceba7be46a636906fe5ef7172248e21ea
|
|
BLAKE2b-256 checksum How to use checksums |
c6d0ba464f8222eb4d8d435f1bce938e17bc94819aa79de6b58de8b772e6e08d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.0
|
Release files / sightrag-0.5.0-py3-none-any.whl
| Download URL | sightrag-0.5.0-py3-none-any.whl |
|---|---|
| Size | 70.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d285bb1497a575a133d1c43b694385a2d4dfc31a6dfbb9154a09732434f7f98f
|
|
BLAKE2b-256 checksum How to use checksums |
0d597d4f5c82a712423f5b8cb41b87ad42346b9bddfb4a40f61bd5235e537e43
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.0
|
Security for sightrag 0.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.