josefchen commited on
Commit
ced4adf
verified
1 Parent(s): f590e74

Retitle FlavourBench around executable evaluation

Browse files
README.md CHANGED
@@ -8,12 +8,13 @@ sdk_version: 6.9.0
8
  app_file: app.py
9
  pinned: false
10
  license: other
11
- short_description: Inspect how Epicure changes frontier model decisions.
12
  ---
13
 
14
- # FlavourBench Explorer
15
 
16
- An evidence-first explorer for the FlavourBench Epicure-native automated pilot.
 
17
 
18
  [Paper](https://github.com/josefchen/flavourbench/blob/main/paper/build/flavourbench.pdf) 路
19
  [Dataset](https://huggingface.co/datasets/josefchen/flavourbench) 路
 
8
  app_file: app.py
9
  pinned: false
10
  license: other
11
+ short_description: Executable culinary reasoning without a model judge.
12
  ---
13
 
14
+ # FlavourBench: An Executable Benchmark for Culinary Reasoning Without a Model Judge
15
 
16
+ An evidence explorer and leaderboard for 20 current language-model endpoints, scored against
17
+ executable culinary answer keys without a human or model judge.
18
 
19
  [Paper](https://github.com/josefchen/flavourbench/blob/main/paper/build/flavourbench.pdf) 路
20
  [Dataset](https://huggingface.co/datasets/josefchen/flavourbench) 路
__pycache__/app.cpython-312.pyc ADDED
Binary file (25.5 kB). View file
 
app.py CHANGED
@@ -277,10 +277,11 @@ def _hero_html() -> str:
277
  return f"""
278
  <div class="fb-shell fb-hero">
279
  <section>
280
- <div class="fb-kicker">Epicure-native automated pilot</div>
281
- <h1>Measure the<br>tool effect.</h1>
282
- <p class="fb-dek">FlavourBench asks every model the same culinary question twice.
283
- <strong>Blue is what the model knows alone. Gold is what Epicure adds.</strong>
 
284
  Open any pair to inspect the prompt, answers, tool trace, and hashes.</p>
285
  <div class="fb-stats">
286
  <div class="fb-stat"><strong>{counts["models"]}</strong><span>models</span></div>
@@ -289,11 +290,11 @@ def _hero_html() -> str:
289
  <div class="fb-stat"><strong>{counts["observed_response_arms"]:,}</strong><span>observed arms</span></div>
290
  </div>
291
  </section>
292
- <section class="fb-frontier" aria-label="Tool-off scores and Epicure uplift">
293
- <div class="fb-frontier-head"><strong>Baseline plus Epicure uplift</strong><span>Top 12 路 percent correct</span></div>
294
  {_frontier_html()}
295
  <div class="fb-note">One task equals 3.125 percentage points. Read adjacent rows as a
296
- pilot score group, then inspect the underlying pairs.</div>
297
  </section>
298
  </div>
299
  """
@@ -309,9 +310,9 @@ def _leaderboard_frame() -> pd.DataFrame:
309
  {
310
  "Rank": model["rank"],
311
  "Model": model["display_name"],
312
- "Tool off": f"{off['accuracy_percent']:.3g}%",
313
- "Tool on": f"{on['accuracy_percent']:.3g}%",
314
- "Uplift": f"+{model['uplift_percentage_points']:.3g} pp",
315
  "Observed arms": f"{observed}/64",
316
  "Backend": model["execution_backend"],
317
  }
@@ -326,14 +327,14 @@ def _model_detail(model_name: str) -> tuple[str, pd.DataFrame]:
326
  summary = f"""
327
  <div class="fb-pair-status">
328
  <div class="fb-condition good">
329
- <small>Tool-off exact-choice score</small>
330
  <strong>{off["accuracy_percent"]:.3g}%</strong>
331
  <span>Wilson 95%: {off["wilson_95"][0] * 100:.1f}% to {off["wilson_95"][1] * 100:.1f}%</span>
332
  </div>
333
  <div class="fb-condition good">
334
- <small>Epicure-assisted score</small>
335
  <strong>{on["accuracy_percent"]:.3g}%</strong>
336
- <span>Uplift: +{model["uplift_percentage_points"]:.3g} percentage points</span>
337
  </div>
338
  </div>
339
  """
@@ -342,8 +343,8 @@ def _model_detail(model_name: str) -> tuple[str, pd.DataFrame]:
342
  family_rows.append(
343
  {
344
  "Family": family.title(),
345
- "Tool off": f"{off['family_accuracy'][family] * 100:.1f}%",
346
- "Tool on": f"{on['family_accuracy'][family] * 100:.1f}%",
347
  "Change": (
348
  f"{(on['family_accuracy'][family] - off['family_accuracy'][family]) * 100:+.1f} pp"
349
  ),
@@ -400,8 +401,8 @@ def _pair_detail(
400
  on = _observation(model["model_id"], task_id, "epicure_on")
401
  status = (
402
  "<div class='fb-pair-status'>"
403
- + _status_card("Epicure off", off)
404
- + _status_card("Epicure on", on)
405
  + "</div>"
406
  )
407
  reference = json.dumps(
@@ -471,7 +472,7 @@ theme = gr.themes.Base(
471
  )
472
 
473
 
474
- with gr.Blocks(title="FlavourBench 路 Epicure evidence explorer") as demo:
475
  gr.HTML(_hero_html())
476
 
477
  with gr.Tabs():
@@ -480,8 +481,8 @@ with gr.Blocks(title="FlavourBench 路 Epicure evidence explorer") as demo:
480
  """
481
  <div class="fb-section-title">
482
  <div class="fb-kicker">Automated exact-choice track</div>
483
- <h2>The public pilot, without hidden rows</h2>
484
- <p>Rank follows tool-off score. Tool-on and uplift show the paired Epicure effect.</p>
485
  </div>
486
  """
487
  )
@@ -494,8 +495,8 @@ with gr.Blocks(title="FlavourBench 路 Epicure evidence explorer") as demo:
494
  column_widths=[55, 260, 95, 95, 105, 110, 110],
495
  )
496
  gr.Markdown(
497
- "**Reading the table.** A rank is a deterministic ordering of this 32-task pilot, "
498
- "not a claim about general model quality. Equal scores are ordered by the release's "
499
  "frozen tie-break rules. Use Pair Lens before interpreting small differences."
500
  )
501
 
@@ -565,8 +566,8 @@ with gr.Blocks(title="FlavourBench 路 Epicure evidence explorer") as demo:
565
  )
566
  choices = gr.JSON(value=initial_pair[2], label="Choices")
567
  with gr.Row():
568
- off_answer = gr.Markdown(value=initial_pair[3], label="Epicure off answer")
569
- on_answer = gr.Markdown(value=initial_pair[4], label="Epicure on answer")
570
  tool_trace = gr.JSON(value=initial_pair[5], label="Observed Epicure trace")
571
  reference = gr.Textbox(
572
  value=initial_pair[6],
@@ -599,9 +600,10 @@ with gr.Blocks(title="FlavourBench 路 Epicure evidence explorer") as demo:
599
  <div class="fb-method-grid">
600
  <div>
601
  <h3>Scoring contract</h3>
602
- <p><strong>Epicure-native score</strong> is exact-choice accuracy with Epicure
603
- disabled. <strong>Tool-assisted score</strong> uses the same model-task cells with
604
- Epicure available. <strong>Uplift</strong> is the paired percentage-point change.</p>
 
605
  <p>Tasks cover substitution, composition, cookability, and evidence. Every expected
606
  answer is derived from a fixed read-only Epicure operation.</p>
607
  <h3>Public records</h3>
@@ -642,7 +644,7 @@ public research preview.
642
  gr.HTML(
643
  """
644
  <div class="fb-shell fb-footer">
645
- FlavourBench 路 Evidence-first culinary model evaluation 路 Public automated pilot
646
  </div>
647
  """
648
  )
 
277
  return f"""
278
  <div class="fb-shell fb-hero">
279
  <section>
280
+ <div class="fb-kicker">Frontier culinary reasoning benchmark 路 20 endpoints</div>
281
+ <h1>Culinary reasoning without a model judge.</h1>
282
+ <p class="fb-dek">FlavourBench scores 20 current language-model endpoints against answer
283
+ keys compiled by Epicure.
284
+ <strong>Blue measures Model only. Gold measures the gain from Epicure.</strong>
285
  Open any pair to inspect the prompt, answers, tool trace, and hashes.</p>
286
  <div class="fb-stats">
287
  <div class="fb-stat"><strong>{counts["models"]}</strong><span>models</span></div>
 
290
  <div class="fb-stat"><strong>{counts["observed_response_arms"]:,}</strong><span>observed arms</span></div>
291
  </div>
292
  </section>
293
+ <section class="fb-frontier" aria-label="FlavourBench Score and Epicure Gain">
294
+ <div class="fb-frontier-head"><strong>FlavourBench Score plus Epicure Gain</strong><span>Top 12 路 percent correct</span></div>
295
  {_frontier_html()}
296
  <div class="fb-note">One task equals 3.125 percentage points. Read adjacent rows as a
297
+ close score group, then inspect the underlying pairs.</div>
298
  </section>
299
  </div>
300
  """
 
310
  {
311
  "Rank": model["rank"],
312
  "Model": model["display_name"],
313
+ "Model only": f"{off['accuracy_percent']:.3g}%",
314
+ "Model + Epicure": f"{on['accuracy_percent']:.3g}%",
315
+ "Epicure Gain": f"+{model['uplift_percentage_points']:.3g} pp",
316
  "Observed arms": f"{observed}/64",
317
  "Backend": model["execution_backend"],
318
  }
 
327
  summary = f"""
328
  <div class="fb-pair-status">
329
  <div class="fb-condition good">
330
+ <small>FlavourBench Score</small>
331
  <strong>{off["accuracy_percent"]:.3g}%</strong>
332
  <span>Wilson 95%: {off["wilson_95"][0] * 100:.1f}% to {off["wilson_95"][1] * 100:.1f}%</span>
333
  </div>
334
  <div class="fb-condition good">
335
+ <small>Model + Epicure accuracy</small>
336
  <strong>{on["accuracy_percent"]:.3g}%</strong>
337
+ <span>Epicure Gain: +{model["uplift_percentage_points"]:.3g} percentage points</span>
338
  </div>
339
  </div>
340
  """
 
343
  family_rows.append(
344
  {
345
  "Family": family.title(),
346
+ "Model only": f"{off['family_accuracy'][family] * 100:.1f}%",
347
+ "Model + Epicure": f"{on['family_accuracy'][family] * 100:.1f}%",
348
  "Change": (
349
  f"{(on['family_accuracy'][family] - off['family_accuracy'][family]) * 100:+.1f} pp"
350
  ),
 
401
  on = _observation(model["model_id"], task_id, "epicure_on")
402
  status = (
403
  "<div class='fb-pair-status'>"
404
+ + _status_card("Model only", off)
405
+ + _status_card("Model + Epicure", on)
406
  + "</div>"
407
  )
408
  reference = json.dumps(
 
472
  )
473
 
474
 
475
+ with gr.Blocks(title="FlavourBench 路 Frontier culinary reasoning benchmark") as demo:
476
  gr.HTML(_hero_html())
477
 
478
  with gr.Tabs():
 
481
  """
482
  <div class="fb-section-title">
483
  <div class="fb-kicker">Automated exact-choice track</div>
484
+ <h2>The complete public benchmark</h2>
485
+ <p>Rank follows FlavourBench Score. Model + Epicure and Epicure Gain show the matched intervention.</p>
486
  </div>
487
  """
488
  )
 
495
  column_widths=[55, 260, 95, 95, 105, 110, 110],
496
  )
497
  gr.Markdown(
498
+ "**Reading the table.** Rank follows Model only accuracy over this 32-task release; "
499
+ "it is not a claim about general model quality. Equal scores follow the release's "
500
  "frozen tie-break rules. Use Pair Lens before interpreting small differences."
501
  )
502
 
 
566
  )
567
  choices = gr.JSON(value=initial_pair[2], label="Choices")
568
  with gr.Row():
569
+ off_answer = gr.Markdown(value=initial_pair[3], label="Model only answer")
570
+ on_answer = gr.Markdown(value=initial_pair[4], label="Model + Epicure answer")
571
  tool_trace = gr.JSON(value=initial_pair[5], label="Observed Epicure trace")
572
  reference = gr.Textbox(
573
  value=initial_pair[6],
 
600
  <div class="fb-method-grid">
601
  <div>
602
  <h3>Scoring contract</h3>
603
+ <p><strong>FlavourBench Score</strong> is Model only exact-choice accuracy over
604
+ all 32 tasks. <strong>Model + Epicure</strong> uses the same endpoint-task cells
605
+ with one named Epicure operation. <strong>Epicure Gain</strong> is the matched
606
+ percentage-point change and does not affect rank.</p>
607
  <p>Tasks cover substitution, composition, cookability, and evidence. Every expected
608
  answer is derived from a fixed read-only Epicure operation.</p>
609
  <h3>Public records</h3>
 
644
  gr.HTML(
645
  """
646
  <div class="fb-shell fb-footer">
647
+ FlavourBench 路 Executable culinary evaluation 路 Public automated benchmark
648
  </div>
649
  """
650
  )
data/epicure-native-release.json CHANGED
@@ -1,5 +1,5 @@
1
  {
2
- "artifact_sha256": "603e4aa4db86a6e28900736322943dde2593c9e1ffd473f26b9a469bcd5c912a",
3
  "benchmark": "FlavourBench",
4
  "counts": {
5
  "assigned_arms": 1280,
@@ -20,7 +20,7 @@
20
  "reference_tool_match_pairs": 606,
21
  "uplift_percentage_points": 50.0
22
  },
23
- "artifact_sha256": "6153fc38fb27107386b127562809762facb9729807c8a9f8a5e91ed499cfad4e",
24
  "benchmark": "FlavourBench",
25
  "design": {
26
  "conditions": [
@@ -1483,16 +1483,16 @@
1483
  "official_track": true,
1484
  "primary_metric": {
1485
  "chance_level": 25,
1486
- "definition": "100 times equal-family exact-choice accuracy against Epicure answers, without Epicure tool access",
1487
- "name": "Epicure Benchmark Score",
1488
  "range": [
1489
  0,
1490
  100
1491
  ],
1492
  "rank_order": [
1493
- "Epicure Benchmark Score descending",
1494
- "Epicure-on accuracy descending",
1495
- "Epicure-on reliability descending",
1496
  "model ID ascending"
1497
  ]
1498
  },
@@ -34493,7 +34493,7 @@
34493
  "release_id": "exploratory-unmatched-1790-runtime",
34494
  "schema_version": "epicure-runtime-provenance-v1"
34495
  },
34496
- "leaderboard_artifact_sha256": "6153fc38fb27107386b127562809762facb9729807c8a9f8a5e91ed499cfad4e",
34497
  "manifest_sha256": "44220f0a6c26798871f830f6ddd62ed99d8872ad5dcb7516491b90bfc71887fc",
34498
  "task_set_sha256": "c033bf8e349350b186a47b28c94d4b0f356cbb519d0cffb3d5a7389ce7d7ca2f",
34499
  "taskset_artifact_sha256": "615e6164a29ea57c507d979934f3ce484d6b71f4d6da55e9e8d338147c68e536"
 
1
  {
2
+ "artifact_sha256": "197b84d75ccaa549650ad08cc88f934a4ac1173c8e51c9fb149a703ce2602ce8",
3
  "benchmark": "FlavourBench",
4
  "counts": {
5
  "assigned_arms": 1280,
 
20
  "reference_tool_match_pairs": 606,
21
  "uplift_percentage_points": 50.0
22
  },
23
+ "artifact_sha256": "6076a904af22c6d58b11cb6a0b267431dbfeff639ab511bf6c936d9cf55eebf4",
24
  "benchmark": "FlavourBench",
25
  "design": {
26
  "conditions": [
 
1483
  "official_track": true,
1484
  "primary_metric": {
1485
  "chance_level": 25,
1486
+ "definition": "100 times Model only correct answers divided by 32, against the published Epicure answer keys",
1487
+ "name": "FlavourBench Score",
1488
  "range": [
1489
  0,
1490
  100
1491
  ],
1492
  "rank_order": [
1493
+ "FlavourBench Score descending",
1494
+ "Model + Epicure accuracy descending",
1495
+ "Model + Epicure completion descending",
1496
  "model ID ascending"
1497
  ]
1498
  },
 
34493
  "release_id": "exploratory-unmatched-1790-runtime",
34494
  "schema_version": "epicure-runtime-provenance-v1"
34495
  },
34496
+ "leaderboard_artifact_sha256": "6076a904af22c6d58b11cb6a0b267431dbfeff639ab511bf6c936d9cf55eebf4",
34497
  "manifest_sha256": "44220f0a6c26798871f830f6ddd62ed99d8872ad5dcb7516491b90bfc71887fc",
34498
  "task_set_sha256": "c033bf8e349350b186a47b28c94d4b0f356cbb519d0cffb3d5a7389ce7d7ca2f",
34499
  "taskset_artifact_sha256": "615e6164a29ea57c507d979934f3ce484d6b71f4d6da55e9e8d338147c68e536"