Production-ready framework for reliable LLM orchestration
Project description
PromptGuard 🛡️
The Framework for Reliable LLM Orchestration
PromptGuard is a Python library that brings production-grade reliability, type safety, and observability to LLM applications. Think of it as "Pydantic meets Circuit Breaker for AI" - reducing boilerplate by 80% while making your AI apps bulletproof.
🎯 The Problem We Solve
Every AI engineer writes the same boilerplate:
- Manual retry logic with exponential backoff
- Model fallback chains when primary fails
- Response parsing with regex/string manipulation
- Token counting and cost tracking
- Response validation and error handling
PromptGuard eliminates all of this.
✨ Core Features
1. Smart Execution with Auto-Retry & Fallbacks
from promptguard import PromptChain
chain = PromptChain(
models=["anthropic/claude-3-5-sonnet", "openai/gpt-4o", "groq/llama-70b"],
strategy="cascade",
max_retries=3,
retry_delay="exponential"
)
result = await chain.execute("Analyze this document...")
print(result.response) # Guaranteed to succeed or raise clear error
2. Type-Safe Response Validation
from pydantic import BaseModel, Field
from promptguard import PromptChain
class EvaluationResponse(BaseModel):
evaluation: str = Field(description="Overall evaluation")
score: int = Field(ge=0, le=100)
reason: str
chain = PromptChain(
models=["anthropic/claude-3-5-sonnet"],
response_schema=EvaluationResponse,
validation_mode="strict"
)
result = await chain.execute(prompt)
print(result.response.score) # Type-safe!
3. Multi-Provider Support
chain = PromptChain(
models=[
"anthropic/claude-3-5-sonnet",
"openai/gpt-4o",
"groq/llama-3-70b",
"cohere/command-r-plus",
"google/gemini-1.5-pro"
]
)
4. Automatic Token Tracking & Cost Estimation
result = await chain.execute(prompt)
print(result.metadata.tokens_used)
print(result.metadata.estimated_cost)
print(result.metadata.model_used)
print(result.metadata.execution_time_ms)
5. Response Caching
from promptguard import CacheBackend
chain = PromptChain(
models=["anthropic/claude-3-5-sonnet"],
cache=CacheBackend.memory(), # or .redis() or .disk()
cache_ttl=3600
)
result1 = await chain.execute("What is AI?", cache_key="ai_def_v1")
result2 = await chain.execute("What is AI?", cache_key="ai_def_v1")
assert result2.metadata.cached == True
6. Semantic Response Validation
from promptguard import validators
chain = PromptChain(
models=["anthropic/claude-3-5-sonnet"],
validators=[
validators.length_range(min_chars=100, max_chars=5000),
validators.contains_keywords(["risk", "evaluation"]),
validators.has_citations(required=True),
validators.sentiment_check(allowed=["neutral", "positive"])
]
)
7. Streaming Support
chain = PromptChain(models=["anthropic/claude-3-5-sonnet"])
async for chunk in chain.stream("Write a long essay..."):
print(chunk.delta, end="", flush=True)
8. Batch Processing
prompts = ["Evaluate doc 1...", "Evaluate doc 2...", ...]
results = await chain.batch_execute(
prompts,
max_concurrent=5,
show_progress=True
)
📦 Installation
# Basic installation
pip install promptguard
# With all features
pip install promptguard[all]
# With specific features
pip install promptguard[cache] # Redis caching
pip install promptguard[validation] # Semantic validators
pip install promptguard[metrics] # Prometheus metrics
🚀 Quick Start
import asyncio
from promptguard import PromptChain, validators, CacheBackend
from pydantic import BaseModel
class Analysis(BaseModel):
summary: str
score: int
recommendations: list[str]
async def main():
chain = PromptChain(
models=[
"anthropic/claude-3-5-sonnet",
"openai/gpt-4o",
"groq/llama-70b"
],
strategy="cascade",
max_retries=3,
response_schema=Analysis,
validators=[
validators.length_range(min_chars=100),
validators.has_citations()
],
cache=CacheBackend.memory(),
cache_ttl=3600
)
result = await chain.execute(
prompt="Analyze this document: ...",
cache_key="analysis_v1"
)
print(f"Score: {result.response.score}")
print(f"Cost: ${result.metadata.estimated_cost:.4f}")
print(f"Time: {result.metadata.execution_time_ms:.0f}ms")
asyncio.run(main())
📚 Documentation
🧪 Testing
# Run all tests
pytest tests/ -v
# Run with coverage
pytest tests/ --cov=promptguard --cov-report=html
# Run specific test file
pytest tests/unit/test_core.py -v
🔧 Configuration
Environment Variables
# API Keys
export ANTHROPIC_API_KEY=sk-ant-...
export OPENAI_API_KEY=sk-...
export GROQ_API_KEY=gsk-...
export COHERE_API_KEY=...
export GOOGLE_API_KEY=...
# Redis
export REDIS_URL=redis://localhost:6379
🤝 Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
📄 License
MIT License - See LICENSE file for details
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 promptguard_pro-0.1.2.tar.gz.
File metadata
- Download URL: promptguard_pro-0.1.2.tar.gz
- Upload date:
- Size: 22.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1eea638eeb1d8966e35417264505ac6d28a9ab0f1c78e84d15766e0a1bf583b3
|
|
| MD5 |
e4da31069aaf2a720116ae8c7b5f07de
|
|
| BLAKE2b-256 |
5e9d1665a1194ddaf2905e1eb99f4cac0bbdd1f7ca00ae02df0579a94491ce5a
|
File details
Details for the file promptguard_pro-0.1.2-py3-none-any.whl.
File metadata
- Download URL: promptguard_pro-0.1.2-py3-none-any.whl
- Upload date:
- Size: 33.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c40d5c9f70cd94ffa6cacce2d188ce459aa8732a40f6a3122c40ffdeec3eaa3
|
|
| MD5 |
8490b545333c7ae8973777c064611918
|
|
| BLAKE2b-256 |
7ff4ae4e7620f18fdf189ca56c1d3772a8293f10fadd22eafe52b67a083b9d4b
|