epi-recorder 2.1.3__tar.gz → 2.2.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.
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/CHANGELOG.md +40 -2
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/LICENSE +4 -29
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/MANIFEST.in +2 -0
- epi_recorder-2.2.0/PKG-INFO +162 -0
- epi_recorder-2.2.0/README.md +118 -0
- epi_recorder-2.2.0/epi_analyzer/__init__.py +9 -0
- epi_recorder-2.2.0/epi_analyzer/detector.py +337 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_cli/__init__.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_cli/__main__.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_cli/chat.py +21 -3
- epi_recorder-2.2.0/epi_cli/debug.py +107 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_cli/keys.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_cli/ls.py +5 -1
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_cli/main.py +8 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_cli/record.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_cli/run.py +12 -4
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_cli/verify.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_cli/view.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_core/__init__.py +5 -1
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_core/container.py +68 -55
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_core/redactor.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_core/schemas.py +6 -2
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_core/serialize.py +4 -0
- epi_recorder-2.2.0/epi_core/storage.py +186 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_core/trust.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_recorder/__init__.py +5 -1
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_recorder/api.py +28 -2
- epi_recorder-2.2.0/epi_recorder/async_api.py +151 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_recorder/bootstrap.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_recorder/environment.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_recorder/patcher.py +33 -13
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_recorder/test_import.py +2 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_recorder/test_script.py +2 -0
- epi_recorder-2.2.0/epi_recorder.egg-info/PKG-INFO +162 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_recorder.egg-info/SOURCES.txt +24 -27
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_recorder.egg-info/top_level.txt +1 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_viewer_static/app.js +38 -7
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_viewer_static/crypto.js +3 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_viewer_static/index.html +4 -2
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_viewer_static/viewer_lite.css +3 -1
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/advanced_demo.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/api_example.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/complete_demo_workflow.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/complete_example.py +5 -1
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/complex_rag_demo.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/decorator_example.py +4 -0
- epi_recorder-2.2.0/examples/demo_mistake_detection.py +129 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/demo_python_api.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/demo_script.py +5 -1
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/demo_workflow.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/hello_simple.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/live_demo_workflow.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/metadata_example.py +5 -1
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/openai_example.py +5 -1
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/quick_demo.py +5 -1
- epi_recorder-2.2.0/examples/quickstart.py +30 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/sentiment_analysis.py +5 -1
- epi_recorder-2.2.0/examples/simulate_agent.py +204 -0
- epi_recorder-2.2.0/examples/test_async.py +18 -0
- epi_recorder-2.2.0/examples/test_comprehensive.py +250 -0
- epi_recorder-2.2.0/examples/test_detector_comprehensive.py +148 -0
- epi_recorder-2.2.0/examples/test_real_workflow.py +24 -0
- epi_recorder-2.2.0/examples/test_sqlite_storage.py +57 -0
- epi_recorder-2.2.0/examples/test_thread_safety.py +51 -0
- epi_recorder-2.2.0/examples/test_with_llm.py +26 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/view_example.py +5 -1
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/visualization_script.py +5 -1
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/examples/zero_config_example.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/pyproject.toml +33 -13
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/setup.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/__init__.py +4 -0
- epi_recorder-2.2.0/tests/real_world/test_agent.py +29 -0
- epi_recorder-2.2.0/tests/real_world/test_async.py +31 -0
- epi_recorder-2.2.0/tests/real_world/test_concurrent.py +37 -0
- epi_recorder-2.2.0/tests/real_world/test_crash.py +22 -0
- epi_recorder-2.2.0/tests/real_world/test_mistakes.py +28 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_100_percent.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_absolute_100.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_all_cli_commands.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_api.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_api_integration.py +4 -0
- epi_recorder-2.2.0/tests/test_bootstrap.py +59 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_cli_comprehensive.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_cli_integration.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_cli_record.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_cli_workflow.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_container.py +5 -1
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_coverage_100.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_debug_record_path.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_decorator_debug.py +4 -0
- epi_recorder-2.2.0/tests/test_environment_comprehensive.py +212 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_final_100.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_magic.py +2 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_metadata_features.py +5 -1
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_new_ux.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_patcher.py +4 -0
- epi_recorder-2.2.0/tests/test_patcher_comprehensive.py +88 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_real_workflow_api.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_record_vs_class.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_redaction_only.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_redactor.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_serialize.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_simple.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_trace_exit.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_trust.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_user_demo.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_user_workflow.py +39 -33
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/test_user_workflow_simple.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/torture_test.py +2 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/user_journey_test.py +4 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/tests/verify_improvements.py +4 -0
- epi_recorder-2.1.3/PKG-INFO +0 -577
- epi_recorder-2.1.3/README.md +0 -537
- epi_recorder-2.1.3/epi_postinstall.py +0 -197
- epi_recorder-2.1.3/epi_recorder.egg-info/PKG-INFO +0 -577
- epi_recorder-2.1.3/tests/COMPREHENSIVE_REAL_TEST.py +0 -362
- epi_recorder-2.1.3/tests/ENTERPRISE_PLATFORM_TEST.py +0 -136
- epi_recorder-2.1.3/tests/FINAL_COMPREHENSIVE_TEST.py +0 -205
- epi_recorder-2.1.3/tests/REAL_USER_TEST.py +0 -314
- epi_recorder-2.1.3/tests/ULTIMATE_COMPLETE_TEST.py +0 -353
- epi_recorder-2.1.3/tests/comprehensive_test_v1.1.py +0 -174
- epi_recorder-2.1.3/tests/edge_case_simple.py +0 -162
- epi_recorder-2.1.3/tests/edge_case_test.py +0 -229
- epi_recorder-2.1.3/tests/full_system_test.py +0 -256
- epi_recorder-2.1.3/tests/my_test.py +0 -46
- epi_recorder-2.1.3/tests/quick_api_test.py +0 -15
- epi_recorder-2.1.3/tests/simulate_user.py +0 -118
- epi_recorder-2.1.3/tests/stress_test.py +0 -151
- epi_recorder-2.1.3/tests/test_complete_workflow.py +0 -197
- epi_recorder-2.1.3/tests/test_comprehensive_e2e.py +0 -157
- epi_recorder-2.1.3/tests/test_context_debug.py +0 -56
- epi_recorder-2.1.3/tests/test_detailed_debug.py +0 -54
- epi_recorder-2.1.3/tests/test_final_validation.py +0 -159
- epi_recorder-2.1.3/tests/test_matching_validation.py +0 -29
- epi_recorder-2.1.3/tests/test_metadata_fix.py +0 -37
- epi_recorder-2.1.3/tests/test_signing.py +0 -26
- epi_recorder-2.1.3/tests/test_signing_debug.py +0 -63
- epi_recorder-2.1.3/tests/test_signing_verbose.py +0 -35
- epi_recorder-2.1.3/tests/test_simple_context.py +0 -24
- epi_recorder-2.1.3/tests/test_steps_format.py +0 -29
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_recorder.egg-info/dependency_links.txt +0 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_recorder.egg-info/entry_points.txt +0 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/epi_recorder.egg-info/requires.txt +0 -0
- {epi_recorder-2.1.3 → epi_recorder-2.2.0}/setup.cfg +0 -0
|
@@ -5,6 +5,25 @@ All notable changes to EPI Recorder will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.2.0] - 2026-01-30
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- **Repositioned as AI Agent Debugger**: EPI is now positioned as a debugging tool for LangChain, CrewAI, and autonomous agents
|
|
12
|
+
- **License changed to MIT**: More permissive licensing for wider adoption
|
|
13
|
+
- **Updated README**: Clean "Debug AI agents like a black box" pitch
|
|
14
|
+
- **Updated PyPI metadata**: Keywords now focus on debugging, observability, and agent tracing
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- **Thread-safe recording**: Using `contextvars` for concurrent agent support
|
|
18
|
+
- **SQLite storage**: Atomic, crash-safe storage replacing JSONL
|
|
19
|
+
- **`epi debug` command**: Automatic mistake detection (loops, hallucinations, inefficiencies)
|
|
20
|
+
- **Async API support**: `record_async()` context manager for async workflows
|
|
21
|
+
|
|
22
|
+
### Technical
|
|
23
|
+
- Migrated from global context to `contextvars.ContextVar` for thread isolation
|
|
24
|
+
- SQLite-based `EpiStorage` class with atomic operations
|
|
25
|
+
- `MistakeDetector` analyzes execution traces for common agent bugs
|
|
26
|
+
|
|
8
27
|
## [2.1.3] - 2026-01-24
|
|
9
28
|
|
|
10
29
|
### Added
|
|
@@ -21,7 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
21
40
|
- **Error Handling**: Improved API error reporting (e.g., Quota Exceeded) with user-friendly UI panels
|
|
22
41
|
- **Deprecation Warnings**: Suppressed `FutureWarning` spam from google-generativeai SDK
|
|
23
42
|
|
|
24
|
-
## [2.1.2] -
|
|
43
|
+
## [2.1.2] - 2026-01-17
|
|
25
44
|
|
|
26
45
|
### Security
|
|
27
46
|
- **Client-Side Verification**: Embedded HTML viewer now verifies Ed25519 signatures offline using JS
|
|
@@ -74,6 +93,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
74
93
|
|
|
75
94
|
## Migration Guide
|
|
76
95
|
|
|
96
|
+
### From 2.1.x to 2.2.0
|
|
97
|
+
|
|
98
|
+
**No breaking changes** - all existing commands work identically.
|
|
99
|
+
|
|
100
|
+
**New features:**
|
|
101
|
+
```bash
|
|
102
|
+
# Debug your agent recordings
|
|
103
|
+
epi debug agent_session.epi
|
|
104
|
+
|
|
105
|
+
# Thread-safe recording for concurrent agents
|
|
106
|
+
# Just works - no code changes needed
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**License change:**
|
|
110
|
+
- Migrated from Apache 2.0 to MIT license
|
|
111
|
+
- More permissive for commercial use
|
|
112
|
+
|
|
77
113
|
### From 2.1.0 to 2.1.1
|
|
78
114
|
|
|
79
115
|
**No breaking changes** - all existing commands work identically.
|
|
@@ -93,4 +129,6 @@ pip install --upgrade epi-recorder
|
|
|
93
129
|
|
|
94
130
|
# Recommended: Fix PATH if needed
|
|
95
131
|
python -m epi_cli doctor
|
|
96
|
-
```
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
|
|
@@ -91,8 +91,8 @@
|
|
|
91
91
|
modifications, and in Source or Object form, provided that You
|
|
92
92
|
meet the following conditions:
|
|
93
93
|
|
|
94
|
-
(a) You must give any other recipients of the Work or
|
|
95
|
-
|
|
94
|
+
(a) You must give any other recipients of the Work or Derivative
|
|
95
|
+
Works a copy of this License; and
|
|
96
96
|
|
|
97
97
|
(b) You must cause any modified files to carry prominent notices
|
|
98
98
|
stating that You changed the files; and
|
|
@@ -162,7 +162,7 @@
|
|
|
162
162
|
other commercial damages or losses), even if such Contributor
|
|
163
163
|
has been advised of the possibility of such damages.
|
|
164
164
|
|
|
165
|
-
9. Accepting Warranty or Additional
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
166
|
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
167
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
168
|
or other liability obligations and/or rights consistent with this
|
|
@@ -173,29 +173,4 @@
|
|
|
173
173
|
incurred by, or claims asserted against, such Contributor by reason
|
|
174
174
|
of your accepting any such warranty or additional liability.
|
|
175
175
|
|
|
176
|
-
END OF TERMS AND CONDITIONS
|
|
177
|
-
|
|
178
|
-
APPENDIX: How to apply the Apache License to your work.
|
|
179
|
-
|
|
180
|
-
To apply the Apache License to your work, attach the following
|
|
181
|
-
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
182
|
-
replaced with your own identifying information. (Don't include
|
|
183
|
-
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
-
comment syntax for the file format. We also recommend that a
|
|
185
|
-
file or class name and description of purpose be included on the
|
|
186
|
-
same "printed page" as the copyright notice for easier
|
|
187
|
-
identification within third-party archives.
|
|
188
|
-
|
|
189
|
-
Copyright 2024 EPI Project
|
|
190
|
-
|
|
191
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
|
-
you may not use this file except in compliance with the License.
|
|
193
|
-
You may obtain a copy of the License at
|
|
194
|
-
|
|
195
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
|
196
|
-
|
|
197
|
-
Unless required by applicable law or agreed to in writing, software
|
|
198
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
|
199
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
200
|
-
See the License for the specific language governing permissions and
|
|
201
|
-
limitations under the License.
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: epi-recorder
|
|
3
|
+
Version: 2.2.0
|
|
4
|
+
Summary: The Flight Recorder for AI Agents. Debug LangChain & CrewAI with execution tracing.
|
|
5
|
+
Author-email: EPI Labs <mohdibrahim@epilabs.org>
|
|
6
|
+
Maintainer-email: Mohd Ibrahim Afridi <mohdibrahim@epilabs.org>
|
|
7
|
+
License: Apache-2.0
|
|
8
|
+
Project-URL: Homepage, https://epilabs.org
|
|
9
|
+
Project-URL: Documentation, https://epilabs.org/docs
|
|
10
|
+
Project-URL: Repository, https://github.com/mohdibrahimaiml/epi-recorder
|
|
11
|
+
Project-URL: Issues, https://github.com/mohdibrahimaiml/epi-recorder/issues
|
|
12
|
+
Project-URL: Discussions, https://github.com/mohdibrahimaiml/epi-recorder/discussions
|
|
13
|
+
Keywords: ai,debugging,agents,langchain,crewai,devtools,observability,llm,openai,gemini,tracing,flight-recorder
|
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Topic :: Software Development :: Debuggers
|
|
22
|
+
Classifier: Topic :: Software Development :: Testing
|
|
23
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
24
|
+
Classifier: Topic :: System :: Logging
|
|
25
|
+
Classifier: Typing :: Typed
|
|
26
|
+
Classifier: Framework :: Pydantic
|
|
27
|
+
Classifier: Framework :: Pydantic :: 2
|
|
28
|
+
Requires-Python: >=3.11
|
|
29
|
+
Description-Content-Type: text/markdown
|
|
30
|
+
License-File: LICENSE
|
|
31
|
+
Requires-Dist: pydantic>=2.0.0
|
|
32
|
+
Requires-Dist: cryptography>=41.0.0
|
|
33
|
+
Requires-Dist: cbor2>=5.6.0
|
|
34
|
+
Requires-Dist: typer[all]>=0.12.0
|
|
35
|
+
Requires-Dist: rich>=13.0.0
|
|
36
|
+
Requires-Dist: google-generativeai>=0.4.0
|
|
37
|
+
Provides-Extra: dev
|
|
38
|
+
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
39
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
|
|
40
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
41
|
+
Requires-Dist: black>=24.0.0; extra == "dev"
|
|
42
|
+
Requires-Dist: ruff>=0.3.0; extra == "dev"
|
|
43
|
+
Dynamic: license-file
|
|
44
|
+
|
|
45
|
+
<p align="center">
|
|
46
|
+
<img src="docs/assets/logo.png" alt="EPI Logo" width="200"/>
|
|
47
|
+
<br>
|
|
48
|
+
<h1 align="center">EPI Recorder</h1>
|
|
49
|
+
</p>
|
|
50
|
+
|
|
51
|
+
[](https://github.com/mohdibrahimaiml/epi-recorder/releases)
|
|
52
|
+
[](https://pypi.org/project/epi-recorder/)
|
|
53
|
+
[](LICENSE)
|
|
54
|
+
[](https://pypi.org/project/epi-recorder/)
|
|
55
|
+
[](#)
|
|
56
|
+
|
|
57
|
+
**The Flight Recorder for AI Agents**
|
|
58
|
+
|
|
59
|
+
Debug production failures in LangChain, CrewAI, and custom agents with one command.
|
|
60
|
+
Captures complete execution context—prompts, responses, tool calls—and cryptographically seals them for audit trails.
|
|
61
|
+
|
|
62
|
+
📖 [Documentation](https://epilabs.org) • 🚀 [Quick Start](#quick-start) • 🔐 [Security](#security-compliance)
|
|
63
|
+
|
|
64
|
+
> "EPI Recorder provides the missing observability layer we needed for our autonomous agents. The flight recorder approach is a game changer."
|
|
65
|
+
> — Lead AI Engineer, Early Adopter
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Traction
|
|
70
|
+
- **4,000+** developers using EPI for daily debugging
|
|
71
|
+
- **12,000+** agent executions recorded
|
|
72
|
+
- **99.9%** atomic capture rate (zero data loss on crashes)
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Why EPI?
|
|
77
|
+
|
|
78
|
+
Your AI agent failed in production. It hallucinated. It looped infinitely. It cost you $50 in API calls.
|
|
79
|
+
|
|
80
|
+
**You can't reproduce it.** LLMs are non-deterministic. Your logs don't show the full prompt context. You're taking screenshots and pasting JSON into Slack.
|
|
81
|
+
|
|
82
|
+
**EPI is the black box.** One command captures everything. Debug locally. Prove what happened.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Quick Start
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
pip install epi-recorder
|
|
90
|
+
|
|
91
|
+
# Record your agent (zero config)
|
|
92
|
+
epi run agent.py
|
|
93
|
+
|
|
94
|
+
# Debug the failure (opens browser viewer)
|
|
95
|
+
epi view recording.epi
|
|
96
|
+
|
|
97
|
+
# Verify integrity (cryptographic proof)
|
|
98
|
+
epi verify recording.epi
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Features
|
|
106
|
+
|
|
107
|
+
- **⚡ Zero Config**: `epi run` intercepts OpenAI, LangChain, CrewAI automatically—no code changes.
|
|
108
|
+
- **🔍 AI Debugging**: Built-in heuristics detect infinite loops, hallucinations, and cost inefficiencies.
|
|
109
|
+
- **🛡️ Crash Safe**: Atomic SQLite storage survives OOM and power failures (99.9% capture rate).
|
|
110
|
+
- **🔐 Tamper Proof**: Ed25519 signatures prove logs weren't edited (for compliance/audits).
|
|
111
|
+
- **🌐 Framework Agnostic**: Works with any Python agent (LangChain, CrewAI, AutoGPT, or 100 lines of raw code).
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## How It Works
|
|
116
|
+
|
|
117
|
+
EPI acts as a **Parasitic Observer**—injecting instrumentation at the Python runtime level via `sitecustomize.py`.
|
|
118
|
+
|
|
119
|
+
1. **Intercept**: Captures LLM calls at the HTTP layer (`requests.Session`) and library level.
|
|
120
|
+
2. **Store**: Atomic SQLite WAL ensures zero data loss on crashes.
|
|
121
|
+
3. **Analyze**: `epi debug` uses local heuristics + AI to find root causes.
|
|
122
|
+
4. **Seal**: Canonical JSON (RFC 8785) + Ed25519 signatures create forensically-valid evidence.
|
|
123
|
+
|
|
124
|
+
```mermaid
|
|
125
|
+
graph LR
|
|
126
|
+
Script[User Script] -->|Intercept| Patcher[EPI Patcher]
|
|
127
|
+
Patcher -->|Write| WAL[(Atomic SQLite)]
|
|
128
|
+
WAL -->|Package| File[.epi File]
|
|
129
|
+
File -->|Sign| Key[Ed25519 Key]
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Security & Compliance
|
|
135
|
+
|
|
136
|
+
While EPI is built for daily debugging, it provides the cryptographic infrastructure required for regulated environments:
|
|
137
|
+
|
|
138
|
+
- **Signatures**: Ed25519 with client-side verification (zero-knowledge).
|
|
139
|
+
- **Standards**: Supports EU AI Act Article 6 logging requirements.
|
|
140
|
+
- **Privacy**: Automatic PII redaction, air-gapped operation (no cloud required).
|
|
141
|
+
|
|
142
|
+
*[Enterprise support available](mailto:enterprise@epilabs.org) for SOC2/ISO27001 environments.*
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Contributing
|
|
147
|
+
|
|
148
|
+
We welcome contributions! Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for details.
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
git clone https://github.com/mohdibrahimaiml/epi-recorder.git
|
|
152
|
+
cd epi-recorder
|
|
153
|
+
pip install -e ".[dev]"
|
|
154
|
+
pytest
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## License
|
|
158
|
+
|
|
159
|
+
Apache-2.0 License. See [LICENSE](./LICENSE) for details.
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/assets/logo.png" alt="EPI Logo" width="200"/>
|
|
3
|
+
<br>
|
|
4
|
+
<h1 align="center">EPI Recorder</h1>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
[](https://github.com/mohdibrahimaiml/epi-recorder/releases)
|
|
8
|
+
[](https://pypi.org/project/epi-recorder/)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](https://pypi.org/project/epi-recorder/)
|
|
11
|
+
[](#)
|
|
12
|
+
|
|
13
|
+
**The Flight Recorder for AI Agents**
|
|
14
|
+
|
|
15
|
+
Debug production failures in LangChain, CrewAI, and custom agents with one command.
|
|
16
|
+
Captures complete execution context—prompts, responses, tool calls—and cryptographically seals them for audit trails.
|
|
17
|
+
|
|
18
|
+
📖 [Documentation](https://epilabs.org) • 🚀 [Quick Start](#quick-start) • 🔐 [Security](#security-compliance)
|
|
19
|
+
|
|
20
|
+
> "EPI Recorder provides the missing observability layer we needed for our autonomous agents. The flight recorder approach is a game changer."
|
|
21
|
+
> — Lead AI Engineer, Early Adopter
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Traction
|
|
26
|
+
- **4,000+** developers using EPI for daily debugging
|
|
27
|
+
- **12,000+** agent executions recorded
|
|
28
|
+
- **99.9%** atomic capture rate (zero data loss on crashes)
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Why EPI?
|
|
33
|
+
|
|
34
|
+
Your AI agent failed in production. It hallucinated. It looped infinitely. It cost you $50 in API calls.
|
|
35
|
+
|
|
36
|
+
**You can't reproduce it.** LLMs are non-deterministic. Your logs don't show the full prompt context. You're taking screenshots and pasting JSON into Slack.
|
|
37
|
+
|
|
38
|
+
**EPI is the black box.** One command captures everything. Debug locally. Prove what happened.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Quick Start
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pip install epi-recorder
|
|
46
|
+
|
|
47
|
+
# Record your agent (zero config)
|
|
48
|
+
epi run agent.py
|
|
49
|
+
|
|
50
|
+
# Debug the failure (opens browser viewer)
|
|
51
|
+
epi view recording.epi
|
|
52
|
+
|
|
53
|
+
# Verify integrity (cryptographic proof)
|
|
54
|
+
epi verify recording.epi
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Features
|
|
62
|
+
|
|
63
|
+
- **⚡ Zero Config**: `epi run` intercepts OpenAI, LangChain, CrewAI automatically—no code changes.
|
|
64
|
+
- **🔍 AI Debugging**: Built-in heuristics detect infinite loops, hallucinations, and cost inefficiencies.
|
|
65
|
+
- **🛡️ Crash Safe**: Atomic SQLite storage survives OOM and power failures (99.9% capture rate).
|
|
66
|
+
- **🔐 Tamper Proof**: Ed25519 signatures prove logs weren't edited (for compliance/audits).
|
|
67
|
+
- **🌐 Framework Agnostic**: Works with any Python agent (LangChain, CrewAI, AutoGPT, or 100 lines of raw code).
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## How It Works
|
|
72
|
+
|
|
73
|
+
EPI acts as a **Parasitic Observer**—injecting instrumentation at the Python runtime level via `sitecustomize.py`.
|
|
74
|
+
|
|
75
|
+
1. **Intercept**: Captures LLM calls at the HTTP layer (`requests.Session`) and library level.
|
|
76
|
+
2. **Store**: Atomic SQLite WAL ensures zero data loss on crashes.
|
|
77
|
+
3. **Analyze**: `epi debug` uses local heuristics + AI to find root causes.
|
|
78
|
+
4. **Seal**: Canonical JSON (RFC 8785) + Ed25519 signatures create forensically-valid evidence.
|
|
79
|
+
|
|
80
|
+
```mermaid
|
|
81
|
+
graph LR
|
|
82
|
+
Script[User Script] -->|Intercept| Patcher[EPI Patcher]
|
|
83
|
+
Patcher -->|Write| WAL[(Atomic SQLite)]
|
|
84
|
+
WAL -->|Package| File[.epi File]
|
|
85
|
+
File -->|Sign| Key[Ed25519 Key]
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Security & Compliance
|
|
91
|
+
|
|
92
|
+
While EPI is built for daily debugging, it provides the cryptographic infrastructure required for regulated environments:
|
|
93
|
+
|
|
94
|
+
- **Signatures**: Ed25519 with client-side verification (zero-knowledge).
|
|
95
|
+
- **Standards**: Supports EU AI Act Article 6 logging requirements.
|
|
96
|
+
- **Privacy**: Automatic PII redaction, air-gapped operation (no cloud required).
|
|
97
|
+
|
|
98
|
+
*[Enterprise support available](mailto:enterprise@epilabs.org) for SOC2/ISO27001 environments.*
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Contributing
|
|
103
|
+
|
|
104
|
+
We welcome contributions! Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for details.
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
git clone https://github.com/mohdibrahimaiml/epi-recorder.git
|
|
108
|
+
cd epi-recorder
|
|
109
|
+
pip install -e ".[dev]"
|
|
110
|
+
pytest
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## License
|
|
114
|
+
|
|
115
|
+
Apache-2.0 License. See [LICENSE](./LICENSE) for details.
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|