5.5K+ RL tasks for hill-climbing small models in code and data science.
A 2B model on these tasks. Left: what it optimises. Right: 144 held-out tasks it never trains on.
Two runs over the same 5,000 tasks: shuffled against a curriculum ordered easiest to hardest.
4,677 worked examples of an agent doing data science the right way. Each row is a complete, verified-correct trajectory: read the question, poke at the data with a shell tool, reason, compute, write the answer. Every one of them solved its task and passed the deterministic grader, so you are fine-tuning on demonstrations that are known to be correct rather than merely plausible.
Drop-in ready for TRL: conversational messages plus tools.
bashmessages: the full conversation in OpenAI/TRL chat format: system โ user (the task) โ
assistant (reasoning plus tool_calls) โ tool (command output) โ โฆ โ final assistant answertools: the bash tool's JSON schema, for apply_chat_template(..., tools=...)task_id, difficulty (1โ5), difficulty_tier, n_turns, source_agentfrom datasets import load_dataset
from trl import SFTConfig, SFTTrainer
ds = load_dataset("FineEnvs/SmolDataEnvs-sft", split="train")
trainer = SFTTrainer(
model="HuggingFaceTB/SmolLM3-3B",
train_dataset=ds,
args=SFTConfig(output_dir="smoldataenvs-sft", max_length=8192),
)
trainer.train()
A runnable notebook and a single-file script for HF Jobs are in FineEnvs/04-smoldataenvs.
Built from the jupyter-agent dataset, real data-science notebooks over 471 Kaggle datasets. Every questionโanswer pair was extracted and then verified: strong agent models had to solve the task in a live sandbox and reproduce the gold answer under deterministic grading. Anything ambiguous or un-checkable was dropped. So every task here is known-solvable and unambiguously gradable.
Verified by a checker, not judged by a model. Grading is an exact comparison against a known answer, through a ladder of checks: exact match โ numeric with tolerances โ list and percent normalisation โ symbolic equivalence. No LLM sits in the reward path, so the signal does not drift when you change the grader's model, because there isn't one.
| Repo | What it is |
|---|---|
SmolDataEnvs | the tasks as plain rows, load it and prompt any model |
SmolDataEnvs-sft | 4,677 verified agent trajectories, TRL-ready |
SmolDataEnvs-harbor-train | 5,000 tasks as Harbor environments |
SmolDataEnvs-harbor-test | 250 held-out, deliberately harder |
SmolDataEnvs-harbor-eval | 144 for quick validation during a run |
@misc{fineenvs,
author = {Kolavi, Adithya S},
title = {FineEnvs: Open Source RL Environments for LLM Agents},
year = {2026},
url = {https://github.com/adithya-s-k/FineEnvs}
}
11 commits
5.5K+ RL tasks for hill-climbing small models in code and data science.
A 2B model on these tasks. Left: what it optimises. Right: 144 held-out tasks it never trains on.
Two runs over the same 5,000 tasks: shuffled against a curriculum ordered easiest to hardest.
4,677 worked examples of an agent doing data science the right way. Each row is a complete, verified-correct trajectory: read the question, poke at the data with a shell tool, reason, compute, write the answer. Every one of them solved its task and passed the deterministic grader, so you are fine-tuning on demonstrations that are known to be correct rather than merely plausible.
Drop-in ready for TRL: conversational messages plus tools.
bashmessages: the full conversation in OpenAI/TRL chat format: system โ user (the task) โ
assistant (reasoning plus tool_calls) โ tool (command output) โ โฆ โ final assistant answertools: the bash tool's JSON schema, for apply_chat_template(..., tools=...)task_id, difficulty (1โ5), difficulty_tier, n_turns, source_agentfrom datasets import load_dataset
from trl import SFTConfig, SFTTrainer
ds = load_dataset("FineEnvs/SmolDataEnvs-sft", split="train")
trainer = SFTTrainer(
model="HuggingFaceTB/SmolLM3-3B",
train_dataset=ds,
args=SFTConfig(output_dir="smoldataenvs-sft", max_length=8192),
)
trainer.train()
A runnable notebook and a single-file script for HF Jobs are in FineEnvs/04-smoldataenvs.
Built from the jupyter-agent dataset, real data-science notebooks over 471 Kaggle datasets. Every questionโanswer pair was extracted and then verified: strong agent models had to solve the task in a live sandbox and reproduce the gold answer under deterministic grading. Anything ambiguous or un-checkable was dropped. So every task here is known-solvable and unambiguously gradable.
Verified by a checker, not judged by a model. Grading is an exact comparison against a known answer, through a ladder of checks: exact match โ numeric with tolerances โ list and percent normalisation โ symbolic equivalence. No LLM sits in the reward path, so the signal does not drift when you change the grader's model, because there isn't one.
| Repo | What it is |
|---|---|
SmolDataEnvs | the tasks as plain rows, load it and prompt any model |
SmolDataEnvs-sft | 4,677 verified agent trajectories, TRL-ready |
SmolDataEnvs-harbor-train | 5,000 tasks as Harbor environments |
SmolDataEnvs-harbor-test | 250 held-out, deliberately harder |
SmolDataEnvs-harbor-eval | 144 for quick validation during a run |
@misc{fineenvs,
author = {Kolavi, Adithya S},
title = {FineEnvs: Open Source RL Environments for LLM Agents},
year = {2026},
url = {https://github.com/adithya-s-k/FineEnvs}
}
11 commits