{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/huggingface-co/2026-09-28-welcome-rl-environments-to-the-hub/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "Reinforcement Learning environments give new capabilities to agentic AI systems, and they’re a great way to measure and improve performance in your agents. Therefore, Hugging Face Hub now has a special place for RL Environments.\n\nAn environment gives an agent a task, responds to its actions with observations, and scores the outcome. The resulting rewards can measure an agent's performance during evaluation or provide a learning signal during training. For an introduction to this interaction loop, see [our blogpost on environments](https://huggingface.co/spaces/AdithyaSK/rl-environments-guide). Within the environment, the agent will perform a set of tasks that are represented as datasets. Therefore, environments can be split into broadly two parts: tasksets and runtimes. In this release, we are focusing on the tasksets.\n\n![Browsing the RL Environments filter on the Hugging Face Hub](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/rl-environments/rl-environments-filter.gif)\n\nAn RL environment on the Hub is a dataset repo that shows up in the new [RL Environments filter](https://huggingface.co/datasets?other=rl-environment). The **Use this dataset** button gives you the command to run it in that framework. There is no new repo type, no registry, and no sign-up. There are already environments in Harbor, Verifiers, and NVIDIA NeMo Gym.\n\n## Stop building environment registries\n\nEvery RL paper or framework uses its own way to find environments. Custom hubs, runtime registries, independent task datasets, or a GitHub list of tasks with a custom loader. This means that many of the published environments are siloed: if you publish an environment for one framework, users of the other three can’t load it. If you want to train on an environment from another framework or a new paper, you’ll need to port it by hand.\n\nWe think this is the wrong shape. An environment is tasks, tests, containers, and a reward rule, which are data with a runtime on top. The Hub already stores data, versions it, gates it, previews it, and serves it to millions of people. It does not need a second system to hold environments. It needs a way to say \"this data is an environment, and here is how you run it.\"\n\nTask data lives on the Hub. Runtime configuration and verifier code can live in the repo or the framework.\n\nThe frameworks keep doing what they are good at. The Hub does what it is good at, which is hosting, discovery, and versioning. Nobody has to own the catalogue. In fact, catalogues can run on other platforms too, powered by the hub.\n\nThe dataset repository hosts your environment files. The framework runs them locally or on a supported cloud backend. [Hugging Face Jobs](https://huggingface.co/docs/hub/en/jobs) can run cloud workloads, and [Hugging Face Sandboxes](https://huggingface.co/docs/huggingface_hub/main/guides/sandbox), built on Jobs, provide interactive command execution. The tags describe compatibility and generate loading commands; adding a tag does not start a job or sandbox.\n\n## What shipped\n\n**The RL Environments filter.** Go to [huggingface.co/datasets?other=rl-environment](https://huggingface.co/datasets?other=rl-environment). Every dataset with the `rl-environment` tag appears there, whatever framework it works with.\n\n**Framework tags.** Four environment frameworks are registered as dataset libraries:\n\n| Tag         | Framework                                                    |\n| ----------- | ------------------------------------------------------------ |\n| `harbor`    | [Harbor](https://github.com/harbor-framework/harbor)        |\n| `verifiers` | [Verifiers](https://github.com/PrimeIntellect-ai/verifiers) |\n| `openenv`   | [OpenEnv](https://github.com/huggingface/OpenEnv)           |\n| `nemo-gym`  | [NeMo Gym](https://github.com/NVIDIA-NeMo/Gym)              |\n\nEach framework tag puts the framework's icon on the dataset page and adds a generated snippet to **Use this dataset**.\n\nA dataset can carry more than one framework tag. That is the point. Tags describe compatibility, and compatibility is not exclusive. Each listed framework must support the files in the repository; adding a tag does not convert them.\n\n## Run an environment and inspect its reward\n\nChoose the example for your framework and run it in a separate Python environment with the prerequisites listed below.\n\n### Harbor: run a reference solution\n\n[Harbor](https://www.harborframework.com/docs/datasets) can load task directories from a Hub repository. The oracle agent runs the task's reference solution, then the verifier scores the result. It does not call a model.\n\n```sh\nuv tool install --python 3.13 'harbor==0.21.0'\nharbor run \\\n    --repo https://huggingface.co/datasets/harborframework/terminal-bench-2.1 \\\n    --dataset terminal-bench-2.1@2.1.0 \\\n    --include-task-name '*regex-log' \\\n    --agent oracle --env docker --jobs-dir results/harbor\nharbor view results/harbor\n```\n\nThe viewer shows the task's reward, verifier output, and logs. This checks the task and its reference solution before you try a model agent.\n\n### Verifiers: run a model on the same task\n\nThe Harbor integration of [verifiers v1](https://www.primeintellect.ai/blog/verifiers-v1) can run the same task directories in different runtimes, such as Docker. It also supports different harnesses, including a minimal bash harness.\n\n```sh\nuvx --python 3.13 --from 'verifiers[harbor]' eval harbor \\\n    --env.taskset.repo https://huggingface.co/datasets/harborframework/terminal-bench-2.1 \\\n    --env.taskset.dataset terminal-bench-2.1@2.1.0 \\\n    --env.taskset.tasks '[\"regex-log\"]' \\\n    --env.agent.runtime.type docker \\\n    --env.agent.harness.id bash \\\n    --model \"$MODEL\" \\\n    --client.base-url \"$LLM_URL\"\n```\n\nHere repo is the full Hugging Face Git URL, while dataset is the name and version in that repo's registry.json. This loader uses Harbor's registry conventions, so a bare Hub repo ID cannot replace both values.\n\n### OpenEnv: run an agent and inspect its reward\n\n[OpenEnv's Harbor integration](https://huggingface.co/docs/openenv/main/environments/harbor) can run the same task directories with an agent such as OpenCode and return the verifier's reward alongside the agent's trace.\n\n```sh\npip install \"openenv[harbor]==0.7.0\"\n\nopenenv harbor rollout \\\n    --llm-url \"$LLM_URL\" \\\n    --model \"$MODEL\" \\\n    --dataset harborframework/terminal-bench-2.1 \\\n    --task-index 0 \\\n    --harness opencode \\\n    --sandbox docker \\\n    --out rollout.json\n```\n\nThe command downloads the dataset's `tasks/` directories, runs one task in Docker, and writes the result. The default connection uses a temporary Gradio tunnel so the sandboxed agent can reach OpenEnv's model proxy. Read the verifier result and the number of model calls:\n\n```py\nimport json\nfrom pathlib import Path\n\nresult = json.loads(Path(\"rollout.json\").read_text())[0]\nprint(\"Reward:\", result[\"reward\"])\nprint(\"Model calls:\", result[\"n_turns\"])\nprint(\"Error:\", result[\"error\"])\n```\n\nA reward of `None` means no verifier reward was produced; inspect `error` before interpreting the run as a model failure. This path expects Harbor task directories.\n\n### NeMo Gym: generate responses and inspect rewards\n\n[NeMo Gym](https://github.com/NVIDIA-NeMo/Gym) supports evaluation and RL training: its environments collect trajectories and compute rewards, while a training framework updates model weights. For example, the [Structured Outputs dataset](https://huggingface.co/datasets/nvidia/Nemotron-RL-instruction_following-structured_outputs) pairs prompts with JSON schemas. Its verifier rewards schema adherence; it does not check whether the generated content is factually correct.\n\nThe best part is that this gives one repo and one discussion tab where people report broken tasks from all major frameworks. So when an author fixes a bad test, every framework gets the fix on the next pull.\n\n## Tag your environment\n\nOpen your dataset card and add this to the YAML header:\n\n```\n---\npretty_name: Terminal-Bench 2.0\ntags:\n- rl-environment\n- harbor\n- verifiers\n---\n```\n\nThat is the whole integration. Keep `rl-environment`, then list every framework that can load your files. If your environment works with a framework we have not registered yet, open a PR to the [list of supported libraries](https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/src/dataset-libraries.ts).\n\nThe [docs](https://huggingface.co/docs/hub/datasets-cards#declare-an-rl-environment-dataset) have the full reference.\n\n## Already on the Hub\n\nWe opened PRs to tag some of the environments people already train on. If you maintain one of these, merge the PR and your environment shows up in the filter.\n\n**Harbor**\n\n- [BeyondSWE](https://huggingface.co/datasets/AweAI-Team/BeyondSWE-harbor/discussions/1): the BeyondSWE benchmark as Harbor task directories, one folder per instance.\n- [Terminal-Lego](https://huggingface.co/datasets/Lego-X/Terminal-Lego-15k/discussions/1): Terminal-Bench-style tasks built from real StackOverflow issues, kept only after Docker round-trip verification.\n- [Harbor-Mix](https://huggingface.co/datasets/harborframework/harbor-mix/discussions/2): 100 hard agentic tasks picked from the Harbor adapters pool, cheaper to run than a full multi-benchmark sweep.\n- [NatureBench](https://huggingface.co/datasets/FrontisAI/NatureBench-Harbor/discussions/2): the 90 NatureBench tasks prebuilt for Harbor.\n\n**Verifiers**\n\n- [Reverse-Text-RL](https://huggingface.co/datasets/PrimeIntellect/Reverse-Text-RL/discussions/2): the small reversal task prime-rl uses in CI to debug RL training.\n- [Multi-SWE-RL-Verified](https://huggingface.co/datasets/PrimeIntellect/Multi-SWE-RL-Verified/discussions/2): 2,232 of 4,703 Multi-SWE-RL rows that pass gold-patch validation across C, Go, Java, JavaScript, Rust, and TypeScript.\n- [R2E-Gym-Subset-Verified](https://huggingface.co/datasets/PrimeIntellect/R2E-Gym-Subset-Verified/discussions/1): a verified R2E-Gym subset.\n- [Scale-SWE-Verified](https://huggingface.co/datasets/PrimeIntellect/Scale-SWE-Verified/discussions/2): 17,202 of 20,181 Python issue-resolving tasks that give a clean reward signal end to end.\n\n**NeMo Gym**\n\n- [Workplace Assistant](https://huggingface.co/datasets/nvidia/Nemotron-RL-agent-workplace_assistant/discussions/3): a multi-step tool-use sandbox with five databases, 26 tools, and 690 business tasks.\n- [Structured Outputs](https://huggingface.co/datasets/nvidia/Nemotron-RL-instruction_following-structured_outputs/discussions/2): instruction following with structured outputs.\n- [CFBench](https://huggingface.co/datasets/nvidia/Nemotron-RL-CFBench-v1/discussions/2): multilingual constraint following.\n- [SysBench](https://huggingface.co/datasets/nvidia/Nemotron-RL-SysBench-v1/discussions/1): multi-turn system message following.\n\n## What comes next\n\nThe first version generates one `default` snippet per framework. Per-config snippets are next, so a repo with several task sets can show the right command for each. After that we will look at structural detection for frameworks with strict layouts. It would also be really cool build custom task UIs, we’ve been experimenting with this here:\n\nThe bigger goal is for framework tagging to be automatic everywhere. OpenEnv already does it on upload. If you maintain Harbor, Verifiers, Nemo Gym, or any other environment framework, add the tags in your push path. It is a few lines, and every environment your users publish becomes visible to everyone else.\n\nIf you train agents, go browse the [filter](https://huggingface.co/datasets?other=rl-environment). If you build environments, publish and tag them, whether they cover coding, tool use, games, robotics, or another task. Include the files, a working run command, and the rule that produces the reward so others can use them. If your framework is missing, contribute it to the [list of supported libraries](https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/src/dataset-libraries.ts).\n",
  "authors": [],
  "captured_at": "2026-10-05T18:49:38.624325496+00:00",
  "category": "ai",
  "content_html": "<p>Reinforcement Learning environments give new capabilities to agentic AI systems, and they’re a great way to measure and improve performance in your agents. Therefore, Hugging Face Hub now has a special place for RL Environments.</p>\n<p>An environment gives an agent a task, responds to its actions with observations, and scores the outcome. The resulting rewards can measure an agent's performance during evaluation or provide a learning signal during training. For an introduction to this interaction loop, see <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/AdithyaSK/rl-environments-guide\">our blogpost on environments</a>. Within the environment, the agent will perform a set of tasks that are represented as datasets. Therefore, environments can be split into broadly two parts: tasksets and runtimes. In this release, we are focusing on the tasksets.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/rl-environments/rl-environments-filter.gif\" alt=\"Browsing the RL Environments filter on the Hugging Face Hub\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>An RL environment on the Hub is a dataset repo that shows up in the new <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets?other=rl-environment\">RL Environments filter</a>. The <strong>Use this dataset</strong> button gives you the command to run it in that framework. There is no new repo type, no registry, and no sign-up. There are already environments in Harbor, Verifiers, and NVIDIA NeMo Gym.</p>\n<h2>Stop building environment registries</h2>\n<p>Every RL paper or framework uses its own way to find environments. Custom hubs, runtime registries, independent task datasets, or a GitHub list of tasks with a custom loader. This means that many of the published environments are siloed: if you publish an environment for one framework, users of the other three can’t load it. If you want to train on an environment from another framework or a new paper, you’ll need to port it by hand.</p>\n<p>We think this is the wrong shape. An environment is tasks, tests, containers, and a reward rule, which are data with a runtime on top. The Hub already stores data, versions it, gates it, previews it, and serves it to millions of people. It does not need a second system to hold environments. It needs a way to say &quot;this data is an environment, and here is how you run it.&quot;</p>\n<p>Task data lives on the Hub. Runtime configuration and verifier code can live in the repo or the framework.</p>\n<p>The frameworks keep doing what they are good at. The Hub does what it is good at, which is hosting, discovery, and versioning. Nobody has to own the catalogue. In fact, catalogues can run on other platforms too, powered by the hub.</p>\n<p>The dataset repository hosts your environment files. The framework runs them locally or on a supported cloud backend. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/docs/hub/en/jobs\">Hugging Face Jobs</a> can run cloud workloads, and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/docs/huggingface_hub/main/guides/sandbox\">Hugging Face Sandboxes</a>, built on Jobs, provide interactive command execution. The tags describe compatibility and generate loading commands; adding a tag does not start a job or sandbox.</p>\n<h2>What shipped</h2>\n<p><strong>The RL Environments filter.</strong> Go to <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets?other=rl-environment\">huggingface.co/datasets?other=rl-environment</a>. Every dataset with the <code>rl-environment</code> tag appears there, whatever framework it works with.</p>\n<p><strong>Framework tags.</strong> Four environment frameworks are registered as dataset libraries:</p>\n<table>\n<thead>\n<tr>\n<th>Tag</th>\n<th>Framework</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>harbor</code></td>\n<td><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/harbor-framework/harbor\">Harbor</a></td>\n</tr>\n<tr>\n<td><code>verifiers</code></td>\n<td><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/PrimeIntellect-ai/verifiers\">Verifiers</a></td>\n</tr>\n<tr>\n<td><code>openenv</code></td>\n<td><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/huggingface/OpenEnv\">OpenEnv</a></td>\n</tr>\n<tr>\n<td><code>nemo-gym</code></td>\n<td><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/NVIDIA-NeMo/Gym\">NeMo Gym</a></td>\n</tr>\n</tbody>\n</table>\n<p>Each framework tag puts the framework's icon on the dataset page and adds a generated snippet to <strong>Use this dataset</strong>.</p>\n<p>A dataset can carry more than one framework tag. That is the point. Tags describe compatibility, and compatibility is not exclusive. Each listed framework must support the files in the repository; adding a tag does not convert them.</p>\n<h2>Run an environment and inspect its reward</h2>\n<p>Choose the example for your framework and run it in a separate Python environment with the prerequisites listed below.</p>\n<h3>Harbor: run a reference solution</h3>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.harborframework.com/docs/datasets\">Harbor</a> can load task directories from a Hub repository. The oracle agent runs the task's reference solution, then the verifier scores the result. It does not call a model.</p>\n<pre><code class=\"language-sh\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">uv</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> tool install<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>python</span> 3.13 <span class=\"syntax-string syntax-quoted syntax-single syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&#39;</span>harbor==0.21.0<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&#39;</span></span></span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">harbor</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> run <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>repo</span> https://huggingface.co/datasets/harborframework/terminal-bench-2.1 <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>dataset</span> terminal-bench-2.1@2.1.0 <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>include-task-name</span> <span class=\"syntax-string syntax-quoted syntax-single syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&#39;</span>*regex-log<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&#39;</span></span> <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>agent</span> oracle<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>env</span> docker<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>jobs-dir</span> results/harbor</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">harbor</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> view results/harbor</span>\n</span></span></code></pre>\n<p>The viewer shows the task's reward, verifier output, and logs. This checks the task and its reference solution before you try a model agent.</p>\n<h3>Verifiers: run a model on the same task</h3>\n<p>The Harbor integration of <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.primeintellect.ai/blog/verifiers-v1\">verifiers v1</a> can run the same task directories in different runtimes, such as Docker. It also supports different harnesses, including a minimal bash harness.</p>\n<pre><code class=\"language-sh\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">uvx</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>python</span> 3.13<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>from</span> <span class=\"syntax-string syntax-quoted syntax-single syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&#39;</span>verifiers[harbor]<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&#39;</span></span> eval harbor <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>env</span>.taskset.repo https://huggingface.co/datasets/harborframework/terminal-bench-2.1 <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>env</span>.taskset.dataset terminal-bench-2.1@2.1.0 <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>env</span>.taskset.tasks <span class=\"syntax-string syntax-quoted syntax-single syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&#39;</span>[&quot;regex-log&quot;]<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&#39;</span></span> <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>env</span>.agent.runtime.type docker <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>env</span>.agent.harness.id bash <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>model</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">MODEL</span></span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span> <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>client</span>.base-url <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">LLM_URL</span></span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n</span></span></code></pre>\n<p>Here repo is the full Hugging Face Git URL, while dataset is the name and version in that repo's registry.json. This loader uses Harbor's registry conventions, so a bare Hub repo ID cannot replace both values.</p>\n<h3>OpenEnv: run an agent and inspect its reward</h3>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/docs/openenv/main/environments/harbor\">OpenEnv's Harbor integration</a> can run the same task directories with an agent such as OpenCode and return the verifier's reward alongside the agent's trace.</p>\n<pre><code class=\"language-sh\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">pip</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> install <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>openenv[harbor]==0.7.0<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">openenv</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> harbor rollout <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>llm-url</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">LLM_URL</span></span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span> <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>model</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">MODEL</span></span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span> <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>dataset</span> harborframework/terminal-bench-2.1 <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>task-index</span> 0 <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>harness</span> opencode <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>sandbox</span> docker <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">    --</span>out</span> rollout.json</span>\n</span></span></code></pre>\n<p>The command downloads the dataset's <code>tasks/</code> directories, runs one task in Docker, and writes the result. The default connection uses a temporary Gradio tunnel so the sandboxed agent can reach OpenEnv's model proxy. Read the verifier result and the number of model calls:</p>\n<pre><code class=\"language-py\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\"><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">json</span></span></span>\n<span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">pathlib</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">Path</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">result</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">json</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">loads</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">Path</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">rollout.json<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span><span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">read_text</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">0</span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">print</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Reward:<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">result</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">reward<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">print</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Model calls:<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">result</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">n_turns<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">print</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Error:<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">result</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">error<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n</span></span></code></pre>\n<p>A reward of <code>None</code> means no verifier reward was produced; inspect <code>error</code> before interpreting the run as a model failure. This path expects Harbor task directories.</p>\n<h3>NeMo Gym: generate responses and inspect rewards</h3>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/NVIDIA-NeMo/Gym\">NeMo Gym</a> supports evaluation and RL training: its environments collect trajectories and compute rewards, while a training framework updates model weights. For example, the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/nvidia/Nemotron-RL-instruction_following-structured_outputs\">Structured Outputs dataset</a> pairs prompts with JSON schemas. Its verifier rewards schema adherence; it does not check whether the generated content is factually correct.</p>\n<p>The best part is that this gives one repo and one discussion tab where people report broken tasks from all major frameworks. So when an author fixes a bad test, every framework gets the fix on the next pull.</p>\n<h2>Tag your environment</h2>\n<p>Open your dataset card and add this to the YAML header:</p>\n<pre><code><span class=\"code-snippet\" data-language=\"YAML\"><span class=\"syntax-source syntax-yaml\"><span class=\"syntax-entity syntax-other syntax-document syntax-begin syntax-yaml\">---</span>\n<span class=\"syntax-string syntax-unquoted syntax-plain syntax-out syntax-yaml\"><span class=\"syntax-entity syntax-name syntax-tag syntax-yaml\">pretty_name</span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-mapping syntax-yaml\">:</span> <span class=\"syntax-string syntax-unquoted syntax-plain syntax-out syntax-yaml\">Terminal-Bench 2.0</span>\n<span class=\"syntax-string syntax-unquoted syntax-plain syntax-out syntax-yaml\"><span class=\"syntax-entity syntax-name syntax-tag syntax-yaml\">tags</span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-mapping syntax-yaml\">:</span>\n<span class=\"syntax-punctuation syntax-definition syntax-block syntax-sequence syntax-item syntax-yaml\">-</span> <span class=\"syntax-string syntax-unquoted syntax-plain syntax-out syntax-yaml\">rl-environment</span>\n<span class=\"syntax-punctuation syntax-definition syntax-block syntax-sequence syntax-item syntax-yaml\">-</span> <span class=\"syntax-string syntax-unquoted syntax-plain syntax-out syntax-yaml\">harbor</span>\n<span class=\"syntax-punctuation syntax-definition syntax-block syntax-sequence syntax-item syntax-yaml\">-</span> <span class=\"syntax-string syntax-unquoted syntax-plain syntax-out syntax-yaml\">verifiers</span>\n<span class=\"syntax-entity syntax-other syntax-document syntax-begin syntax-yaml\">---</span>\n</span></span></code></pre>\n<p>That is the whole integration. Keep <code>rl-environment</code>, then list every framework that can load your files. If your environment works with a framework we have not registered yet, open a PR to the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/src/dataset-libraries.ts\">list of supported libraries</a>.</p>\n<p>The <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/docs/hub/datasets-cards#declare-an-rl-environment-dataset\">docs</a> have the full reference.</p>\n<h2>Already on the Hub</h2>\n<p>We opened PRs to tag some of the environments people already train on. If you maintain one of these, merge the PR and your environment shows up in the filter.</p>\n<p><strong>Harbor</strong></p>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/AweAI-Team/BeyondSWE-harbor/discussions/1\">BeyondSWE</a>: the BeyondSWE benchmark as Harbor task directories, one folder per instance.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/Lego-X/Terminal-Lego-15k/discussions/1\">Terminal-Lego</a>: Terminal-Bench-style tasks built from real StackOverflow issues, kept only after Docker round-trip verification.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/harborframework/harbor-mix/discussions/2\">Harbor-Mix</a>: 100 hard agentic tasks picked from the Harbor adapters pool, cheaper to run than a full multi-benchmark sweep.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/FrontisAI/NatureBench-Harbor/discussions/2\">NatureBench</a>: the 90 NatureBench tasks prebuilt for Harbor.</li>\n</ul>\n<p><strong>Verifiers</strong></p>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/PrimeIntellect/Reverse-Text-RL/discussions/2\">Reverse-Text-RL</a>: the small reversal task prime-rl uses in CI to debug RL training.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/PrimeIntellect/Multi-SWE-RL-Verified/discussions/2\">Multi-SWE-RL-Verified</a>: 2,232 of 4,703 Multi-SWE-RL rows that pass gold-patch validation across C, Go, Java, JavaScript, Rust, and TypeScript.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/PrimeIntellect/R2E-Gym-Subset-Verified/discussions/1\">R2E-Gym-Subset-Verified</a>: a verified R2E-Gym subset.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/PrimeIntellect/Scale-SWE-Verified/discussions/2\">Scale-SWE-Verified</a>: 17,202 of 20,181 Python issue-resolving tasks that give a clean reward signal end to end.</li>\n</ul>\n<p><strong>NeMo Gym</strong></p>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/nvidia/Nemotron-RL-agent-workplace_assistant/discussions/3\">Workplace Assistant</a>: a multi-step tool-use sandbox with five databases, 26 tools, and 690 business tasks.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/nvidia/Nemotron-RL-instruction_following-structured_outputs/discussions/2\">Structured Outputs</a>: instruction following with structured outputs.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/nvidia/Nemotron-RL-CFBench-v1/discussions/2\">CFBench</a>: multilingual constraint following.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/nvidia/Nemotron-RL-SysBench-v1/discussions/1\">SysBench</a>: multi-turn system message following.</li>\n</ul>\n<h2>What comes next</h2>\n<p>The first version generates one <code>default</code> snippet per framework. Per-config snippets are next, so a repo with several task sets can show the right command for each. After that we will look at structural detection for frameworks with strict layouts. It would also be really cool build custom task UIs, we’ve been experimenting with this here:</p>\n<p>The bigger goal is for framework tagging to be automatic everywhere. OpenEnv already does it on upload. If you maintain Harbor, Verifiers, Nemo Gym, or any other environment framework, add the tags in your push path. It is a few lines, and every environment your users publish becomes visible to everyone else.</p>\n<p>If you train agents, go browse the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets?other=rl-environment\">filter</a>. If you build environments, publish and tag them, whether they cover coding, tool use, games, robotics, or another task. Include the files, a working run command, and the rule that produces the reward so others can use them. If your framework is missing, contribute it to the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/src/dataset-libraries.ts\">list of supported libraries</a>.</p>\n",
  "content_markdown": "Reinforcement Learning environments give new capabilities to agentic AI systems, and they’re a great way to measure and improve performance in your agents. Therefore, Hugging Face Hub now has a special place for RL Environments.\n\nAn environment gives an agent a task, responds to its actions with observations, and scores the outcome. The resulting rewards can measure an agent's performance during evaluation or provide a learning signal during training. For an introduction to this interaction loop, see [our blogpost on environments](https://huggingface.co/spaces/AdithyaSK/rl-environments-guide). Within the environment, the agent will perform a set of tasks that are represented as datasets. Therefore, environments can be split into broadly two parts: tasksets and runtimes. In this release, we are focusing on the tasksets.\n\n![Browsing the RL Environments filter on the Hugging Face Hub](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/rl-environments/rl-environments-filter.gif)\n\nAn RL environment on the Hub is a dataset repo that shows up in the new [RL Environments filter](https://huggingface.co/datasets?other=rl-environment). The **Use this dataset** button gives you the command to run it in that framework. There is no new repo type, no registry, and no sign-up. There are already environments in Harbor, Verifiers, and NVIDIA NeMo Gym.\n\n## Stop building environment registries\n\nEvery RL paper or framework uses its own way to find environments. Custom hubs, runtime registries, independent task datasets, or a GitHub list of tasks with a custom loader. This means that many of the published environments are siloed: if you publish an environment for one framework, users of the other three can’t load it. If you want to train on an environment from another framework or a new paper, you’ll need to port it by hand.\n\nWe think this is the wrong shape. An environment is tasks, tests, containers, and a reward rule, which are data with a runtime on top. The Hub already stores data, versions it, gates it, previews it, and serves it to millions of people. It does not need a second system to hold environments. It needs a way to say \"this data is an environment, and here is how you run it.\"\n\nTask data lives on the Hub. Runtime configuration and verifier code can live in the repo or the framework.\n\nThe frameworks keep doing what they are good at. The Hub does what it is good at, which is hosting, discovery, and versioning. Nobody has to own the catalogue. In fact, catalogues can run on other platforms too, powered by the hub.\n\nThe dataset repository hosts your environment files. The framework runs them locally or on a supported cloud backend. [Hugging Face Jobs](https://huggingface.co/docs/hub/en/jobs) can run cloud workloads, and [Hugging Face Sandboxes](https://huggingface.co/docs/huggingface_hub/main/guides/sandbox), built on Jobs, provide interactive command execution. The tags describe compatibility and generate loading commands; adding a tag does not start a job or sandbox.\n\n## What shipped\n\n**The RL Environments filter.** Go to [huggingface.co/datasets?other=rl-environment](https://huggingface.co/datasets?other=rl-environment). Every dataset with the `rl-environment` tag appears there, whatever framework it works with.\n\n**Framework tags.** Four environment frameworks are registered as dataset libraries:\n\n| Tag         | Framework                                                    |\n| ----------- | ------------------------------------------------------------ |\n| `harbor`    | [Harbor](https://github.com/harbor-framework/harbor)        |\n| `verifiers` | [Verifiers](https://github.com/PrimeIntellect-ai/verifiers) |\n| `openenv`   | [OpenEnv](https://github.com/huggingface/OpenEnv)           |\n| `nemo-gym`  | [NeMo Gym](https://github.com/NVIDIA-NeMo/Gym)              |\n\nEach framework tag puts the framework's icon on the dataset page and adds a generated snippet to **Use this dataset**.\n\nA dataset can carry more than one framework tag. That is the point. Tags describe compatibility, and compatibility is not exclusive. Each listed framework must support the files in the repository; adding a tag does not convert them.\n\n## Run an environment and inspect its reward\n\nChoose the example for your framework and run it in a separate Python environment with the prerequisites listed below.\n\n### Harbor: run a reference solution\n\n[Harbor](https://www.harborframework.com/docs/datasets) can load task directories from a Hub repository. The oracle agent runs the task's reference solution, then the verifier scores the result. It does not call a model.\n\n```sh\nuv tool install --python 3.13 'harbor==0.21.0'\nharbor run \\\n    --repo https://huggingface.co/datasets/harborframework/terminal-bench-2.1 \\\n    --dataset terminal-bench-2.1@2.1.0 \\\n    --include-task-name '*regex-log' \\\n    --agent oracle --env docker --jobs-dir results/harbor\nharbor view results/harbor\n```\n\nThe viewer shows the task's reward, verifier output, and logs. This checks the task and its reference solution before you try a model agent.\n\n### Verifiers: run a model on the same task\n\nThe Harbor integration of [verifiers v1](https://www.primeintellect.ai/blog/verifiers-v1) can run the same task directories in different runtimes, such as Docker. It also supports different harnesses, including a minimal bash harness.\n\n```sh\nuvx --python 3.13 --from 'verifiers[harbor]' eval harbor \\\n    --env.taskset.repo https://huggingface.co/datasets/harborframework/terminal-bench-2.1 \\\n    --env.taskset.dataset terminal-bench-2.1@2.1.0 \\\n    --env.taskset.tasks '[\"regex-log\"]' \\\n    --env.agent.runtime.type docker \\\n    --env.agent.harness.id bash \\\n    --model \"$MODEL\" \\\n    --client.base-url \"$LLM_URL\"\n```\n\nHere repo is the full Hugging Face Git URL, while dataset is the name and version in that repo's registry.json. This loader uses Harbor's registry conventions, so a bare Hub repo ID cannot replace both values.\n\n### OpenEnv: run an agent and inspect its reward\n\n[OpenEnv's Harbor integration](https://huggingface.co/docs/openenv/main/environments/harbor) can run the same task directories with an agent such as OpenCode and return the verifier's reward alongside the agent's trace.\n\n```sh\npip install \"openenv[harbor]==0.7.0\"\n\nopenenv harbor rollout \\\n    --llm-url \"$LLM_URL\" \\\n    --model \"$MODEL\" \\\n    --dataset harborframework/terminal-bench-2.1 \\\n    --task-index 0 \\\n    --harness opencode \\\n    --sandbox docker \\\n    --out rollout.json\n```\n\nThe command downloads the dataset's `tasks/` directories, runs one task in Docker, and writes the result. The default connection uses a temporary Gradio tunnel so the sandboxed agent can reach OpenEnv's model proxy. Read the verifier result and the number of model calls:\n\n```py\nimport json\nfrom pathlib import Path\n\nresult = json.loads(Path(\"rollout.json\").read_text())[0]\nprint(\"Reward:\", result[\"reward\"])\nprint(\"Model calls:\", result[\"n_turns\"])\nprint(\"Error:\", result[\"error\"])\n```\n\nA reward of `None` means no verifier reward was produced; inspect `error` before interpreting the run as a model failure. This path expects Harbor task directories.\n\n### NeMo Gym: generate responses and inspect rewards\n\n[NeMo Gym](https://github.com/NVIDIA-NeMo/Gym) supports evaluation and RL training: its environments collect trajectories and compute rewards, while a training framework updates model weights. For example, the [Structured Outputs dataset](https://huggingface.co/datasets/nvidia/Nemotron-RL-instruction_following-structured_outputs) pairs prompts with JSON schemas. Its verifier rewards schema adherence; it does not check whether the generated content is factually correct.\n\nThe best part is that this gives one repo and one discussion tab where people report broken tasks from all major frameworks. So when an author fixes a bad test, every framework gets the fix on the next pull.\n\n## Tag your environment\n\nOpen your dataset card and add this to the YAML header:\n\n```\n---\npretty_name: Terminal-Bench 2.0\ntags:\n- rl-environment\n- harbor\n- verifiers\n---\n```\n\nThat is the whole integration. Keep `rl-environment`, then list every framework that can load your files. If your environment works with a framework we have not registered yet, open a PR to the [list of supported libraries](https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/src/dataset-libraries.ts).\n\nThe [docs](https://huggingface.co/docs/hub/datasets-cards#declare-an-rl-environment-dataset) have the full reference.\n\n## Already on the Hub\n\nWe opened PRs to tag some of the environments people already train on. If you maintain one of these, merge the PR and your environment shows up in the filter.\n\n**Harbor**\n\n- [BeyondSWE](https://huggingface.co/datasets/AweAI-Team/BeyondSWE-harbor/discussions/1): the BeyondSWE benchmark as Harbor task directories, one folder per instance.\n- [Terminal-Lego](https://huggingface.co/datasets/Lego-X/Terminal-Lego-15k/discussions/1): Terminal-Bench-style tasks built from real StackOverflow issues, kept only after Docker round-trip verification.\n- [Harbor-Mix](https://huggingface.co/datasets/harborframework/harbor-mix/discussions/2): 100 hard agentic tasks picked from the Harbor adapters pool, cheaper to run than a full multi-benchmark sweep.\n- [NatureBench](https://huggingface.co/datasets/FrontisAI/NatureBench-Harbor/discussions/2): the 90 NatureBench tasks prebuilt for Harbor.\n\n**Verifiers**\n\n- [Reverse-Text-RL](https://huggingface.co/datasets/PrimeIntellect/Reverse-Text-RL/discussions/2): the small reversal task prime-rl uses in CI to debug RL training.\n- [Multi-SWE-RL-Verified](https://huggingface.co/datasets/PrimeIntellect/Multi-SWE-RL-Verified/discussions/2): 2,232 of 4,703 Multi-SWE-RL rows that pass gold-patch validation across C, Go, Java, JavaScript, Rust, and TypeScript.\n- [R2E-Gym-Subset-Verified](https://huggingface.co/datasets/PrimeIntellect/R2E-Gym-Subset-Verified/discussions/1): a verified R2E-Gym subset.\n- [Scale-SWE-Verified](https://huggingface.co/datasets/PrimeIntellect/Scale-SWE-Verified/discussions/2): 17,202 of 20,181 Python issue-resolving tasks that give a clean reward signal end to end.\n\n**NeMo Gym**\n\n- [Workplace Assistant](https://huggingface.co/datasets/nvidia/Nemotron-RL-agent-workplace_assistant/discussions/3): a multi-step tool-use sandbox with five databases, 26 tools, and 690 business tasks.\n- [Structured Outputs](https://huggingface.co/datasets/nvidia/Nemotron-RL-instruction_following-structured_outputs/discussions/2): instruction following with structured outputs.\n- [CFBench](https://huggingface.co/datasets/nvidia/Nemotron-RL-CFBench-v1/discussions/2): multilingual constraint following.\n- [SysBench](https://huggingface.co/datasets/nvidia/Nemotron-RL-SysBench-v1/discussions/1): multi-turn system message following.\n\n## What comes next\n\nThe first version generates one `default` snippet per framework. Per-config snippets are next, so a repo with several task sets can show the right command for each. After that we will look at structural detection for frameworks with strict layouts. It would also be really cool build custom task UIs, we’ve been experimenting with this here:\n\nThe bigger goal is for framework tagging to be automatic everywhere. OpenEnv already does it on upload. If you maintain Harbor, Verifiers, Nemo Gym, or any other environment framework, add the tags in your push path. It is a few lines, and every environment your users publish becomes visible to everyone else.\n\nIf you train agents, go browse the [filter](https://huggingface.co/datasets?other=rl-environment). If you build environments, publish and tag them, whether they cover coding, tool use, games, robotics, or another task. Include the files, a working run command, and the rule that produces the reward so others can use them. If your framework is missing, contribute it to the [list of supported libraries](https://github.com/huggingface/huggingface.js/blob/main/packages/tasks/src/dataset-libraries.ts).\n",
  "dateCreated": "2026-10-05T18:49:38.624325496+00:00",
  "date_created": "2026-09-28T00:00:00+00:00",
  "date_modified": "2026-09-28T00:00:00+00:00",
  "date_published": "2026-09-28T00:00:00+00:00",
  "description": "Reinforcement Learning environments give new capabilities to agentic AI systems, and they’re a great way to measure and improve performance in your agents. Therefore, Hugging Face Hub now has a special place for RL Environments. An…",
  "external_url": "https://huggingface.co/blog/rl-environments",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/huggingface-co/2026/09/2026-09-28-welcome-rl-environments-to-the-hub.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/huggingface-co/2026/09/2026-09-28-welcome-rl-environments-to-the-hub.md"
  },
  "id": "urn:aggr:item:5ee783135a6721fa0e7bad8fdb3b8dc0649422d6",
  "isBasedOn": {
    "@id": "https://huggingface.co/blog/rl-environments"
  },
  "mainEntity": {
    "@id": "https://huggingface.co/blog/rl-environments",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/huggingface-co/2026-09-28-welcome-rl-environments-to-the-hub/#webpage"
    },
    "dateModified": "2026-09-28T00:00:00+00:00",
    "datePublished": "2026-09-28T00:00:00+00:00",
    "headline": "Welcome RL Environments to the hub",
    "timeRequired": "PT7M",
    "url": "https://huggingface.co/blog/rl-environments",
    "wordCount": 1461
  },
  "name": "Archived snapshot: Welcome RL Environments to the hub",
  "preview": null,
  "reading_minutes": 7,
  "replicated_at": null,
  "source": "huggingface-co",
  "source_name": "Hugging Face - Blog",
  "summary": null,
  "tags": [],
  "temporalCoverage": "2026-10-05T18:49:38.624325496+00:00",
  "title": "Welcome RL Environments to the hub",
  "url": "https://aggr.aymericbeaumet.com/items/huggingface-co/2026-09-28-welcome-rl-environments-to-the-hub/",
  "word_count": 1461
}