OptionalanswerHow a person should judge an answer, where it takes more than each
field's help: opened from the info button beside the answer key's
heading, as "How to judge an answer".
Without it, labelHelp shows there. For people only: it never reaches
the model, so it doesn't change the instructions hash.
OptionalanswerHow long one answer may take before it counts as failed. Default 60s; multi-step agent turns need more. Keep it under the run budget.
Optionalcase"typed": cases are text someone types (added by hand, or drafted). "imported": cases are frozen from the app's own data, then rated by a person. "fixture": cases are structured inputs, shown with describe() and edited as JSON.
OptionalconcurrencyHow many answers a test asks for at once. Default 6; slow operations need more to finish before the platform's time limit.
OptionaldecisionsGraded as decisions (typed answers with probabilities, as from the AI
SDK's experimental_decide), so pages show probability quality and
calibration next to accuracy, and which models' probabilities are
native or prompted.
OptionalfieldsThe form's fields, so pages can render one for any suite. Every field has a plain label and help: people confirming answers weeks later won't remember what a field means.
Bump when checks change, so runs say which grading they used.
OptionallabelFixture suites: what the expected answer's fields mean.
The EXPECTED label's value.
The AI feature it tests, as your app names it ("summarize_ticket").
OptionalrateFalse when blind rating doesn't fit the suite's cases: each answer is one person's own (a verdict on their own data), or your app has no rate page. The answer key then offers no Rate blind.
OptionalreviewsReviews of starter cases that ship with the suite: its author or an
expert confirmed a case's answer once, for every app, so
importStarters adds it confirmed instead of pending. Each names who,
what qualifies them, and when, and counts only while the case's input
and answer are what they saw; the suite contract fails on one that
doesn't.
OptionalstarterDrafted cases to start from, added as drafts with PENDING labels.
OptionalunitWhat the headline counts: "items", "tickets", … Default "answers".
OptionaldescribeFixture suites: the whole input, readable, for reviewing a case.
OptionaldraftDrafts cases from what the feature saw in your app since a date (inputs
people rated or admins flagged), so the answer key keeps up with real
use. The weekly check calls it through draftFromActivity; drafts
arrive with a PENDING answer or none, never confirmed. Strip names,
contact details, and anything identifying from each input. Return at
most limit, and skip anything whose sourceRef is in known.
The suite's cases, retired ones too, to avoid near-repeats.
The sourceRef of every draft made before: skip these.
The most drafts to return: what's left of this week's allowance.
Look at activity from this date on.
OptionaldraftGrades one output. label is the confirmed one, or null. A check that
asks a judge model reports its cost through ctx.onCost.
OptionalgradeChecks that compare a test's answers with each other, such as ranking. Gets every graded answer of one repeat; returns extra checks for each, in the same order. Pure; runs after a test and on every regrade.
Reads a case's input from the add/edit form; throws on bad input.
OptionallabelReads an answer from the add/edit form; throws on bad input.
OptionallabelCalls the operation on exactly this model, recorded as an eval.
OptionalmaxOutputTokens?: number | nullThe output-token cap the test runs at, like temperature. Null: send none (the call's own default).
OptionalreasoningEffort?: ReasoningEffort | nullA reasoning setting to test; undefined: the operation's own.
Optionaltemperature?: number | nullThe temperature the test runs at: the operation's live one when the test was started. Null: send none. Undefined from runners before temperature was versioned.
OptionalwithoutRemoves anything the input learned from its own case before it's
frozen, so a case can't carry its answer: facts the app learned from
the person's reaction to that same item, for example. importCases,
importStarters, and adding a case on the pages run it, and report
what it removed per case so a person can check it. Match on something
specific to the case (the company's name), not something general (a
job title), or it removes what other cases rightly share.
The case's input, already checked against input.
Where the case came from: its sourceRef, or null
for a case added by hand.
The input without what leaked, and a plain line for each item removed (empty when nothing was).
An eval suite: how to call one AI feature on a model and how to grade what comes back. Code says how to evaluate; the store holds the cases and answers.