Private Document AI Platform with AdaptHex compression
Project description
Adaptensor Python SDK
Private Document AI Platform — Upload, index, and search your documents with AI. 100% self-hosted, no external APIs.
Features
- 🔒 100% Private — Your data never leaves your infrastructure
- ⚡ Fast Search — Sub-150ms semantic queries across thousands of documents
- 📦 AdaptHex Compression — 4-8x smaller vectors with 99.6% accuracy
- 🔌 Simple API — Upload, index, search in 3 lines of code
- 🚀 TPU Accelerated — 25% cheaper than GPU clouds
Installation
pip install adaptensor
Quick Start
from adaptensor import Adaptensor
# Initialize client
client = Adaptensor(api_key="your-api-key")
# Upload documents
client.documents.upload("contract.pdf")
client.documents.upload("report.docx")
# Build search index
result = client.documents.index()
print(f"Indexed {result.total_chunks} chunks")
# Search
results = client.query("liability clauses", top_k=5)
for chunk in results:
print(f"[{chunk.score:.2f}] {chunk.text[:100]}...")
Authentication
Set your API key via environment variable or pass directly:
# Environment variable
export ADAPTENSOR_API_KEY="your-api-key"
# Or pass directly
client = Adaptensor(api_key="your-api-key")
Upload Documents
Single File
doc = client.documents.upload("report.pdf")
print(f"Uploaded: {doc.doc_id} ({doc.size_bytes:,} bytes)")
Multiple Files
docs = client.documents.upload_many([
"doc1.pdf",
"doc2.pdf",
"doc3.pdf"
], on_progress=lambda c, t, d: print(f"{c}/{t}: {d.filename}"))
Supported Formats
- PDF (
.pdf) - Word (
.docx) - Text (
.txt) - HTML (
.html) - Markdown (
.md) - CSV (
.csv)
Build Index
After uploading documents, build the search index:
result = client.documents.index()
print(f"Status: {result.status}")
print(f"Documents: {result.documents_processed}")
print(f"Chunks: {result.total_chunks}")
print(f"Time: {result.elapsed_seconds:.1f}s")
Search
Basic Search
results = client.query("contract termination", top_k=5)
for chunk in results:
print(f"Score: {chunk.score:.3f}")
print(f"Text: {chunk.text}")
print(f"Source: {chunk.metadata.get('filename')}")
print("---")
Search Result Object
results = client.query("machine learning")
print(f"Query: {results.query}")
print(f"Results: {results.count}")
print(f"Time: {results.elapsed_ms:.1f}ms")
# Iterate through results
for chunk in results:
print(chunk.text)
Embeddings
Generate embeddings with optional AdaptHex compression:
# With compression (default)
result = client.embed("machine learning algorithms")
print(f"Dimensions: {result.dimensions}")
print(f"Hex: {result.hex_embedding[:50]}...")
# Without compression
result = client.embed("machine learning", quantize=False)
print(f"Vector: {result.embedding[:5]}...")
Compression Modes
| Mode | Compression | Accuracy |
|---|---|---|
hex8 |
4x | 99.6% |
hex4 |
8x | 95.8% |
binary |
32x | ~85% |
# Use different compression modes
result = client.embed("text", mode="hex4") # 8x compression
RAG Chat (Coming Soon)
response = client.chat("What are the key terms in the contract?")
print(response)
Error Handling
from adaptensor import (
Adaptensor,
AdaptensorError,
AuthenticationError,
DocumentNotFoundError,
APIError
)
try:
client = Adaptensor(api_key="invalid-key")
client.query("test")
except AuthenticationError:
print("Invalid API key")
except APIError as e:
print(f"API error: {e} (status: {e.status_code})")
except AdaptensorError as e:
print(f"General error: {e}")
Configuration
client = Adaptensor(
api_key="your-api-key",
base_url="https://your-instance.adaptensor.com", # Custom endpoint
timeout=600 # Request timeout in seconds
)
Health Check
if client.health():
print("API is healthy")
else:
print("API is down")
Usage Statistics
stats = client.stats()
print(f"Documents: {stats['documents']}")
print(f"Chunks: {stats['chunks']}")
print(f"Queries: {stats['queries']}")
Full Example
from adaptensor import Adaptensor
# Initialize
client = Adaptensor()
# Upload a batch of legal documents
docs = client.documents.upload_many([
"contracts/agreement_2024.pdf",
"contracts/amendment_1.pdf",
"contracts/amendment_2.pdf",
])
print(f"Uploaded {len(docs)} documents")
# Index everything
result = client.documents.index()
print(f"Indexed {result.total_chunks} chunks in {result.elapsed_seconds:.1f}s")
# Search for specific clauses
results = client.query("indemnification obligations", top_k=10)
print(f"\nFound {results.count} results in {results.elapsed_ms:.1f}ms:\n")
for i, chunk in enumerate(results, 1):
print(f"{i}. [{chunk.score:.2f}] {chunk.metadata.get('filename')}")
print(f" {chunk.text[:150]}...")
print()
Requirements
- Python 3.8+
- requests >= 2.25.0
Links
- Documentation: docs.adaptensor.com
- API Reference: docs.adaptensor.com/api
- GitHub: github.com/adaptensor/adaptensor-python
- PyPI: pypi.org/project/adaptensor
License
MIT License - see LICENSE for details.
Adaptensor — Your Data. Your Infrastructure. Your AI.
Project details
Release history Release notifications | RSS feed
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 adaptensor-0.2.0.tar.gz.
File metadata
- Download URL: adaptensor-0.2.0.tar.gz
- Upload date:
- Size: 13.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
97f0542bdc1610613256ccfe6705354511114d2050e981cb887090f0886f79db
|
|
| MD5 |
370b9e605eac097d588d7b4f65e3747a
|
|
| BLAKE2b-256 |
0a71eb20032459792dad3e71816800298285abbe882709decf48d2fd6173ffd4
|
File details
Details for the file adaptensor-0.2.0-py3-none-any.whl.
File metadata
- Download URL: adaptensor-0.2.0-py3-none-any.whl
- Upload date:
- Size: 17.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
181e03869544b8654bdddd15440e5c61649e64c28a1257d38fefeb26983beec7
|
|
| MD5 |
417f5ede215ba4165d03a256b026adea
|
|
| BLAKE2b-256 |
d02a639748f50cc309268354f0fac02d9dea61089f21c563fa4d5788d140be62
|