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.
The training suite: 5,000 hands-on data-analysis tasks. Each one drops an agent into a sandbox with a real dataset and a question, and asks it to explore the data, compute the answer, and write it down. Every answer is checked deterministically.
Packaged in Harbor format, so each task is a ready-made agentic environment: its own container, its own data, its own verifier.
difficulty_tier, plus difficulty_level 1β5)tasks/<task_id>/
task.toml # metadata, the question, the gold answer, grading tolerances
instruction.md # the prompt the agent sees
environment/ # Dockerfile (shared base image) + the data-pull hook
tests/ # grader.py (deterministic) + test.sh
registry.json # the suite manifest
manifest.parquet # one row per task, for filtering without walking the tree
pip install "openenv[harbor]" # tested with openenv 0.6.0, needs Python 3.12+
The [harbor] extra is what brings in the sandboxes. A plain pip install openenv gives you
the CLI but nothing to run a task in. --sandbox e2b also needs E2B_API_KEY set.
openenv harbor serve \
--dataset FineEnvs/SmolDataEnvs-harbor-train \
--llm-url http://127.0.0.1:8000/v1 --model <your-model> \
--port 8000 --capture-port 8100
Pass several with --dataset a,b and each arrives as its own split, which is how you train against
-train and validate against -eval from one server.
openenv harbor rollout \
--dataset FineEnvs/SmolDataEnvs-harbor-train \
--llm-url http://127.0.0.1:8000/v1 --model <your-model> \
--harness opencode --sandbox e2b --task-index 0
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}
}
49 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.
The training suite: 5,000 hands-on data-analysis tasks. Each one drops an agent into a sandbox with a real dataset and a question, and asks it to explore the data, compute the answer, and write it down. Every answer is checked deterministically.
Packaged in Harbor format, so each task is a ready-made agentic environment: its own container, its own data, its own verifier.
difficulty_tier, plus difficulty_level 1β5)tasks/<task_id>/
task.toml # metadata, the question, the gold answer, grading tolerances
instruction.md # the prompt the agent sees
environment/ # Dockerfile (shared base image) + the data-pull hook
tests/ # grader.py (deterministic) + test.sh
registry.json # the suite manifest
manifest.parquet # one row per task, for filtering without walking the tree
pip install "openenv[harbor]" # tested with openenv 0.6.0, needs Python 3.12+
The [harbor] extra is what brings in the sandboxes. A plain pip install openenv gives you
the CLI but nothing to run a task in. --sandbox e2b also needs E2B_API_KEY set.
openenv harbor serve \
--dataset FineEnvs/SmolDataEnvs-harbor-train \
--llm-url http://127.0.0.1:8000/v1 --model <your-model> \
--port 8000 --capture-port 8100
Pass several with --dataset a,b and each arrives as its own split, which is how you train against
-train and validate against -eval from one server.
openenv harbor rollout \
--dataset FineEnvs/SmolDataEnvs-harbor-train \
--llm-url http://127.0.0.1:8000/v1 --model <your-model> \
--harness opencode --sandbox e2b --task-index 0
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}
}
49 commits