Skip to main content

Adaptive AI Agent Execution Layer — risk scoring, audit trails, regulatory compliance

Project description

Vaara — Built to see over the noise

PyPI Python License CI OpenSSF Scorecard OpenSSF Best Practices

Adaptive AI agent execution layer. Sits between agents and actions, scores risk in real time, and produces evidence artefacts that support EU AI Act Article 14 human-oversight and Article 12 logging obligations.

Vaara is a tool that helps deployers assemble evidence for their own conformity work. It does not itself conduct conformity assessments, certify compliance, or constitute legal advice. Deployers remain responsible for their obligations under the EU AI Act and other applicable law.

Three questions for every agent action:

  1. Should this happen? (adaptive risk scoring with conformal prediction)
  2. What is this? (action taxonomy with regulatory classification)
  3. What happened and why? (hash-chained audit trail)

Why Vaara

AI governance tools audit models. Vaara governs actions.

Models are scored once at deployment. Agents act continuously at runtime -- calling tools, moving money, modifying infrastructure. Individual actions may be safe, but sequences can be catastrophic. read_data + export_data + delete_data is a data exfiltration pattern where each step alone is benign.

Vaara catches this. It learns which risk signals predict bad outcomes, adapts its scoring online, and wraps every estimate in a distribution-free confidence interval. No retraining. No manual threshold tuning.

Install

pip install vaara

Python 3.10+. Zero runtime dependencies.

Quick Start

from vaara.pipeline import InterceptionPipeline

pipeline = InterceptionPipeline()

# Agent wants to execute a tool
result = pipeline.intercept(
    agent_id="agent-007",
    tool_name="fs.write_file",
    parameters={"path": "/etc/service.yaml", "content": "..."},
    agent_confidence=0.8,
)

if result.allowed:
    execute_tool("fs.write_file", {"path": "/etc/service.yaml", "content": "..."})
    # Report outcome so the scorer learns
    pipeline.report_outcome(result.action_id, outcome_severity=0.0)
else:
    print(f"Blocked: {result.reason}")
    # result.decision is "deny" or "escalate"
    # result.risk_score and result.risk_interval available

How It Works

Risk Scoring (Adaptive)

Five expert signals scored per action, combined via Multiplicative Weight Update:

Signal What it measures
Taxonomy base Static risk from action metadata (reversibility, blast radius, urgency)
Agent history This agent's track record (denial rate, bad outcomes)
Sequence pattern Dangerous action sequences (data exfiltration, privilege escalation, unauthorized tool chaining)
Burst detection Unusual action frequency spikes
Confidence gap High confidence on high-risk actions = suspicious

MWU learns which signals actually predict bad outcomes and shifts weight toward them. It carries a theoretical regret bound of O(√(T log N)) against the best fixed expert in hindsight (Arora–Hazan–Kale 2012).

Conformal Prediction

Every risk score is wrapped in a conformal prediction interval:

P(true_risk in [lower, upper]) >= 1 - alpha

No distributional assumptions. No model retraining. The decision uses the upper bound -- conservative by construction. Under distribution shift, FACI adaptive alpha maintains long-run coverage.

Decisions

ALLOW     — upper bound < 0.3 (configurable)
ESCALATE  — between 0.3 and 0.7 → route to human
DENY      — upper bound > 0.7

Cold start is maximally cautious: wide intervals route most actions through human review. As outcomes accumulate, intervals tighten and the system becomes autonomous.

Framework Integrations

LangChain

from vaara.integrations.langchain import VaaraCallbackHandler

pipeline = InterceptionPipeline()
handler = VaaraCallbackHandler(pipeline, agent_id="my-agent")
agent = create_react_agent(llm, tools)

result = agent.invoke(
    {"messages": [("user", "...")]},
    config={"callbacks": [handler]},
)

OpenAI Agents SDK

from vaara.integrations.openai_agents import VaaraToolGuardrail

pipeline = InterceptionPipeline()
guardrail = VaaraToolGuardrail(pipeline)
agent = Agent(name="my-agent", tools=[...], output_guardrails=[guardrail])

CrewAI

from vaara.integrations.crewai import VaaraCrewGovernance

pipeline = InterceptionPipeline()
gov = VaaraCrewGovernance(pipeline)
safe_crew = gov.governed_kickoff(crew)

MCP Server (Claude Code, Cursor)

python -m vaara.integrations.mcp_server

