Metadata-Version: 2.4
Name: docpipe-sdk
Version: 0.6.0
Summary: Unified document parsing, structured extraction, vector ingestion, and RAG pipeline SDK
Project-URL: Homepage, https://docpipe.sunnysinha.online
Project-URL: Documentation, https://docpipe.sunnysinha.online
Project-URL: Repository, https://github.com/thesunnysinha/docpipe
Project-URL: Bug Tracker, https://github.com/thesunnysinha/docpipe/issues
Project-URL: Changelog, https://github.com/thesunnysinha/docpipe/blob/main/CHANGELOG.md
Author-email: Sunny Sinha <thesunnysinha@gmail.com>
License-Expression: MIT
License-File: LICENSE
Keywords: docling,document,embeddings,extraction,ingestion,langchain,langextract,llm,observability,opentelemetry,parsing,pgvector,pipeline,rag,retrieval,turbovec,vector
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Text Processing
Classifier: Typing :: Typed
Requires-Python: >=3.10
Requires-Dist: click>=8.0
Requires-Dist: langchain-core>=0.3
Requires-Dist: langchain-text-splitters>=0.3
Requires-Dist: pydantic-settings>=2.0
Requires-Dist: pydantic>=2.0
Requires-Dist: pyyaml>=6.0
Provides-Extra: all
Requires-Dist: autogen-agentchat>=0.4; extra == 'all'
Requires-Dist: autogen-ext[openai]>=0.4; extra == 'all'
Requires-Dist: chonkie>=1.0; extra == 'all'
Requires-Dist: cohere>=5.0; extra == 'all'
Requires-Dist: datasets>=3.0; extra == 'all'
Requires-Dist: docling>=2.0; extra == 'all'
Requires-Dist: fastapi>=0.100; extra == 'all'
Requires-Dist: flashrank>=0.2; extra == 'all'
Requires-Dist: glmocr>=0.1; extra == 'all'
Requires-Dist: httpx>=0.27; extra == 'all'
Requires-Dist: langchain-anthropic>=0.3; extra == 'all'
Requires-Dist: langchain-classic>=0.1; extra == 'all'
Requires-Dist: langchain-community>=0.3; extra == 'all'
Requires-Dist: langchain-core>=0.3; extra == 'all'
Requires-Dist: langchain-google-genai>=2.0; extra == 'all'
Requires-Dist: langchain-huggingface>=0.1; extra == 'all'
Requires-Dist: langchain-ollama>=0.3; extra == 'all'
Requires-Dist: langchain-openai>=0.3; extra == 'all'
Requires-Dist: langchain-postgres>=0.0.12; extra == 'all'
Requires-Dist: langextract>=0.1; extra == 'all'
Requires-Dist: langgraph>=0.2; extra == 'all'
Requires-Dist: lightrag-hku>=1.0; extra == 'all'
Requires-Dist: markitdown>=0.1; extra == 'all'
Requires-Dist: opentelemetry-api>=1.27; extra == 'all'
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.27; extra == 'all'
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.48b0; extra == 'all'
Requires-Dist: opentelemetry-sdk>=1.27; extra == 'all'
Requires-Dist: outlines>=0.1; extra == 'all'
Requires-Dist: prometheus-client>=0.20; extra == 'all'
Requires-Dist: prometheus-fastapi-instrumentator>=7.1.0; extra == 'all'
Requires-Dist: psycopg2-binary>=2.9; extra == 'all'
Requires-Dist: pymupdf4llm>=0.0.17; extra == 'all'
Requires-Dist: python-multipart>=0.0.6; extra == 'all'
Requires-Dist: ragas>=0.2; extra == 'all'
Requires-Dist: rank-bm25>=0.2; extra == 'all'
Requires-Dist: semchunk>=2.0; extra == 'all'
Requires-Dist: sentence-transformers>=3.0; extra == 'all'
Requires-Dist: turbovec[langchain]>=0.1; extra == 'all'
Requires-Dist: unstructured[all-docs]>=0.16; extra == 'all'
Requires-Dist: uvicorn[standard]>=0.20; extra == 'all'
Provides-Extra: anthropic
Requires-Dist: langchain-anthropic>=0.3; extra == 'anthropic'
Provides-Extra: autogen
Requires-Dist: autogen-agentchat>=0.4; extra == 'autogen'
Requires-Dist: autogen-ext[openai]>=0.4; extra == 'autogen'
Provides-Extra: chonkie
Requires-Dist: chonkie>=1.0; extra == 'chonkie'
Provides-Extra: dev
Requires-Dist: fastapi>=0.100; extra == 'dev'
Requires-Dist: httpx; extra == 'dev'
Requires-Dist: mypy; extra == 'dev'
Requires-Dist: prometheus-client>=0.20; extra == 'dev'
Requires-Dist: prometheus-fastapi-instrumentator>=7.1.0; extra == 'dev'
Requires-Dist: psycopg2-binary>=2.9; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.21; extra == 'dev'
Requires-Dist: pytest-cov; extra == 'dev'
Requires-Dist: pytest>=7.0; extra == 'dev'
Requires-Dist: ruff; extra == 'dev'
Provides-Extra: docling
Requires-Dist: docling>=2.0; extra == 'docling'
Provides-Extra: eval-ragas
Requires-Dist: datasets>=3.0; extra == 'eval-ragas'
Requires-Dist: ragas>=0.2; extra == 'eval-ragas'
Provides-Extra: glm-ocr
Requires-Dist: glmocr>=0.1; extra == 'glm-ocr'
Provides-Extra: google
Requires-Dist: langchain-google-genai>=2.0; extra == 'google'
Provides-Extra: http
Requires-Dist: httpx>=0.27; extra == 'http'
Provides-Extra: huggingface
Requires-Dist: langchain-huggingface>=0.1; extra == 'huggingface'
Provides-Extra: langextract
Requires-Dist: langextract>=0.1; extra == 'langextract'
Provides-Extra: langgraph
Requires-Dist: langchain-core>=0.3; extra == 'langgraph'
Requires-Dist: langgraph>=0.2; extra == 'langgraph'
Provides-Extra: lightrag
Requires-Dist: lightrag-hku>=1.0; extra == 'lightrag'
Provides-Extra: markitdown
Requires-Dist: markitdown>=0.1; extra == 'markitdown'
Provides-Extra: mineru
Requires-Dist: mineru>=2.0; extra == 'mineru'
Provides-Extra: observability
Requires-Dist: opentelemetry-api>=1.27; extra == 'observability'
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.27; extra == 'observability'
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.48b0; extra == 'observability'
Requires-Dist: opentelemetry-sdk>=1.27; extra == 'observability'
Provides-Extra: ollama
Requires-Dist: langchain-ollama>=0.3; extra == 'ollama'
Provides-Extra: openai
Requires-Dist: langchain-openai>=0.3; extra == 'openai'
Provides-Extra: outlines
Requires-Dist: outlines>=0.1; extra == 'outlines'
Provides-Extra: paddleocr
Requires-Dist: paddleocr>=3.0; extra == 'paddleocr'
Provides-Extra: pgvector
Requires-Dist: langchain-postgres>=0.0.12; extra == 'pgvector'
Requires-Dist: psycopg2-binary>=2.9; extra == 'pgvector'
Provides-Extra: phoenix
Requires-Dist: arize-phoenix>=5.0; extra == 'phoenix'
Provides-Extra: profile-agents
Requires-Dist: autogen-agentchat>=0.4; extra == 'profile-agents'
Requires-Dist: autogen-ext[openai]>=0.4; extra == 'profile-agents'
Requires-Dist: docling>=2.0; extra == 'profile-agents'
Requires-Dist: fastapi>=0.100; extra == 'profile-agents'
Requires-Dist: flashrank>=0.2; extra == 'profile-agents'
Requires-Dist: httpx>=0.27; extra == 'profile-agents'
Requires-Dist: langchain-classic>=0.1; extra == 'profile-agents'
Requires-Dist: langchain-community>=0.3; extra == 'profile-agents'
Requires-Dist: langchain-openai>=0.3; extra == 'profile-agents'
Requires-Dist: langchain-postgres>=0.0.12; extra == 'profile-agents'
Requires-Dist: langextract>=0.1; extra == 'profile-agents'
Requires-Dist: markitdown>=0.1; extra == 'profile-agents'
Requires-Dist: opentelemetry-api>=1.27; extra == 'profile-agents'
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.27; extra == 'profile-agents'
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.48b0; extra == 'profile-agents'
Requires-Dist: opentelemetry-sdk>=1.27; extra == 'profile-agents'
Requires-Dist: prometheus-client>=0.20; extra == 'profile-agents'
Requires-Dist: prometheus-fastapi-instrumentator>=7.1.0; extra == 'profile-agents'
Requires-Dist: psycopg2-binary>=2.9; extra == 'profile-agents'
Requires-Dist: python-multipart>=0.0.6; extra == 'profile-agents'
Requires-Dist: rank-bm25>=0.2; extra == 'profile-agents'
Requires-Dist: semchunk>=2.0; extra == 'profile-agents'
Requires-Dist: uvicorn[standard]>=0.20; extra == 'profile-agents'
Provides-Extra: profile-balanced
Requires-Dist: docling>=2.0; extra == 'profile-balanced'
Requires-Dist: fastapi>=0.100; extra == 'profile-balanced'
Requires-Dist: flashrank>=0.2; extra == 'profile-balanced'
Requires-Dist: httpx>=0.27; extra == 'profile-balanced'
Requires-Dist: langchain-classic>=0.1; extra == 'profile-balanced'
Requires-Dist: langchain-community>=0.3; extra == 'profile-balanced'
Requires-Dist: langchain-openai>=0.3; extra == 'profile-balanced'
Requires-Dist: langchain-postgres>=0.0.12; extra == 'profile-balanced'
Requires-Dist: langextract>=0.1; extra == 'profile-balanced'
Requires-Dist: markitdown>=0.1; extra == 'profile-balanced'
Requires-Dist: opentelemetry-api>=1.27; extra == 'profile-balanced'
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.27; extra == 'profile-balanced'
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.48b0; extra == 'profile-balanced'
Requires-Dist: opentelemetry-sdk>=1.27; extra == 'profile-balanced'
Requires-Dist: prometheus-client>=0.20; extra == 'profile-balanced'
Requires-Dist: prometheus-fastapi-instrumentator>=7.1.0; extra == 'profile-balanced'
Requires-Dist: psycopg2-binary>=2.9; extra == 'profile-balanced'
Requires-Dist: python-multipart>=0.0.6; extra == 'profile-balanced'
Requires-Dist: rank-bm25>=0.2; extra == 'profile-balanced'
Requires-Dist: semchunk>=2.0; extra == 'profile-balanced'
Requires-Dist: uvicorn[standard]>=0.20; extra == 'profile-balanced'
Provides-Extra: profile-eval
Requires-Dist: datasets>=3.0; extra == 'profile-eval'
Requires-Dist: docling>=2.0; extra == 'profile-eval'
Requires-Dist: fastapi>=0.100; extra == 'profile-eval'
Requires-Dist: flashrank>=0.2; extra == 'profile-eval'
Requires-Dist: httpx>=0.27; extra == 'profile-eval'
Requires-Dist: langchain-classic>=0.1; extra == 'profile-eval'
Requires-Dist: langchain-community>=0.3; extra == 'profile-eval'
Requires-Dist: langchain-openai>=0.3; extra == 'profile-eval'
Requires-Dist: langchain-postgres>=0.0.12; extra == 'profile-eval'
Requires-Dist: langextract>=0.1; extra == 'profile-eval'
Requires-Dist: markitdown>=0.1; extra == 'profile-eval'
Requires-Dist: opentelemetry-api>=1.27; extra == 'profile-eval'
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.27; extra == 'profile-eval'
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.48b0; extra == 'profile-eval'
Requires-Dist: opentelemetry-sdk>=1.27; extra == 'profile-eval'
Requires-Dist: prometheus-client>=0.20; extra == 'profile-eval'
Requires-Dist: prometheus-fastapi-instrumentator>=7.1.0; extra == 'profile-eval'
Requires-Dist: psycopg2-binary>=2.9; extra == 'profile-eval'
Requires-Dist: python-multipart>=0.0.6; extra == 'profile-eval'
Requires-Dist: ragas>=0.2; extra == 'profile-eval'
Requires-Dist: rank-bm25>=0.2; extra == 'profile-eval'
Requires-Dist: semchunk>=2.0; extra == 'profile-eval'
Requires-Dist: uvicorn[standard]>=0.20; extra == 'profile-eval'
Provides-Extra: profile-gpu
Requires-Dist: chonkie>=1.0; extra == 'profile-gpu'
Requires-Dist: cohere>=5.0; extra == 'profile-gpu'
Requires-Dist: docling>=2.0; extra == 'profile-gpu'
Requires-Dist: fastapi>=0.100; extra == 'profile-gpu'
Requires-Dist: flashrank>=0.2; extra == 'profile-gpu'
Requires-Dist: glmocr>=0.1; extra == 'profile-gpu'
Requires-Dist: httpx>=0.27; extra == 'profile-gpu'
Requires-Dist: langchain-classic>=0.1; extra == 'profile-gpu'
Requires-Dist: langchain-community>=0.3; extra == 'profile-gpu'
Requires-Dist: langchain-openai>=0.3; extra == 'profile-gpu'
Requires-Dist: langchain-postgres>=0.0.12; extra == 'profile-gpu'
Requires-Dist: langextract>=0.1; extra == 'profile-gpu'
Requires-Dist: markitdown>=0.1; extra == 'profile-gpu'
Requires-Dist: mineru>=2.0; extra == 'profile-gpu'
Requires-Dist: opentelemetry-api>=1.27; extra == 'profile-gpu'
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.27; extra == 'profile-gpu'
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.48b0; extra == 'profile-gpu'
Requires-Dist: opentelemetry-sdk>=1.27; extra == 'profile-gpu'
Requires-Dist: paddleocr>=3.0; extra == 'profile-gpu'
Requires-Dist: prometheus-client>=0.20; extra == 'profile-gpu'
Requires-Dist: prometheus-fastapi-instrumentator>=7.1.0; extra == 'profile-gpu'
Requires-Dist: psycopg2-binary>=2.9; extra == 'profile-gpu'
Requires-Dist: python-multipart>=0.0.6; extra == 'profile-gpu'
Requires-Dist: rank-bm25>=0.2; extra == 'profile-gpu'
Requires-Dist: semchunk>=2.0; extra == 'profile-gpu'
Requires-Dist: sentence-transformers>=3.0; extra == 'profile-gpu'
Requires-Dist: uvicorn[standard]>=0.20; extra == 'profile-gpu'
Provides-Extra: profile-quality
Requires-Dist: chonkie>=1.0; extra == 'profile-quality'
Requires-Dist: cohere>=5.0; extra == 'profile-quality'
Requires-Dist: docling>=2.0; extra == 'profile-quality'
Requires-Dist: fastapi>=0.100; extra == 'profile-quality'
Requires-Dist: flashrank>=0.2; extra == 'profile-quality'
Requires-Dist: glmocr>=0.1; extra == 'profile-quality'
Requires-Dist: httpx>=0.27; extra == 'profile-quality'
Requires-Dist: langchain-classic>=0.1; extra == 'profile-quality'
Requires-Dist: langchain-community>=0.3; extra == 'profile-quality'
Requires-Dist: langchain-openai>=0.3; extra == 'profile-quality'
Requires-Dist: langchain-postgres>=0.0.12; extra == 'profile-quality'
Requires-Dist: langextract>=0.1; extra == 'profile-quality'
Requires-Dist: markitdown>=0.1; extra == 'profile-quality'
Requires-Dist: opentelemetry-api>=1.27; extra == 'profile-quality'
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.27; extra == 'profile-quality'
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.48b0; extra == 'profile-quality'
Requires-Dist: opentelemetry-sdk>=1.27; extra == 'profile-quality'
Requires-Dist: prometheus-client>=0.20; extra == 'profile-quality'
Requires-Dist: prometheus-fastapi-instrumentator>=7.1.0; extra == 'profile-quality'
Requires-Dist: psycopg2-binary>=2.9; extra == 'profile-quality'
Requires-Dist: python-multipart>=0.0.6; extra == 'profile-quality'
Requires-Dist: rank-bm25>=0.2; extra == 'profile-quality'
Requires-Dist: semchunk>=2.0; extra == 'profile-quality'
Requires-Dist: sentence-transformers>=3.0; extra == 'profile-quality'
Requires-Dist: uvicorn[standard]>=0.20; extra == 'profile-quality'
Provides-Extra: profile-slim
Requires-Dist: fastapi>=0.100; extra == 'profile-slim'
Requires-Dist: flashrank>=0.2; extra == 'profile-slim'
Requires-Dist: httpx>=0.27; extra == 'profile-slim'
Requires-Dist: langchain-openai>=0.3; extra == 'profile-slim'
Requires-Dist: langchain-postgres>=0.0.12; extra == 'profile-slim'
Requires-Dist: markitdown>=0.1; extra == 'profile-slim'
Requires-Dist: opentelemetry-api>=1.27; extra == 'profile-slim'
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.27; extra == 'profile-slim'
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.48b0; extra == 'profile-slim'
Requires-Dist: opentelemetry-sdk>=1.27; extra == 'profile-slim'
Requires-Dist: prometheus-client>=0.20; extra == 'profile-slim'
Requires-Dist: prometheus-fastapi-instrumentator>=7.1.0; extra == 'profile-slim'
Requires-Dist: psycopg2-binary>=2.9; extra == 'profile-slim'
Requires-Dist: python-multipart>=0.0.6; extra == 'profile-slim'
Requires-Dist: semchunk>=2.0; extra == 'profile-slim'
Requires-Dist: uvicorn[standard]>=0.20; extra == 'profile-slim'
Provides-Extra: pymupdf
Requires-Dist: pymupdf4llm>=0.0.17; extra == 'pymupdf'
Provides-Extra: rag
Requires-Dist: langchain-classic>=0.1; extra == 'rag'
Requires-Dist: langchain-community>=0.3; extra == 'rag'
Requires-Dist: rank-bm25>=0.2; extra == 'rag'
Provides-Extra: rerank
Requires-Dist: flashrank>=0.2; extra == 'rerank'
Provides-Extra: rerank-quality
Requires-Dist: cohere>=5.0; extra == 'rerank-quality'
Requires-Dist: sentence-transformers>=3.0; extra == 'rerank-quality'
Provides-Extra: semchunk
Requires-Dist: semchunk>=2.0; extra == 'semchunk'
Provides-Extra: server
Requires-Dist: fastapi>=0.100; extra == 'server'
Requires-Dist: prometheus-client>=0.20; extra == 'server'
Requires-Dist: prometheus-fastapi-instrumentator>=7.1.0; extra == 'server'
Requires-Dist: python-multipart>=0.0.6; extra == 'server'
Requires-Dist: uvicorn[standard]>=0.20; extra == 'server'
Provides-Extra: turbovec
Requires-Dist: turbovec[langchain]>=0.1; extra == 'turbovec'
Provides-Extra: unstructured
Requires-Dist: unstructured[all-docs]>=0.16; extra == 'unstructured'
Description-Content-Type: text/markdown

