Metadata-Version: 2.4
Name: patchvec
Version: 0.5.8.1
Summary: Patchvec — A lightweight, pluggable vector search microservice.
Author: Rodrigo Rodrigues da Silva
Author-email: rodrigo@flowlexi.com
License: AGPL-3.0-or-later
Project-URL: Homepage, https://github.com/rodrigopitanga/patchvec/?tab=readme-ov-file#readme-ov-file
Project-URL: Source, https://github.com/rodrigopitanga/patchvec
Project-URL: Tracker, https://github.com/rodrigopitanga/patchvec/issues
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3 :: Only
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: Programming Language :: Python :: 3.14
Classifier: Framework :: FastAPI
Classifier: Topic :: Database
Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
Requires-Python: >=3.10,<3.15
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: fastapi>=0.115.0
Requires-Dist: uvicorn[standard]>=0.30.6
Requires-Dist: txtai>=6.3.0
Requires-Dist: pydantic>=2.8.2
Requires-Dist: python-multipart>=0.0.9
Requires-Dist: pypdf>=5.0.0
Requires-Dist: pyyaml>=6.0.2
Requires-Dist: python-dotenv>=1.0.1
Requires-Dist: faiss-cpu>=1.7.1
Requires-Dist: torch>=2.10.0
Provides-Extra: cpu
Provides-Extra: sbert
Requires-Dist: sentence-transformers>=2.7.0; extra == "sbert"
Provides-Extra: openai
Requires-Dist: openai>=1.0.0; extra == "openai"
Provides-Extra: test
Requires-Dist: pytest; extra == "test"
Requires-Dist: httpx; extra == "test"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: license
Dynamic: license-file
Dynamic: project-url
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

<!-- (C) 2025, 2026 Rodrigo Rodrigues da Silva <rodrigo@flowlexi.com> -->
<!-- SPDX-License-Identifier: AGPL-3.0-or-later -->

# PatchVec — A lightweight, pluggable vector search microservice.

Upload → chunk → index (with metadata) → search via REST and CLI.

## Highlights
- Multi-tenant collections: `/collections/{tenant}/{name}`
- Upload and search TXT, CSV, and PDF
- Deterministic provenance: every hit returns doc id, page, offset, snippet
- Metadata filters on search (`{"filters": {"docid": "DOC-1"}}`)
- REST and CLI entry points
- Health/metrics endpoints + Prometheus exporter
- Pluggable embeddings and stores; default backend is local

## Requirements
- Python 3.10–3.14

## Install (PyPI)
```bash
python -m venv .venv
source .venv/bin/activate
pip install patchvec
```

CPU-only deployments can use the PyTorch CPU wheel index:
```bash
pip install "patchvec[cpu]" \
  --index-url https://download.pytorch.org/whl/cpu \
  --extra-index-url https://pypi.org/simple
```

## Quickstart
```bash
# Start the server (installed entry point)
pavesrv

# Or run with uvicorn manually if you prefer:
uvicorn pave.main:app --host 0.0.0.0 --port 8086
```

Auth defaults to `none` only for dev. For production, set static auth:
```bash
export PATCHVEC_AUTH__MODE=static
export PATCHVEC_AUTH__GLOBAL_KEY="your-secret"
```

## Minimal config (optional)
By default PatchVec runs with sensible local defaults. To customize, create
`config.yml`:
```yaml
vector_store:
  type: default
embedder:
  type: default
auth:
  mode: static
  global_key: ${PATCHVEC_GLOBAL_KEY}
```
Then export:
```bash
export PATCHVEC_CONFIG=./config.yml
export PATCHVEC_GLOBAL_KEY="your-secret"
```

## CLI example
```bash
pavecli create-collection demo books
pavecli upload demo books demo/20k_leagues.txt --docid=verne-20k \
  --metadata='{"lang":"en"}'
pavecli search demo books "captain nemo" -k 5
```

## REST example
```bash
# Create a collection
curl -X POST http://localhost:8086/collections/demo/books \
  -H "Authorization: Bearer your-secret"

# Upload a TXT document
curl -X POST http://localhost:8086/collections/demo/books/documents \
  -H "Authorization: Bearer your-secret" \
  -F "file=@demo/20k_leagues.txt" -F "docid=verne-20k" \
  -F 'metadata={"lang":"en"}'

# Search (GET, no filters)
curl -G --data-urlencode "q=hello" \
  -H "Authorization: Bearer your-secret" \
  http://localhost:8086/collections/demo/books/search

# Search (POST, with filters)
curl -X POST http://localhost:8086/collections/demo/books/search \
  -H "Authorization: Bearer your-secret" \
  -H "Content-Type: application/json" \
  -d '{"q":"captain nemo","k":5,"filters":{"docid":"verne-20k"}}'
```

## License
AGPL-3.0-or-later — (C) 2025, 2026 Rodrigo Rodrigues da Silva <rodrigo@flowlexi.com>
