Import upstream Verifiers episodes into Bench
CI / verify (push) Successful in 40s
CI / deploy (push) Failing after 1m21s

This commit is contained in:
2026-08-25 13:08:02 -07:00
parent 006feee0f7
commit 68a436d7ea
5 changed files with 496 additions and 2 deletions
+122
View File
@@ -0,0 +1,122 @@
"""Prime Verifiers v1 episode JSONL enters Bench without a second harness."""
from __future__ import annotations
import json
import sys
import tempfile
import unittest
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(ROOT))
from kbench.verifiers_import import (
VerifiersImportError,
import_quality,
read_episodes,
)
def trace(
trace_id: str,
reward: float,
*,
agent: str = "agent",
trainable: bool = True,
answer: str = "done",
) -> dict:
return {
"id": trace_id,
"verifiers": {"version": "0.3.1"},
"agent": {"name": agent, "trainable": trainable},
"ok": True,
"rewards": {"task": {"score": reward, "weight": 1.0}},
"metrics": {"strict": reward},
"nodes": [{"message": {"role": "assistant", "content": answer}}],
"timing": {"agent": {"start": 10.0, "end": 12.0}},
}
def episode(episode_id: str, traces: list[dict], task_key: str = "task-1") -> dict:
return {
"id": episode_id,
"env": {"id": "example-tool-loop-v1"},
"task": {
"type": "OfficeJobTask",
"key": task_key,
"data": {"private_prompt": "must never enter the score card"},
},
"ok": True,
"errors": [],
"traces": traces,
}
class VerifiersImportTests(unittest.TestCase):
def write(self, root: Path, rows: list[dict]) -> Path:
path = root / "traces.jsonl"
path.write_text("".join(json.dumps(row) + "\n" for row in rows))
return path
def test_one_episode_becomes_one_existing_sample_outcome(self) -> None:
with tempfile.TemporaryDirectory() as tmp:
path = self.write(Path(tmp), [episode("ep-1", [trace("tr-1", 1.0)])])
result = import_quality(path, "example-tool-loop")
self.assertEqual(result.n_samples, 1)
self.assertEqual(result.metrics["accuracy"], 1.0)
self.assertEqual(result.samples[0].sample_id, "ep-1")
self.assertEqual(result.samples[0].excerpt, "done")
self.assertNotIn("private_prompt", json.dumps(result.samples[0].metadata))
self.assertEqual(result.dataset_version, "verifiers:0.3.1")
def test_multi_agent_episode_ignores_non_trainable_user_simulator(self) -> None:
rows = [
episode(
"ep-1",
[
trace("assistant", 0.75, agent="assistant"),
trace("user", 0.0, agent="user", trainable=False),
],
)
]
with tempfile.TemporaryDirectory() as tmp:
result = import_quality(self.write(Path(tmp), rows), "user-sim", pass_threshold=0.5)
self.assertEqual(result.samples[0].score, 0.75)
self.assertTrue(result.samples[0].passed)
self.assertEqual(result.samples[0].metadata["agents"], ["assistant"])
def test_named_metric_can_be_the_score_source(self) -> None:
with tempfile.TemporaryDirectory() as tmp:
path = self.write(Path(tmp), [episode("ep-1", [trace("tr-1", 0.25)])])
result = import_quality(path, "strict", pass_threshold=0.2, primary_metric="strict")
self.assertEqual(result.samples[0].score, 0.25)
self.assertEqual(result.samples[0].metadata["score_source"], "metric:strict")
def test_fingerprint_uses_task_identity_not_line_order(self) -> None:
rows = [
episode("ep-1", [trace("tr-1", 1.0)], "a"),
episode("ep-2", [trace("tr-2", 0.0)], "b"),
]
with tempfile.TemporaryDirectory() as tmp:
root = Path(tmp)
a = import_quality(self.write(root, rows), "t").dataset_fingerprint
b = import_quality(self.write(root, list(reversed(rows))), "t").dataset_fingerprint
self.assertEqual(a, b)
def test_duplicate_episode_ids_are_refused(self) -> None:
row = episode("same", [trace("tr-1", 1.0)])
with tempfile.TemporaryDirectory() as tmp:
path = self.write(Path(tmp), [row, row])
with self.assertRaises(VerifiersImportError):
read_episodes(path)
def test_directory_resolves_the_upstream_traces_filename(self) -> None:
with tempfile.TemporaryDirectory() as tmp:
root = Path(tmp)
self.write(root, [episode("ep-1", [trace("tr-1", 1.0)])])
self.assertEqual(len(read_episodes(root)), 1)
if __name__ == "__main__":
unittest.main()