license: odc-by
language:
- en
task_categories: - text-generation
tags: - instruction-following
- ifeval
- ifbench
- rlvr
- lfm2
- lfm2.5
- prompts
size_categories: - 10K<n<100K
source_datasets: - allenai/IF_multi_constraints_upto5
configs: - config_name: default
data_files:- split: train
path: data/train-*.parquet
- split: train
IF_multi_constraints_upto5 → LFM2.5 prompt format (for RLVR / rejection sampling / DPO)
A derivative of allenai/IF_multi_constraints_upto5 (odc-by)
normalized for fine-tuning Liquid AI LFM2 / LFM2.5 models, whose native tool-call format is Pythonic:
<|im_start|>assistant
<|tool_call_start|>[get_weather(location='Paris, France', unit='celsius')]<|tool_call_end|><|im_end|>
Prompt-only rows (prompt_only = true): Tulu-SFT instructions with up to 5 verifiable constraints from IFEval (25) and IFBench-Train (29 — disjoint from IFBench test). Each row ends in the LFM2.5 generation prompt; extra carries the verifier spec (ground_truth, constraint_type, constraint) for open_instruct/IFEvalG. This is the IF-RLVR data from Generalizing Verifiable Instruction Following (arXiv 2507.02833).
Every row was rendered through the official LiquidAI/LFM2.5-VL-3B chat template (identical to the LFM2.5
text models' template for text-only input); prompt-only rows carry no tool calls, so no round-trip check applies.
What changed vs. the source
| Transform | Why |
|---|---|
Rendered with add_generation_prompt=True; no assistant turn |
Prompt set for on-policy sampling. |
Tool names sanitized to Python identifiers (web-search → web_search), consistently in tools and calls; originals kept in renamed_tools |
Pythonic call syntax requires identifiers. |
| Exact-duplicate tool entries deduplicated | Template hygiene. |
Dropped: calls to undeclared tools, unparseable arguments, argument names that are not identifiers or are Python keywords (from, class), rows over 8192 tokens, rows with no assistant tokens |
Training hygiene. |
Nothing was rephrased, re-generated, or re-labelled.
Columns
| Column | Type | Description |
|---|---|---|
id, source, split, license |
str | provenance |
messages |
str (JSON) | canonical OpenAI-style messages; tool_calls arguments are dicts. Feed this + tools to apply_chat_template to re-render with any LFM template version. |
tools |
str (JSON) | OpenAI-style tool schemas |
text |
str | fully rendered LFM2.5 conversation, BOS included |
prompt_only |
bool | true when the row is a prompt ending in the generation prompt (no assistant tokens) |
n_turns, n_tool_calls, n_tools, n_tokens, n_assistant_tokens |
int | sizes (LFM2.5 tokenizer) |
renamed_tools |
str (JSON) | {original: sanitized} when any tool was renamed, else "" |
extra |
str (JSON) | source-specific fields: key, ground_truth (verifier args), dataset, constraint_type, constraint |
Stats
| Split | Read | Kept | Rows with renamed tools | Dropped (reason=count) |
|---|---|---|---|---|
train |
95,373 | 95,264 | 0 | too_long=109 |
Training notes
- Use assistant-only loss:
apply_chat_template(messages, tools=tools, tokenize=True, return_assistant_tokens_mask=True). - Prefer re-rendering from
messages/toolsover training ontextif your template differs. - Serving-side parsers must accept JSON literals (
true,null, nested{}/[]) inside Pythonic calls.
Citation
Please cite the upstream dataset: https://huggingface.co/datasets/allenai/IF_multi_constraints_upto5