Batch processing for Anthropic's Claude API with structured output
Project description
AI Batch
Python SDK for batch processing with structured output and citation mapping.
- 50% cost savings via Anthropic's batch API pricing
- Automatic cost tracking with token usage and pricing
- Structured output with Pydantic models
- Field-level citations map results to source documents
- Type safety with full validation
Currently supports Anthropic Claude. OpenAI support coming soon.
API Reference
batch()- Process message conversationsbatch_files()- Process PDF filesBatchJob- Job status and results
Quick Start
from ai_batch import batch_files
from pydantic import BaseModel
class Invoice(BaseModel):
company_name: str
total_amount: str
date: str
# Process PDFs with structured output + citations
job = batch_files(
files=["invoice1.pdf", "invoice2.pdf", "invoice3.pdf"],
prompt="Extract the company name, total amount, and date.",
model="claude-3-5-sonnet-20241022",
response_model=Invoice,
enable_citations=True
)
# Wait for completion
while not job.is_complete():
time.sleep(30)
results = job.results()
citations = job.citations()
Installation
pip install ai-batch
Usage
Create a .env file in your project root:
ANTHROPIC_API_KEY=your-api-key
API Functions
batch()
Process multiple message conversations with optional structured output.
from ai_batch import batch
from pydantic import BaseModel
class SpamResult(BaseModel):
is_spam: bool
confidence: float
reason: str
# Process messages
job = batch(
messages=[
[{"role": "user", "content": "Is this spam? You've won $1000!"}],
[{"role": "user", "content": "Meeting at 3pm tomorrow"}],
[{"role": "user", "content": "URGENT: Click here now!"}]
],
model="claude-3-haiku-20240307",
response_model=SpamResult
)
# Get results
results = job.results()
Response:
[
SpamResult(is_spam=True, confidence=0.95, reason="Contains monetary prize claim"),
SpamResult(is_spam=False, confidence=0.98, reason="Normal meeting reminder"),
SpamResult(is_spam=True, confidence=0.92, reason="Urgent call-to-action pattern")
]
batch_files()
Process PDF files with optional structured output and citations.
from ai_batch import batch_files
from pydantic import BaseModel
class Invoice(BaseModel):
company_name: str
total_amount: str
date: str
# Process PDFs with citations
job = batch_files(
files=["invoice1.pdf", "invoice2.pdf"],
prompt="Extract the company name, total amount, and date.",
model="claude-3-5-sonnet-20241022",
response_model=Invoice,
enable_citations=True
)
results = job.results()
citations = job.citations()
Response:
# Results
[
Invoice(company_name="TechCorp Solutions", total_amount="$12,500.00", date="March 15, 2024"),
Invoice(company_name="DataFlow Systems", total_amount="$8,750.00", date="March 18, 2024")
]
# Citations (field-level mapping)
[
{
"company_name": [Citation(cited_text="TechCorp Solutions", start_page=1)],
"total_amount": [Citation(cited_text="TOTAL: $12,500.00", start_page=2)],
"date": [Citation(cited_text="Date: March 15, 2024", start_page=1)]
},
{
"company_name": [Citation(cited_text="DataFlow Systems", start_page=1)],
"total_amount": [Citation(cited_text="Total Due: $8,750.00", start_page=3)],
"date": [Citation(cited_text="Invoice Date: March 18, 2024", start_page=1)]
}
]
BatchJob
The job object returned by batch() and batch_files().
# Check completion status
if job.is_complete():
results = job.results()
# Get processing statistics with cost tracking
stats = job.stats(print_stats=True)
# Output:
# 📊 Batch Statistics
# ID: msgbatch_01BPtdnmEwxtaDcdJ2eUsq4T
# Status: ended
# Complete: ✅
# Elapsed: 41.8s
# Mode: Text + Citations
# Results: 0
# Citations: 0
# Input tokens: 2,117
# Output tokens: 81
# Total cost: $0.0038
# (50% batch discount applied)
# Get citations (if enabled)
citations = job.citations()
# Save raw API responses
job = batch(..., raw_results_dir="./raw_responses")
Citations
Citations work in two modes depending on whether you use structured output:
1. Text + Citations (Flat List)
When enable_citations=True without a response model, citations are returned as a flat list:
job = batch_files(
files=["document.pdf"],
prompt="Summarize the key findings",
enable_citations=True
)
results = job.results() # List of strings
citations = job.citations() # Flat list of Citation objects
# Example citations:
[
Citation(cited_text="AI reduces errors by 30%", start_page=2),
Citation(cited_text="Implementation cost: $50,000", start_page=5)
]
2. Structured + Field Citations (Mapping)
When using both response_model and enable_citations=True, citations are mapped to specific fields:
job = batch_files(
files=["document.pdf"],
prompt="Extract the data",
response_model=MyModel,
enable_citations=True
)
results = job.results() # List of Pydantic models
citations = job.citations() # List of dicts mapping fields to citations
# Example field-level citations:
[
{
"title": [Citation(cited_text="Annual Report 2024", start_page=1)],
"revenue": [Citation(cited_text="Revenue: $1.2M", start_page=3)],
"growth": [Citation(cited_text="YoY Growth: 25%", start_page=3)]
}
]
The field mapping allows you to trace exactly which part of the source document was used to populate each field in your structured output.
Cost Tracking
AI Batch automatically tracks token usage and costs for all batch operations:
from ai_batch import batch
job = batch(
messages=[...],
model="claude-3-5-sonnet-20241022"
)
# Get cost information
stats = job.stats()
print(f"Total cost: ${stats['total_cost']:.4f}")
print(f"Input tokens: {stats['total_input_tokens']:,}")
print(f"Output tokens: {stats['total_output_tokens']:,}")
# Or print formatted statistics
job.stats(print_stats=True)
Example Scripts
examples/spam_detection.py- Email classificationexamples/pdf_extraction.py- PDF data extractionexamples/citation_example.py- Basic citation usageexamples/citation_with_pydantic.py- Structured output with citations
Limitations
- Citationm mapping only work with flat Pydantic models (no nested models)
- No support for OpenAI.
- PDFs require Opus/Sonnet models for best results
- Batch jobs can take up to 24 hours to process
- Use
job.is_complete()to check status before getting results - Citations may not be available in all batch API responses
License
MIT
Todos
-
Add pricing metadata and max_spend controls(Cost tracking implemented) - Auto batch manager (parallel batches, retry, spend control)
- Test mode to run on 1% sample before full batch
- Quick batch - split into smaller chunks for faster results
- Support text/other file types (not just PDFs)
- Support for OpenAI
Project details
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 ai_batch-0.0.3.tar.gz.
File metadata
- Download URL: ai_batch-0.0.3.tar.gz
- Upload date:
- Size: 85.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3b0b367d761e8163b61aa969d571b6d382b5129fd2b787ab6b0acec06276f216
|
|
| MD5 |
3b94690267c6977ac1a1729631ab289c
|
|
| BLAKE2b-256 |
00cf147247db0c3c7ca60a778761c0cea562f4ea1b439024a3eab8c83b17059b
|
Provenance
The following attestation bundles were made for ai_batch-0.0.3.tar.gz:
Publisher:
publish.yml on agamm/ai-batch
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ai_batch-0.0.3.tar.gz -
Subject digest:
3b0b367d761e8163b61aa969d571b6d382b5129fd2b787ab6b0acec06276f216 - Sigstore transparency entry: 269043280
- Sigstore integration time:
-
Permalink:
agamm/ai-batch@2b410780e9bc4dcccaf42ad970ffa1d227f36158 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/agamm
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2b410780e9bc4dcccaf42ad970ffa1d227f36158 -
Trigger Event:
release
-
Statement type:
File details
Details for the file ai_batch-0.0.3-py3-none-any.whl.
File metadata
- Download URL: ai_batch-0.0.3-py3-none-any.whl
- Upload date:
- Size: 17.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
671bd0da9075c7ba09fa030dad040078a3d52678b8bbc325f0a7f4ec3b6f9682
|
|
| MD5 |
d22d93286f9e65437e8d6e625b09fd2b
|
|
| BLAKE2b-256 |
b5277647647ae8ec1ad4e677c4a17ab4267fc1f9ec09e71620c5a65e77a54e9e
|
Provenance
The following attestation bundles were made for ai_batch-0.0.3-py3-none-any.whl:
Publisher:
publish.yml on agamm/ai-batch
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ai_batch-0.0.3-py3-none-any.whl -
Subject digest:
671bd0da9075c7ba09fa030dad040078a3d52678b8bbc325f0a7f4ec3b6f9682 - Sigstore transparency entry: 269043287
- Sigstore integration time:
-
Permalink:
agamm/ai-batch@2b410780e9bc4dcccaf42ad970ffa1d227f36158 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/agamm
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2b410780e9bc4dcccaf42ad970ffa1d227f36158 -
Trigger Event:
release
-
Statement type: