aireliability 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.
- aireliability-0.1.0/.github/workflows/ci.yml +114 -0
- aireliability-0.1.0/.github/workflows/integration.yml +43 -0
- aireliability-0.1.0/.github/workflows/reliability.yml +81 -0
- aireliability-0.1.0/.gitignore +88 -0
- aireliability-0.1.0/CHANGELOG.md +45 -0
- aireliability-0.1.0/CONTRIBUTING.md +149 -0
- aireliability-0.1.0/LICENSE +176 -0
- aireliability-0.1.0/PKG-INFO +801 -0
- aireliability-0.1.0/README.md +758 -0
- aireliability-0.1.0/benchmarks/README.md +158 -0
- aireliability-0.1.0/benchmarks/RESULTS.md +132 -0
- aireliability-0.1.0/benchmarks/benchmark_results.json +121 -0
- aireliability-0.1.0/benchmarks/phase14_results.json +124 -0
- aireliability-0.1.0/benchmarks/run_benchmarks.py +497 -0
- aireliability-0.1.0/benchmarks/run_phase24_benchmarks.py +183 -0
- aireliability-0.1.0/benchmarks/run_phase25_benchmarks.py +165 -0
- aireliability-0.1.0/benchmarks/run_phase26_benchmarks.py +215 -0
- aireliability-0.1.0/benchmarks/run_phase27_benchmarks.py +292 -0
- aireliability-0.1.0/benchmarks/run_phase28_benchmarks.py +252 -0
- aireliability-0.1.0/benchmarks/run_phase29_benchmarks.py +249 -0
- aireliability-0.1.0/benchmarks/scenarios/__init__.py +53 -0
- aireliability-0.1.0/benchmarks/scenarios/latency_regression.py +50 -0
- aireliability-0.1.0/benchmarks/scenarios/missing_tool.py +71 -0
- aireliability-0.1.0/benchmarks/scenarios/output_regression.py +48 -0
- aireliability-0.1.0/benchmarks/scenarios/tool_order.py +67 -0
- aireliability-0.1.0/benchmarks/scenarios/wrong_arguments.py +62 -0
- aireliability-0.1.0/benchmarks/scenarios/wrong_tool.py +55 -0
- aireliability-0.1.0/benchmarks/scenarios.py +162 -0
- aireliability-0.1.0/docs/README.md +29 -0
- aireliability-0.1.0/docs/adapters.md +197 -0
- aireliability-0.1.0/docs/architecture.md +134 -0
- aireliability-0.1.0/docs/ci-reliability.md +189 -0
- aireliability-0.1.0/docs/control-plane.md +185 -0
- aireliability-0.1.0/docs/distributed-execution.md +184 -0
- aireliability-0.1.0/docs/evaluation_concepts.md +83 -0
- aireliability-0.1.0/docs/integrations.md +214 -0
- aireliability-0.1.0/docs/multi-tenancy.md +176 -0
- aireliability-0.1.0/docs/observability.md +250 -0
- aireliability-0.1.0/docs/persistence.md +250 -0
- aireliability-0.1.0/docs/provider-integration.md +200 -0
- aireliability-0.1.0/docs/regression-generation.md +185 -0
- aireliability-0.1.0/docs/release.md +117 -0
- aireliability-0.1.0/docs/resilience.md +202 -0
- aireliability-0.1.0/docs/root-cause-analysis.md +177 -0
- aireliability-0.1.0/docs/security.md +141 -0
- aireliability-0.1.0/docs/semantic-evaluation.md +196 -0
- aireliability-0.1.0/examples/README.md +60 -0
- aireliability-0.1.0/examples/ci_pipeline.sh +53 -0
- aireliability-0.1.0/examples/custom_evaluator_and_adapter.py +177 -0
- aireliability-0.1.0/examples/end_to_end_workflow.py +170 -0
- aireliability-0.1.0/examples/langchain_reliability.py +95 -0
- aireliability-0.1.0/examples/langgraph_reliability.py +96 -0
- aireliability-0.1.0/examples/local_agent.py +140 -0
- aireliability-0.1.0/examples/real_agent_reliability.py +143 -0
- aireliability-0.1.0/pyproject.toml +117 -0
- aireliability-0.1.0/src/aireliability/__init__.py +574 -0
- aireliability-0.1.0/src/aireliability/cli.py +2010 -0
- aireliability-0.1.0/src/aireliability/control_plane/__init__.py +66 -0
- aireliability-0.1.0/src/aireliability/control_plane/cancellation.py +146 -0
- aireliability-0.1.0/src/aireliability/control_plane/controller.py +716 -0
- aireliability-0.1.0/src/aireliability/control_plane/errors.py +25 -0
- aireliability-0.1.0/src/aireliability/control_plane/models.py +248 -0
- aireliability-0.1.0/src/aireliability/control_plane/policies.py +144 -0
- aireliability-0.1.0/src/aireliability/control_plane/queue.py +183 -0
- aireliability-0.1.0/src/aireliability/control_plane/scheduler.py +203 -0
- aireliability-0.1.0/src/aireliability/control_plane/worker_manager.py +196 -0
- aireliability-0.1.0/src/aireliability/core/__init__.py +51 -0
- aireliability-0.1.0/src/aireliability/core/exceptions.py +25 -0
- aireliability-0.1.0/src/aireliability/core/models.py +218 -0
- aireliability-0.1.0/src/aireliability/core/protocols.py +93 -0
- aireliability-0.1.0/src/aireliability/diagnosis/__init__.py +21 -0
- aireliability-0.1.0/src/aireliability/diagnosis/analyzer.py +156 -0
- aireliability-0.1.0/src/aireliability/diagnosis/evidence.py +31 -0
- aireliability-0.1.0/src/aireliability/diagnosis/models.py +171 -0
- aireliability-0.1.0/src/aireliability/diagnosis/rules.py +330 -0
- aireliability-0.1.0/src/aireliability/distributed/__init__.py +59 -0
- aireliability-0.1.0/src/aireliability/distributed/aggregator.py +156 -0
- aireliability-0.1.0/src/aireliability/distributed/metrics.py +473 -0
- aireliability-0.1.0/src/aireliability/distributed/models.py +336 -0
- aireliability-0.1.0/src/aireliability/distributed/runner.py +297 -0
- aireliability-0.1.0/src/aireliability/distributed/sqlite_storage.py +1671 -0
- aireliability-0.1.0/src/aireliability/distributed/storage.py +772 -0
- aireliability-0.1.0/src/aireliability/distributed/worker.py +386 -0
- aireliability-0.1.0/src/aireliability/evaluation/__init__.py +54 -0
- aireliability-0.1.0/src/aireliability/evaluation/assertions.py +16 -0
- aireliability-0.1.0/src/aireliability/evaluation/deterministic/__init__.py +33 -0
- aireliability-0.1.0/src/aireliability/evaluation/expectations.py +770 -0
- aireliability-0.1.0/src/aireliability/evaluation/semantic/__init__.py +23 -0
- aireliability-0.1.0/src/aireliability/evaluation/semantic/base.py +81 -0
- aireliability-0.1.0/src/aireliability/evaluation/semantic/expectations.py +198 -0
- aireliability-0.1.0/src/aireliability/evaluation/semantic/mock_judge.py +134 -0
- aireliability-0.1.0/src/aireliability/execution/__init__.py +22 -0
- aireliability-0.1.0/src/aireliability/execution/adapters/__init__.py +25 -0
- aireliability-0.1.0/src/aireliability/execution/adapters/base.py +269 -0
- aireliability-0.1.0/src/aireliability/execution/adapters/callable.py +302 -0
- aireliability-0.1.0/src/aireliability/execution/runner.py +263 -0
- aireliability-0.1.0/src/aireliability/failures/__init__.py +15 -0
- aireliability-0.1.0/src/aireliability/failures/analyzer.py +354 -0
- aireliability-0.1.0/src/aireliability/failures/taxonomy.py +147 -0
- aireliability-0.1.0/src/aireliability/integrations/__init__.py +52 -0
- aireliability-0.1.0/src/aireliability/integrations/langchain/__init__.py +27 -0
- aireliability-0.1.0/src/aireliability/integrations/langchain/adapter.py +355 -0
- aireliability-0.1.0/src/aireliability/integrations/langgraph/__init__.py +27 -0
- aireliability-0.1.0/src/aireliability/integrations/langgraph/adapter.py +393 -0
- aireliability-0.1.0/src/aireliability/integrations/openai_compatible/__init__.py +30 -0
- aireliability-0.1.0/src/aireliability/integrations/openai_compatible/adapter.py +885 -0
- aireliability-0.1.0/src/aireliability/integrations/opentelemetry/__init__.py +110 -0
- aireliability-0.1.0/src/aireliability/integrations/postgres/__init__.py +125 -0
- aireliability-0.1.0/src/aireliability/integrations/prometheus/__init__.py +139 -0
- aireliability-0.1.0/src/aireliability/integrations/redis/__init__.py +30 -0
- aireliability-0.1.0/src/aireliability/observability/__init__.py +113 -0
- aireliability-0.1.0/src/aireliability/observability/aggregation.py +107 -0
- aireliability-0.1.0/src/aireliability/observability/anomaly.py +128 -0
- aireliability-0.1.0/src/aireliability/observability/context.py +110 -0
- aireliability-0.1.0/src/aireliability/observability/events.py +111 -0
- aireliability-0.1.0/src/aireliability/observability/exporter.py +99 -0
- aireliability-0.1.0/src/aireliability/observability/health.py +134 -0
- aireliability-0.1.0/src/aireliability/observability/incidents.py +122 -0
- aireliability-0.1.0/src/aireliability/observability/manager.py +197 -0
- aireliability-0.1.0/src/aireliability/observability/metrics.py +419 -0
- aireliability-0.1.0/src/aireliability/observability/models.py +133 -0
- aireliability-0.1.0/src/aireliability/observability/retention.py +91 -0
- aireliability-0.1.0/src/aireliability/observability/sanitization.py +29 -0
- aireliability-0.1.0/src/aireliability/observability/slo.py +280 -0
- aireliability-0.1.0/src/aireliability/observability/spans.py +150 -0
- aireliability-0.1.0/src/aireliability/observability/traces.py +223 -0
- aireliability-0.1.0/src/aireliability/py.typed +0 -0
- aireliability-0.1.0/src/aireliability/regression/__init__.py +38 -0
- aireliability-0.1.0/src/aireliability/regression/baseline.py +222 -0
- aireliability-0.1.0/src/aireliability/regression/generator.py +173 -0
- aireliability-0.1.0/src/aireliability/regression/minimizer.py +144 -0
- aireliability-0.1.0/src/aireliability/regression/models.py +107 -0
- aireliability-0.1.0/src/aireliability/regression/runner.py +197 -0
- aireliability-0.1.0/src/aireliability/regression/synthesizer.py +302 -0
- aireliability-0.1.0/src/aireliability/regression/validator.py +169 -0
- aireliability-0.1.0/src/aireliability/resilience/__init__.py +57 -0
- aireliability-0.1.0/src/aireliability/resilience/bulkhead.py +61 -0
- aireliability-0.1.0/src/aireliability/resilience/circuit_breaker.py +110 -0
- aireliability-0.1.0/src/aireliability/resilience/classifier.py +157 -0
- aireliability-0.1.0/src/aireliability/resilience/health.py +87 -0
- aireliability-0.1.0/src/aireliability/resilience/load_shedder.py +97 -0
- aireliability-0.1.0/src/aireliability/resilience/manager.py +201 -0
- aireliability-0.1.0/src/aireliability/resilience/models.py +98 -0
- aireliability-0.1.0/src/aireliability/resilience/retry.py +65 -0
- aireliability-0.1.0/src/aireliability/resilience/worker_health.py +221 -0
- aireliability-0.1.0/src/aireliability/security/__init__.py +151 -0
- aireliability-0.1.0/src/aireliability/security/api_keys.py +197 -0
- aireliability-0.1.0/src/aireliability/security/audit.py +113 -0
- aireliability-0.1.0/src/aireliability/security/authentication.py +260 -0
- aireliability-0.1.0/src/aireliability/security/authorization.py +102 -0
- aireliability-0.1.0/src/aireliability/security/errors.py +99 -0
- aireliability-0.1.0/src/aireliability/security/gateway.py +355 -0
- aireliability-0.1.0/src/aireliability/security/identity.py +57 -0
- aireliability-0.1.0/src/aireliability/security/models.py +146 -0
- aireliability-0.1.0/src/aireliability/security/permissions.py +113 -0
- aireliability-0.1.0/src/aireliability/security/replay_protection.py +119 -0
- aireliability-0.1.0/src/aireliability/security/request_validator.py +91 -0
- aireliability-0.1.0/src/aireliability/security/roles.py +193 -0
- aireliability-0.1.0/src/aireliability/security/security_events.py +82 -0
- aireliability-0.1.0/src/aireliability/security/tokens.py +154 -0
- aireliability-0.1.0/src/aireliability/storage/__init__.py +6 -0
- aireliability-0.1.0/src/aireliability/storage/base.py +146 -0
- aireliability-0.1.0/src/aireliability/storage/sqlite.py +694 -0
- aireliability-0.1.0/src/aireliability/telemetry/__init__.py +45 -0
- aireliability-0.1.0/src/aireliability/telemetry/async_collector.py +167 -0
- aireliability-0.1.0/src/aireliability/telemetry/builder.py +299 -0
- aireliability-0.1.0/src/aireliability/telemetry/collector.py +156 -0
- aireliability-0.1.0/src/aireliability/telemetry/models.py +170 -0
- aireliability-0.1.0/src/aireliability/telemetry/sampler.py +61 -0
- aireliability-0.1.0/src/aireliability/telemetry/sanitizer.py +86 -0
- aireliability-0.1.0/src/aireliability/tenancy/__init__.py +54 -0
- aireliability-0.1.0/src/aireliability/tenancy/governance.py +177 -0
- aireliability-0.1.0/src/aireliability/tenancy/models.py +279 -0
- aireliability-0.1.0/src/aireliability/tenancy/policies.py +139 -0
- aireliability-0.1.0/src/aireliability/tenancy/quota.py +167 -0
- aireliability-0.1.0/src/aireliability/tenancy/rate_limiter.py +164 -0
- aireliability-0.1.0/tests/fixtures/reliability/output_regression.json +23 -0
- aireliability-0.1.0/tests/fixtures/reliability/tool_order.json +31 -0
- aireliability-0.1.0/tests/fixtures/reliability/wrong_arguments.json +28 -0
- aireliability-0.1.0/tests/fixtures/reliability/wrong_tool.json +27 -0
- aireliability-0.1.0/tests/integration/__init__.py +1 -0
- aireliability-0.1.0/tests/integration/test_phase30_final.py +525 -0
- aireliability-0.1.0/tests/mocks/framework_mocks.py +336 -0
- aireliability-0.1.0/tests/unit/__init__.py +1 -0
- aireliability-0.1.0/tests/unit/test_assertions.py +502 -0
- aireliability-0.1.0/tests/unit/test_cli.py +221 -0
- aireliability-0.1.0/tests/unit/test_failures.py +290 -0
- aireliability-0.1.0/tests/unit/test_imports.py +148 -0
- aireliability-0.1.0/tests/unit/test_models.py +428 -0
- aireliability-0.1.0/tests/unit/test_phase14_benchmarks.py +323 -0
- aireliability-0.1.0/tests/unit/test_phase15_integration.py +354 -0
- aireliability-0.1.0/tests/unit/test_phase16_semantic.py +379 -0
- aireliability-0.1.0/tests/unit/test_phase17_diagnosis.py +387 -0
- aireliability-0.1.0/tests/unit/test_phase18_regression.py +608 -0
- aireliability-0.1.0/tests/unit/test_phase19_integrations.py +408 -0
- aireliability-0.1.0/tests/unit/test_phase20_ci_reliability.py +557 -0
- aireliability-0.1.0/tests/unit/test_phase21_provider_integration.py +679 -0
- aireliability-0.1.0/tests/unit/test_phase22_telemetry.py +745 -0
- aireliability-0.1.0/tests/unit/test_phase23_distributed.py +433 -0
- aireliability-0.1.0/tests/unit/test_phase24_persistence.py +488 -0
- aireliability-0.1.0/tests/unit/test_phase25_control_plane.py +568 -0
- aireliability-0.1.0/tests/unit/test_phase26_resilience.py +571 -0
- aireliability-0.1.0/tests/unit/test_phase27_multitenancy.py +492 -0
- aireliability-0.1.0/tests/unit/test_phase28_security.py +476 -0
- aireliability-0.1.0/tests/unit/test_phase29_observability.py +447 -0
- aireliability-0.1.0/tests/unit/test_protocols.py +166 -0
- aireliability-0.1.0/tests/unit/test_regression.py +329 -0
- aireliability-0.1.0/tests/unit/test_reliability_runner.py +274 -0
- aireliability-0.1.0/tests/unit/test_storage.py +357 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
pull_request:
|
|
8
|
+
branches:
|
|
9
|
+
- main
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: true
|
|
14
|
+
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
lint:
|
|
20
|
+
name: Lint & Format Check (Ruff)
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
steps:
|
|
23
|
+
- name: Check out repository
|
|
24
|
+
uses: actions/checkout@v4
|
|
25
|
+
|
|
26
|
+
- name: Set up Python
|
|
27
|
+
uses: actions/setup-python@v5
|
|
28
|
+
with:
|
|
29
|
+
python-version: "3.11"
|
|
30
|
+
cache: "pip"
|
|
31
|
+
|
|
32
|
+
- name: Install dependencies
|
|
33
|
+
run: |
|
|
34
|
+
python -m pip install --upgrade pip
|
|
35
|
+
python -m pip install ruff
|
|
36
|
+
|
|
37
|
+
- name: Run Ruff Lint
|
|
38
|
+
run: ruff check .
|
|
39
|
+
|
|
40
|
+
- name: Run Ruff Format Check
|
|
41
|
+
run: ruff format --check .
|
|
42
|
+
|
|
43
|
+
tests:
|
|
44
|
+
name: Tests (Python ${{ matrix.python-version }})
|
|
45
|
+
runs-on: ubuntu-latest
|
|
46
|
+
needs: [lint]
|
|
47
|
+
strategy:
|
|
48
|
+
fail-fast: false
|
|
49
|
+
matrix:
|
|
50
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
51
|
+
steps:
|
|
52
|
+
- name: Check out repository
|
|
53
|
+
uses: actions/checkout@v4
|
|
54
|
+
|
|
55
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
56
|
+
uses: actions/setup-python@v5
|
|
57
|
+
with:
|
|
58
|
+
python-version: ${{ matrix.python-version }}
|
|
59
|
+
cache: "pip"
|
|
60
|
+
|
|
61
|
+
- name: Install core package and dev dependencies
|
|
62
|
+
run: |
|
|
63
|
+
python -m pip install --upgrade pip
|
|
64
|
+
python -m pip install -e ".[dev]"
|
|
65
|
+
|
|
66
|
+
- name: Run test suite with JUnit report
|
|
67
|
+
run: |
|
|
68
|
+
pytest --junitxml=junit-results-${{ matrix.python-version }}.xml
|
|
69
|
+
|
|
70
|
+
- name: Upload test results artifact
|
|
71
|
+
uses: actions/upload-artifact@v4
|
|
72
|
+
if: always()
|
|
73
|
+
with:
|
|
74
|
+
name: test-results-python-${{ matrix.python-version }}
|
|
75
|
+
path: junit-results-${{ matrix.python-version }}.xml
|
|
76
|
+
retention-days: 7
|
|
77
|
+
|
|
78
|
+
package:
|
|
79
|
+
name: Package Build & Clean Install Verification
|
|
80
|
+
runs-on: ubuntu-latest
|
|
81
|
+
needs: [tests]
|
|
82
|
+
steps:
|
|
83
|
+
- name: Check out repository
|
|
84
|
+
uses: actions/checkout@v4
|
|
85
|
+
|
|
86
|
+
- name: Set up Python
|
|
87
|
+
uses: actions/setup-python@v5
|
|
88
|
+
with:
|
|
89
|
+
python-version: "3.11"
|
|
90
|
+
cache: "pip"
|
|
91
|
+
|
|
92
|
+
- name: Install packaging tools
|
|
93
|
+
run: |
|
|
94
|
+
python -m pip install --upgrade pip
|
|
95
|
+
python -m pip install build twine
|
|
96
|
+
|
|
97
|
+
- name: Build package distribution (sdist and wheel)
|
|
98
|
+
run: python -m build
|
|
99
|
+
|
|
100
|
+
- name: Validate distribution metadata with Twine
|
|
101
|
+
run: |
|
|
102
|
+
ls -la dist/
|
|
103
|
+
twine check dist/*
|
|
104
|
+
|
|
105
|
+
- name: Clean environment installation test
|
|
106
|
+
run: |
|
|
107
|
+
# Create an isolated temporary virtual environment outside repository tree
|
|
108
|
+
python -m venv /tmp/aireliability-clean
|
|
109
|
+
/tmp/aireliability-clean/bin/pip install --upgrade pip
|
|
110
|
+
/tmp/aireliability-clean/bin/pip install dist/*.whl
|
|
111
|
+
|
|
112
|
+
# Verify Python import and CLI entrypoint
|
|
113
|
+
/tmp/aireliability-clean/bin/python -c "import aireliability; print('aireliability version:', aireliability.__version__)"
|
|
114
|
+
/tmp/aireliability-clean/bin/airel --help
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: Integration
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
pull_request:
|
|
8
|
+
branches:
|
|
9
|
+
- main
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: true
|
|
14
|
+
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
framework-matrix:
|
|
20
|
+
name: Optional Frameworks (Python ${{ matrix.python-version }})
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
strategy:
|
|
23
|
+
fail-fast: false
|
|
24
|
+
matrix:
|
|
25
|
+
python-version: ["3.11", "3.12"]
|
|
26
|
+
steps:
|
|
27
|
+
- name: Check out repository
|
|
28
|
+
uses: actions/checkout@v4
|
|
29
|
+
|
|
30
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
31
|
+
uses: actions/setup-python@v5
|
|
32
|
+
with:
|
|
33
|
+
python-version: ${{ matrix.python-version }}
|
|
34
|
+
cache: "pip"
|
|
35
|
+
|
|
36
|
+
- name: Install package with optional framework dependencies
|
|
37
|
+
run: |
|
|
38
|
+
python -m pip install --upgrade pip
|
|
39
|
+
python -m pip install -e ".[dev,langgraph,langchain,openai,opentelemetry,prometheus]"
|
|
40
|
+
|
|
41
|
+
- name: Run framework and provider integration test suite
|
|
42
|
+
run: |
|
|
43
|
+
pytest tests/unit/test_phase19_integrations.py tests/unit/test_phase21_provider_integration.py tests/unit/test_phase22_telemetry.py -v
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
name: Reliability
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
pull_request:
|
|
8
|
+
branches:
|
|
9
|
+
- main
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: true
|
|
14
|
+
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
reliability:
|
|
20
|
+
name: Deterministic Reliability & Regression Suite
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
steps:
|
|
23
|
+
- name: Check out repository
|
|
24
|
+
uses: actions/checkout@v4
|
|
25
|
+
|
|
26
|
+
- name: Set up Python
|
|
27
|
+
uses: actions/setup-python@v5
|
|
28
|
+
with:
|
|
29
|
+
python-version: "3.11"
|
|
30
|
+
cache: "pip"
|
|
31
|
+
|
|
32
|
+
- name: Install dependencies
|
|
33
|
+
run: |
|
|
34
|
+
python -m pip install --upgrade pip
|
|
35
|
+
python -m pip install -e ".[dev]"
|
|
36
|
+
|
|
37
|
+
- name: Run Deterministic Reliability Benchmarks & Scenarios
|
|
38
|
+
run: |
|
|
39
|
+
pytest tests/unit/test_phase14_benchmarks.py \
|
|
40
|
+
tests/unit/test_phase18_regression.py \
|
|
41
|
+
tests/unit/test_phase20_ci_reliability.py \
|
|
42
|
+
tests/unit/test_phase23_distributed.py \
|
|
43
|
+
tests/unit/test_phase24_persistence.py \
|
|
44
|
+
tests/unit/test_phase25_control_plane.py \
|
|
45
|
+
tests/unit/test_phase26_resilience.py \
|
|
46
|
+
-v
|
|
47
|
+
|
|
48
|
+
- name: Run Smoke Benchmark (100 Iterations)
|
|
49
|
+
run: |
|
|
50
|
+
python benchmarks/run_benchmarks.py --smoke
|
|
51
|
+
|
|
52
|
+
- name: Verify CLI PR Reliability Reporting & Step Summary
|
|
53
|
+
run: |
|
|
54
|
+
# 1. Initialize clean test project
|
|
55
|
+
mkdir -p /tmp/pr-reliability-eval
|
|
56
|
+
airel init --dir /tmp/pr-reliability-eval
|
|
57
|
+
|
|
58
|
+
# 2. Establish main baseline with nominal agent
|
|
59
|
+
airel test --dir /tmp/pr-reliability-eval --save-baseline
|
|
60
|
+
|
|
61
|
+
# 3. Evaluate PR with comparison and generate reports
|
|
62
|
+
airel compare default \
|
|
63
|
+
--dir /tmp/pr-reliability-eval \
|
|
64
|
+
--report-json /tmp/reliability-report.json \
|
|
65
|
+
--report-markdown /tmp/reliability-report.md
|
|
66
|
+
|
|
67
|
+
# 4. Append to GitHub Step Summary if running in GitHub Actions
|
|
68
|
+
if [ -n "$GITHUB_STEP_SUMMARY" ]; then
|
|
69
|
+
cat /tmp/reliability-report.md >> $GITHUB_STEP_SUMMARY
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
- name: Upload Reliability Reports
|
|
73
|
+
uses: actions/upload-artifact@v4
|
|
74
|
+
if: always()
|
|
75
|
+
with:
|
|
76
|
+
name: reliability-reports
|
|
77
|
+
path: |
|
|
78
|
+
/tmp/reliability-report.json
|
|
79
|
+
/tmp/reliability-report.md
|
|
80
|
+
benchmarks/phase14_results.json
|
|
81
|
+
retention-days: 14
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# Virtual environments
|
|
30
|
+
.venv/
|
|
31
|
+
venv/
|
|
32
|
+
ENV/
|
|
33
|
+
env/
|
|
34
|
+
|
|
35
|
+
# Testing and coverage
|
|
36
|
+
.pytest_cache/
|
|
37
|
+
.coverage
|
|
38
|
+
.coverage.*
|
|
39
|
+
htmlcov/
|
|
40
|
+
nosetests.xml
|
|
41
|
+
coverage.xml
|
|
42
|
+
*.cover
|
|
43
|
+
*.py,cover
|
|
44
|
+
|
|
45
|
+
# Ruff
|
|
46
|
+
.ruff_cache/
|
|
47
|
+
|
|
48
|
+
# IDE / Editor
|
|
49
|
+
.vscode/
|
|
50
|
+
.idea/
|
|
51
|
+
*.swp
|
|
52
|
+
*.swo
|
|
53
|
+
*~
|
|
54
|
+
.DS_Store
|
|
55
|
+
# Python
|
|
56
|
+
__pycache__/
|
|
57
|
+
*.py[cod]
|
|
58
|
+
*.so
|
|
59
|
+
|
|
60
|
+
# Virtual environments
|
|
61
|
+
.venv/
|
|
62
|
+
venv/
|
|
63
|
+
env/
|
|
64
|
+
|
|
65
|
+
# Build artifacts
|
|
66
|
+
build/
|
|
67
|
+
dist/
|
|
68
|
+
*.egg-info/
|
|
69
|
+
|
|
70
|
+
# Test / coverage
|
|
71
|
+
.pytest_cache/
|
|
72
|
+
.coverage
|
|
73
|
+
htmlcov/
|
|
74
|
+
.coverage.*
|
|
75
|
+
|
|
76
|
+
# Ruff
|
|
77
|
+
.ruff_cache/
|
|
78
|
+
|
|
79
|
+
# AI Reliability Engine runtime data
|
|
80
|
+
.aireliability/
|
|
81
|
+
*.db
|
|
82
|
+
|
|
83
|
+
# macOS
|
|
84
|
+
.DS_Store
|
|
85
|
+
# Environment / secrets
|
|
86
|
+
.env
|
|
87
|
+
.env.*
|
|
88
|
+
!.env.example
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **Phase 1: Foundation & Setup**
|
|
12
|
+
- Package structure, `pyproject.toml` configuration with Hatchling build backend.
|
|
13
|
+
- Python 3.11+ requirement, Pydantic runtime dependency.
|
|
14
|
+
- Development tools (`pytest`, `ruff`).
|
|
15
|
+
- **Phase 2: Core Data Models**
|
|
16
|
+
- Implemented immutable Pydantic models: `TestCase`, `TraceStep`, `ExecutionTrace`, `EvaluationResult`, `FailureReport`, `RegressionTest`, and `RunResult`.
|
|
17
|
+
- Added enums: `StepType`, `ExecutionStatus`, and `FailureSeverity`.
|
|
18
|
+
- **Phase 3: Core Protocols & Interfaces**
|
|
19
|
+
- Added `runtime_checkable` protocols: `Traceable`, `ExecutionAdapter`, `Evaluator`, and `Expectation`.
|
|
20
|
+
- **Phase 4: Deterministic Assertions**
|
|
21
|
+
- Implemented non-LLM, microsecond-level assertions: `ToolCalled`, `ToolNotCalled`, `ToolOrder`, `ToolArguments`, `OutputEquals`, `OutputContains`, `SchemaMatch`, `MaxLatency`, and `MaxCost`.
|
|
22
|
+
- **Phase 5: Execution Engine**
|
|
23
|
+
- Implemented `ReliabilityRunner` orchestrating agent invocation, trace capture, evaluator execution, and failure compilation.
|
|
24
|
+
- **Phase 6: Failure Taxonomy & Analysis**
|
|
25
|
+
- Implemented `FailureTaxonomy` across 6 categories (`TASK`, `TOOL`, `RETRIEVAL`, `OUTPUT`, `SAFETY`, `PERFORMANCE`).
|
|
26
|
+
- Implemented deterministic `FailureAnalyzer` mapping evaluation outcomes into structured `FailureReports`.
|
|
27
|
+
- **Phase 7: Regression Generator & Baseline Management**
|
|
28
|
+
- Implemented `RegressionGenerator` creating reproducible `RegressionTest` cases preserving provenance (`source_failure_id`).
|
|
29
|
+
- Implemented `BaselineManager` with 5-state comparison logic (`PASSING`, `REGRESSION`, `KNOWN_FAILURE`, `FIXED`, `NEW`).
|
|
30
|
+
- **Phase 8: SQLite Storage Subsystem**
|
|
31
|
+
- Implemented serverless, transactional `SQLiteStorage` implementing `StorageBackend`.
|
|
32
|
+
- Added index optimization and safe schema initialization.
|
|
33
|
+
- **Phase 9: Command-Line Interface (`airel`)**
|
|
34
|
+
- Implemented CLI commands: `airel init`, `airel test`, `airel failures`, `airel regressions`, and `airel compare`.
|
|
35
|
+
- **Phase 10: CI/CD Workflows & Packaging**
|
|
36
|
+
- Added GitHub Actions workflow (`.github/workflows/ci.yml`) testing Python 3.11, 3.12, 3.13, Ruff linting, and package builds.
|
|
37
|
+
- Implemented `--ci` strict exit code flag (`airel test --ci`).
|
|
38
|
+
- Added executable CI script `examples/ci_pipeline.sh`.
|
|
39
|
+
- **Phase 11: Reproducible Benchmarks**
|
|
40
|
+
- Created reproducible benchmark runner `benchmarks/run_benchmarks.py` and scenario definitions `benchmarks/scenarios.py`.
|
|
41
|
+
- Empirical overhead verification (< 0.04 ms added per agent run; 500k–700k ops/sec assertion throughput).
|
|
42
|
+
- **Phase 12 (Documentation & Community Readiness)**
|
|
43
|
+
- Comprehensive `README.md` covering architecture, deterministic vs semantic evaluation, CI/CD, and extension points.
|
|
44
|
+
- Added `docs/architecture.md`, `docs/evaluation_concepts.md`, and `docs/README.md`.
|
|
45
|
+
- Added practical runnable examples: `examples/end_to_end_workflow.py` and `examples/custom_evaluator_and_adapter.py`.
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Contributing to AI Reliability Engine
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to `aireliability`! We welcome community contributions, bug reports, documentation improvements, and architectural suggestions.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Code of Conduct
|
|
8
|
+
|
|
9
|
+
We are committed to providing a welcoming, inclusive, and harassment-free environment for all contributors. Please treat all community members with respect.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 2. Technical Philosophy & Design Invariants
|
|
14
|
+
|
|
15
|
+
Before contributing code, please keep our core architectural rules in mind:
|
|
16
|
+
- **Zero Heavy External Dependencies**: The core package relies only on Python standard libraries and `pydantic`. External frameworks (e.g. LangChain, LangGraph) are strictly optional adapters.
|
|
17
|
+
- **Provider & Framework Agnostic**: Never couple internal models or runners to a specific LLM vendor or agent framework. Use standard protocols.
|
|
18
|
+
- **Deterministic Confidence**: Never report confidence `1.0` on failure analyses unless backed by verifiable, deterministic evidence.
|
|
19
|
+
- **Zero API Key Requirement in CI**: All CI and local test suites run deterministically without API keys, GPUs, or network access.
|
|
20
|
+
- **Microsecond Overhead**: Evaluators and tracing logic must remain lightweight (< 0.1 ms overhead).
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 3. Development Setup
|
|
25
|
+
|
|
26
|
+
### Prerequisites
|
|
27
|
+
- Python 3.11, 3.12, or 3.13
|
|
28
|
+
- `git`
|
|
29
|
+
|
|
30
|
+
### Installation
|
|
31
|
+
1. **Fork and clone the repository:**
|
|
32
|
+
```bash
|
|
33
|
+
git clone https://github.com/aireliability/aireliability.git
|
|
34
|
+
cd aireliability
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
2. **Set up a virtual environment:**
|
|
38
|
+
```bash
|
|
39
|
+
python3 -m venv .venv
|
|
40
|
+
source .venv/bin/activate
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
3. **Install dependencies in editable mode:**
|
|
44
|
+
```bash
|
|
45
|
+
pip install --upgrade pip
|
|
46
|
+
pip install -e ".[dev]"
|
|
47
|
+
pip install build twine
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
4. **Install optional frameworks (if testing integrations):**
|
|
51
|
+
```bash
|
|
52
|
+
pip install -e ".[langgraph,langchain]"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 4. Running Checks Locally
|
|
58
|
+
|
|
59
|
+
All contributions must pass local linting, formatting, tests, and packaging checks before opening a pull request.
|
|
60
|
+
|
|
61
|
+
### 1. Running Unit & Integration Tests
|
|
62
|
+
```bash
|
|
63
|
+
# Run all unit tests
|
|
64
|
+
pytest
|
|
65
|
+
|
|
66
|
+
# Run tests with verbose output
|
|
67
|
+
pytest -v
|
|
68
|
+
|
|
69
|
+
# Run with JUnit XML generation (same as CI)
|
|
70
|
+
pytest --junitxml=test-results.xml
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 2. Running Reliability Scenarios & Distributed Tests
|
|
74
|
+
```bash
|
|
75
|
+
# Run deterministic reliability benchmark scenarios
|
|
76
|
+
pytest tests/unit/test_phase14_benchmarks.py \
|
|
77
|
+
tests/unit/test_phase18_regression.py \
|
|
78
|
+
tests/unit/test_phase20_ci_reliability.py
|
|
79
|
+
|
|
80
|
+
# Run Phase 23-29 distributed, resilience, tenancy, security, & observability tests
|
|
81
|
+
pytest tests/unit/test_phase23_distributed.py \
|
|
82
|
+
tests/unit/test_phase24_persistence.py \
|
|
83
|
+
tests/unit/test_phase25_control_plane.py \
|
|
84
|
+
tests/unit/test_phase26_resilience.py \
|
|
85
|
+
tests/unit/test_phase27_multitenancy.py \
|
|
86
|
+
tests/unit/test_phase28_security.py \
|
|
87
|
+
tests/unit/test_phase29_observability.py
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 3. Running Benchmarks
|
|
91
|
+
```bash
|
|
92
|
+
python benchmarks/run_benchmarks.py --smoke
|
|
93
|
+
python benchmarks/run_phase28_benchmarks.py
|
|
94
|
+
python benchmarks/run_phase29_benchmarks.py
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 4. Running Optional Framework Tests
|
|
98
|
+
If you have `langgraph` and `langchain` installed:
|
|
99
|
+
```bash
|
|
100
|
+
pytest tests/unit/test_phase19_integrations.py
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 5. Running Ruff (Linter & Formatter)
|
|
104
|
+
We enforce clean code via `ruff` with an 88-character line length:
|
|
105
|
+
```bash
|
|
106
|
+
# Check for lint violations
|
|
107
|
+
ruff check .
|
|
108
|
+
|
|
109
|
+
# Check code formatting
|
|
110
|
+
ruff format --check .
|
|
111
|
+
|
|
112
|
+
# Automatically apply safe lint fixes and formatting
|
|
113
|
+
ruff check --fix .
|
|
114
|
+
ruff format .
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 6. Validating Package Distribution
|
|
118
|
+
Ensure the project builds cleanly and installs in an isolated clean environment:
|
|
119
|
+
```bash
|
|
120
|
+
# Build distribution
|
|
121
|
+
python -m build
|
|
122
|
+
twine check dist/*
|
|
123
|
+
|
|
124
|
+
# Test clean wheel installation
|
|
125
|
+
python -m venv /tmp/airel-clean
|
|
126
|
+
source /tmp/airel-clean/bin/activate
|
|
127
|
+
pip install dist/*.whl
|
|
128
|
+
python -c "import aireliability; print(aireliability.__version__)"
|
|
129
|
+
airel --help
|
|
130
|
+
deactivate
|
|
131
|
+
rm -rf /tmp/airel-clean
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 5. Pull Request Expectations & Handling Reliability Regressions
|
|
137
|
+
|
|
138
|
+
1. **Deterministic Test Execution**:
|
|
139
|
+
- Tests in CI do not use network access or external LLM API keys. Do not add tests that require external network access.
|
|
140
|
+
2. **Baseline Comparison Policy**:
|
|
141
|
+
- The reliability CI job compares execution against established baselines using `BaselineManager`.
|
|
142
|
+
- `PASSING` (previously passing, still passing): Allowed.
|
|
143
|
+
- `FIXED` (previously failing, now passing): Allowed.
|
|
144
|
+
- `KNOWN_FAILURE` (previously failing, still failing): Allowed (does not fail CI).
|
|
145
|
+
- `REGRESSION` (previously passing, now failing): **Strict CI failure**.
|
|
146
|
+
3. **Diagnosing a Reliability Regression**:
|
|
147
|
+
- If CI flags a regression, inspect the step summary and generated `reliability-report.json` / `reliability-report.md` artifacts.
|
|
148
|
+
- The report pinpoints the test ID, failure category (`tool`, `output`, `performance`), root cause diagnosis, and synthesized regression test.
|
|
149
|
+
- Run the scenario locally using `airel test` or `airel compare` to reproduce and resolve the regression before requesting review.
|