Skip to content

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.

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
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
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
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

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

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

These fail when the config is loaded.

  • A reasoning teacher (every teacher except Qwen3-235B-A22B-Instruct-2507, Qwen3-480B-A35B-Coder and Qwen2.5-VL-72B-Instruct) requires synthgen.teacher_temperature between 0.5 and 0.7.

  • base.enable_thinking: true requires a reasoning student.

  • visual_task: true requires 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_turn must 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_examples and tuning.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.

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

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.