Skip to content

Commit 1fd7632

Browse files
raifdmuellerclaude
andcommitted
feat: evaluation results for 10 models including Claude Opus/Haiku and GPT-5.4
New models tested (193 questions each): - claude-opus-4-6: 99%, 0 fails (tied #1 with GPT-5.4) - claude-haiku-4-5-20251001: 98%, 9 fails - gpt-5.4-2026-03-05: 99%, 0 fails (tied #1 with Opus) - gpt-5.4-mini-2026-03-17: 97%, 13 fails Full leaderboard (10 models): 99% claude-opus-4-6, gpt-5.4-2026-03-05 (0 fails each) 99% claude-sonnet-4-20250514 (2 fails) 98% claude-haiku-4-5-20251001 (9 fails) 97% gpt-4o, gpt-5.4-mini-2026-03-17 (13 fails each) 96% mistral-large-2512, devstral-2512 (18 fails each) 85% mistral-medium-2508 (77 fails) 74% mistral-small-2603 (116 fails) Key finding: Claude Opus and GPT-5.4 both achieve 0 fails — despite Claude having generated the questions and distractors. No Claude bias. Added --claude-model parameter for flexible Claude model selection. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 0e0a749 commit 1fd7632

11 files changed

Lines changed: 6202 additions & 535 deletions

evaluations/generate-report.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535

3636
def get_model_display(backend, config):
3737
"""Get exact model display name from config."""
38+
if backend == "claude" and config.get("claude_model"):
39+
return config["claude_model"]
3840
if backend == "openai" and config.get("openai_model"):
3941
return config["openai_model"]
4042
if backend == "mistral" and config.get("mistral_model"):

evaluations/pilot.py

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,24 @@ def set_temperature(t):
9999
TEMPERATURE = t
100100

101101

102-
def call_claude_api(prompt, model="claude-sonnet-4-20250514"):
103-
"""Send prompt to Claude via Anthropic API."""
104-
try:
105-
import anthropic
106-
except ImportError:
107-
print("anthropic package required: pip install anthropic")
108-
sys.exit(1)
109-
110-
client = anthropic.Anthropic()
111-
response = client.messages.create(
112-
model=model,
113-
max_tokens=10,
114-
temperature=TEMPERATURE,
115-
messages=[{"role": "user", "content": prompt}],
116-
)
117-
return response.content[0].text, model
102+
def make_claude_api_caller(claude_model):
103+
"""Create a Claude API caller for a specific model."""
104+
def call_claude_api(prompt, model=claude_model):
105+
try:
106+
import anthropic
107+
except ImportError:
108+
print("anthropic package required: pip install anthropic")
109+
sys.exit(1)
110+
111+
client = anthropic.Anthropic()
112+
response = client.messages.create(
113+
model=model,
114+
max_tokens=10,
115+
temperature=TEMPERATURE,
116+
messages=[{"role": "user", "content": prompt}],
117+
)
118+
return response.content[0].text, model
119+
return call_claude_api
118120

119121

120122
def call_claude_cli(prompt, model="claude-cli"):
@@ -292,12 +294,15 @@ def save_results(all_results, out_file):
292294

293295
def run_pilot(models, dry_run=False, verbose=False, ollama_model="qwen3:4b", no_think=False,
294296
ollama_url="http://localhost:11434", openai_model="gpt-4o-mini",
295-
mistral_model="mistral-large-latest", deepseek_model="deepseek-chat"):
297+
mistral_model="mistral-large-latest", deepseek_model="deepseek-chat",
298+
claude_model="claude-sonnet-4-20250514"):
296299
start_time = time.time()
297300
specs = load_specs()
298301
print(f"Loaded {len(specs)} anchor specs")
299302
print(f"Models: {', '.join(models)}")
300303
print(f"Temperature: {TEMPERATURE}")
304+
if "claude" in models:
305+
print(f"Claude model: {claude_model}")
301306
if "openai" in models:
302307
print(f"OpenAI model: {openai_model}")
303308
if "mistral" in models:
@@ -315,7 +320,8 @@ def run_pilot(models, dry_run=False, verbose=False, ollama_model="qwen3:4b", no_
315320
# Include exact model IDs in filename to prevent race conditions
316321
model_ids = []
317322
for m in models:
318-
if m == "openai": model_ids.append(openai_model)
323+
if m == "claude": model_ids.append(claude_model)
324+
elif m == "openai": model_ids.append(openai_model)
319325
elif m == "mistral": model_ids.append(mistral_model)
320326
elif m == "deepseek": model_ids.append(deepseek_model)
321327
elif m == "ollama": model_ids.append(f"ollama-{ollama_model}")
@@ -327,6 +333,7 @@ def run_pilot(models, dry_run=False, verbose=False, ollama_model="qwen3:4b", no_
327333
"timestamp": datetime.now(timezone.utc).isoformat(),
328334
"config": {
329335
"models": models,
336+
"claude_model": claude_model if "claude" in models else None,
330337
"openai_model": openai_model if "openai" in models else None,
331338
"mistral_model": mistral_model if "mistral" in models else None,
332339
"deepseek_model": deepseek_model if "deepseek" in models else None,
@@ -340,7 +347,7 @@ def run_pilot(models, dry_run=False, verbose=False, ollama_model="qwen3:4b", no_
340347

341348
for model_name in models:
342349
if model_name == "claude":
343-
call_fn = call_claude_api
350+
call_fn = make_claude_api_caller(claude_model)
344351
elif model_name == "claude-cli":
345352
call_fn = call_claude_cli
346353
elif model_name == "claude-haiku":
@@ -499,8 +506,10 @@ def append_and_save(r):
499506
parser.add_argument("--model", nargs="+", default=["claude-cli"],
500507
choices=["claude", "claude-cli", "claude-haiku", "openai", "mistral", "deepseek", "ollama"],
501508
help="Models to evaluate (default: claude-cli)")
509+
parser.add_argument("--claude-model", default="claude-sonnet-4-20250514",
510+
help="Claude model name (default: claude-sonnet-4-20250514)")
502511
parser.add_argument("--openai-model", default="gpt-4o-mini",
503-
help="OpenAI model name (default: gpt-4o-mini). Try: gpt-5, gpt-5-mini, gpt-4o")
512+
help="OpenAI model name (default: gpt-4o-mini). Try: gpt-5.4-2026-03-05, gpt-4o")
504513
parser.add_argument("--mistral-model", default="mistral-large-latest",
505514
help="Mistral model name (default: mistral-large-latest)")
506515
parser.add_argument("--deepseek-model", default="deepseek-chat",
@@ -520,4 +529,5 @@ def append_and_save(r):
520529
args = parser.parse_args()
521530
set_temperature(args.temperature)
522531
run_pilot(args.model, args.dry_run, args.verbose, args.ollama_model, args.no_think,
523-
args.ollama_url, args.openai_model, args.mistral_model, args.deepseek_model)
532+
args.ollama_url, args.openai_model, args.mistral_model, args.deepseek_model,
533+
args.claude_model)

0 commit comments

Comments
 (0)