Commit Graph

85 Commits

Author SHA1 Message Date
github-actions[bot] 512f29972e Version Packages 2026-02-20 22:47:26 +00:00
Allen Zhou 097490384c asserting agent behavior 2026-02-20 13:59:49 -08:00
github-actions[bot] e514739637 Version Packages (#78)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-17 22:57:42 -08:00
Jude Gao 065afc909f Revert "[Classifier] Add "eval" failure type for flawed eval tests (#79)" (#82)
This reverts commit 683e681b7d.
2026-02-17 17:10:37 -08:00
Jude Gao 330ec5e8b7 [Classifier] Switch to Haiku 4.5 and parallelize classification (#81)
* [Classifier] Upgrade classification model to Claude Sonnet 4.6

* [Classifier] Parallelize classification with p-limit and add dashboard progress

Run up to 4 classifications concurrently using p-limit instead of a
sequential for-loop. The dashboard now shows "classifying N/M…" so
users can track per-eval progress during the classification phase.

* [Classifier] Switch to Haiku 4.5 for classification

Haiku is faster and cheaper while still capable enough for the
classification task, especially with 4 concurrent classifications.
2026-02-17 17:06:55 -08:00
Jude Gao 620fb473ad [CLI] run-all subcommand options like --dry are intercepted by the parent program (#80)
* [CLI] run-all subcommand options like --dry are intercepted by the parent program

* Add changeset
2026-02-17 16:46:04 -08:00
Jude Gao 683e681b7d [Classifier] Add "eval" failure type for flawed eval tests (#79) 2026-02-17 16:28:03 -08:00
Jude Gao c8bcde36d1 [Runner] Retry eval attempts on 429 rate limiting with exponential backoff (#77)
* [Runner] Retry eval attempts on 429 rate limiting with exponential backoff

* Add changeset

* Add StartRateLimiter and switch to anomaly-based retry detection

- Add StartRateLimiter class to throttle sandbox starts across experiments
  (20 starts per 2s window) to prevent 429s at the source
- Replace 429 string matching with anomaly detection: retry any failure
  that completes in <5s, since real evals take minutes
- Move progress events (eval:start, eval:complete, earlyExit) outside
  runAttempt so they fire correctly after retries

* Fix runner tests: exclude timeouts from retry, bump mock durations above anomaly threshold
2026-02-17 12:06:10 -08:00
github-actions[bot] 28b64c8bee Version Packages 2026-02-13 16:08:45 +00:00
Jude Gao 9558ee90b9 Remove debug console.log from saveResults (#75)
Removes a debug console.log statement that was left in the saveResults function. The statement was logging internal state (copyFiles, hasGeneratedFiles, hasDeletedFiles, options, and runData) during result persistence, which is unnecessary noise in production output.

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-02-13 11:08:00 -05:00
github-actions[bot] a784dcf962 Version Packages (#72)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-12 16:56:35 -05:00
Jude Gao 087415c73d [O11y] Add transcript parsers for Gemini and Cursor agents (#74)
* [O11y] Add transcript parsers for Gemini and Cursor agents

* Handle Gemini direct-API transcript format

The Gemini agent has two output formats: the CLI format (via OpenCode
framework with part.tool/part.state) and the direct-API format (with
tool_name/parameters and separate tool_result events). The initial
parser only handled the CLI format, leaving direct-API transcripts
with all-zero metrics. This adds handling for both.

* Aggregate Gemini direct-API delta messages into single turns

Contiguous assistant delta messages are now merged into one message
event so totalTurns reflects actual conversation turns instead of 0.

* Add changeset
2026-02-12 16:50:18 -05:00
Jude Gao be7ca1560e [Agents] Add Cursor CLI agent with direct API support (#73)
* [Agents] Add Cursor CLI agent with direct API support

Add Cursor CLI as a new agent to the eval framework, enabling testing against Cursor models using direct API access via `CURSOR_API_KEY`. The implementation follows the established pattern from existing agents (Claude Code, Codex, Gemini) and integrates seamlessly with the sandbox infrastructure.

Cursor CLI uses a different interaction model than other agents. Unlike the `agent chat` subcommand syntax, the correct invocation is to pass the prompt as the first positional argument, then use the `--print` flag to enable non-interactive mode (required for scripts and headless execution). The `--force` flag is added to automatically approve all CLI operations without waiting for user confirmation. This combination ensures the agent completes successfully in sandboxed environments without hanging on interactive prompts.

The agent installation uses Cursor's official shell-based installation method (`curl https://cursor.com/install -fsSL | bash`), which handles proper setup of the CLI environment. Once installed, prompts are executed as `agent "<prompt>" --print --force`, capturing both stdout and stderr as output. The implementation includes transcript extraction that filters for JSON-formatted events when available, falling back to raw text output if no structured format is detected. This matches the approach used by other agents but adapts to Cursor's plain-text output characteristics.

The agent uses `composer-1.5` as the default model and integrates with all eval framework features including file capture, script validation, and test execution. Integration tests verify both basic eval execution and result output structure matching. The agent is fully typed in the framework's type system and added to the configuration schema alongside other direct-API agents.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix missing --model and --output-format flags, update env var docs

- Pass --model to Cursor CLI so user-configured model is actually used
- Add --output-format stream-json for structured JSONL transcripts
- Update changeset to reflect correct default model (composer-1.5)
- Add GEMINI_API_KEY and CURSOR_API_KEY to README env var table

---------

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-02-12 15:08:22 -05:00
Jude Gao 8f198d4d18 [Agents] Add Gemini CLI agent with direct API and stream-json transcript support (#71) 2026-02-12 14:15:34 -05:00
github-actions[bot] b58bc3d8d7 Version Packages 2026-02-12 14:56:51 +00:00
paoloricciuti 93c1a6390a fix: add all the files to track newly created files 2026-02-12 15:24:14 +01:00
github-actions[bot] 37dbeaf29c Version Packages 2026-02-11 20:56:57 +00:00
Paolo Ricciuti fc91cfb7e2 Merge pull request #64 from vercel-labs/save-changed-files
fix: use git to get changes files
2026-02-11 21:56:10 +01:00
github-actions[bot] 68adf6525d Version Packages (#66)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-11 15:28:24 -05:00
Jude Gao cf50218fe2 Make failure classifier optional (#65) 2026-02-11 15:22:13 -05:00
paoloricciuti 83be77b5b7 Merge remote-tracking branch 'origin/main' into save-changed-files 2026-02-11 16:42:34 +01:00
paoloricciuti f3e4f69612 feat: add option to copy files in results 2026-02-11 16:38:58 +01:00
github-actions[bot] 4f9d492e8d Version Packages (#62)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-10 18:06:50 -05:00
Jude Gao bc5114cea6 [CLI] Live terminal dashboard for parallel experiment runs (#63)
* [CLI] Live terminal dashboard for parallel experiment runs

* Fix lint errors: remove unused renderDetailLine and verbose
2026-02-10 17:55:04 -05:00
paoloricciuti 24c4345b26 fix: use git to get changes files 2026-02-10 20:28:39 +01:00
paoloricciuti b846fc7ec7 fix: allow user defined tests verifyNoTestFiles 2026-02-10 15:18:55 +01:00
github-actions[bot] 2455c8be48 Version Packages 2026-02-09 22:09:59 +00:00
Allen Zhou e42dbf7d4c playground changeset 2026-02-09 14:07:03 -08:00
Allen Zhou f426890713 update playground 2026-02-09 14:03:59 -08:00
Allen Zhou bcb69cd046 fix opencode parsing 2026-02-09 13:50:35 -08:00
Allen Zhou 2f0be0862a codex parsing 2026-02-09 13:41:42 -08:00
github-actions[bot] bf99e421b3 Version Packages (#57)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-09 14:28:15 -05:00
Jude Gao 5e451599e0 [Codex] Support reasoning effort via model string, fix Docker CA certs, and improve npm install reliability (#56) 2026-02-09 14:25:04 -05:00
github-actions[bot] 4497ed66ae Version Packages 2026-02-08 20:23:01 +00:00
paoloricciuti 465fbac30b fix: allow VERCEL_OIDC_TOKEN if AI_GATEWAY_API_KEY is not set 2026-02-08 19:48:18 +01:00
github-actions[bot] cfa2555c19 Version Packages (#48)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-08 01:05:49 -05:00
Jude Gao e10e69b2b3 Fingerprint reuse was never persisting fingerprints to results (#47) 2026-02-08 01:04:49 -05:00
github-actions[bot] 2eef698793 Version Packages (#45)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-08 00:31:38 -05:00
Jude Gao 0bbd6b29d5 Make run-all the default when invoked with no arguments (#43)
`npx agent-eval` with no args now discovers and runs all experiments
(same as `agent-eval run-all`). Running a single experiment still
works: `npx agent-eval my-experiment`.
2026-02-08 00:24:17 -05:00
Jude Gao 3e57444699 Add run-all command with housekeeping (#41)
New run-all command auto-discovers experiments/*.ts and orchestrates
the full pipeline: fingerprint reuse, failure classification,
auto-retry of infra failures, and housekeeping.

Housekeeping runs after each experiment: keeps only the latest valid
result per (experiment, eval) pair, removes duplicates and incomplete
results, cleans up empty timestamp directories.

Supports --dry (preview), --force (ignore fingerprints), --smoke
(1 eval per experiment), and optional experiment name/glob arguments.
2026-02-08 00:21:05 -05:00
Jude Gao b841c01306 Add failure classification and auto-retry support (#40)
New classifier.ts module classifies failed evals as model, infra, or
timeout. Rule-based fast path catches ~80% of cases (timeout errors,
missing transcripts, rate limits, tiny transcripts with API errors).
Falls back to AI classification via gateway(anthropic/claude-sonnet-4-5)
with sandboxed read-only tools. Gracefully degrades to rule-based only
when AI_GATEWAY_API_KEY is not set.

shouldRetry() returns true when all failures are non-model, enabling
auto-retry of infra-failed evals.

summary.json now supports classification and valid fields. Results
marked valid: false are excluded from fingerprint reuse.
2026-02-08 00:17:03 -05:00
Jude Gao 8f08f07cd8 Add content fingerprinting and result reuse (#42)
Computes a SHA-256 fingerprint from all eval directory files plus the
config fields that affect results (agent, model, scripts, timeout,
earlyExit, runs). The fingerprint is stored in summary.json.

scanReusableResults() scans existing results and returns matches where
the fingerprint is identical, the result is valid, and passedRuns > 0.

Functions like setup and editPrompt can't be hashed — use --force to
re-run when these change.
2026-02-07 23:57:05 -05:00
Jude Gao 08eb8eedda Add --smoke flag for quick setup verification (#38)
Picks the first eval alphabetically and runs it once per model.
Useful for verifying API keys, model IDs, and sandbox connectivity
before committing to a full suite, especially with model arrays.
2026-02-07 23:41:19 -05:00
Jude Gao a5af95bfb3 Move script outputs to outputs/scripts/ to fix naming collision (#37)
When `scripts: ['eval']` is configured, the script output was written
to `outputs/eval.txt` which collided with the EVAL.ts test output at
the same path. Script outputs now go to `outputs/scripts/{name}.txt`.
2026-02-07 23:34:56 -05:00
Allen Zhou 38930cfad3 show playground runs 2026-02-07 15:01:58 -08:00
github-actions[bot] 3885f2ba08 Version Packages 2026-02-07 22:41:12 +00:00
Allen Zhou 59ceacaf77 Merge pull request #36 from vercel-labs/allen/recursive-directory-playground-support
fix: support recursive playground directory discovery
2026-02-07 14:40:38 -08:00
Allen Zhou 621e9893e5 support recursive playground directory discovery 2026-02-07 14:40:01 -08:00
paoloricciuti d3501c8b37 fix: playground parsing 2026-02-07 22:25:06 +01:00
paoloricciuti 186aa6d846 fix: add model to results 2026-02-07 21:12:27 +01:00