Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
a878654
feat(evals): add SWE-bench Lite eval (lm-eval generation + swebench h…
adibarra Jul 2, 2026
8f9f3ee
feat(evals): agentic-scenario eval selection + routing (swebench on a…
adibarra Jul 2, 2026
13bf8e8
fix(evals): swebench Modal uses --max_workers (no --parallelism in 4.…
adibarra Jul 2, 2026
e34035d
feat(evals): eval-only gating for all single-node agentic recipes
adibarra Jul 2, 2026
dd4eb00
feat(evals): thread Modal credentials + SWEBENCH_USE_MODAL into eval …
adibarra Jul 2, 2026
c01c530
Merge remote-tracking branch 'origin/main' into feat/swebench-lite-eval
adibarra Jul 6, 2026
dc4d677
fix(evals): adapt agentic eval wiring to AgentX v1.0
adibarra Jul 6, 2026
e340aff
feat(evals): eval-limit smoke knob + robust Modal credential HOME han…
adibarra Jul 7, 2026
88db694
fix(evals): gate agentic eval marking to evals-only/all-evals + fix e…
adibarra Jul 7, 2026
6f7abf2
fix(evals): register swebench task via --include_path (pinned lm-eval…
adibarra Jul 7, 2026
dc5e657
fix(evals): sanitize Modal token env vars (CI secrets pasted with tra…
adibarra Jul 7, 2026
314230d
fix(evals): scoring timeout guard + artifact preservation on eval fai…
adibarra Jul 7, 2026
8122b91
feat(evals): --predictions-file mode in swebench_score (agentic gener…
adibarra Jul 7, 2026
e67c005
feat(evals): agentic SWE-bench generation via mini-swe-agent + Modal …
adibarra Jul 7, 2026
9dffaed
fix(evals): mini-swe-agent import banner pollutes config-path capture
adibarra Jul 7, 2026
6aef40a
fix(evals): raise swe-rex Modal sandbox startup timeout for agentic mode
adibarra Jul 7, 2026
d8358ed
feat(evals): preserve agent trajectories + predictions as run artifacts
adibarra Jul 8, 2026
2e6df77
feat(evals): trajectory-forensics guidance in the agent template
adibarra Jul 8, 2026
c020298
fix(swebench): stop leaking Modal sandboxes to the 1h runtime_timeout
adibarra Jul 8, 2026
7745e0e
fix(swebench): correct resolved-rate denominator; submit tree diff on…
adibarra Jul 8, 2026
8e51c66
fix(swebench): hook budget-exhaustion fallback on the normal-return path
adibarra Jul 8, 2026
a1df115
Merge remote-tracking branch 'origin/main' into feat/swebench-lite-eval
adibarra Jul 8, 2026
b0bdb2f
fix(swebench): cut scoring cost ~2x by patching eval-sandbox cpu=4 -> 2
adibarra Jul 9, 2026
101cc79
fix(swebench): completion watchdog + partial-preds salvage for genera…
adibarra Jul 9, 2026
9be208b
Merge remote-tracking branch 'origin/main' into feat/swebench-lite-eval
adibarra Jul 10, 2026
4ffa926
feat(swebench): production defaults -- 0.50 threshold, 50-slice CI de…
adibarra Jul 10, 2026
94268c7
fix(swebench): scenario implies generation mode when SWEBENCH_GEN_MOD…
adibarra Jul 10, 2026
16f81a4
feat(swebench): agentic-only generation
adibarra Jul 10, 2026
bd5b735
fix(swebench): launch-line step_limit display default matches the rea…
adibarra Jul 10, 2026
c7b791b
Merge remote-tracking branch 'origin/main' into feat/swebench-lite-eval
adibarra Jul 10, 2026
47f1226
fix(swebench): review-wave hardening -- 17 confirmed findings across …
adibarra Jul 10, 2026
099a87c
fix(swebench): terminate eval sandboxes on instance completion (scori…
adibarra Jul 10, 2026
cfff9a9
feat(swebench): SWEBENCH_AGENT_SANDBOX_CPU knob for agent execution s…
adibarra Jul 10, 2026
1c5d4ff
feat(swebench): SWEBENCH_EVAL_TIMEOUT knob for per-instance scoring t…
adibarra Jul 11, 2026
e22a0fb
feat(swebench): conc-matched agent workers, 900s scoring timeout, app…
adibarra Jul 11, 2026
6c008da
Merge remote-tracking branch 'origin/main' into feat/swebench-lite-eval
adibarra Jul 11, 2026
64610a3
docs: waiver for eval-harness runtime patches (Check 9, PR #1947)
adibarra Jul 11, 2026
944d63b
docs: drop eval-tooling waiver -- maintainer call: Check 9 targets en…
adibarra Jul 11, 2026
a97906c
fix(swebench): gate the one un-gated agentic recipe; pin swebench; re…
adibarra Jul 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions .github/workflows/benchmark-tmpl.yml
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,16 @@ on:
required: false
type: string
default: '3600'
eval-limit:
description: "Limit eval to first N instances (smoke tests); empty = full set"
required: false
type: string
default: ""
swebench-gen-mode:
description: "SWE-bench generation mode (single-shot | agentic). Empty = agentic (single-shot is an explicit debugging escape hatch)."
required: false
type: string
default: ""
env:
RANDOM_RANGE_RATIO: 0.8
HF_TOKEN: ${{ secrets.INFERENCEX_OFFICIAL_RO_HF_TOKEN }}
Expand Down Expand Up @@ -136,10 +146,22 @@ env:
KV_OFFLOAD_BACKEND: ${{ inputs.kv-offload-backend }}
TOTAL_CPU_DRAM_GB: ${{ inputs.total-cpu-dram-gb }}
DURATION: ${{ inputs.duration }}
EVAL_LIMIT: ${{ inputs.eval-limit }}
SWEBENCH_GEN_MODE: ${{ inputs.swebench-gen-mode }}
AIPERF_FAILED_REQUEST_THRESHOLD: '0.10'
RESULT_DIR: /workspace/results
PYTHONDONTWRITEBYTECODE: '1'
PYTHONPYCACHEPREFIX: /tmp/inferencex-pycache
# SWE-bench scoring runs on Modal (GPU runners have no Docker); creds are
# bootstrapped into ~/.modal.toml by benchmark_lib.sh:_ensure_modal_credentials.
SWEBENCH_USE_MODAL: 'true'
MODAL_TOKEN_ID: ${{ secrets.MODAL_TOKEN_ID }}
MODAL_TOKEN_SECRET: ${{ secrets.MODAL_TOKEN_SECRET }}
# Known-bad b300 nodes, excluded until infra repairs them (salloc honors
# this env natively). b300-005: NCCL/CUDA init death (jobs 30508/30548).
# b300-006: wedged nvidia driver, container-cli rpc timeout (run
# 28958779201). Remove entries as nodes are fixed.
SALLOC_EXCLUDE: 'b300-005,b300-006'

permissions:
contents: read
Expand Down Expand Up @@ -296,6 +318,10 @@ jobs:
meta_env.json
results*.json
sample*.jsonl
agent_preds.json
predictions.jsonl
swebench_report_*.json
*.traj*
if-no-files-found: ${{ inputs.eval-only && 'error' || 'ignore' }}

- name: Verify eval scores
Expand All @@ -309,6 +335,7 @@ jobs:
# Remove any eval results JSONs that were moved into workspace
rm -f results*.json || true
rm -f sample*.jsonl || true
rm -f agent_preds.json predictions.jsonl swebench_report_*.json *.traj* || true

- name: Resource cleanup (post-run)
if: always()
Expand Down
69 changes: 66 additions & 3 deletions .github/workflows/e2e-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,16 @@
required: false
type: string
default: ""
eval-limit:
description: "Eval instance count: empty = 50-slice CI default (swebench); N = first-N; full = whole split"
required: false
type: string
default: ""
swebench-gen-mode:
description: "SWE-bench generation mode (single-shot | agentic). Empty = agentic (single-shot is an explicit debugging escape hatch)."
required: false
type: string
default: ""
workflow_call:
inputs:
generate-cli-command:
Expand All @@ -40,6 +50,16 @@
required: false
type: string
default: ""
eval-limit:
description: "Eval instance count: empty = 50-slice CI default (swebench); N = first-N; full = whole split"
required: false
type: string
default: ""
swebench-gen-mode:
description: "SWE-bench generation mode (single-shot | agentic). Empty = agentic (single-shot is an explicit debugging escape hatch)."
required: false
type: string
default: ""

jobs:
get-jobs:
Expand All @@ -50,6 +70,7 @@
eval-config: ${{ steps.get-jobs.outputs.eval-config }}
multi-node-eval-config: ${{ steps.get-jobs.outputs.multi-node-eval-config }}
agentic-config: ${{ steps.get-jobs.outputs.agentic-config }}
agentic-eval-config: ${{ steps.get-jobs.outputs.agentic-eval-config }}
multi-node-agentic-config: ${{ steps.get-jobs.outputs.multi-node-agentic-config }}
steps:
- name: Checkout code (ref)
Expand All @@ -69,13 +90,15 @@
pip install pydantic
CONFIG_JSON=$(python3 ${GITHUB_WORKSPACE}/utils/matrix_logic/generate_sweep_configs.py \
${{ inputs.generate-cli-command || github.event.inputs.generate-cli-command }})
AGENTIC=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if x.get('scenario-type') == 'agentic-coding' and 'prefill' not in x]))")
AGENTIC=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if x.get('scenario-type') == 'agentic-coding' and 'prefill' not in x and not x.get('run-eval', False)]))")
AGENTIC_EVAL=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if x.get('scenario-type') == 'agentic-coding' and 'prefill' not in x and x.get('run-eval', False)]))")
MULTI_AGENTIC=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if x.get('scenario-type') == 'agentic-coding' and 'prefill' in x]))")
SINGLE=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if 'prefill' not in x and x.get('scenario-type') != 'agentic-coding' and not x.get('eval-only', False)]))")
MULTI=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if 'prefill' in x and x.get('scenario-type') != 'agentic-coding' and not x.get('eval-only', False)]))")
EVALS=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if 'prefill' not in x and x.get('scenario-type') != 'agentic-coding' and x.get('run-eval', False)]))")
MULTI_EVAL=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if 'prefill' in x and x.get('run-eval', False)]))")
echo "agentic-config=$AGENTIC" >> $GITHUB_OUTPUT
echo "agentic-eval-config=$AGENTIC_EVAL" >> $GITHUB_OUTPUT
echo "multi-node-agentic-config=$MULTI_AGENTIC" >> $GITHUB_OUTPUT
echo "single-node-config=$SINGLE" >> $GITHUB_OUTPUT
echo "multi-node-config=$MULTI" >> $GITHUB_OUTPUT
Expand Down Expand Up @@ -216,7 +239,46 @@
scenario-type: agentic-coding
ref: ${{ inputs.ref }}

