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
messages=[{"role": "user", "content": "..."}, ...] is normalised to Message objects. On the wire:
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 beyondmessages 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.
"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.