aer1-all 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,67 @@
1
+ Metadata-Version: 2.4
2
+ Name: aer1-all
3
+ Version: 0.1.0
4
+ Summary: One install for every AER-1 framework collector: verifiable AI agent execution receipts, auto-detected.
5
+ License: Apache-2.0
6
+ Project-URL: Homepage, https://zambo.dev
7
+ Project-URL: IETF Draft, https://datatracker.ietf.org/doc/draft-zambo-aer1/12/
8
+ Project-URL: Verify a receipt, https://zambo.dev/verify/
9
+ Keywords: aer-1,ai-agents,verifiable-receipts,audit,tracing,audit-trail,zambo,metapackage
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
14
+ Requires-Python: >=3.10
15
+ Description-Content-Type: text/markdown
16
+ Requires-Dist: aer1-haystack>=0.1.0
17
+ Requires-Dist: aer1-pydantic>=0.1.0
18
+ Requires-Dist: aer1-langgraph>=0.1.4
19
+ Requires-Dist: aer1-llamaindex>=0.1.1
20
+ Requires-Dist: aer1-crewai>=0.1.5
21
+ Requires-Dist: aer1-autogen>=0.1.2
22
+ Requires-Dist: aer1-smolagents>=0.1.7
23
+ Requires-Dist: aer1-middleware>=0.2.1
24
+ Requires-Dist: aer1-openai-agents>=0.1.6
25
+
26
+ # aer1-all
27
+
28
+ One install for every AER-1 framework collector. Verifiable execution receipts for AI agents, whichever framework you use.
29
+
30
+ ```bash
31
+ pip install aer1-all
32
+ ```
33
+
34
+ ```python
35
+ import aer1_all
36
+
37
+ report = aer1_all.instrument()
38
+ for framework, info in report.items():
39
+ if info["ready"]:
40
+ print(framework, "ready:", info["snippet"])
41
+ ```
42
+
43
+ `instrument()` detects which collectors (and their underlying frameworks) are importable in your environment and reports readiness. It never raises on missing pieces. Each ready framework ships a two-line wiring snippet in the report.
44
+
45
+ Included collectors (all live on PyPI):
46
+
47
+ - CrewAI (`aer1-crewai`)
48
+ - LangGraph (`aer1-langgraph`)
49
+ - LlamaIndex (`aer1-llamaindex`)
50
+ - AutoGen (`aer1-autogen`)
51
+ - SmolAgents (`aer1-smolagents`)
52
+ - Haystack (`aer1-haystack`)
53
+ - Pydantic AI (`aer1-pydantic`)
54
+ - OpenAI Agents SDK (`aer1-openai-agents`)
55
+ - Framework-agnostic middleware (`aer1-middleware`)
56
+
57
+ `aer1-langchain` and `aer1-strands` join this list as soon as they land on PyPI.
58
+
59
+ ## What a verifiable receipt proves
60
+
61
+ A verifiable receipt proves the recorded result bytes were not changed after capture. It does not prove the model was right, and it does not prove the upstream capture was honest. That boundary is deliberate: the receipt is a claim about bytes, and the bytes are re-checkable by anyone.
62
+
63
+ Verify any receipt at https://zambo.dev/verify/.
64
+
65
+ ## Spec
66
+
67
+ AER-1 is an IETF Internet-Draft by Brennan Zambo: https://datatracker.ietf.org/doc/draft-zambo-aer1/12/
@@ -0,0 +1,42 @@
1
+ # aer1-all
2
+
3
+ One install for every AER-1 framework collector. Verifiable execution receipts for AI agents, whichever framework you use.
4
+
5
+ ```bash
6
+ pip install aer1-all
7
+ ```
8
+
9
+ ```python
10
+ import aer1_all
11
+
12
+ report = aer1_all.instrument()
13
+ for framework, info in report.items():
14
+ if info["ready"]:
15
+ print(framework, "ready:", info["snippet"])
16
+ ```
17
+
18
+ `instrument()` detects which collectors (and their underlying frameworks) are importable in your environment and reports readiness. It never raises on missing pieces. Each ready framework ships a two-line wiring snippet in the report.
19
+
20
+ Included collectors (all live on PyPI):
21
+
22
+ - CrewAI (`aer1-crewai`)
23
+ - LangGraph (`aer1-langgraph`)
24
+ - LlamaIndex (`aer1-llamaindex`)
25
+ - AutoGen (`aer1-autogen`)
26
+ - SmolAgents (`aer1-smolagents`)
27
+ - Haystack (`aer1-haystack`)
28
+ - Pydantic AI (`aer1-pydantic`)
29
+ - OpenAI Agents SDK (`aer1-openai-agents`)
30
+ - Framework-agnostic middleware (`aer1-middleware`)
31
+
32
+ `aer1-langchain` and `aer1-strands` join this list as soon as they land on PyPI.
33
+
34
+ ## What a verifiable receipt proves
35
+
36
+ A verifiable receipt proves the recorded result bytes were not changed after capture. It does not prove the model was right, and it does not prove the upstream capture was honest. That boundary is deliberate: the receipt is a claim about bytes, and the bytes are re-checkable by anyone.
37
+
38
+ Verify any receipt at https://zambo.dev/verify/.
39
+
40
+ ## Spec
41
+
42
+ AER-1 is an IETF Internet-Draft by Brennan Zambo: https://datatracker.ietf.org/doc/draft-zambo-aer1/12/
@@ -0,0 +1,181 @@
1
+ """aer1-all: one install for every AER-1 framework collector.
2
+
3
+ ``pip install aer1-all`` pulls in every published AER-1 framework collector.
4
+ ``aer1_all.instrument()`` then detects which collectors (and their underlying
5
+ frameworks) are actually importable in your environment and reports what is
6
+ ready, without ever raising on missing pieces.
7
+
8
+ A verifiable receipt proves the recorded result bytes were not changed after
9
+ capture. It does not prove the model was right or the upstream capture was
10
+ honest. That boundary is deliberate and documented in every collector.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import importlib
16
+
17
+ __version__ = "0.1.0"
18
+
19
+ # framework -> (collector pypi name, collector module, collector class,
20
+ # framework import probe, two-line wiring snippet)
21
+ FRAMEWORKS = {
22
+ "crewai": (
23
+ "aer1-crewai",
24
+ "aer1_crewai",
25
+ "AER1CrewAIListener",
26
+ "crewai",
27
+ 'from aer1_crewai import AER1CrewAIListener\n'
28
+ 'listener = AER1CrewAIListener(goal="...") # pass to Crew(...)',
29
+ ),
30
+ "langgraph": (
31
+ "aer1-langgraph",
32
+ "aer1_langgraph",
33
+ "AER1LangGraphHandler",
34
+ "langgraph",
35
+ 'from aer1_langgraph import AER1LangGraphHandler\n'
36
+ 'handler = AER1LangGraphHandler() # attach to your StateGraph',
37
+ ),
38
+ "llamaindex": (
39
+ "aer1-llamaindex",
40
+ "aer1_llamaindex",
41
+ "AER1ReceiptCollector",
42
+ "llama_index",
43
+ 'from aer1_llamaindex import AER1ReceiptCollector\n'
44
+ 'collector = AER1ReceiptCollector() # pass via CallbackManager',
45
+ ),
46
+ "autogen": (
47
+ "aer1-autogen",
48
+ "aer1_autogen",
49
+ "AER1AutoGenCollector",
50
+ "autogen_agentchat",
51
+ 'from aer1_autogen import AER1AutoGenCollector, AER1AgentWrapper\n'
52
+ 'collector = AER1AutoGenCollector(goal="...") # wrap your agents',
53
+ ),
54
+ "smolagents": (
55
+ "aer1-smolagents",
56
+ "aer1_smolagents",
57
+ "AER1ReceiptCollector",
58
+ "smolagents",
59
+ 'from aer1_smolagents import AER1ReceiptCollector\n'
60
+ 'collector = AER1ReceiptCollector() # step_callbacks={TaskStep: collector, ...}',
61
+ ),
62
+ "haystack": (
63
+ "aer1-haystack",
64
+ "aer1_haystack",
65
+ "AER1ReceiptCollector",
66
+ "haystack",
67
+ 'from aer1_haystack import AER1ReceiptCollector\n'
68
+ 'collector = AER1ReceiptCollector() # connect to your Pipeline',
69
+ ),
70
+ "pydantic-ai": (
71
+ "aer1-pydantic",
72
+ "aer1_pydantic",
73
+ "AER1ReceiptCollector",
74
+ "pydantic_ai",
75
+ 'from aer1_pydantic import AER1ReceiptCollector\n'
76
+ 'collector = AER1ReceiptCollector() # wrap your Pydantic AI agent',
77
+ ),
78
+ "openai-agents": (
79
+ "aer1-openai-agents",
80
+ "aer1_openai_agents",
81
+ "AER1TracingProcessor",
82
+ "agents",
83
+ 'from aer1_openai_agents import AER1TracingProcessor\n'
84
+ 'from agents.tracing import add_trace_processor\n'
85
+ 'add_trace_processor(AER1TracingProcessor(goal="..."))',
86
+ ),
87
+ "middleware": (
88
+ "aer1-middleware",
89
+ "aer1_middleware",
90
+ "create_receipt",
91
+ None, # framework-agnostic toolkit, no single framework probe
92
+ 'from aer1_middleware import create_receipt, verify_receipt\n'
93
+ 'receipt = create_receipt(tool_name="...", inputs={...}, output={...})',
94
+ ),
95
+ }
96
+
97
+
98
+ def _probe(module_name):
99
+ """Return True if module_name imports, False otherwise. Never raises."""
100
+ if not module_name:
101
+ return True
102
+ try:
103
+ importlib.import_module(module_name)
104
+ return True
105
+ except Exception:
106
+ return False
107
+
108
+
109
+ def available():
110
+ """Return {framework: info} for every collector that is importable here."""
111
+ out = {}
112
+ for framework, (pypi_name, module, cls, fw_probe, snippet) in FRAMEWORKS.items():
113
+ if not _probe(module):
114
+ continue
115
+ out[framework] = {
116
+ "pypi": pypi_name,
117
+ "module": module,
118
+ "class": cls,
119
+ "framework_present": _probe(fw_probe),
120
+ "snippet": snippet,
121
+ }
122
+ return out
123
+
124
+
125
+ def get_collector(framework):
126
+ """Return the collector class for a framework, or None if unavailable."""
127
+ info = available().get(framework)
128
+ if not info:
129
+ return None
130
+ try:
131
+ module = importlib.import_module(info["module"])
132
+ return getattr(module, info["class"], None)
133
+ except Exception:
134
+ return None
135
+
136
+
137
+ def instrument():
138
+ """Detect installed AER-1 collectors and report readiness.
139
+
140
+ Returns a dict mapping framework name to a status dict with keys:
141
+ ``pypi`` (package name), ``ready`` (collector importable AND its
142
+ framework importable, or framework-agnostic), ``reason`` (human string),
143
+ and ``snippet`` (the two-line wiring example).
144
+
145
+ Never raises on missing packages or frameworks. A verifiable receipt
146
+ proves recorded bytes were unchanged, not that the model was right.
147
+ """
148
+ report = {}
149
+ for framework, (pypi_name, module, cls, fw_probe, snippet) in FRAMEWORKS.items():
150
+ if not _probe(module):
151
+ report[framework] = {
152
+ "pypi": pypi_name,
153
+ "ready": False,
154
+ "reason": "collector %s not installed" % pypi_name,
155
+ "snippet": snippet,
156
+ }
157
+ continue
158
+ if fw_probe is None or _probe(fw_probe):
159
+ report[framework] = {
160
+ "pypi": pypi_name,
161
+ "ready": True,
162
+ "reason": "collector and framework importable",
163
+ "snippet": snippet,
164
+ }
165
+ else:
166
+ report[framework] = {
167
+ "pypi": pypi_name,
168
+ "ready": False,
169
+ "reason": "collector installed but framework '%s' not importable" % fw_probe,
170
+ "snippet": snippet,
171
+ }
172
+ return report
173
+
174
+
175
+ __all__ = [
176
+ "__version__",
177
+ "FRAMEWORKS",
178
+ "available",
179
+ "get_collector",
180
+ "instrument",
181
+ ]
@@ -0,0 +1,67 @@
1
+ Metadata-Version: 2.4
2
+ Name: aer1-all
3
+ Version: 0.1.0
4
+ Summary: One install for every AER-1 framework collector: verifiable AI agent execution receipts, auto-detected.
5
+ License: Apache-2.0
6
+ Project-URL: Homepage, https://zambo.dev
7
+ Project-URL: IETF Draft, https://datatracker.ietf.org/doc/draft-zambo-aer1/12/
8
+ Project-URL: Verify a receipt, https://zambo.dev/verify/
9
+ Keywords: aer-1,ai-agents,verifiable-receipts,audit,tracing,audit-trail,zambo,metapackage
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
14
+ Requires-Python: >=3.10
15
+ Description-Content-Type: text/markdown
16
+ Requires-Dist: aer1-haystack>=0.1.0
17
+ Requires-Dist: aer1-pydantic>=0.1.0
18
+ Requires-Dist: aer1-langgraph>=0.1.4
19
+ Requires-Dist: aer1-llamaindex>=0.1.1
20
+ Requires-Dist: aer1-crewai>=0.1.5
21
+ Requires-Dist: aer1-autogen>=0.1.2
22
+ Requires-Dist: aer1-smolagents>=0.1.7
23
+ Requires-Dist: aer1-middleware>=0.2.1
24
+ Requires-Dist: aer1-openai-agents>=0.1.6
25
+
26
+ # aer1-all
27
+
28
+ One install for every AER-1 framework collector. Verifiable execution receipts for AI agents, whichever framework you use.
29
+
30
+ ```bash
31
+ pip install aer1-all
32
+ ```
33
+
34
+ ```python
35
+ import aer1_all
36
+
37
+ report = aer1_all.instrument()
38
+ for framework, info in report.items():
39
+ if info["ready"]:
40
+ print(framework, "ready:", info["snippet"])
41
+ ```
42
+
43
+ `instrument()` detects which collectors (and their underlying frameworks) are importable in your environment and reports readiness. It never raises on missing pieces. Each ready framework ships a two-line wiring snippet in the report.
44
+
45
+ Included collectors (all live on PyPI):
46
+
47
+ - CrewAI (`aer1-crewai`)
48
+ - LangGraph (`aer1-langgraph`)
49
+ - LlamaIndex (`aer1-llamaindex`)
50
+ - AutoGen (`aer1-autogen`)
51
+ - SmolAgents (`aer1-smolagents`)
52
+ - Haystack (`aer1-haystack`)
53
+ - Pydantic AI (`aer1-pydantic`)
54
+ - OpenAI Agents SDK (`aer1-openai-agents`)
55
+ - Framework-agnostic middleware (`aer1-middleware`)
56
+
57
+ `aer1-langchain` and `aer1-strands` join this list as soon as they land on PyPI.
58
+
59
+ ## What a verifiable receipt proves
60
+
61
+ A verifiable receipt proves the recorded result bytes were not changed after capture. It does not prove the model was right, and it does not prove the upstream capture was honest. That boundary is deliberate: the receipt is a claim about bytes, and the bytes are re-checkable by anyone.
62
+
63
+ Verify any receipt at https://zambo.dev/verify/.
64
+
65
+ ## Spec
66
+
67
+ AER-1 is an IETF Internet-Draft by Brennan Zambo: https://datatracker.ietf.org/doc/draft-zambo-aer1/12/
@@ -0,0 +1,9 @@
1
+ README.md
2
+ pyproject.toml
3
+ aer1_all/__init__.py
4
+ aer1_all.egg-info/PKG-INFO
5
+ aer1_all.egg-info/SOURCES.txt
6
+ aer1_all.egg-info/dependency_links.txt
7
+ aer1_all.egg-info/requires.txt
8
+ aer1_all.egg-info/top_level.txt
9
+ tests/test_aer1_all.py
@@ -0,0 +1,9 @@
1
+ aer1-haystack>=0.1.0
2
+ aer1-pydantic>=0.1.0
3
+ aer1-langgraph>=0.1.4
4
+ aer1-llamaindex>=0.1.1
5
+ aer1-crewai>=0.1.5
6
+ aer1-autogen>=0.1.2
7
+ aer1-smolagents>=0.1.7
8
+ aer1-middleware>=0.2.1
9
+ aer1-openai-agents>=0.1.6
@@ -0,0 +1 @@
1
+ aer1_all
@@ -0,0 +1,38 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "aer1-all"
7
+ version = "0.1.0"
8
+ description = "One install for every AER-1 framework collector: verifiable AI agent execution receipts, auto-detected."
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = { text = "Apache-2.0" }
12
+ dependencies = [
13
+ "aer1-haystack>=0.1.0",
14
+ "aer1-pydantic>=0.1.0",
15
+ "aer1-langgraph>=0.1.4",
16
+ "aer1-llamaindex>=0.1.1",
17
+ "aer1-crewai>=0.1.5",
18
+ "aer1-autogen>=0.1.2",
19
+ "aer1-smolagents>=0.1.7",
20
+ "aer1-middleware>=0.2.1",
21
+ "aer1-openai-agents>=0.1.6",
22
+ ]
23
+ keywords = ["aer-1", "ai-agents", "verifiable-receipts", "audit", "tracing", "audit-trail", "zambo", "metapackage"]
24
+ classifiers = [
25
+ "Development Status :: 3 - Alpha",
26
+ "Intended Audience :: Developers",
27
+ "Programming Language :: Python :: 3",
28
+ "Topic :: Software Development :: Libraries :: Python Modules",
29
+ ]
30
+
31
+ [project.urls]
32
+ Homepage = "https://zambo.dev"
33
+ "IETF Draft" = "https://datatracker.ietf.org/doc/draft-zambo-aer1/12/"
34
+ "Verify a receipt" = "https://zambo.dev/verify/"
35
+
36
+ [tool.setuptools.packages.find]
37
+ where = ["."]
38
+ include = ["aer1_all*"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,52 @@
1
+ """Unit tests for aer1_all (run against the source tree)."""
2
+
3
+ import aer1_all
4
+
5
+
6
+ def test_version():
7
+ assert aer1_all.__version__ == "0.1.0"
8
+
9
+
10
+ def test_frameworks_registry_shape():
11
+ for fw, entry in aer1_all.FRAMEWORKS.items():
12
+ assert len(entry) == 5, fw
13
+ pypi_name, module, cls, fw_probe, snippet = entry
14
+ assert pypi_name.startswith("aer1-"), fw
15
+ assert module.startswith("aer1_"), fw
16
+ assert isinstance(snippet, str) and "from " in snippet, fw
17
+
18
+
19
+ def test_probe_never_raises():
20
+ assert aer1_all._probe("definitely_not_a_real_module_xyz") is False
21
+ assert aer1_all._probe(None) is True
22
+ assert aer1_all._probe("sys") is True
23
+
24
+
25
+ def test_instrument_never_raises_and_covers_all_frameworks():
26
+ report = aer1_all.instrument()
27
+ assert set(report.keys()) == set(aer1_all.FRAMEWORKS.keys())
28
+ for fw, info in report.items():
29
+ assert set(info.keys()) == {"pypi", "ready", "reason", "snippet"}, fw
30
+ assert isinstance(info["ready"], bool), fw
31
+ assert isinstance(info["reason"], str) and info["reason"], fw
32
+
33
+
34
+ def test_instrument_zero_collectors_reports_not_installed():
35
+ # In this dev environment collectors may or may not be installed;
36
+ # the invariant is the shape, not the values.
37
+ report = aer1_all.instrument()
38
+ for fw, info in report.items():
39
+ if not info["ready"]:
40
+ assert "not installed" in info["reason"] or "not importable" in info["reason"], fw
41
+
42
+
43
+ def test_get_collector_missing_returns_none():
44
+ assert aer1_all.get_collector("no_such_framework_xyz") is None
45
+
46
+
47
+ def test_no_banned_phrasing():
48
+ import pathlib
49
+ for f in list(pathlib.Path("aer1_all").glob("*.py")) + [pathlib.Path("README.md")]:
50
+ text = f.read_text()
51
+ assert "signed receipt" not in text.lower(), f
52
+ assert "—" not in text and "–" not in text, f