Agent Execution Verification System — transparent audit SDK for AI agents
Project description
AEVS SDK
Agent Execution Verification System — transparent audit SDK for AI agents
Documentation · Explorer · Examples · Get Credentials
Intercepts tool calls from supported frameworks, builds tamper-evident receipts (HMAC-signed, hash-chained), and sends them to the AEVS backend. Zero changes to your agent code.
Installation
pip install aevs
With framework extras:
pip install aevs[langchain] # LangChain / LangGraph
pip install aevs[mcp] # Model Context Protocol
| Framework | Extra | Min version |
|---|---|---|
| LangChain / LangGraph | aevs[langchain] |
langchain-core >= 0.2 |
| MCP | aevs[mcp] |
mcp >= 1.20 |
Quick Start
import aevs
from langchain_core.tools import tool
@tool
def search(query: str) -> str:
"""Search the web."""
return f"Results for: {query}"
aevs.configure(
api_key="aevs_sk_<key_id>_<hex_secret>",
agent_id="<your-agent-uuid>",
)
aevs.enable()
result = search.invoke({"query": "AI news"})
refs = aevs.get_reference_ids(clear=True)
print(refs)
# [{"seq": 1, "tool_name": "search", "reference_id": "abc-123-...", ...}]
aevs.flush()
aevs.disable()
Credentials can also be set via AEVS_API_KEY / AEVS_AGENT_ID environment variables. If missing, the SDK logs a warning and runs in no-op mode — your agent keeps working, receipts just aren't recorded.
How It Works
Agent (LangChain / MCP)
│
▼ tool call intercepted
ReceiptBuilder ──▶ HMAC sign + hash chain
│
▼
LocalBuffer (SQLite, encrypted at rest)
│
▼ background drainer
AEVSClient ──▶ POST /v1/receipts ──▶ AEVS Backend
aevs.enable()patches your framework's tool dispatch- Every tool call is intercepted and a signed receipt is created
- Receipts are buffered locally (encrypted, crash-safe)
- A background thread flushes receipts to the AEVS backend
- Verify any receipt using its
reference_id
API Overview
aevs.configure(api_key=..., **options) # set configuration
aevs.enable() # start intercepting tool calls
aevs.disable() # stop and restore originals
aevs.flush() # send buffered receipts now
aevs.get_session_id() # current session UUID
aevs.get_reference_ids(clear=True) # all captured reference IDs
aevs.get_reference_id(tool_call_id) # lookup single reference ID
aevs.is_healthy() # buffer write health check
See the full API reference for details.
Receipt Visibility
Control what data is included in each receipt:
| Mode | Inputs & outputs | Use case |
|---|---|---|
"public" |
Included | Full audit — verifiers can inspect everything |
"private" |
Included | Signed and submitted, but restricted access (default) |
"proof_only" |
Stripped | Prove a tool call happened without revealing data |
aevs.configure(api_key=..., agent_id=..., receipt_visibility="proof_only")
Examples
| Script | What it teaches | Requirements |
|---|---|---|
01_local_quickstart.py |
Minimal SDK loop — invoke a tool, see AEVS capture it | AEVS credentials only |
02_openai_agent.py |
LangChain agent with OpenAI | OPENAI_API_KEY + AEVS |
03_asi_agent.py |
Same agent with ASI:One — provider-agnostic | ASI_API_KEY + AEVS |
See examples/README.md for setup instructions.
Documentation
| Page | Description |
|---|---|
| Getting Started | Install, configure, and capture your first receipt |
| Core Concepts | Receipts, hash chains, sessions, invocation tracking |
| Configuration | All configuration options with defaults |
| LangChain Integration | LangChain / LangGraph guide |
| MCP Integration | Model Context Protocol guide |
| Receipt Verification | Visibility modes and verification |
| Security & Privacy | Threat model and data handling |
| API Reference | Complete function reference |
| Troubleshooting | Common issues and fixes |
Data & Privacy
- Receipts are buffered locally in an encrypted SQLite database
- Submitted to the AEVS backend over HTTPS
- Use
receipt_visibility="proof_only"to prevent inputs/outputs from leaving the host - AEVS is tamper-evident, not tamper-proof — it detects modification after the fact
Development
git clone https://github.com/fetchai/AEVS-sdk.git && cd AEVS-sdk
make install # poetry install --all-extras
make check # lint + typecheck + tests (the CI gate)
make test # run tests
make test-cov # tests with coverage
make lint # ruff check
make format # ruff format + auto-fix
make typecheck # mypy --strict
make build # build sdist + wheel
Contributing
See CONTRIBUTING.md for the full guide.
Security
Please do not open a public issue for security problems. See SECURITY.md for the disclosure process.
License
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 aevs-0.2.2.tar.gz.
File metadata
- Download URL: aevs-0.2.2.tar.gz
- Upload date:
- Size: 40.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
03868618c8124f50119e3c179c04eb260629a33662f476d19abbcf9eaa33bd7c
|
|
| MD5 |
61e842b3b8045bc7b4a6dee2c1d74d4d
|
|
| BLAKE2b-256 |
0839c019da19306f6c2d50473657f3f3c3f7c34267875cf3d924fdc3b5017bd1
|
Provenance
The following attestation bundles were made for aevs-0.2.2.tar.gz:
Publisher:
release.yml on fetchai/AEVS-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aevs-0.2.2.tar.gz -
Subject digest:
03868618c8124f50119e3c179c04eb260629a33662f476d19abbcf9eaa33bd7c - Sigstore transparency entry: 1763244280
- Sigstore integration time:
-
Permalink:
fetchai/AEVS-sdk@578397636a002a7c255daab1e974edc9d5ab7b9f -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/fetchai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@578397636a002a7c255daab1e974edc9d5ab7b9f -
Trigger Event:
push
-
Statement type:
File details
Details for the file aevs-0.2.2-py3-none-any.whl.
File metadata
- Download URL: aevs-0.2.2-py3-none-any.whl
- Upload date:
- Size: 46.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
11056ec52a800387ab4e3c377ff794010b3f9e46fedaa1275262a728b2782d34
|
|
| MD5 |
3dbf9744c030f19142bfbebdddbb922d
|
|
| BLAKE2b-256 |
5d127034e63e7970ddf521f51c7d65c86a407d1640da2fe650ae3d0fea1504f1
|
Provenance
The following attestation bundles were made for aevs-0.2.2-py3-none-any.whl:
Publisher:
release.yml on fetchai/AEVS-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aevs-0.2.2-py3-none-any.whl -
Subject digest:
11056ec52a800387ab4e3c377ff794010b3f9e46fedaa1275262a728b2782d34 - Sigstore transparency entry: 1763244582
- Sigstore integration time:
-
Permalink:
fetchai/AEVS-sdk@578397636a002a7c255daab1e974edc9d5ab7b9f -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/fetchai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@578397636a002a7c255daab1e974edc9d5ab7b9f -
Trigger Event:
push
-
Statement type: