Training data
Table with columns: Component, Rows| Component | Rows |
|---|
| AgenticData true-multiturn SFT | 4,537 |
CodeDance SFT (multi-turn <code> tool use) | 13,828 |
| TIR synthetic non-thinking attachment | 6,700 |
| Total | 25,065 |
No assistant message contains a <think> block; the empty non-thinking prefix is inserted by the template and excluded from the loss.
Training configuration
- Base model:
Qwen/Qwen3.5-4B; full-parameter SFT, vision tower and aligner frozen
- Recipe: non-thinking (
add_non_thinking_prefix=true, loss_scale=default+ignore_empty_think, truncation_strategy=delete)
- Learning rate 1e-5, min 1e-6, cosine decay, warmup fraction 0.05, weight decay 0.1, clip grad 1.0
- Maximum length 32,768; global batch 64; micro batch 1; TP=2, PP=1, sequence parallel; bf16; flash attention
- One epoch = 391/391 optimizer steps, elapsed 6h 12m 6s, final training loss 0.1767263
- Full arguments:
training/args.json; per-step log: training/logging.jsonl
Evaluation
Not yet evaluated at publication time. Results on TIR-Bench and the huawei_benchmark suite (FVQA, SimpleVQA, MMBrowseComp, GAIA) will be added alongside the legacy checkpoint for comparison.
Inference
vllm serve HEART77/TIR-Qwen3.5-4B-NonThinking-v2 --port 8000 --max-model-len 32768 --reasoning-parser qwen3
Disable thinking at request time with chat_template_kwargs={"enable_thinking": false}. The model uses the TIR agent format: Python in <code> blocks, tool results as a user turn beginning with Code execution result:, final answer in <answer>...</answer>.