File shape
A CSV or JSONL file with one question per row.
Any other column is named in the preview and ignored. A CSV needs a header
row; a JSONL file is one JSON object per line.
One example row, as CSV:
Limits
- At most 500 rows in one file, and at most 8,000 characters in a
promptor agolden_response. A file over either is refused whole, with the number. - One seeding request takes at most 25 rows. The console refuses a file
of more before sending; with a token, send the rest with
pairs(row indexes) in another request. - A row with no
promptor nogolden_responseis not a question. The console names it by row number and sends nothing until it is fixed.
What happens to each row
Litmus turns each golden response into the facts a correct answer must state, each quoting its words, and shows you each one; you can correct any of them on the question’s page. These facts are model-derived, and are marked so. A row that no part of your workspace’s test copy is about is refuseduncited, by row number: it cannot be graded there.
The three calls
POST /v0/evidencewithkind: golden_pairsand the rows ascontentstores the file. The answer’sidis the evidence id.POST /v0/orgs/{org}/environments/{env_id}/taskswith{"from_pairs": "<evidence id>"}seeds one question per row on that environment. It answers a job; when the job is done its result listsstored_as(the new question indexes) andrefused({pair, why},paircounted from 0).POST /v0/orgs/{org}/datasetswith{"name": "...", "environments": [{"id": "<env_id>", "indexes": [<stored_as>]}]}declares the dataset as exactly those questions. Declaring needs anadmintoken.
"dataset": {"name": "..."} with step 2
({"from_pairs": "<evidence id>", "dataset": {"name": "..."}}) and the job
declares the set itself when it lands — exactly the indexes it stored, with
origin uploaded — and reports it as result.dataset (declared, id,
indexes, or why when nothing was stored). A name already taken is refused
at the call, before anything is seeded.