Skip to main content

SightRAG Banner

SightRAG

See. Search. Retrieve.

PyPI License Python Open In Colab

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=True for 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

arc

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

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)

Source distribution for sightrag 0.5.0
File Size Uploaded Provenance
sightrag-0.5.0.tar.gz 59.7 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for sightrag 0.5.0
File Interpreter ABI Platform
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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page