Skip to main content
A dataset stream is an append-only dataset that grows as your data arrives. Training never reads the live stream: a job pins an immutable snapshot, so the exact rows a model trained on are reproducible forever. Rows are never edited or deleted in place: a correction is a new row that supersedes an old one, and a removal is a tombstone. Both take effect in snapshots cut from that point on; earlier snapshots keep the original rows, so history stays honest. One-shot datasets (upload or connect) keep working exactly as before; streams are for data that keeps growing, like production feedback.

Create a stream

--format locks the row shape and is required: prompt, preference, completion, chat, or eval (experiment rows; see Experiments). Every append is validated against it, so a malformed row is rejected at append time rather than at training time. A chat stream whose first row has no prompt reports its format as chat_no_prompt: it still takes chat rows, but GRPO jobs on it are rejected at submit, since GRPO generates from a prompt. Every stream command accepts the dataset’s name or its id.

Append rows

Append a JSONL file, or pipe rows on stdin with -:
Each row gets a permanent row id. Blank lines are skipped; a malformed line fails the whole append with its line number, and nothing is written.

Correct a row (supersede)

A supersede is a new row that replaces an earlier one in every snapshot cut from now on. Snapshots cut before the correction keep the original, so an old training run still resolves to exactly what it trained on.
--supersedes takes exactly one row.

Remove a row (tombstone)

The row disappears from every snapshot cut from now on and stays in every snapshot cut before. Nothing is deleted; --reason is required and shows up in diffs.

Cut a snapshot

A snapshot is a pointer at the current head, so cutting one is instant at any size. Reading a snapshot resolves supersessions and skips tombstones as of that snapshot. --quiet prints just the pinned id (9f2c81ab04de@snap-2) for scripting. To cut a snapshot automatically every N new rows, set a rule at create time (--auto-snapshot 100) or later via the SDK (client.datasets.set_auto_snapshot("acme-feedback", 100)). Auto-cut snapshots show auto in the timeline.

Train on a snapshot

Pin a training job to a stream with <name>@latest or <name>@snap-N as the dataset id:
What @latest resolves to at submit time:
  • If the newest snapshot already sits at the stream head, the job pins that snapshot.
  • Otherwise a new snapshot is cut at the head (noted “pinned at job submit”) and the job pins it.
  • A plain stream name with no @ suffix implies @latest.
  • An empty stream is rejected: append rows before pinning @latest.
Either way the job stores the resolved <dataset_id>@snap-N id, so rows appended after submit never change what the job trains on. The pinned id is on the job record as dataset_snapshot_id (SDK: client.training_jobs.get(job_id).dataset_snapshot_id, or GET /v1/training_jobs/{job_id}), and you can record it on the resulting model version with veri models register ... --dataset-snapshot <id> (see Model versions).

Diff two snapshots

See exactly what changed between two snapshots (or between a snapshot and the live head, the default for the second argument):
This answers “what data made v6 different from v5” when each version pins a snapshot.

Inspect a stream

Shows the locked format, the current head row, how many rows arrived since the last snapshot, and the snapshot timeline (name, head row, note, auto flag, created time). To read rows as of a snapshot programmatically, use the SDK: client.datasets.rows("acme-feedback", snapshot="snap-2") resolves supersessions and tombstones exactly as training does.

Import request traces

Turn a window of a deployment’s request traces into rows on a stream — production traffic becoming training data in one call:
Each trace becomes one row. On a chat stream the row is the full transcript (the request messages plus the assistant’s reply); on a prompt stream the reply is discarded and only the request messages are kept (GRPO samples its own completions). --model-version mv_... keeps only traces answered by that model version. --snapshot cuts a snapshot right after the append, with a note recording the source deployment and window, so the imported set is immediately pinnable for training. Two guardrails to know about:
  • Overlap protection. Re-importing a window that overlaps a previous import for the same dataset and deployment is refused with a 409, because the same traffic would land twice. Import adjacent windows instead, or pass --force if the duplication is intentional.
  • Imports reflect what was captured. Traces exist only for deployments created with trace capture enabled, and only for successful requests (streamed responses once the stream completes). A response cut short by max_tokens looks complete in the trace, so consider your serving token limits before training on imported transcripts. Unmappable traces are skipped and counted in the response, never imported silently.
One call imports up to 10,000 rows (--limit to lower that); cover longer ranges with consecutive windows. Base-retention traces are deleted after 14 days — import windows you care about before they age out.

Import only scored traces

Narrow an import to traces with a matching score, for example the requests reviewers or your own judge harness scored as failing, so the next training round focuses on what went wrong:
--score-evaluator NAME (or NAME@N for one version) keeps only traces with an ok score from that evaluator. Add --passed or --failed to select by verdict, or --min-score and --max-score to select a numeric range. Traces without a matching score are counted under skipped.filtered_score. In the SDK, pass scores={"evaluator": "helpful", "passed": False} to client.datasets.import_traces.

Where to go next

Model versions

Register the trained job as a version and record the snapshot it trained on.

Datasets

One-shot uploads, Hugging Face connects, and JSONL formats.

Dataset CLI

Every veri datasets command in one place.