Guard CrewAI tools with EMILIA Protocol — require an offline-verifiable authorization receipt (EP-RECEIPT-v1) before an irreversible tool runs: missing -> refused, valid -> runs, replay -> refused, forged -> refused (RR-1).
Project description
emilia-crewai
Guard CrewAI tools with the EMILIA Protocol — require an offline-verifiable authorization receipt (EP-RECEIPT-v1) before an irreversible tool runs.
missing receipt -> refused
valid receipt -> runs
replayed receipt -> refused (one-time consumption)
forged receipt -> refused
Verification is offline Ed25519 over canonical JSON via
emilia-verify — zero network, no
vendor in the loop. The approval becomes portable evidence an auditor can check
without trusting the operator. It is necessary, not sufficient: it composes with —
never replaces — your tool's own checks.
EMILIA proves who authorized a specific action. It is not a truth oracle and not an access-control runtime; it is the portable authorization receipt any runtime can emit.
Install
pip install emilia-crewai # brings in emilia-verify
pip install "emilia-crewai[crewai]" # also install CrewAI (optional peer)
Quick start
Gate a CrewAI BaseTool instance — its _run now requires a receipt:
from emilia_crewai import guard_crewai_tool, using_receipt
guard_crewai_tool(
my_wire_tool,
action="payment.release",
trusted_keys=[ISSUER_SPKI_B64URL], # pin the issuer keys you trust
target_for=lambda to, amount: f"payment.release:{to}", # optional per-call binding
)
# Bind the human-approved receipt for the agent step, then run as normal:
with using_receipt(receipt):
crew.kickoff() # my_wire_tool runs only with a valid, action-bound receipt
Or decorate a plain tool function:
from emilia_crewai import require_receipt, using_receipt
@require_receipt("payment.release", trusted_keys=[ISSUER_SPKI_B64URL])
def send_payment(to: str, amount: int) -> str:
return do_transfer(to, amount)
Lower-level gate (verify -> reserve -> commit/release yourself):
from emilia_crewai import ReceiptGate
gate = ReceiptGate("payment.release", trusted_keys=[ISSUER_SPKI_B64URL])
result = gate.run(receipt, lambda: do_transfer(to, amount), target=to)
Multi-agent / quorum
For collective decisions (M-of-N agents or humans approving one action), EMILIA's
quorum produces a single composite, offline-verifiable receipt. See the
emilia_verify.verify_quorum primitive and draft-schrock-ep-quorum.
What it is / isn't
- Is: an offline gate that enforces a named human authorized this exact action and yields portable, third-party-verifiable evidence.
- Isn't: authentication ("who is the agent"), access control, or a hosted runtime. It composes on top of whatever runtime you use.
Apache-2.0. Reference implementation, experimental. Part of the
EMILIA Protocol — an open
IETF-track authorization-receipt standard (draft-schrock-ep-authorization-receipts).
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
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 emilia_crewai-0.1.0.tar.gz.
File metadata
- Download URL: emilia_crewai-0.1.0.tar.gz
- Upload date:
- Size: 12.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
335f41e516f76c90443cdf4960c45639429ae5b222d28f4556fad96089e1d3b5
|
|
| MD5 |
e556e5e96001a1d150810031ca539ebe
|
|
| BLAKE2b-256 |
ae82f69d13e1c17006594ad6e164759a7fed155fce548297b8faf016fdfc8531
|
File details
Details for the file emilia_crewai-0.1.0-py3-none-any.whl.
File metadata
- Download URL: emilia_crewai-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
414ea89f873f8db529907d7225750713b8cdeeb6ef587dbd6246c01c0222a3af
|
|
| MD5 |
683a1a4e5ae530bc555b82b804944dfe
|
|
| BLAKE2b-256 |
5c76dcc68bbdcf8f144534b8f13feb5cc5ced16663bef91ca8d1b3e14103fa9d
|