Config file
config.yaml controls the pipeline through six sections: base, tuning, evaluation,
synthgen, trace_processing and traces_to_test_set. Only base.task is required, and every
other field has a default. Always set base.task, base.student_model_name and
base.teacher_model_name.
File format
Section titled “File format”The config is YAML, in a file named config.yaml (config.yml is accepted too). The CLI reads it
out of your data directory, and the REST API stages it as config_yaml.
base:
task: question-answering
student_model_name: Qwen3.5-4B
teacher_model_name: zai.glm-5.3-low-thinking
evaluation:
llm_as_a_judge_model_name: zai.glm-5.3-low-thinking
Overrides sent inline over the REST API carry this same structure in the request body. See Using the REST API.
| Parameter | Default | Notes |
|---|---|---|
task |
required | question-answering, classification, chat-completion or chat-completion-agentic. See Task selection |
visual_task |
false |
Inputs carry images. Question answering only; every model must be vision-capable. Image traces use the openai_messages_with_images observation format |
enable_thinking |
false |
Reasoning student. See Reasoning models |
student_model_name |
Llama-3.2-1B-Instruct |
See Supported models |
teacher_model_name |
openai.gpt-oss-120b |
See Supported models |
random_seed |
123 |
Seeds sampling everywhere, including mutators |
llm_num_parallel_requests |
4 |
Parallel LLM calls across teacher, generation and judge. Raising it helps until per-call latency and the validation between batches dominate |
should_expand_dataset |
"auto" |
true, false or auto. See Conversation expansion |
tuning
Section titled “tuning”| Parameter | Default | Notes |
|---|---|---|
learning_rate |
5e-5 |
AdamW |
learning_rate_scheduler |
linear |
cosine, linear, constant |
weight_decay |
0.0 |
|
warmup_ratio |
0.05 |
|
bf16 |
true |
|
lora_r |
64 |
Rank of the LoRA adapter, which is the trained model. One of 8, 16, 32, 64, 128, 256, 320 or 512. alpha = lora_r * lora_alpha_multiplier |
lora_alpha_multiplier |
1 |
|
per_device_train_batch_size |
1 |
Higher uses more memory. At a fixed num_train_epochs it divides the number of optimizer steps |
per_device_eval_batch_size |
1 |
|
num_train_epochs |
4 |
Steps ≈ rows × epochs / (batch × gradient_accumulation_steps) |
gradient_accumulation_steps |
1 |
Multiplies the effective batch size |
num_few_shot_examples_student |
0 |
Few-shot examples for student evaluation and tuning. See Cross-field validation |
enable_trainer_internal_eval |
false |
Per-epoch validation during training. Final metrics come from the post-training evaluation either way |
memory_optimized_training |
false |
Only when training runs out of GPU memory; much slower |
use_qlora |
false |
4-bit NF4 base model |
max_completion_length |
2048 |
Tokens the student may generate in evaluation and RLVR. Raise it when training warns it is below the longest training completion |
rlvr_dataset_size |
0.0 |
RLVR, an optional reinforcement learning stage after fine-tuning, runs when this is above 0 |
rlvr_llm_as_a_judge_model_name |
inherits base.teacher_model_name |
The judge that scores RLVR rollouts |
rlvr_per_device_batch_size |
6 |
Must be a multiple of rlvr_num_generations |
rlvr_num_generations |
6 |
|
rlvr_num_train_epochs |
1 |
evaluation
Section titled “evaluation”| Parameter | Default | Notes |
|---|---|---|
num_few_shot_examples |
1 |
Few-shot examples shown to the teacher in teacher evaluation, drawn from the train split. For classification, at least one per class. 0 when there is no train split. See Cross-field validation |
llm_as_a_judge_model_name |
inherits base.teacher_model_name |
Scores from different judges can’t be compared. See Supported models |
synthgen
Section titled “synthgen”| Parameter | Default | Notes |
|---|---|---|
generation_target |
10000 |
A target, not an exact count: generation runs in generation_iteration_size batches until the target is met, so the result can exceed it by up to one batch |
generation_in_single_call |
4 |
Examples per teacher call |
generation_iteration_size |
128 |
Generate-and-validate batch size, and the step generation_target rounds up to |
num_positive_exemplars_per_generation |
1 |
In-context examples per generation call (for classification, of the class being generated, and a per-class floor on train data) |
num_negative_exemplars_per_generation |
1 |
In-context examples of the classes not being generated. Classification only |
num_unlabelled_exemplars_per_generation |
1 |
unstructured.jsonl must hold at least this many rows |
validation_max_total_length |
30000 |
Characters, input plus answer; applies to uploaded data too |
validation_similarity_threshold |
0.95 |
Deduplication against the seed data. Lower it if generation produces near-duplicates |
teacher_temperature |
0.7 |
See Cross-field validation for reasoning teachers |
teacher_max_tokens |
32000 |
|
match_generated_distribution_to_seed |
false |
Classification only: keep the class balance of the seed data |
output_is_json |
false |
Question answering only. Answers in uploaded data must also be valid JSON |
mutators |
[] |
One entry per dimension to vary. See Synthetic data generation |
mutator_update_frequency |
5 |
Batches between two classifier runs of an adaptive mutator |
max_tool_calls_per_turn |
null |
Chat completion only: cap on tool calls per generated assistant turn. See Chat completion |
clean_training_targets |
false |
A final teacher pass that minimally repairs corrupted or cut-off training targets. Expansion follows base.should_expand_dataset; false cleans only the supplied final-turn targets |
trace_processing
Section titled “trace_processing”Read by both trace jobs: trace processing, and test set from traces for how it relabels.
| Parameter | Default | Notes |
|---|---|---|
relabel |
true |
The teacher (or committee) rewrites the answers. false keeps the original trace answers |
relevance_filtering |
false |
true has an LLM score the traces and drop those with low relevance or coherence, at one LLM pass over every trace |
relevance_filtering_batch_size |
32 |
|
min_relevance_score |
4 |
1-5 |
min_coherence_score |
3 |
1-5. A lower value lets corrupted traces through for committee repair |
num_traces_as_training_base |
200 |
Traces relabeled into the train split. Both trace jobs refuse a trace set smaller than this. Leftover traces become unstructured data |
max_unstructured |
10000 |
|
observation_format |
openai_messages |
See Trace inputs |
remove_system_prompt_from_traces |
true |
The system prompt belongs in the job description |
compress_job_description |
false |
For very long task descriptions |
teacher_model_name |
inherits base.teacher_model_name |
Filters traces and arbitrates the relabeling |
relabelling_committee_models |
[] |
A non-empty list enables committee relabeling |
committee_max_input_length |
250000 |
Characters. Traces whose committee input would exceed this skip the committee and are edited by the teacher directly |
traces_to_test_set
Section titled “traces_to_test_set”Read by the test set from traces job.
| Parameter | Default | Notes |
|---|---|---|
num_traces_to_relabel |
200 |
Traces relabeled into test examples, with the trace_processing relabeling settings. They leave the trace set |
num_synthetic_examples |
0 |
Synthetic test examples generated from the relabeled ones with the synthgen section. The next 2 × num_synthetic_examples traces are the generation context and also leave the trace set. A floor: generation runs in synthgen.generation_iteration_size batches, so more rows can come back |
evaluate_original_model |
false |
Scores the original model’s answers on the relabeled traces with the student’s metrics. false writes null metrics. See Metrics |
min_relabelled_examples |
0 |
Fails the job when fewer relabeled test examples survive. Best kept at the default 0, which sets no floor |
Cross-field validation
Section titled “Cross-field validation”These fail when the config is loaded.
-
A reasoning teacher (every teacher except
Qwen3-235B-A22B-Instruct-2507,Qwen3-480B-A35B-CoderandQwen2.5-VL-72B-Instruct) requiressynthgen.teacher_temperaturebetween 0.5 and 0.7. -
base.enable_thinking: truerequires a reasoning student. -
visual_task: truerequires a vision-capable model in every teacher and judge role, and a vision-capable student (Supported models). -
Chat completion with tools declared restricts the student and teacher (Tool-calling compatibility).
-
synthgen.max_tool_calls_per_turnmust match whether the job description declares tools. -
No in-context exemplar count may exceed the number of train rows. The four counts are
synthgen.num_positive_exemplars_per_generation,synthgen.num_negative_exemplars_per_generation,evaluation.num_few_shot_examplesandtuning.num_few_shot_examples_student. Every job except trace processing rejects a count above the train row count with an error like this one:{'synthgen.num_positive_exemplars_per_generation': 3} asks for more in-context exemplars than the training dataset holds (1). Lower the counts, or provide more training data.Trace processing instead lowers the counts to fit the train split it produced.
Conversation expansion
Section titled “Conversation expansion”base.should_expand_dataset decides whether a conversation becomes one example per assistant
turn. It applies to training, to evaluation, and to the expansion before
synthgen.clean_training_targets and the reasoning backfill.
| Value | Effect |
|---|---|
auto (default) |
Expands multi-turn tasks, unless at least half of the examples share history prefixes with other examples (data that is already split per turn) |
false |
Each supplied row stays one example, with only its final assistant turn as the target; earlier assistant turns are history. Evaluation scores each test row’s final turn only. Use it for pre-split rows whose final responses were selected or rewritten |
true |
Expands every conversation, pre-split data included. Valid only for the chat completion tasks |
Parameters that have no effect
Section titled “Parameters that have no effect”These appear in every config the platform returns and do nothing: evaluation.batch_size,
synthgen.validation_max_answer_length, synthgen.parallel_llm_calls,
synthgen.basic_mutators_to_use, tuning.awq_quantize_tuned_model, tuning.train_eval_split,
trace_processing.num_traces_as_testing_base, trace_processing.min_generated_examples and
trace_processing.evaluate_original_model. Leave them untouched in a config you override, and
don’t add them to one you write.
An override replaces this file whole rather than merging into it, so read the parent’s config back before you edit one field. See How the platform works.