# docpipe

Unified document parsing, structured extraction, vector ingestion, and RAG pipeline SDK.

[![PyPI](https://img.shields.io/pypi/v/docpipe-sdk)](https://pypi.org/project/docpipe-sdk/)
[![Python](https://img.shields.io/pypi/pyversions/docpipe-sdk)](https://pypi.org/project/docpipe-sdk/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Docker](https://img.shields.io/badge/ghcr.io-docpipe-6366f1?logo=docker&logoColor=white)](https://ghcr.io/thesunnysinha/docpipe)
[![Website](https://img.shields.io/badge/docs-docpipe-6366f1)](https://docpipe.sunnysinha.online/docs)

## Overview

docpipe connects document parsing (Docling, [MarkItDown](https://github.com/microsoft/markitdown), GLM-OCR), LLM-based structured extraction (LangExtract + LangChain), vector ingestion (pgvector or optional turbovec), and RAG querying into a single composable pipeline. Optional [AutoGen](https://github.com/microsoft/autogen) agents add tool-using multi-agent RAG.

**Four pipelines, composable together:**

1. **Parse** — Unstructured docs → parsed text/markdown
2. **Extract** — Text → structured entities via LLM
3. **Ingest** — Chunks → embeddings → your vector store
4. **RAG** — Questions → grounded answers with citations (six retrieval strategies)

> docpipe never stores your data. It connects to your infrastructure and gets out of the way.

**Full documentation** (install extras, Docker, API reference, RAG strategies, observability, turbovec, plugins): **[docpipe docs](https://docpipe.sunnysinha.online/docs)** · [Marketing site](https://docpipe.sunnysinha.online)

---

## Install

```bash
pip install docpipe-sdk
# API server + OpenTelemetry (optional)
pip install "docpipe-sdk[server,observability]"
```

Optional extras (`docling`, `openai`, `google`, `pgvector`, `turbovec`, `rag`, `rerank`, `http`, `all`, …) are listed on the **[Install guide](https://docpipe.sunnysinha.online/docs)**.

For unreleased commits: `pip install git+https://github.com/thesunnysinha/docpipe.git`

---

## Quick start

```python
import docpipe

# Parse (docling default; markitdown for lightweight Office/PDF → Markdown)
doc = docpipe.parse("invoice.pdf", parser="markitdown")
print(doc.markdown)

# Extract
schema = docpipe.ExtractionSchema(
    description="Extract invoice line items with amounts",
    model_id="gemini-2.5-flash",
)
results = docpipe.extract(doc.text, schema)

# Ingest + RAG (configure your DB + providers)
config = docpipe.IngestionConfig(
    connection_string="postgresql://user:pass@localhost:5432/mydb",
    table_name="invoices",
    embedding_provider="openai",
    embedding_model="text-embedding-3-small",
)
docpipe.ingest("invoice.pdf", config=config)

rag_config = docpipe.RAGConfig(
    connection_string=config.connection_string,
    table_name=config.table_name,
    embedding_provider="openai",
    embedding_model="text-embedding-3-small",
    llm_provider="openai",
    llm_model="gpt-4o",
    strategy="hyde",
    system_prompt=(
        "Answer using ONLY the context below.\n\n"
        "Context:\n{context}\n\nQuestion: {question}\n\nAnswer:"
    ),
    hyde_prompt="Write a passage that answers: {question}",
)
result = docpipe.query("What is the total on the invoice?", config=rag_config)
print(result.answer)

# Optional: AutoGen agents with vector-search tools (pip install "docpipe-sdk[autogen]")
agent_result = docpipe.agent_query(
    "What is the total on the invoice?",
    config=rag_config,
    enable_reviewer=True,
)
print(agent_result.answer)
```

**CLI:** `docpipe parse`, `docpipe ingest`, `docpipe rag query`, `docpipe serve` — see **[CLI & API server](https://docpipe.sunnysinha.online/docs)**.

**Docker (profile tags):**

```bash
docker pull ghcr.io/thesunnysinha/docpipe:balanced   # default production
docker pull ghcr.io/thesunnysinha/docpipe:slim       # lightweight
docker pull ghcr.io/thesunnysinha/docpipe:quality    # OCR + BGE rerank
docker pull ghcr.io/thesunnysinha/docpipe:agents     # AutoGen
```

**pip profiles:** `profile-slim`, `profile-balanced`, `profile-quality`, `profile-agents` — see [`.env.example`](.env.example) and [`docs/INTEGRATION.md`](docs/INTEGRATION.md).

**Runtime presets** on `/ingest` and `/rag/query`: `preset=fast|balanced|quality|agents`. Discover options via `GET /profiles` and `GET /plugins`.

**Shared Kubernetes API** (one docpipe for Jingo, Andocs, and other apps): manifests in [`k8s/`](k8s/), deploy via `.github/workflows/deploy-k8s.yml`. Consumers call `http://docpipe.docpipe.svc.cluster.local:8000` and pass their own `connection_string` on each `/ingest` and `/rag/*` request (vectors stay in each app's Postgres). See [`env/k8s/DOCPIPE_ENV.example`](env/k8s/DOCPIPE_ENV.example).

---

## Learn more

| Topic | Where |
|--------|--------|
| Install extras & providers | [docs](https://docpipe.sunnysinha.online/docs) |
| REST API (`/ingest`, `/rag/query`, `/rag/stream`, `/transcribe`, …) | [docs](https://docpipe.sunnysinha.online/docs) |
| Speech-to-text ([VibeVoice ASR](https://github.com/microsoft/VibeVoice) or OpenAI Whisper) | `POST /transcribe` · backends: `openai`, `vibevoice`, `vibevoice_remote` |
| RAG strategies (`naive`, `hyde`, `hybrid`, `auto`, …) | [docs](https://docpipe.sunnysinha.online/docs) |
| Observability (OTEL, Prometheus, JSON logs) | [docs](https://docpipe.sunnysinha.online/docs) · `.env.example` |
| turbovec (local file indices) | [docs](https://docpipe.sunnysinha.online/docs) |
| Custom parsers / extractors | [CONTRIBUTING.md](CONTRIBUTING.md) |
| Environment variables | [`.env.example`](.env.example) · [config reference](https://docpipe.sunnysinha.online/docs) |

---

## License

MIT — see [LICENSE](LICENSE).
