Skip to main content

Enterprise data quality layer for AI agents - Validates data quality with Verodat cloud integration. Requires Verodat API key.

Project description

ADRI - Agent Data Readiness Index

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 results

Auto-validates data quality. Works with any framework. 2 minutes to integrate.


ADRI = Data Contracts for AI Agents

Think of ADRI standards as executable data contracts - formal agreements that define what good data looks like and automatically enforce those agreements at runtime.

Traditional approach: Documentation says "email must be valid" โ†’ agents break when it's not
ADRI approach: Contract defines email validation โ†’ invalid emails automatically blocked

# Your data contract (auto-generated from good data)
field_requirements:
  email:
    type: string
    nullable: false
    pattern: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
    validation_rules:
      - name: email format validation
        severity: CRITICAL
        rule_expression: REGEX_MATCH('...')

Contract benefits:

  • ๐Ÿ“‹ Schema Contract: Field names and types must match
  • โœ… Quality Contract: Validation rules must pass
  • ๐Ÿ“Š SLA Contract: Quality scores must meet thresholds
  • ๐Ÿ”’ Enforcement: Violations blocked before reaching agents

This aligns ADRI with modern data architectures: Data Mesh (domain-owned contracts), Data Fabric (unified enforcement), DataOps (automated quality gates).

๐Ÿ‘‰ Learn more about Data Contracts โ†’


How ADRI Works

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.


What is ADRI?

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.

Why ADRI?

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.

Complete Example

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 standard

What happened:

  1. Function executed successfully
  2. ADRI analyzed the data structure
  3. Generated quality standard in ADRI/dev/standards/customer_data.yaml
  4. 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 report

Installation

pip install adri

Requirements: Python 3.10+


โญ Star us if ADRI saves you time - it helps us grow!


Quick Links

Features

๐ŸŽฏ One Decorator, Complete Protection

@adri_protected(standard="your_data", data_param="data")
def your_function(data):
    return results

๐Ÿค– Framework Agnostic

Works with any AI agent framework:

  • LangChain & LangGraph
  • CrewAI
  • AutoGen
  • LlamaIndex
  • Haystack
  • Semantic Kernel
  • Generic Python

๐Ÿ“Š Five Quality Dimensions

ADRI validates:

  1. Validity - Data types and formats
  2. Completeness - Required fields present
  3. Consistency - Cross-field relationships
  4. Accuracy - Value ranges and patterns
  5. Timeliness - Data freshness

๐Ÿ”„ Auto-Generation

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

๐Ÿ›ก๏ธ Protection Modes

# 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")

๐Ÿ”ง CLI Tools

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 standard

๐Ÿ“ Local Logging

Developer-friendly insights during development:

  • Quality scores and assessments
  • Dimension-specific failures
  • Auto-generated standards
  • Stored in ADRI/dev/logs/

Common Use Cases

API Data Validation

@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

Multi-Agent Workflows

@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)

RAG Pipelines

@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!

๐Ÿ“š Don't Start from Scratch - Use Catalog Standards

13 battle-tested standards ready to copy and use - No need to write validation rules from scratch.

Business Domains

AI Frameworks

Generic Templates

๐Ÿ“– Full Catalog | Can't find your use case? Add it! - Takes 15 minutes, helps everyone.

๐Ÿค Share Your Standards

Built something with ADRI? Your standard could help hundreds of engineers.

  1. Use ADRI on your data
  2. Polish your standard
  3. 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

Development

# 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.

License

Apache 2.0 License. See LICENSE for details.

Community & Support

Get Help

Connect with the Team

Support This Project

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

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

verodat_adri-6.1.0.tar.gz (1.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

verodat_adri-6.1.0-py3-none-any.whl (309.3 kB view details)

Uploaded Python 3

File details

Details for the file verodat_adri-6.1.0.tar.gz.

File metadata

  • Download URL: verodat_adri-6.1.0.tar.gz
  • Upload date:
  • Size: 1.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for verodat_adri-6.1.0.tar.gz
Algorithm Hash digest
SHA256 672bbd3fec155c7a2a6bc2b9581521cddfbdb632cec8f3ce56ef110e6dc1daed
MD5 ffa991cd044b0ecb4802831301643dd3
BLAKE2b-256 5cff85bf6f8f8f3f95d65903cfadfb124303a465c3dad9b0f2b5e1143875ef79

See more details on using hashes here.

File details

Details for the file verodat_adri-6.1.0-py3-none-any.whl.

File metadata

  • Download URL: verodat_adri-6.1.0-py3-none-any.whl
  • Upload date:
  • Size: 309.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for verodat_adri-6.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 34c8f2d40b1159fe60a241c11a54c169cadbaa744a15efd5a82eb8006a8fe607
MD5 771842825131fa1d5a39af6bcdcf4376
BLAKE2b-256 d11a3ffa1819f920a09f29fed445ede831d9db1392ab9388de4fe1cfc2947af8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page