agent-regress-cli 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.
- agent_regress_cli-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +30 -0
- agent_regress_cli-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +17 -0
- agent_regress_cli-0.1.0/.github/dependabot.yml +16 -0
- agent_regress_cli-0.1.0/.github/pull_request_template.md +22 -0
- agent_regress_cli-0.1.0/.github/workflows/benchmark.yml +33 -0
- agent_regress_cli-0.1.0/.github/workflows/ci.yml +116 -0
- agent_regress_cli-0.1.0/.github/workflows/release.yml +39 -0
- agent_regress_cli-0.1.0/.github/workflows/scorecard.yml +29 -0
- agent_regress_cli-0.1.0/.gitignore +39 -0
- agent_regress_cli-0.1.0/.pre-commit-config.yaml +20 -0
- agent_regress_cli-0.1.0/CHANGELOG.md +60 -0
- agent_regress_cli-0.1.0/CLAUDE.md +71 -0
- agent_regress_cli-0.1.0/CONTRIBUTING.md +56 -0
- agent_regress_cli-0.1.0/LICENSE +178 -0
- agent_regress_cli-0.1.0/PKG-INFO +405 -0
- agent_regress_cli-0.1.0/README.md +361 -0
- agent_regress_cli-0.1.0/SECURITY.md +40 -0
- agent_regress_cli-0.1.0/benchmarks/README.md +104 -0
- agent_regress_cli-0.1.0/benchmarks/results/baseline.json +2187 -0
- agent_regress_cli-0.1.0/benchmarks/test_gaia.py +57 -0
- agent_regress_cli-0.1.0/benchmarks/test_stat_overhead.py +69 -0
- agent_regress_cli-0.1.0/benchmarks/test_swebench.py +40 -0
- agent_regress_cli-0.1.0/benchmarks/test_tau_bench.py +52 -0
- agent_regress_cli-0.1.0/docker-compose.yml +25 -0
- agent_regress_cli-0.1.0/docs/arxiv-preprint-draft.md +287 -0
- agent_regress_cli-0.1.0/docs/benchmarks.md +20 -0
- agent_regress_cli-0.1.0/docs/concepts.md +50 -0
- agent_regress_cli-0.1.0/docs/cross-version-comparison.md +137 -0
- agent_regress_cli-0.1.0/docs/getting-started.md +185 -0
- agent_regress_cli-0.1.0/docs/good-first-issues.md +216 -0
- agent_regress_cli-0.1.0/docs/integrations/crewai.md +113 -0
- agent_regress_cli-0.1.0/docs/integrations/langchain.md +30 -0
- agent_regress_cli-0.1.0/docs/integrations/langgraph.md +324 -0
- agent_regress_cli-0.1.0/docs/integrations/openai-agents.md +138 -0
- agent_regress_cli-0.1.0/docs/lessons.md +53 -0
- agent_regress_cli-0.1.0/docs/statistical-methods.md +183 -0
- agent_regress_cli-0.1.0/examples/01-basic-comparison/example.py +44 -0
- agent_regress_cli-0.1.0/examples/02-ci-regression-gate/test_regression.py +41 -0
- agent_regress_cli-0.1.0/examples/03-tau-bench-harness/example.py +33 -0
- agent_regress_cli-0.1.0/examples/04-model-upgrade-audit/example.py +43 -0
- agent_regress_cli-0.1.0/leaderboard/README.md +31 -0
- agent_regress_cli-0.1.0/leaderboard/results/.gitkeep +0 -0
- agent_regress_cli-0.1.0/leaderboard/results/mock-baseline-agent-2026-06-19.json +25 -0
- agent_regress_cli-0.1.0/leaderboard/schema.json +41 -0
- agent_regress_cli-0.1.0/pyproject.toml +118 -0
- agent_regress_cli-0.1.0/src/agent_regress/__init__.py +63 -0
- agent_regress_cli-0.1.0/src/agent_regress/benchmarks/__init__.py +15 -0
- agent_regress_cli-0.1.0/src/agent_regress/benchmarks/gaia.py +80 -0
- agent_regress_cli-0.1.0/src/agent_regress/benchmarks/swebench.py +65 -0
- agent_regress_cli-0.1.0/src/agent_regress/benchmarks/tau_bench.py +86 -0
- agent_regress_cli-0.1.0/src/agent_regress/ci/__init__.py +5 -0
- agent_regress_cli-0.1.0/src/agent_regress/ci/gate.py +62 -0
- agent_regress_cli-0.1.0/src/agent_regress/cli.py +298 -0
- agent_regress_cli-0.1.0/src/agent_regress/core/__init__.py +17 -0
- agent_regress_cli-0.1.0/src/agent_regress/core/compare.py +239 -0
- agent_regress_cli-0.1.0/src/agent_regress/core/report.py +81 -0
- agent_regress_cli-0.1.0/src/agent_regress/core/runner.py +487 -0
- agent_regress_cli-0.1.0/src/agent_regress/core/scorer.py +254 -0
- agent_regress_cli-0.1.0/src/agent_regress/core/state_diff.py +48 -0
- agent_regress_cli-0.1.0/src/agent_regress/integrations/__init__.py +1 -0
- agent_regress_cli-0.1.0/src/agent_regress/integrations/crewai.py +121 -0
- agent_regress_cli-0.1.0/src/agent_regress/integrations/langchain.py +39 -0
- agent_regress_cli-0.1.0/src/agent_regress/integrations/langgraph.py +453 -0
- agent_regress_cli-0.1.0/src/agent_regress/integrations/openai_agents.py +471 -0
- agent_regress_cli-0.1.0/src/agent_regress/py.typed +0 -0
- agent_regress_cli-0.1.0/src/agent_regress/stats/__init__.py +14 -0
- agent_regress_cli-0.1.0/src/agent_regress/stats/bootstrap.py +59 -0
- agent_regress_cli-0.1.0/src/agent_regress/stats/effect_size.py +87 -0
- agent_regress_cli-0.1.0/src/agent_regress/stats/mann_whitney.py +69 -0
- agent_regress_cli-0.1.0/tests/__init__.py +0 -0
- agent_regress_cli-0.1.0/tests/conftest.py +51 -0
- agent_regress_cli-0.1.0/tests/integration/__init__.py +0 -0
- agent_regress_cli-0.1.0/tests/integration/test_crewai.py +70 -0
- agent_regress_cli-0.1.0/tests/integration/test_langgraph.py +35 -0
- agent_regress_cli-0.1.0/tests/integration/test_openai_agents.py +598 -0
- agent_regress_cli-0.1.0/tests/unit/__init__.py +0 -0
- agent_regress_cli-0.1.0/tests/unit/benchmarks/__init__.py +0 -0
- agent_regress_cli-0.1.0/tests/unit/benchmarks/test_harnesses.py +233 -0
- agent_regress_cli-0.1.0/tests/unit/ci/__init__.py +0 -0
- agent_regress_cli-0.1.0/tests/unit/ci/test_gate.py +135 -0
- agent_regress_cli-0.1.0/tests/unit/core/__init__.py +0 -0
- agent_regress_cli-0.1.0/tests/unit/core/test_compare.py +337 -0
- agent_regress_cli-0.1.0/tests/unit/core/test_report.py +101 -0
- agent_regress_cli-0.1.0/tests/unit/core/test_runner.py +622 -0
- agent_regress_cli-0.1.0/tests/unit/core/test_scorer.py +369 -0
- agent_regress_cli-0.1.0/tests/unit/core/test_state_diff.py +68 -0
- agent_regress_cli-0.1.0/tests/unit/integrations/__init__.py +0 -0
- agent_regress_cli-0.1.0/tests/unit/integrations/test_crewai_unit.py +165 -0
- agent_regress_cli-0.1.0/tests/unit/integrations/test_langgraph_unit.py +807 -0
- agent_regress_cli-0.1.0/tests/unit/stats/__init__.py +0 -0
- agent_regress_cli-0.1.0/tests/unit/stats/test_bootstrap.py +71 -0
- agent_regress_cli-0.1.0/tests/unit/stats/test_effect_size.py +114 -0
- agent_regress_cli-0.1.0/tests/unit/stats/test_mann_whitney.py +79 -0
- agent_regress_cli-0.1.0/tests/unit/stats/test_stat_timing.py +36 -0
- agent_regress_cli-0.1.0/tests/unit/test_cli.py +344 -0
- agent_regress_cli-0.1.0/uv.lock +5635 -0
- agent_regress_cli-0.1.0/web/serve.py +147 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: File a bug report
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug", "needs-triage"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: what-happened
|
|
8
|
+
attributes:
|
|
9
|
+
label: What happened?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: to-reproduce
|
|
14
|
+
attributes:
|
|
15
|
+
label: Minimal reproduction
|
|
16
|
+
render: python
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
- type: input
|
|
20
|
+
id: version
|
|
21
|
+
attributes:
|
|
22
|
+
label: agent-regress version
|
|
23
|
+
validations:
|
|
24
|
+
required: true
|
|
25
|
+
- type: input
|
|
26
|
+
id: python
|
|
27
|
+
attributes:
|
|
28
|
+
label: Python version
|
|
29
|
+
validations:
|
|
30
|
+
required: true
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
name: Feature Request
|
|
2
|
+
description: Request a new feature
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: problem
|
|
8
|
+
attributes:
|
|
9
|
+
label: What problem does this solve?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: solution
|
|
14
|
+
attributes:
|
|
15
|
+
label: Proposed solution
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: pip
|
|
4
|
+
directory: /
|
|
5
|
+
schedule:
|
|
6
|
+
interval: weekly
|
|
7
|
+
day: monday
|
|
8
|
+
groups:
|
|
9
|
+
patch-updates:
|
|
10
|
+
update-types:
|
|
11
|
+
- patch
|
|
12
|
+
|
|
13
|
+
- package-ecosystem: github-actions
|
|
14
|
+
directory: /
|
|
15
|
+
schedule:
|
|
16
|
+
interval: monthly
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
## Description
|
|
2
|
+
|
|
3
|
+
What does this PR do? (one sentence)
|
|
4
|
+
|
|
5
|
+
## Type of change
|
|
6
|
+
|
|
7
|
+
- [ ] Bug fix
|
|
8
|
+
- [ ] New feature
|
|
9
|
+
- [ ] Performance improvement
|
|
10
|
+
- [ ] Documentation update
|
|
11
|
+
|
|
12
|
+
## Checklist
|
|
13
|
+
|
|
14
|
+
- [ ] Tests pass locally
|
|
15
|
+
- [ ] Added tests for new behavior
|
|
16
|
+
- [ ] CHANGELOG entry added for user-facing changes
|
|
17
|
+
- [ ] Benchmark output included below if performance-sensitive code changed
|
|
18
|
+
- [ ] AI-assisted code has been reviewed and validated line by line
|
|
19
|
+
|
|
20
|
+
## Benchmark output (if applicable)
|
|
21
|
+
|
|
22
|
+
paste output here
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Benchmark
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["main"]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
benchmark:
|
|
9
|
+
name: Statistical overhead
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v7
|
|
13
|
+
- uses: astral-sh/setup-uv@v7
|
|
14
|
+
with:
|
|
15
|
+
enable-cache: true
|
|
16
|
+
- run: uv sync --extra dev
|
|
17
|
+
- name: Run benchmarks
|
|
18
|
+
run: |
|
|
19
|
+
uv run pytest benchmarks/test_stat_overhead.py \
|
|
20
|
+
--benchmark-json=output.json \
|
|
21
|
+
--benchmark-only \
|
|
22
|
+
-v
|
|
23
|
+
- uses: benchmark-action/github-action-benchmark@4de1bed97a47d2e7a675c37e04bcf5f29cb28bdb # v1.20.4
|
|
24
|
+
with:
|
|
25
|
+
tool: pytest
|
|
26
|
+
output-file-path: output.json
|
|
27
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
28
|
+
auto-push: true
|
|
29
|
+
alert-threshold: "120%"
|
|
30
|
+
comment-on-alert: true
|
|
31
|
+
fail-on-alert: true
|
|
32
|
+
gh-pages-branch: gh-pages
|
|
33
|
+
benchmark-data-dir-path: dev/bench
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["main", "dev"]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: ["main"]
|
|
8
|
+
|
|
9
|
+
concurrency:
|
|
10
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
quality:
|
|
15
|
+
name: Quality (Python ${{ matrix.python-version }})
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
permissions:
|
|
18
|
+
contents: read
|
|
19
|
+
security-events: write
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v7
|
|
26
|
+
|
|
27
|
+
- uses: astral-sh/setup-uv@v7
|
|
28
|
+
with:
|
|
29
|
+
python-version: ${{ matrix.python-version }}
|
|
30
|
+
enable-cache: true
|
|
31
|
+
|
|
32
|
+
- name: Install dependencies
|
|
33
|
+
run: uv sync --extra dev
|
|
34
|
+
|
|
35
|
+
- name: Lint
|
|
36
|
+
run: uv run ruff check src/ tests/ benchmarks/
|
|
37
|
+
|
|
38
|
+
- name: Format check
|
|
39
|
+
run: uv run ruff format --check src/ tests/ benchmarks/
|
|
40
|
+
|
|
41
|
+
- name: Type check
|
|
42
|
+
run: uv run mypy src/ --strict
|
|
43
|
+
|
|
44
|
+
- name: Unit tests with coverage
|
|
45
|
+
run: |
|
|
46
|
+
uv run pytest tests/unit/ \
|
|
47
|
+
--cov=src/ \
|
|
48
|
+
--cov-report=xml \
|
|
49
|
+
--cov-report=term-missing \
|
|
50
|
+
--cov-fail-under=80 \
|
|
51
|
+
-v
|
|
52
|
+
|
|
53
|
+
- name: Stats module coverage gate (95%)
|
|
54
|
+
run: |
|
|
55
|
+
uv run pytest tests/unit/stats/ \
|
|
56
|
+
--cov=src/agent_regress/stats/ \
|
|
57
|
+
--cov-fail-under=95 \
|
|
58
|
+
-q
|
|
59
|
+
|
|
60
|
+
- name: Security scan
|
|
61
|
+
uses: aquasecurity/trivy-action@v0.36.0
|
|
62
|
+
with:
|
|
63
|
+
scan-type: fs
|
|
64
|
+
format: sarif
|
|
65
|
+
output: trivy-results.sarif
|
|
66
|
+
severity: HIGH,CRITICAL
|
|
67
|
+
exit-code: "1"
|
|
68
|
+
ignore-unfixed: true
|
|
69
|
+
|
|
70
|
+
- name: Upload Trivy SARIF
|
|
71
|
+
uses: github/codeql-action/upload-sarif@v4
|
|
72
|
+
if: always()
|
|
73
|
+
with:
|
|
74
|
+
sarif_file: trivy-results.sarif
|
|
75
|
+
|
|
76
|
+
leaderboard-schema:
|
|
77
|
+
name: Validate leaderboard schema
|
|
78
|
+
runs-on: ubuntu-latest
|
|
79
|
+
steps:
|
|
80
|
+
- uses: actions/checkout@v7
|
|
81
|
+
- uses: astral-sh/setup-uv@v7
|
|
82
|
+
- run: uv sync --extra dev
|
|
83
|
+
- name: Validate submissions
|
|
84
|
+
run: |
|
|
85
|
+
python -c "
|
|
86
|
+
import json, jsonschema, pathlib, sys
|
|
87
|
+
schema_path = pathlib.Path('leaderboard/schema.json')
|
|
88
|
+
if not schema_path.exists():
|
|
89
|
+
sys.exit(0)
|
|
90
|
+
schema = json.loads(schema_path.read_text())
|
|
91
|
+
results_dir = pathlib.Path('leaderboard/results')
|
|
92
|
+
json_files = [f for f in results_dir.glob('*.json') if f.name != '.gitkeep']
|
|
93
|
+
if not json_files:
|
|
94
|
+
print('No leaderboard results to validate')
|
|
95
|
+
sys.exit(0)
|
|
96
|
+
for f in json_files:
|
|
97
|
+
jsonschema.validate(json.loads(f.read_text()), schema)
|
|
98
|
+
print(f'OK: {f.name}')
|
|
99
|
+
"
|
|
100
|
+
|
|
101
|
+
codeql:
|
|
102
|
+
name: CodeQL Security Analysis
|
|
103
|
+
runs-on: ubuntu-latest
|
|
104
|
+
permissions:
|
|
105
|
+
actions: read
|
|
106
|
+
contents: read
|
|
107
|
+
security-events: write
|
|
108
|
+
steps:
|
|
109
|
+
- uses: actions/checkout@v7
|
|
110
|
+
- uses: github/codeql-action/init@v4
|
|
111
|
+
with:
|
|
112
|
+
languages: python
|
|
113
|
+
- uses: github/codeql-action/autobuild@v4
|
|
114
|
+
- uses: github/codeql-action/analyze@v4
|
|
115
|
+
with:
|
|
116
|
+
category: "/language:python"
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
release:
|
|
10
|
+
name: Build and publish
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
permissions:
|
|
13
|
+
id-token: write
|
|
14
|
+
contents: write
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v7
|
|
17
|
+
- uses: astral-sh/setup-uv@v7
|
|
18
|
+
- name: Build
|
|
19
|
+
run: uv build
|
|
20
|
+
- name: Publish to PyPI
|
|
21
|
+
run: uv publish
|
|
22
|
+
env:
|
|
23
|
+
UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
|
24
|
+
- name: Generate SBOM
|
|
25
|
+
run: |
|
|
26
|
+
pip install cyclonedx-bom
|
|
27
|
+
uv export --no-dev --format requirements-txt -o /tmp/prod-requirements.txt
|
|
28
|
+
cyclonedx-py requirements --output-format json -o sbom.json /tmp/prod-requirements.txt
|
|
29
|
+
- name: Sign with Sigstore
|
|
30
|
+
uses: sigstore/gh-action-sigstore-python@f514d46b907ebcd5bedc05145c03b69c1edd8b46 # v3.0.0
|
|
31
|
+
with:
|
|
32
|
+
inputs: dist/*.whl dist/*.tar.gz
|
|
33
|
+
- name: Create GitHub Release
|
|
34
|
+
uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1
|
|
35
|
+
with:
|
|
36
|
+
files: |
|
|
37
|
+
sbom.json
|
|
38
|
+
dist/*.whl
|
|
39
|
+
dist/*.tar.gz
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
name: OpenSSF Scorecard
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["main"]
|
|
6
|
+
schedule:
|
|
7
|
+
- cron: "30 1 * * 6"
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
analysis:
|
|
11
|
+
name: Scorecard analysis
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
permissions:
|
|
14
|
+
security-events: write
|
|
15
|
+
id-token: write
|
|
16
|
+
contents: read
|
|
17
|
+
actions: read
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v7
|
|
20
|
+
with:
|
|
21
|
+
persist-credentials: false
|
|
22
|
+
- uses: ossf/scorecard-action@v2.4.3
|
|
23
|
+
with:
|
|
24
|
+
results_file: results.sarif
|
|
25
|
+
results_format: sarif
|
|
26
|
+
publish_results: true
|
|
27
|
+
- uses: github/codeql-action/upload-sarif@v4
|
|
28
|
+
with:
|
|
29
|
+
sarif_file: results.sarif
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.so
|
|
5
|
+
*.egg
|
|
6
|
+
*.egg-info/
|
|
7
|
+
dist/
|
|
8
|
+
build/
|
|
9
|
+
.eggs/
|
|
10
|
+
.venv/
|
|
11
|
+
venv/
|
|
12
|
+
env/
|
|
13
|
+
.env
|
|
14
|
+
|
|
15
|
+
# Testing
|
|
16
|
+
.pytest_cache/
|
|
17
|
+
.coverage
|
|
18
|
+
coverage.xml
|
|
19
|
+
htmlcov/
|
|
20
|
+
|
|
21
|
+
# Type checking
|
|
22
|
+
.mypy_cache/
|
|
23
|
+
|
|
24
|
+
# Ruff
|
|
25
|
+
.ruff_cache/
|
|
26
|
+
|
|
27
|
+
# Claude Code settings
|
|
28
|
+
.claude/
|
|
29
|
+
|
|
30
|
+
# IDE
|
|
31
|
+
.vscode/
|
|
32
|
+
.idea/
|
|
33
|
+
|
|
34
|
+
# OS
|
|
35
|
+
.DS_Store
|
|
36
|
+
Thumbs.db
|
|
37
|
+
|
|
38
|
+
# Benchmark output
|
|
39
|
+
output.json
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.9.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff
|
|
6
|
+
args: [--fix]
|
|
7
|
+
- id: ruff-format
|
|
8
|
+
|
|
9
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
10
|
+
rev: v5.0.0
|
|
11
|
+
hooks:
|
|
12
|
+
- id: check-yaml
|
|
13
|
+
- id: check-toml
|
|
14
|
+
- id: check-json
|
|
15
|
+
- id: check-merge-conflict
|
|
16
|
+
- id: detect-private-key
|
|
17
|
+
- id: no-commit-to-branch
|
|
18
|
+
args: [--branch, main]
|
|
19
|
+
- id: end-of-file-fixer
|
|
20
|
+
- id: trailing-whitespace
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes documented here.
|
|
4
|
+
|
|
5
|
+
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
6
|
+
Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- PyPI distribution renamed to `agent-regress-cli` (import path is unchanged: `import agent_regress`) -- `agent-regress` on PyPI was blocked as too similar to an existing unrelated project
|
|
13
|
+
- `agent-regress` CLI (`src/agent_regress/cli.py`), wired up via `[project.scripts]`
|
|
14
|
+
- `agent-regress compare --version-a-results <path.json> --version-b-results <path.json>` -- file-based entry point that runs two JSON arrays of pre-computed per-run scores through the same Mann-Whitney U / bootstrap CI / Cohen's d pipeline `compare()` uses
|
|
15
|
+
- `--json` flag on `compare` for clean, machine-readable `Report` output (warnings routed to stderr)
|
|
16
|
+
- `--fail-on-regression` flag on `compare` for CI use (exit 1 on a `REGRESSED` verdict)
|
|
17
|
+
- `agent-regress --version`
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- `mann_whitney_u`: raise `ValueError` on NaN input instead of silently returning `p=1.0`
|
|
22
|
+
- `rank_biserial_r`: propagate `nan` instead of silently returning `-1.0` on NaN input
|
|
23
|
+
- `run_suite`: warn threshold raised from n<10 to n<30 to match recommendation message
|
|
24
|
+
- `_get_expected`: fix `KeyError` when `expected` key is present but set to `None`
|
|
25
|
+
- `f1_scorer`: use `Counter` multiset intersection instead of set intersection — fixes wrong F1 when tokens repeat
|
|
26
|
+
- `compare`: align `_MIN_N_WARN` threshold (was 30, now 50) with warning message and `n_runs` default
|
|
27
|
+
- `compare` / `Report`: store `p_threshold` and `min_effect` on `Report` so `assert_stable()` uses the right defaults
|
|
28
|
+
- `gaia.py`: fix false-positive accuracy when agent raises and `expected_answer` is `'none'`
|
|
29
|
+
- `tau_bench.py`: raise clear `ValueError` on empty `k_values` instead of opaque `max()` error
|
|
30
|
+
- `langchain` / `langgraph` integrations: fix fallback adapters that were wrapping `test_case` in a nested dict
|
|
31
|
+
- `openai_agents_runner`: narrow `RuntimeError` catch to avoid masking real errors and double-invoking the agent
|
|
32
|
+
- `benchmarks/__init__`: export `GAIALevelResult`, `SWEBenchResult`, `TauBenchResult`
|
|
33
|
+
- `core/__init__` / top-level `__init__`: export `AgentCallable` and `ScorerCallable` type aliases
|
|
34
|
+
|
|
35
|
+
## [0.1.0] - 2026-06-19
|
|
36
|
+
|
|
37
|
+
### Added
|
|
38
|
+
|
|
39
|
+
- `compare(version_a, version_b, test_suite, n_runs=50)` -- primary public API
|
|
40
|
+
- `run_suite(agent, test_suite, n_runs)` -- run agent N times on a test suite
|
|
41
|
+
- `Report` dataclass with `verdict`, `p_value`, `effect_size`, `ci_lower`, `ci_upper`
|
|
42
|
+
- `Verdict` enum: `REGRESSED`, `STABLE`, `IMPROVED`, `INSUFFICIENT_DATA`
|
|
43
|
+
- Mann-Whitney U test with continuity correction (`stats.mann_whitney_u`)
|
|
44
|
+
- Bootstrap confidence intervals at 95%, N=1000 resamples (`stats.bootstrap_mean_ci`)
|
|
45
|
+
- Cohen's d and rank-biserial r effect size (`stats.compute_effect_sizes`)
|
|
46
|
+
- `RegressionGate` and `assert_no_regression` for pytest CI integration
|
|
47
|
+
- `exact_match_scorer` and `f1_scorer` built-in scorers
|
|
48
|
+
- LangGraph integration (`integrations.langgraph_runner`)
|
|
49
|
+
- LangChain LCEL integration (`integrations.langchain_runner`)
|
|
50
|
+
- OpenAI Agents SDK integration (`integrations.openai_agents_runner`)
|
|
51
|
+
- CrewAI integration (`integrations.crewai_runner`)
|
|
52
|
+
- Tau-bench pass^k harness (`benchmarks.TauBenchHarness`)
|
|
53
|
+
- GAIA Level 1-3 split harness (`benchmarks.GAIAHarness`)
|
|
54
|
+
- SWE-bench Verified scaffold score harness (`benchmarks.SWEBenchHarness`)
|
|
55
|
+
- Docker Compose self-host setup
|
|
56
|
+
- Sample size warnings: warns (not fails) when n < 30 per version
|
|
57
|
+
- Apache 2.0 license
|
|
58
|
+
- OpenSSF Scorecard CI workflow
|
|
59
|
+
- SLSA Level 2 release signing via Sigstore
|
|
60
|
+
- SBOM generation on release (CycloneDX JSON format)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# CLAUDE.md -- agent-eval
|
|
2
|
+
|
|
3
|
+
## Git Workflow
|
|
4
|
+
|
|
5
|
+
When asked to commit, push, or "update GitHub" -- just do it. No questions.
|
|
6
|
+
|
|
7
|
+
- git add relevant files -> git commit -> git push origin main
|
|
8
|
+
- "commit" means commit AND push -- always both
|
|
9
|
+
- Never ask "should I push?"
|
|
10
|
+
|
|
11
|
+
Every commit message must end with:
|
|
12
|
+
|
|
13
|
+
Built by Rudrendu Paul and Sourav Nandy, developed with Claude Code
|
|
14
|
+
|
|
15
|
+
Never use Co-Authored-By: lines.
|
|
16
|
+
|
|
17
|
+
## Project Overview
|
|
18
|
+
|
|
19
|
+
agent-eval: Python statistical regression testing framework for LLM agents.
|
|
20
|
+
|
|
21
|
+
Core angle: run agent N times at version A, N times at version B, apply
|
|
22
|
+
Mann-Whitney U + bootstrap CI, report p-value and Cohen's d.
|
|
23
|
+
|
|
24
|
+
A/B testing for agent quality. Not DeepEval (threshold-based). Not single-run
|
|
25
|
+
benchmarks. Statistical comparison of two version distributions.
|
|
26
|
+
|
|
27
|
+
License: Apache 2.0 core.
|
|
28
|
+
Primary integrations: LangGraph (P0), OpenAI Agents SDK (P0).
|
|
29
|
+
|
|
30
|
+
## Repo Layout
|
|
31
|
+
|
|
32
|
+
src/agent_regress/
|
|
33
|
+
- core/: runner.py, scorer.py, report.py, compare.py
|
|
34
|
+
- stats/: mann_whitney.py, bootstrap.py, effect_size.py (pure Python + scipy ONLY)
|
|
35
|
+
- integrations/: lazy-imported optional deps
|
|
36
|
+
- ci/: gate.py (AssertionError when p < threshold AND d > min_effect)
|
|
37
|
+
- benchmarks/: tau_bench.py, gaia.py, swebench.py
|
|
38
|
+
tests/unit/: no LLM calls
|
|
39
|
+
tests/integration/: real APIs, tagged @pytest.mark.integration
|
|
40
|
+
benchmarks/: standalone scripts
|
|
41
|
+
leaderboard/: git-committed JSON results
|
|
42
|
+
|
|
43
|
+
## Engineering Standards
|
|
44
|
+
|
|
45
|
+
uv run ruff check src/ tests/ benchmarks/
|
|
46
|
+
uv run ruff format --check src/ tests/ benchmarks/
|
|
47
|
+
uv run mypy src/ --strict
|
|
48
|
+
uv run pytest tests/unit/ --cov=src/ --cov-fail-under=80
|
|
49
|
+
|
|
50
|
+
## Key Invariants
|
|
51
|
+
|
|
52
|
+
- stats/ has ZERO LLM calls. Pure Python + scipy on lists of floats.
|
|
53
|
+
- runner.py: any callable dict->float. No framework coupling.
|
|
54
|
+
- gate.py: AssertionError when p < threshold AND d > min_effect.
|
|
55
|
+
- gate.py: WARN (not fail) when n < 30.
|
|
56
|
+
- All public API in __init__.py.
|
|
57
|
+
- mypy --strict must pass.
|
|
58
|
+
- leaderboard/results/ schema-validated in CI.
|
|
59
|
+
|
|
60
|
+
## Session Start
|
|
61
|
+
|
|
62
|
+
1. git status && git log --oneline -5
|
|
63
|
+
2. uv run pytest tests/unit/ -q
|
|
64
|
+
3. Read docs/lessons.md
|
|
65
|
+
|
|
66
|
+
## Anti-Sycophancy
|
|
67
|
+
|
|
68
|
+
- No performance claims without benchmark output
|
|
69
|
+
- stats/ is a scipy one-liner -- not the moat
|
|
70
|
+
- The moat is leaderboard governance and hosted regression history
|
|
71
|
+
- Braintrust closes the p-value gap in one sprint -- say this proactively
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Contributing to agent-eval
|
|
2
|
+
|
|
3
|
+
Thanks for your interest. This covers everything to go from zero to a merged PR.
|
|
4
|
+
|
|
5
|
+
## Fastest path
|
|
6
|
+
|
|
7
|
+
1. Clone and run dev setup below
|
|
8
|
+
2. Pick an issue labeled `good first issue`
|
|
9
|
+
3. Open a draft PR early -- we can save you wasted work
|
|
10
|
+
4. Mark ready for review when tests pass
|
|
11
|
+
|
|
12
|
+
We aim to review PRs within 72 hours (weekdays).
|
|
13
|
+
|
|
14
|
+
## Dev setup
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
git clone https://github.com/RudrenduPaul/agent-eval
|
|
18
|
+
cd agent-eval
|
|
19
|
+
pip install uv
|
|
20
|
+
uv sync --extra dev
|
|
21
|
+
pre-commit install
|
|
22
|
+
uv run pytest tests/unit/ -q # should pass 100% on a clean clone
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Engineering standards
|
|
26
|
+
|
|
27
|
+
Before submitting:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
uv run ruff check src/ tests/ benchmarks/
|
|
31
|
+
uv run ruff format --check src/ tests/ benchmarks/
|
|
32
|
+
uv run mypy src/ --strict
|
|
33
|
+
uv run pytest tests/unit/ --cov=src/ --cov-fail-under=80
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## What makes a PR merge quickly
|
|
37
|
+
|
|
38
|
+
- Tests added for every behavior change
|
|
39
|
+
- CHANGELOG entry for any user-facing change
|
|
40
|
+
- One focused change per PR
|
|
41
|
+
|
|
42
|
+
## What we will not merge
|
|
43
|
+
|
|
44
|
+
- PRs that break existing tests without a documented reason
|
|
45
|
+
- AI-generated code submitted without running and validating the output
|
|
46
|
+
|
|
47
|
+
## Maintainer SLAs
|
|
48
|
+
|
|
49
|
+
- Bug reports: acknowledged within 24 hours (weekdays)
|
|
50
|
+
- Feature requests: triage label within 72 hours
|
|
51
|
+
- PRs: first review within 72 hours
|
|
52
|
+
- Security: acknowledged within 48 hours
|
|
53
|
+
|
|
54
|
+
## Community
|
|
55
|
+
|
|
56
|
+
Discord: discord.gg/agent-eval (#contributing channel)
|