Skip to main content
ConversationSample holds a chat transcript: a list of messages, each a role and its content, in the shape every chat API and SFT corpus already uses.

Shape

Plain dicts work too: messages=[{"role": "user", "content": "..."}, ...] is normalised to Message objects. On the wire:
Roles are system, user and assistant. A system message may appear once, and only first. The transcript needs at least one user and one assistant turn. Tool and function turns are not accepted. The type deliberately lets some defects through: an empty turn, a transcript that ends on the user, two user turns in a row. Those are what sdvm-audit-1 reports and sdvm-fix-1 repairs, so refusing them at construction would put them out of reach.

Extra columns

Anything beyond messages goes in extra and comes back untouched, exactly as on every other sample type:

Turns

turns says how much of the transcript the models read. "last", the default, is the final exchange: the last user turn, the last assistant reply, and whether that reply belongs to the transcript. "all" is every assistant turn, each against the transcript before it, reported per turn under turns in the audit. Each turn read this way adds to the cost of the sample.
On the wire it is "turns": "all" on the sample.

What the models return

sdvm-audit-1

What it returns for this sample.

sdvm-fix-1

What it changes, and what it never does.

Refine

Audit, fix and re-audit in one call.
Last modified on September 18, 2026