Document intelligence that adapts, accelerates, and scales.
What is DocQWise?
DocQWise is a pluggable, high-performance document intelligence engine for structured and unstructured data. Read any document format, extract exact structured data, and retrieve with semantic search : locally, at scale, for zero per-page cost.
Not a parser. Not a framework. A platform in a library.
Key Features
- Read anything : PDF, DOCX, images, Excel, CSV, JSON, XML, databases, emails, presentations
- Extract everything : text, tables, fields, forms, entities, images, layout with bounding boxes
- Pluggable everything : bring your own OCR, vector DB, LLM, database, graph store
- Speed-first : multiprocessing, async I/O, GPU batching, batch processing
- Incremental : hash-based change detection, never reprocess unchanged files
- Self-improving : user corrections stored as exact overrides, applied automatically
- Local-first : zero cloud dependency, zero per-page cost, your data stays yours
- Deterministic : same input = same output, always
Architecture
Installation
# Core (PDF, DOCX, TXT, images, SQLite store)
pip install docqwise
# With ML models (OCR, layout, embeddings)
pip install docqwise[ml]
# Full processing (pandas, Excel, tables, BM25)
pip install docqwise[full]
# Cloud API connectors (OpenAI, Azure, AWS, Google)
pip install docqwise[api]
# Vector store connectors (Qdrant, FAISS, ChromaDB, pgvector)
pip install docqwise[connectors]
# GraphRAG (NetworkX, Neo4j, Kuzu)
pip install docqwise[graph]
# REST API server (FastAPI)
pip install docqwise[server]
# Everything
pip install docqwise[all]
Docker
# Quick start
docker run -p 8000:8000 -v ./docs:/data vkant/docqwise:latest
# Docker Compose
docker compose up -d
Quick Start
from docqwise import Docqwise
dq = Docqwise()
# Ingest documents
dq.ingest("documents/")
# Semantic search
results = dq.retrieve("payment terms", top_k=5)
# Natural language Q&A
answer = dq.ask("What is the total amount?")
# Field extraction
fields = dq.extract_fields("invoice.pdf", template="invoice")
# Table extraction
tables = dq.extract_tables("report.pdf")
df = tables[0].to_dataframe()
Extract from Any Source
dq = Docqwise()
# Documents
dq.ingest("report.pdf")
dq.ingest("contract.docx")
dq.ingest("scan.tiff")
# Structured data
dq.ingest("data.csv")
dq.ingest("transactions.xlsx")
# Databases
dq.ingest("postgresql://host/db", tables=["invoices"])
dq.ingest("mongodb://host/db", collections=["contracts"])
# Cloud storage
dq.ingest("s3://bucket/documents/")
# Folders (auto-detect all formats)
dq.ingest("documents/")
Field Extraction
# Auto-detect fields
fields = dq.extract_fields("invoice.pdf")
# Schema-driven extraction
fields = dq.extract_fields("invoice.pdf", schema={
"vendor_name": {"type": "string"},
"total": {"type": "number"},
"due_date": {"type": "date"},
"line_items": {"type": "array"},
})
# Pre-built templates
fields = dq.extract_fields("invoice.pdf", template="invoice")
Self-Improving Corrections
result = dq.extract_fields("invoice.pdf", template="invoice")
# Fix a wrong field
result.correct({"tax": 1402.00, "po_number": "PO-8891"})
# Next similar document : correction applied automatically
result2 = dq.extract_fields("invoice_002.pdf")
# tax and po_number now extracted correctly
Query Structured Data
dq.ingest("sales.xlsx")
dq.ask("What is the total amount?") # → exact SUM computation
dq.ask("Which vendor has highest sales?") # → GROUP BY + MAX
dq.ask("How many invoices are overdue?") # → COUNT + WHERE filter
dq.ingest("postgresql://host/db", tables=["invoices"])
dq.ask("Show me vendors with outstanding invoices") # → SQL JOIN
Parallel Processing
dq = Docqwise(
workers=8, # CPU processes
gpu_workers=2, # GPU inference
threads=4, # I/O threads
batch_size=32, # model batch size
)
await dq.ingest_async("documents/", show_progress=True)
# ████████████████████░░░░ 8,421/10,000 | 142 docs/sec | ETA: 11s
Pipeline DAG
from docqwise.pipeline import Pipeline
pipe = Pipeline("invoice_processing")
pipe.add_node("read", node_type="reader")
pipe.add_node("ocr", node_type="ocr", engine="easyocr")
pipe.add_node("extract", node_type="field_extractor", template="invoice")
pipe.add_node("store", node_type="vector_store", backend="qdrant")
pipe.connect("read", "ocr")
pipe.connect("ocr", "extract")
pipe.connect("extract", "store")
results = await pipe.run("invoices/", workers=8)
Docker Deployment
# REST API server
docker compose up -d
# Access API
curl -X POST http://localhost:8000/extract \
-F "file=@invoice.pdf" \
-F "template=invoice"
MCP Server
from docqwise.mcp import DocqwiseMCPServer
server = DocqwiseMCPServer(store_path="./docqwise_db")
server.run(port=8080)
CLI
docqwise ingest ./docs --workers 8 --progress
docqwise extract invoice.pdf --template invoice
docqwise query "payment terms" --top-k 5
docqwise ask "What is the total?" --source data.xlsx
docqwise serve --port 8000
docqwise mcp --port 8080
Ecosystem
DocQWise is part of the VK-Ant open-source AI ecosystem:
| Library | Tagline | Domain |
|---|---|---|
| SightRAG | See. Search. Retrieve. | Visual intelligence |
| sonarwise | Hear. Search. Retrieve. | Audio intelligence |
| docqwise | Read. Extract. Retrieve. | Document intelligence |
| adaptive-intelligence | Learn. Remember. Adapt. | Orchestration |
| llmevalkit | Evaluate. Score. Improve. | Evaluation |
License
Apache License 2.0
Author
Venkatkumar Rajan
Sometimes the ant carries the elephant. 🐜
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 docqwise-0.1.1.tar.gz.
File metadata
- Download URL: docqwise-0.1.1.tar.gz
- Upload date:
- Size: 29.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
baf101c5bae5ed1534def52ef9813e6af38067a2b8a9a0c0096f0fb09a38563c
|
|
| MD5 |
3a88aa5e6d90894700a4415b0aadb3e1
|
|
| BLAKE2b-256 |
7b6dec4e5efe9189251da2c3f610f91f1b03546c5d7cfa4e4a2beaf0d63fc81b
|
File details
Details for the file docqwise-0.1.1-py3-none-any.whl.
File metadata
- Download URL: docqwise-0.1.1-py3-none-any.whl
- Upload date:
- Size: 33.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bec676769aba5a711758282ea1c4c11b88ecfd084d5824666aeec490b872a74e
|
|
| MD5 |
4c428f494b806a61d11f77fbb5ccf053
|
|
| BLAKE2b-256 |
cead9180750bb0653dd2d0723c43563450a3ea94963c612965a9518c23d04299
|