test-sweep-agentic-evals:
needs: get-jobs
if: ${{ needs.get-jobs.outputs.agentic-eval-config != '[]' }}
uses: ./.github/workflows/benchmark-tmpl.yml
name: agentic eval /
strategy:
fail-fast: false
matrix:
config: ${{ fromJson(needs.get-jobs.outputs.agentic-eval-config) }}
secrets: inherit
with:
exp-name: ${{ matrix.config.exp-name }}
runner: ${{ matrix.config.runner }}
image: ${{ matrix.config.image }}
model: ${{ matrix.config.model }}
model-prefix: ${{ matrix.config.model-prefix }}
framework: ${{ matrix.config.framework }}
precision: ${{ matrix.config.precision }}
tp: ${{ matrix.config.tp }}
ep: ${{ matrix.config.ep }}
dp-attn: ${{ matrix.config.dp-attn }}
conc: ${{ matrix.config.conc }}
kv-offloading: ${{ matrix.config.kv-offloading }}
kv-offload-backend: ${{ matrix.config.kv-offload-backend }}
total-cpu-dram-gb: ${{ matrix.config.total-cpu-dram-gb }}
duration: ${{ inputs.duration-override != '' && inputs.duration-override || matrix.config.duration }}
isl: '0'
osl: '0'
max-model-len: '0'
spec-decoding: 'none'
disagg: 'false'
# scenario-type agentic-coding => run_eval auto-selects swebench.
run-eval: true
eval-only: true
eval-limit: ${{ inputs.eval-limit }}
swebench-gen-mode: ${{ inputs.swebench-gen-mode }}
scenario-type: agentic-coding
ref: ${{ inputs.ref }}

