AI agents break on bad data. ADRI fixes that with one decorator.
from adri import adri_protected
@adri_protected(standard="customer_data", data_param="data")
def process_customers(data):
# Your agent logic here
return resultsAuto-validates data quality. Works with any framework. 2 minutes to integrate.
flowchart LR
A[Your Function Called] --> B[π‘οΈ ADRI Intercepts]
B --> C{Quality Check<br/>5 Dimensions}
C -->|Score β₯ 80| D[β
ALLOW<br/>Function Runs]
C -->|Score < 80| E[β BLOCK<br/>Error Raised]
D --> F[π Log Results]
E --> F
style A fill:#e3f2fd,stroke:#2196f3,stroke-width:2px
style B fill:#fff3e0,stroke:#ff9800,stroke-width:3px
style C fill:#f3e5f5,stroke:#9c27b0,stroke-width:2px
style D fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
style E fill:#ffebee,stroke:#f44336,stroke-width:2px
style F fill:#fafafa,stroke:#757575,stroke-width:1px
In plain English: ADRI sits between your code and its data, checking quality before letting data through. Good data passes, bad data gets blocked.
ADRI is the missing data layer for AI agents. It protects your AI agent workflows from bad data by:
- Auto-validating data quality across 5 dimensions (validity, completeness, consistency, accuracy, timeliness)
- Auto-generating quality standards on first successful run - no manual configuration
- Blocking or warning on quality failures based on your preference
- Logging insights locally for debugging and development
Framework agnostic: Works with LangChain, CrewAI, AutoGen, LlamaIndex, Haystack, Semantic Kernel, and any Python function.
AI agents are powerful, but fragile. One malformed field or missing value can crash your entire workflow. Traditional validation is tedious - you write dozens of if statements, manually check types, and hope you caught everything.
ADRI learns what good data looks like and enforces it automatically. Add one decorator, run with good data once, and you're protected.
from adri import adri_protected
import pandas as pd
@adri_protected(standard="customer_data", data_param="customer_data")
def analyze_customers(customer_data):
"""Your AI agent logic."""
print(f"Analyzing {len(customer_data)} customers")
return {"status": "complete"}
# First run with good data
customers = pd.DataFrame({
"id": [1, 2, 3],
"email": ["user1@example.com", "user2@example.com", "user3@example.com"],
"signup_date": ["2024-01-01", "2024-01-02", "2024-01-03"]
})
analyze_customers(customers) # β
Runs, auto-generates standardWhat happened:
- Function executed successfully
- ADRI analyzed the data structure
- Generated quality standard in
ADRI/dev/standards/customer_data.yaml - Future runs validate against this standard
Future runs with bad data:
bad_customers = pd.DataFrame({
"id": [1, 2, None], # Missing ID
"email": ["user1@example.com", "invalid-email", "user3@example.com"], # Bad email
# Missing signup_date column
})
analyze_customers(bad_customers) # β Raises exception with quality reportpip install adriRequirements: Python 3.10+
β Star us if ADRI saves you time - it helps us grow!
- Quickstart Guide - 2-minute integration guide
- Getting Started - Detailed 10-minute tutorial
- Standards Library - 13 production-ready standards to copy and use
- How It Works - Five quality dimensions explained
- Framework Patterns - LangChain, CrewAI, AutoGen examples
- CLI Reference - Command-line tools
- FAQ - Common questions
- Examples - Real-world examples
@adri_protected(standard="your_data", data_param="data")
def your_function(data):
return resultsWorks with any AI agent framework:
- LangChain & LangGraph
- CrewAI
- AutoGen
- LlamaIndex
- Haystack
- Semantic Kernel
- Generic Python
ADRI validates:
- Validity - Data types and formats
- Completeness - Required fields present
- Consistency - Cross-field relationships
- Accuracy - Value ranges and patterns
- Timeliness - Data freshness
No manual configuration. ADRI learns from your data:
- Runs successfully with good data β generates standard
- Future runs β validates against standard
- Customize generated standards as needed
# Raise mode (default) - raises exception
@adri_protected(standard="data", data_param="data", on_failure="raise")
# Warn mode - logs warning, continues
@adri_protected(standard="data", data_param="data", on_failure="warn")
# Continue mode - silently continues
@adri_protected(standard="data", data_param="data", on_failure="continue")adri guide # Interactive walkthrough (recommended for first-time users)
adri setup # Initialize ADRI
adri generate-standard data.json # Generate standard
adri assess data.csv --standard my_standard # Assess data quality
adri list-standards # List standards
adri validate-standard my_standard.yaml # Validate standardDeveloper-friendly insights during development:
- Quality scores and assessments
- Dimension-specific failures
- Auto-generated standards
- Stored in
ADRI/dev/logs/
@adri_protected(standard="api_response", data_param="response")
def process_api_data(response):
return transform(response)What it protects: API response data structure Sample data: examples/data/api_response.json Use when: Validating third-party API responses before processing
@adri_protected(standard="crew_context", data_param="context")
def crew_task(context):
return crew.kickoff(context)What it protects: Agent communication context Sample data: examples/data/crew_context.json Use when: Coordinating multi-agent workflows (CrewAI, AutoGen, custom)
@adri_protected(standard="documents", data_param="docs")
def index_documents(docs):
return index.insert(docs)What it protects: Document structure before indexing Sample data: examples/data/rag_documents.json Use when: Validating documents before vector store indexing (LlamaIndex, Haystack)
Note: ADRI validates data structure, not content. For RAG, it ensures each document has required fields (id, text, metadata) and correct types, preventing indexing failures from malformed data.
Got a different use case? Share your story or contribute a standard - help the community!
13 battle-tested standards ready to copy and use - No need to write validation rules from scratch.
- π§ Customer Service - Support tickets, interactions
- π E-commerce Orders - Order processing, fulfillment
- π° Financial Transactions - Payments, accounting
- π₯ Healthcare Patients - EHR systems, patient records
- π Marketing Campaigns - Campaign tracking, ROI
- π LangChain Chains - Chain input validation
- π€ CrewAI Tasks - Multi-agent task context
- π LlamaIndex Documents - RAG document structure
- π¬ AutoGen Messages - Agent message validation
- π API Responses - REST API response structure
- β±οΈ Time Series - Metrics, sensor data
- π Key-Value Pairs - Configuration, settings
- π³ Nested JSON - Hierarchical structures
π Full Catalog | Can't find your use case? Add it! - Takes 15 minutes, helps everyone.
Built something with ADRI? Your standard could help hundreds of engineers.
- Use ADRI on your data
- Polish your standard
- Submit a PR - Contribution guide
Why contribute?
- π― Get featured in the catalog
- π¬ Connect with others in your domain
- π Help the community solve similar problems
Start Contributing | Discuss Ideas
# Clone repository
git clone https://github.com/adri-standard/adri.git
cd adri
# Install in development mode
pip install -e .
# Run tests
pytest
# Run linters
flake8 src/
black src/See CONTRIBUTING.md for contribution guidelines.
Apache 2.0 License. See LICENSE for details.
- π¬ GitHub Discussions - Ask questions, share use cases
- π GitHub Issues - Report bugs, request features
- π Documentation - Comprehensive guides and tutorials
- π€ Thomas Russell - Founder (updates & engagement)
- π¦ @thomas-ds.bsky.social - Real-time updates on Bluesky
- π’ Verodat - Company behind ADRI
If ADRI saves you time, show your support:
- β Star on GitHub - Helps us reach more developers
- π£οΈ Share your wins: "Solved [your use case] with #ADRI #AIAgents"
- π€ Contribute a standard: Your use case could help hundreds - Guide
- π¬ Discuss ideas: Propose new standards or share what you're building
One decorator. Any framework. Reliable agents.
Built with β€οΈ by Thomas Russell at Verodat