Repository navigation
v0.8.0
Third feature release since the initial public release (v0.5.0). Twelve new benchmarks, a uniform stage-output protocol across all 40 registered tasks, a shared sampling-metrics family, and the rebuilt provider-neutral model binding plane.
A minor bump, and a wide one: the on-disk record shape, several report.json
keys and the infer recipe schema all changed, so a run started under 0.7.x
cannot be resumed under 0.8.0 — start those fresh. Reported scores are
unchanged everywhere except the two places called out below.
Added
- New benchmark tasks & datasets:
- AGIEval v1.1 — all 21 human-exam subsets (19 MCQ + 2 math cloze, 7,272 problems), upstream's two-stage 0-shot protocol, with subset selection via
group/subsets(#67). - IHEval — instruction-hierarchy benchmark (18,998 rows, 9 subtasks × 3 settings); headline is the conflict aggregate, with reference/aligned and the signed + absolute diffs reported beside it (#92).
- Multi-IF — sieval's first multi-turn task: 4,501 three-turn conversations across 8 languages, graded by upstream's own multilingual IFEval fork (#80).
- Inverse IFEval — 1,012 counter-intuitive instruction-following prompts across 8 challenge types, zh/en, LLM-judged (#91).
- AdvancedIF — 1,645 expert-written prompts with human-curated rubrics. Needs an operator-staged upstream checkout (
SIEVAL_ADVANCED_IF_SRC); the judge prompts are not redistributable here (#79). - ComplexConstraints — rubric-judged complex constraint following (#78).
- GSM-Plus — every GSM8K test problem rewritten under 8 adversarial perturbations, 10,552 rows (#69).
- GSM1k — Scale's held-out GSM8K replication, 1,205 rows, as a prompt-exact base/chat pair (#76).
- UGMathBench — 5,061 problems × 3 randomized versions, EAcc headline, shipped as
ugmathbench_0shot_gen_fixed(#68). - PlatinumBench — 5 math 0-shot tasks over the cleaned subsets; all 120 published math cells of the paper's Table 3 reproduce (#65).
- MathArena BRUMO / SMT / CMIMC / Apex / Apex Shortlist 2025 — five more final-answer competitions, validated against upstream's published outputs (#73).
- SciCode — research-coding, 65 problems / 288 tested sub-steps, scored through the code-eval service (#42).
- AGIEval v1.1 — all 21 human-exam subsets (19 MCQ + 2 math cloze, 7,272 problems), upstream's two-stage 0-shot protocol, with subset selection via
- Uniform stage-output protocol —
preprocess/postprocess/feedbackreturnPromptRecord/PredictionRecord/JudgementRecordacross 40 of 40 registered tasks, so any sample's prompt, prediction, ground truth and verdict read the same way without a per-task branch.report.jsonmetrics verified unchanged by 8,400+ randomized differential trials (#60, #62). - Shared sampling metrics —
pass@k,pass^k,avg@n,maj@k(math only),self_consistency,n_unextractedandn_short, rolled out to every sampling task;pass@kandpass^kare meant to be read as a pair (#88, #89). score_key+denominator_policyon every task report, with a preflight gate — 21 of 49 report-bearing modules had never declared them (#93).TaskMeta.reference_kind(value/procedure) plus amissing_referenceanomaly rule, so a judgement carrying no reference says why (#95).- Run directories record which task produced them —
meta.jsongains an optionaltaskblock (name, dataset, eval mode, shot count, tags, status), and a newgate_resume_identityrefuses to resume into a directory another task wrote (#57). - Rebuilt provider-neutral model binding plane (RFC #25) — capability-based model IR, dialect and transport seams under
sieval/core/models/(#45), with follow-ups splittingmodel.pyby lifetime (#99), giving duplicated private primitives one owner (#98) and sharing auxiliary model-role resolution onTask(#97). - Per-call token breakdown on disk and in
profile.json—reasoning_tokens,cached_tokens,accepted/rejected_prediction_tokensandreported_total_tokens, eachint | Noneso an absent key means unreported and a present0is a real measurement (#101). - Infer recipes split into hardware and capability layers, so a base checkpoint no longer inherits instruct-only serving params;
sieval infer startgains--model-type chat|gen(#59). - Task names accept an optional trailing variant segment (
<task>_<N>shot_<mode>[_<variant>]), so an upstream-faithful port and a corrected one can coexist. The unqualified name always means "what upstream measures";_fixedrequires a quantified score delta (#68). pdm.lockversion drift is enforced, not just documented —check_depsfails on a version change no requirement change asked for, with alock-driftpre-commit hook (#64).- The grader's reply is persisted on every LLM-judged attempt, so
judge_unparsedcounts have an artifact behind them (#51). - Grader spend now appears in
profile.json; the runner recovers grader calls from the judgement record (#60).
Fixed
- Resuming no longer raises
KeyError: 'prediction'on samples whose extraction failed — 39 call sites across 38 tasks, plus acheck_record_key_accesspreflight gate. The failure was invisible until the one moment it cost a whole run (#70). theoremqa_kshot_base_genno longer executes model output: upstream's bareeval()is replaced with a bounded AST allowlist walk. Score impact measured at zero over 706 expressions (#83).gsm8k_0shot_gen/hendrycks_math_kshot_base_genno longer execute model output — both of DeepSeek-Math's reachable execution paths are closed, guards shared with the UGMathBench grader. Score impact zero across 12,638 gradings (#84).- A failing CLI command prints a result under
--output json|yamlinstead of nothing; all 15 registered commands now funnel errors throughrender(), andsieval dataset downloadgains-o/--outputand a result payload (#85). --resumestrict-match aborts say what actually differs, instead of reporting "whitespace / formatting only" while aborting; a cross-version resume now names the version (#87).mmlu_kshot_clp/cmmlu_kshot_clp/drop_kshot_gen/openbookqa_kshot_genabort when the few-shot split cannot supplyn_shotexemplars, before any inference spend, instead of silently rendering fewer (#57).ugmathbench_0shot_gen_fixedreads predictions with a case-preserving LaTeX parser — scores move +0.2 pp; 20 problems fixed, 0 verdicts moved right-to-wrong over 11,424 regraded rows (#90).- LiveCodeBench uses upstream's per-case timeout rule rather than a whole-suite timeout (#66).
- Usage totals are computed as prompt + completion, and bad builder defaults are rejected at bind time rather than on first
meta()(#100). get_task_class()resolves subpackage-hosted tasks, which previously raisedKeyErrorfromsieval task show(#57).- Two perf gates no longer flake on a gen2 pause or the cyclic collector (#96, #102).
Changed
- BREAKING — infer recipe schema. The flat
profiles[hardware][precision][framework]bag is split intohardware[...]andcapabilities[instruct|base][...]; the loader rejects aprofileskey with a migration error.resolve_profileis replaced byresolve_hardware_profile+resolve_capability_profile. Resolved gpt-oss params keep identical content but change key order, andinfer_plans.yamlis compared byte-for-byte under--resume— which is what makes this a minor bump (#59). - BREAKING — the few-shot knob is renamed
k→n_shoton 13 tasks.kmeant both a few-shot exemplar count and a pass@k rollout count. Any YAML withargs: {k: N}on a*_kshot_*task must becomeargs: {n_shot: N}; the constructor raises rather than silently ignoring the old spelling. Enforced by a newcheck_task_shot_knobspreflight check (#57). - BREAKING —
pass@<k>report column renamedpass@k, andavg@krenamedavg@n. A run atk=4used to emit apass@4key; the budget is now reported once as then/kfields.scoreandpass@1are unchanged in name and value; a stored leaderboard row keyed onpass@4no longer matches (#89). - BREAKING —
ChatModel.as_type()/GenModel.as_type()are removed. Reconcile a targetRuntimeBindingPlanand useModel.with_dialect()for cross-dialect rebinding (#45). - BREAKING —
sample_fraction/sample_seed/sample_byare removed frommmmlu_kshot_clp. The task's private stratified sampler is replaced byDataset.stratified_sample, which gains afractionbudget. Migrate as a datasetoperations:entry, not taskargs:. The sampled rows change — the two samplers seed independently, so only ~10% of rows overlap atfraction=0.1(#75). - BREAKING — resuming into a result directory produced by a different task now aborts with
ResumeIdentityError, where it previously handed the second task the first task's report, having evaluated nothing (#57). - BREAKING (on-disk records) — result directories written by 0.7.x hold the old feedback shape and cannot be re-reported by the new
report(). The resume version gate rejects a 0.7.x → 0.8.x resume with a version message (#60, #62). anomalies.jsonis backed up and regenerated on the next run of every task: the rule set grew withextraction_failureandmissing_reference, which rotatesrules_hashfleet-wide. Visible, harmless (#60, #95).- Class resolution and model-type derivation move to a new canonical
sieval.cli.resolution, so the infer CLI no longer imports the eval session sideways (#86). - The unrequested
pdm.lockdrift fromd805418ais reverted — 71 packages back on their exact pre-RULER versions, including the CUDA 12 torch tree (#63). sieval/coreis over the 70% mutation bar module-wide (#81); CI now runs integration + acceptance tests (#56).
Docs
- New
docs/guide/metrics.md—report.jsonhad no documentation at all before this. Covers every key, when each appears, the pairs that must be read together, and thepass@<k>→pass@kmigration (#89). - The record protocol is scoped to both sides of the contract (#82).
Full changelog: v0.7.0...v0.8.0