test-sweep-multi-node-agentic:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {}
needs: get-jobs
if: ${{ needs.get-jobs.outputs.multi-node-agentic-config != '[]' }}
uses: ./.github/workflows/benchmark-multinode-tmpl.yml
Expand Down Expand Up @@ -331,6 +393,7 @@
disagg: ${{ matrix.config.disagg }}
run-eval: true
eval-only: true
eval-limit: ${{ inputs.eval-limit }}
ref: ${{ inputs.ref }}

collect-results:
Expand All @@ -342,12 +405,12 @@
result-prefix: "bmk"

collect-evals:
needs: [test-sweep-evals, test-sweep-multi-node-evals]
if: ${{ always() && (needs.test-sweep-evals.result != 'skipped' || needs.test-sweep-multi-node-evals.result != 'skipped') }}
needs: [test-sweep-evals, test-sweep-multi-node-evals, test-sweep-agentic-evals]
if: ${{ always() && (needs.test-sweep-evals.result != 'skipped' || needs.test-sweep-multi-node-evals.result != 'skipped' || needs.test-sweep-agentic-evals.result != 'skipped') }}
uses: ./.github/workflows/collect-evals.yml
secrets: inherit

calc-success-rate:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {}
needs: [collect-results, collect-evals]
if: ${{ always() }}
runs-on: ubuntu-latest
Expand Down
Loading