eewer/mixed-sft-openai-tools-qwen3-areal-diverse
mixed-sft-openai-tools-qwen3-areal-diverse Private SFT dataset for the Qwen3 AReaL terminal-agent trainer. It is the normalized, shuffled "diverse" variant of the default terminal-agent SFT recipe. It is intended for: terminal_agent_demo/sft/config_terminus2_l40s_default_diverse.yaml Files File Rows Description mixed_sft_openai_tools_qwen3_areal.shuf_seed7.jsonl 127,270 Training JSONL, shuffled with seed 7 (post-filtering).… See the full description on the dataset page: https://huggingface.co/datasets/eewer/mixed-sft-openai-tools-qwen3-areal-diverse.
mixed-sft-openai-tools-qwen3-areal-diverse
Private SFT dataset for the Qwen3 AReaL terminal-agent trainer. It is the normalized, shuffled "diverse" variant of the default terminal-agent SFT recipe.
It is intended for:
terminal_agent_demo/sft/config_terminus2_l40s_default_diverse.yamlFiles
Row Schema
Every training row has exactly two top-level columns:
{
"messages": [
{"role": "system", "content": "..."},
{"role": "user", "content": "..."},
{
"role": "assistant",
"content": "...",
"reasoning_content": "...",
"tool_calls": [
{
"id": "call_...",
"type": "function",
"function": {"name": "bash", "arguments": "{\"command\":\"...\"}"}
}
]
},
{"role": "tool", "content": "...", "tool_call_id": "call_..."}
],
"tools": []
}Every assistant message has a non-empty reasoning_content (guaranteed by the filtering below). Rows with tools use OpenAI-style tool schemas in tools; Terminus-2-native rows have tools: [].
Filtering (post-normalization)
The thinking-preservation chat template always opens <think> at generation time, so an assistant turn with empty reasoning_content would be silently dropped (and duplicated) by the loss-mask tokenizer. To make the data consistent and the row→step mapping exact, the normalized dataset is filtered (terminal_agent_demo/sft/filter_normalized_diverse.py):
- Reasoning filter (all subsets): drop any row where not every assistant message has a non-empty
reasoning_content. — 22,534 rows removed. - v54 task dedup (only the `eewer/qwen3-4b-thinking-sft-v54-...` subset): two rows are the same task iff their source
task_idis identical, falling back to first system + first user only iftask_idis missing; within each duplicate group keep the shortest row that passes and has reasoning on every assistant turn. — 1,319 rows removed (max duplication of a single v54 task: 6).
Result: 151,123 → 127,270 rows. Counts are in filter.summary.json.
Source Mix
Total before filtering: 151,123 rows (source-mix counts above). After the reasoning + v54-task_id-dedup filtering: 127,270 rows.
Normalization
Created with:
python terminal_agent_demo/sft/normalize_mixed_sft_to_openai_tools.py \
--input areal_runs/terminal-agent-demo/data/mixed_sft_v3_best_additions_nemotron_medium_eewer_v54_openswe_passed_tmax_success.jsonl \
--unshuffled-output areal_runs/terminal-agent-demo/data/mixed_sft_openai_tools_qwen3_areal.jsonl \
--output areal_runs/terminal-agent-demo/data/mixed_sft_openai_tools_qwen3_areal.shuf_seed7.jsonl \
--manifest areal_runs/terminal-agent-demo/data/mixed_sft_openai_tools_qwen3_areal.shuf_seed7.order.jsonl \
--summary-output areal_runs/terminal-agent-demo/data/mixed_sft_openai_tools_qwen3_areal.summary.json \
--seed 7The normalizer moved inline <think>...</think> / THOUGHT: reasoning into reasoning_content, normalized tool calls to OpenAI function-call shape, and filled missing tool_call_id values on tool messages from the preceding assistant calls.
Validation completed:
- 151,123 JSONL rows
- top-level keys exactly
messagesandtools - every assistant message has non-empty
reasoning_content - tool calls have ids, function names, and string arguments
- every tool message has
tool_call_id
