Two methods
SFT is the default method in the CLI. Gisting supports only the
qwen3-4b and qwen3-8b Base models because it publishes full weights. Both methods can start from a LoRA adapter Model Version in the same project.
See Choose a training method for a decision guide.
From draft to Model Version
A Training is a project-owned, editable draft. It holds the method, model source, dataset slice, split column, and settings. Its name is 1–120 characters and is unique among active Trainings in the project. You can archive or rename a Training through the HTTP API. Editing a Training does not change an existing Training Run. A cost estimate prepares the selected rows from the frozen slice and validates them. It is either blocked, with issues to fix, or ready, with a maximum charge.- A ready estimate expires 24 hours after you request it.
- A Training can have at most three open estimates. An estimate remains open until it starts a Training Run or expires.
- One ready estimate starts one Training Run.
- Editing the Training makes an earlier estimate unusable. Calculate it again.
--version-name after an earlier run has used it.
Data
A dataset row is one chat example. This row teaches the model to label a support ticket:- The row has
messagesand can also havetools. - Allowed roles are
system,user,assistant, andtool. - At least one turn has the
userrole. - The last turn has the
assistantrole and contains content. - System turns appear only before the conversation starts.
- Consecutive turns cannot have the same role. Tool and system turns are exempt.
- Every
system,user, andtoolturn has content. An intermediateassistantturn has content or tool calls. - Each
toolturn answers a preceding assistant tool call. - Every assistant tool call is answered by a later
toolturn.
messages. It can also keep a conversation in a messages column and the expected answer in a label column. The platform appends that label as the final assistant turn.
The CLI can create an empty dataset and append JSONL rows to it:
Pass
--dataset <name-or-id> to prepare the dataset’s split column and freeze a slice named after the Training. If the dataset has no split column, the CLI creates an 80% train, 10% validation, 10% test split. Existing assignments stay in place. Pass --slice <id> instead to reuse a ready slice. Use --split-column to choose among multiple split columns and --parts to select particular train parts; see Dataset selections. To set your own shares or freeze part of a dataset, see Slices and split columns.
The slice created by --dataset fixes the rows and field values the Training reads. Later uploads or label changes are not included automatically. Run toloka training update <training> --dataset <dataset> to freeze a new slice, then calculate a new estimate.
If the slice supplies no validation rows, the platform holds out 10% of the selected training rows for validation. The cost estimate checks row shape, token length, selection size, batch size, export success, and the estimated time limit. See Training limits and Training errors.
For the path from labeled project data to valid training examples, see Prepare training data.
Training Run states
Usetoloka training status <training-run-id> to check progress, toloka training logs <training-run-id> for sanitized logs, and toloka training metrics <training-run-id> for reported metrics.
A Training Run normally moves from queued to running to completed. Other states represent a stop or a billing hold.
While status is
running, the Progress row can show preparing, queued, pending, training, evaluating, or publishing. Progress queued or pending means the job is waiting for GPU capacity. That wait can take hours, and the job starts automatically when capacity is available.
Metrics stop updating when training ends. Output checks, billing, and publication still need to finish before status becomes completed. If metrics report not_configured, the Training Run will not produce metrics. If they report unresolved, check again while the Training Run is running.
For a failed run, inspect toloka training logs <training-run-id> and look up the reported error in Training errors.
Cancellation and payment holds
Canceling before training starts has no charge. Canceling during training stops the job, charges for billable GPU use up to the approved maximum, and publishes no Model Version. A Training Run canceled while it reserves funds or trains showsstopping until the job stops and billing settles; canceled while preparing data or blocked on funds, it becomes canceled at once. Cancellation is no longer available once output validation starts or while final payment is blocked.
The payment window is seven days. If it expires, the Training Run fails with payment_window_expired, cannot resume, and is not charged. Its billing status remains payment_required.
Outputs and downloads
An SFT Model Version includesadapter_model.safetensors and adapter_config.json. It can contain additional .json files. It is a LoRA adapter and needs the matching Base model. The Model Version records the Base model ID; the catalog carries the current upstream repository and revision. The adapter configuration may omit the revision. See Pinned revisions and lineage before serving it.
A gisting Model Version includes config.json and either model.safetensors or a complete numbered set of model-*.safetensors weight shards. Tokenizer files, merges.txt, and chat_template.jinja are optional.
Download a completed Model Version with:
Ways to work with Training
Project Training is available through:- CLI — create and update Trainings, calculate cost, start and control Training Runs, inspect logs and metrics, and download Model Versions
- Fine-tuning agent runbook — guide a coding agent through an SFT workflow
- Gisting agent runbook — guide a coding agent through a gisting workflow
- HTTP API — work with Training, Training Run, Base model, Model, and Model Version resources