agentproof
Cryptographically signed, tamper-evident audit logs for autonomous agents.
As more tools let AI agents run code, call APIs, and modify files
autonomously, there's usually no way to verify — after the fact, or from
outside the agent's own self-report — what it actually did. agentproof
gives any agent a way to sign every action it takes into a hash-chained
log, so the record can be independently verified by anyone, without
trusting the agent's own summary of events.
Each log entry is signed with Ed25519 and references the SHA-256 hash of
the entry before it. Editing, deleting, or inserting an entry breaks the
chain in a way verify() will always catch.
Install
pip install agentproofchain
Quick start
from agentproof import sign_event, verify_log
sign_event(
"agent.log",
"tool_call",
{"tool": "read_file", "args": {"path": "config.yaml"}},
)
ok, message = verify_log("agent.log")
print(ok, message) # True, "1 entries verified, chain intact"
Or with the class wrapper, if you're signing many events against the same log and key:
from agentproof import ProofChain
chain = ProofChain("agent.log", signing_key=my_key_bytes)
chain.sign_event("tool_call", {"tool": "run_bash", "cmd": "pytest"})
chain.sign_event("model_decision", {"chose": "retry", "reason": "timeout"})
ok, msg = chain.verify()
Keys
Generate a key:
agentproof keygen
# AGENTPROOF_SIGNING_KEY=<base64 string>
agentproof resolves a signing key in this order:
signing_key=passed directly to a function call (raw bytes or base64 str)AGENTPROOF_SIGNING_KEYenvironment variable (base64) — works on platforms with no persistent filesystem (Render, Fly, Lambda, etc.)keyfile=passed directly (path to a JSON file:{"secret": [...]}or a raw JSON array of 32 ints)AGENTPROOF_KEYFILEenvironment variable (path to the same format)
No placeholder key is ever silently substituted — if none of the above
resolve, you get a clear ProofChainError.
Verifying someone else's log
If you didn't sign the log yourself, verify it against the signer's published public key instead of your own private key:
from agentproof import verify_log
import base64
pubkey = base64.b64decode("their-published-public-key==")
ok, msg = verify_log("their_agent.log", pubkey_bytes=pubkey)
Publish your own public key with:
agentproof pubkey
CLI
agentproof keygen # generate a new key
agentproof verify path/to/agent.log # verify using your own resolved key
agentproof verify log.jsonl --pubkey B64 # verify against a specific public key
agentproof pubkey # print your public key to share
What this doesn't do
agentproof proves that a specific key signed a specific sequence of
events, and that the sequence hasn't been altered since. It does not
verify that the content of an event is true — if an agent lies about
what a tool call returned and then signs that lie, the signature is
still valid. Signing happens at the point your code calls sign_event,
so the honesty guarantee is only as strong as what you choose to log and
when.
License
MIT
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 agentproofchain-0.1.0.tar.gz.
File metadata
- Download URL: agentproofchain-0.1.0.tar.gz
- Upload date:
- Size: 8.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a05783bdcc94f7f1088ee761489d7a48fe39ef2d3bb83fdfcdfa46963c3aac4
|
|
| MD5 |
fa67484ae56f5bc2b309d68cb1955258
|
|
| BLAKE2b-256 |
ec766bf49cb72aeeeda5b5f5b11a50f749c5fdf8db37d69de954989ba148e765
|
File details
Details for the file agentproofchain-0.1.0-py3-none-any.whl.
File metadata
- Download URL: agentproofchain-0.1.0-py3-none-any.whl
- Upload date:
- Size: 8.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2adc33fb6b970e035208e7d8c876bb4c202ccf83cb42742fd4c00b14fb0892ae
|
|
| MD5 |
6bd1938c2684e87c2af315bcd4a4b092
|
|
| BLAKE2b-256 |
55c96f7ec33bb1d005278027c1b99f7e5b22f671316198df3fb27165fbffbded
|