Add to Claude Code settings:

{
  "mcpServers": {
    "vaara": {
      "command": "python",
      "args": ["-m", "vaara.integrations.mcp_server"]
    }
  }
}

Compliance evidence

Vaara collects and maps evidence artefacts to specific article references in the EU AI Act and DORA. The output is evidence, not a conformity verdict — the deployer, with a Notified Body where applicable, owns the conformity decision.

report = pipeline.run_compliance_assessment(
    system_name="My Agent System",
    system_version="1.0.0",
)

# Article-by-article evidence mapping
for article in report.articles:
    print(f"{article.requirement.article}: {article.status.value}")
    # Article 9(1): evidence_sufficient
    # Article 12(1): evidence_sufficient
    # ...

Article references covered:

  • EU AI Act: Articles 9, 11–15, 61 (risk management, documentation, logging, transparency, human oversight, accuracy, post-market monitoring)
  • DORA: Articles 10, 12, 13 (ICT risk management, incident detection, incident response)

The audit trail is hash-chained (SHA-256) and tamper-evident, which supports Article 12(1) record-keeping obligations when configured with the deployer's required log content.

Cold Start

Generate synthetic traces to pre-calibrate the scorer:

from vaara.sandbox.trace_gen import TraceGenerator

gen = TraceGenerator()
traces = gen.generate(n_traces=100)
gen.pre_calibrate(pipeline, traces)
# Calibration in minutes instead of hours

Three agent archetypes (benign, careless, adversarial) with realistic outcome distributions.

Architecture

Agent (LangChain / OpenAI / CrewAI / MCP)
    |
    v
InterceptionPipeline.intercept()
    |
    +-- ActionRegistry     ->  classify tool_name to ActionType
    +-- AdaptiveScorer     ->  MWU + conformal risk interval
    +-- AuditTrail         ->  hash-chained immutable log
    +-- ComplianceEngine   ->  EU AI Act + DORA evidence mapping
    |
    v
InterceptionResult { allowed, risk_score, risk_interval, reason }
    |
    v
Execute or Block
    |
    v
report_outcome()  ->  closes feedback loop, MWU learns

Persistence

from vaara.audit.sqlite_backend import SQLiteAuditBackend

backend = SQLiteAuditBackend("audit.db")
trail = AuditTrail(on_record=backend.write_record)
pipeline = InterceptionPipeline(trail=trail)

WAL-mode SQLite, append-only, hash chain verified on load.

Formal Specification

See docs/formal_specification.md for the mathematical foundations: MWU regret bounds, conformal coverage guarantees, convergence rates, and security properties.

Tests

pip install vaara[dev]
pytest

200+ tests, runs in <1s.

License

See LICENSE.

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

vaara-0.4.3.tar.gz (141.3 kB view details)

Uploaded Source

Built Distribution

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

vaara-0.4.3-py3-none-any.whl (113.3 kB view details)

Uploaded Python 3

File details

Details for the file vaara-0.4.3.tar.gz.

File metadata

  • Download URL: vaara-0.4.3.tar.gz
  • Upload date:
  • Size: 141.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for vaara-0.4.3.tar.gz
Algorithm Hash digest
SHA256 3a92d4a7868f28ba6447760a4b620d72dec12c9c0f3cd13fcfaf1c3d940d4885
MD5 15814c4b89827bc7036819edc378ecb4
BLAKE2b-256 35a9e623c100332f19cec89db30f28a96f7fea816fe2b3501ad206e0c7240aca

See more details on using hashes here.

Provenance

The following attestation bundles were made for vaara-0.4.3.tar.gz:

Publisher: release.yml on vaaraio/vaara

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vaara-0.4.3-py3-none-any.whl.

File metadata

  • Download URL: vaara-0.4.3-py3-none-any.whl
  • Upload date:
  • Size: 113.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for vaara-0.4.3-py3-none-any.whl
Algorithm Hash digest
SHA256 c505dda83e37cd4583fcf94fb43cf536868839cf5d62e506911b6d1f0cc93c3c
MD5 df942501b1dcbff740b7dda29c7036db
BLAKE2b-256 ea5c4d4b6ec91691762b2daa42d0f12f9c1595cf8bdeb881b9db91d68ec092ca

See more details on using hashes here.

Provenance

The following attestation bundles were made for vaara-0.4.3-py3-none-any.whl:

Publisher: release.yml on vaaraio/vaara

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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