- Upload a JSONL file directly
- Connect a Hugging Face dataset — Veri pulls from the Hub
- Point at a Veri Volume — train from a JSONL file you already uploaded to a managed volume
- Create a dataset stream: an append-only dataset that grows as data arrives; training pins immutable snapshots (
name@latest,name@snap-N)
id you reference in client.training_jobs.create(dataset_id=...). This page covers the one-shot sources (upload, Hugging Face, volumes); streams have their own page.
JSONL format
Each line is one training example:prompt(required) — string OR list of OpenAI-format message dictsanswer— ground truth used by your reward function (optional but typically present). The column name is passed to your reward as a keyword argument of the same name, so it must match what the function reads. Every example here usesanswer; if you map it to another name, read that name instead.
prompt.
Source types
Connect from Hugging Face
Most users start here — pullopenai/gsm8k straight from HF, no local download.
The column_mapping tells Veri which source columns become prompt and answer.
Supported formats
Veri detects the dataset’s format from its columns and converts it to the shape the trainer expects, so you can connect community datasets as they are:
Datasets that don’t match any of these formats, or use tool-calling roles (
observation, function_call), are rejected with a dataset_format_incompatible error at the start of the job rather than trained on incorrectly. Use column_mapping to rename columns into one of the shapes above. Detection and conversion run in the open-source runtime — see detect_dataset_format and normalize_rows in training_runtime.py to check exactly what your dataset passed through.
Each method still needs the right shape: SFT trains on text, messages, or prompt-completion rows; GRPO needs a prompt column; DPO needs chosen and rejected.
Snapshot caching
The first training job on a connected HF dataset downloads it from the Hub, converts it, and caches the result. Later jobs on the same dataset read the cache directly: faster starts, and your data can’t change mid-experiment if the upstream dataset is edited. To pick up upstream changes, connect the dataset again under a new name.Connect from a Veri Volume
If your data is already in a Veri Volume, point a dataset at a JSONL file inside it:Validate before connecting
Test the connection + preview the first row + see total row count without committing.result.valid is false, result.error tells you why.
Upload a JSONL file
For one-off experiments:--skip-validation to skip, --deep-check for tokenizer-aware checks (slower).
Dedup
Datasets are content-addressed. Uploading the same bytes twice (same file, or two files with identical content) returns the sameid — one S3 object, one DB row.
This means you can re-run a script that uploads the same dataset without worrying about stale duplicates.
Preview rows
Click a dataset on the dashboard’s Datasets page to open a row viewer that pages through the stored JSONL 50 rows at a time, so large datasets never download in full. The row number in the footer is editable — type a row number and press Enter to jump straight there (the first jump into a large dataset builds a small row index, so it can take a moment; later jumps are instant). Uploaded datasets are previewable immediately. Connected datasets (Hugging Face or volume) become previewable after their first training run creates the snapshot. The same paging is available programmatically viaGET /v1/datasets/{dataset_id}/rows, with cursor for sequential pages or start_row to jump to an absolute row.
Lifecycle
Datasets persist until you delete them, either from the dashboard or viaDELETE /v1/datasets/{dataset_id}. Deletion is blocked while an active training job still references the dataset.
Name conflicts
Connecting two datasets with the samename but different source config returns 409 dataset_name_conflict. Either pick a unique name or reuse the existing dataset (the identity hash on the source config means the same config returns the same id).
Where to go next
Reward functions
Write TRL-format functions and attach them to jobs inline.
Submit a training job
Use your dataset_id in
training_jobs.create.Quickstart
Full GRPO end-to-end with GSM8K.
SFT with Unsloth demo
Run Unsloth’s Qwen3 QLoRA recipe as a managed SFT job.

