feat(harvey-lab): switch judge to Claude Sonnet + fix docs + enable CLI progress#264
Conversation
… CLI progress output - Update running-benchmarks.md with correct --source-repo benchflow-ai/benchmarks and --source-path datasets/harvey-lab/tasks/... examples - Add note about flattened task names in the benchmarks dataset repo - Configure logging.basicConfig(level=INFO) in CLI so logger.info progress messages from SDK/Job are visible during execution
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
…(matching original) Harvey LAB's original benchmark uses claude-sonnet-4-6 as the default judge model. Our converter was hardcoding gemini-3.1-flash-lite-preview instead. This switches to the original model for accurate parity: - Replace call_gemini() with call_judge() using Anthropic API - Change verifier.env from GEMINI_API_KEY to ANTHROPIC_API_KEY - Update Dockerfile: google-genai -> anthropic pip package - Update README to document Claude-based judge Pre-converted tasks in benchflow-ai/benchmarks will need to be regenerated to pick up this change.
…+ resolve merge conflicts
Test Results — Claude Judge SwitchTested by extracting the generated Claude Judge E2E (primary test)
Template verification
CLI logging fix
Note: Pre-converted tasks in |
Dogfood: Full E2E Run with Claude JudgePatched a pre-converted task ( Result: The full pipeline works: agent → 10 tool calls → Claude judge evaluated 39 criteria → reward 0.103. No crashes, no GEMINI_API_KEY errors. |
| Reward = (criteria passed) / (total criteria). Same per-criterion individual grading and | ||
| default judge model as Harvey LAB's original `evaluation/judge.py`. |
There was a problem hiding this comment.
🟡 README falsely claims same judge model as Harvey LAB's original when it was changed from Gemini to Claude
The new README text states "Same per-criterion individual grading and default judge model as Harvey LAB's original evaluation/judge.py." However, this PR changes the judge from gemini-3.1-flash-lite-preview to claude-sonnet-4-6. The old README correctly said only "Same per-criterion individual grading as Harvey LAB's original" (without the model claim). All parity data in the repo — end-to-end parity (benchmarks/harvey-lab/README.md:94-99), prompt-level parity (benchmarks/harvey-lab/README.md:118-122), benchmark.yaml:35, and parity_experiment.json — consistently show the original judge model was Gemini, not Claude. The added clause "and default judge model" is factually incorrect and misleading.
| Reward = (criteria passed) / (total criteria). Same per-criterion individual grading and | |
| default judge model as Harvey LAB's original `evaluation/judge.py`. | |
| Reward = (criteria passed) / (total criteria). Same per-criterion individual grading | |
| as Harvey LAB's original `evaluation/judge.py`. |
Was this helpful? React with 👍 or 👎 to provide feedback.
There was a problem hiding this comment.
The claim is actually correct — Harvey LAB's original benchmark uses claude-sonnet-4-6 as the default judge model (per their eval-strategies.md). This PR switches from our previous gemini-3.1-flash-lite-preview to match the original.
The parity data in the repo was recorded with the old Gemini judge (before this PR), which is why it shows Gemini — that's an artifact of when parity was run, not the original benchmark's choice. The "default judge model" clause refers to matching Harvey LAB upstream, not our previous adapter.
That said, good catch that the parity data is now stale relative to the judge model. The parity experiment validated prompt equivalence (same prompts produce same verdicts), not judge-model equivalence. I'll add a note clarifying this in the README.
Summary
Three changes bundled in this PR:
Switch Harvey LAB verifier judge from Gemini to Claude Sonnet — the original Harvey LAB benchmark uses
claude-sonnet-4-6as the judge model. Our converter was hardcoded togemini-3.1-flash-lite-preview. This PR updates the converter (benchflow.py) to useclaude-sonnet-4-6via the Anthropic API, matching the original benchmark's judge. Docker dependencies updated fromgoogle-genaitoanthropic.Fix docs to use
benchflow-ai/benchmarks— docs previously showedharveyai/harvey-labsas the--source-repo. Updated with correct examples usingbenchflow-ai/benchmarksanddatasets/harvey-lab/tasks/..., including a note that task names are flattened with hyphens.Enable CLI progress output — added
logging.basicConfig(level=logging.INFO)tocli/main.pysologger.info()messages from benchflow internals are visible in the terminal during execution.Fix parity_test.py for eval-parity mode — updated
check_eval_parity()to passANTHROPIC_API_KEYinstead ofGEMINI_API_KEY(since the generatedevaluate.pynow uses Anthropic). Added--anthropic-api-keyCLI flag. Side-by-side mode still uses--gemini-api-keyas before.Review & Testing Checklist for Human
ANTHROPIC_API_KEYset and verify the Claude judge scores correctlyparity_test.py --mode eval-parity --anthropic-api-key ...worksparity_test.py --mode side-by-side --gemini-api-key ...still works (unchanged)Notes
benchflow-ai/benchmarkswill need regeneration to pick up the new Claude judge in theirevaluate.pyfiles.GEMINI_API_KEYis still needed for the agent (if usinggeminiagent) and for side-by-side parity mode. Only the verifier/judge now usesANTHROPIC_API_KEY.Link to Devin session: https://app.devin.ai/sessions/6b1fbe50a16b4fd497ed4a26cc1d4b6c
Requested by: @xdotli