crewai-aer1
AER-1 verifiable execution receipts for CrewAI crews. One checkable receipt per tool call, emitted through CrewAI's own typed event bus. No changes to your Crew, Agent, or Task definitions.
For whole-run workflow receipts with a Merkle root (AER-1 Section 8), see aer1-crewai.
Quickstart
from crewai import Agent, Crew, Task
from crewai_aer1 import AER1Listener
receipts = AER1Listener() # keep this reference alive for the process
researcher = Agent(
role="Researcher",
goal="Find verifiable facts",
backstory="A careful analyst.",
tools=[my_search_tool],
)
task = Task(description="...", expected_output="...", agent=researcher)
crew = Crew(agents=[researcher], tasks=[task])
crew.kickoff()
receipts.save("receipts.jsonl")
print(f"{len(receipts.receipts)} verifiable receipts recorded")
That is the whole integration. The listener subclasses CrewAI's BaseEventListener and registers handlers for ToolUsageFinishedEvent (and CrewKickoffStartedEvent for crew context) on the singleton event bus in setup_listeners. Because the bus is process-wide, every crew you kick off is covered with zero code intrusion. Just make sure the module that instantiates AER1Listener is imported, and the instance stays alive (not garbage collected), or handlers stop firing.
What a receipt proves
Each receipt follows the AER-1 receipt record (IETF Internet-Draft draft-zambo-aer1, Sections 3-6): a stable id, RFC 3339 timestamp, tool identity, provenance class (EXECUTED BY CREWAI), base64 canonical bytes, and a SHA-256 output commitment anyone can recompute. A receipt proves the recorded bytes were not changed after the tool ran. It does not prove the tool was correct.
Honest boundaries, enforced in code:
- Cached tool results (
from_cache=True) are skipped. Nothing executed, so there is nothing to attest. - Tool calls the tool itself reported as failed are skipped. There is no successful result to commit to.
- A listener exception never breaks a crew run. Every handler is guarded.
Verify a receipt yourself
from crewai_aer1 import verify_receipt
ok, reason = verify_receipt(receipts.receipts[0])
Spec and conformance
- Spec: https://datatracker.ietf.org/doc/draft-zambo-aer1/ (open Internet-Draft)
- Conformance kit: https://gitlab.com/rambozambodotdev/zambo
License
MIT
Metadata
Release files for crewai-aer1 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| crewai_aer1-0.1.1.tar.gz | 6.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| crewai_aer1-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 12.9 kB
Release files / crewai_aer1-0.1.1.tar.gz
| Download URL | crewai_aer1-0.1.1.tar.gz |
|---|---|
| Size | 6.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4d029eb1aa55eaad96f10c8a9d331be30954ff76989d26a671e15eb161b8b58a
|
|
BLAKE2b-256 checksum How to use checksums |
39b11285348a6ff08c533de44abe580cf24d316c34f56092820a08782135664b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
rambo-pypi-grab/0.1.0
|
Release files / crewai_aer1-0.1.1-py3-none-any.whl
| Download URL | crewai_aer1-0.1.1-py3-none-any.whl |
|---|---|
| Size | 6.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d0491b0297473459df424485909390d3a27e82c558a3d0b797b338e533f8906
|
|
BLAKE2b-256 checksum How to use checksums |
355805f926c4cbafb7f42e73050b455259bd045420ac21bf04b0f0dbf1c84916
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
rambo-pypi-grab/0.1.0
|