<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Luca Ostermann</title>
    <description>The latest articles on Forem by Luca Ostermann (@lukeo).</description>
    <link>https://forem.com/lukeo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3899472%2F6f1c9d7f-2248-4653-9ef5-0ee3f3ace539.png</url>
      <title>Forem: Luca Ostermann</title>
      <link>https://forem.com/lukeo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lukeo"/>
    <language>en</language>
    <item>
      <title>The RL environment platform landscape in 2026</title>
      <dc:creator>Luca Ostermann</dc:creator>
      <pubDate>Tue, 28 Apr 2026 09:36:50 +0000</pubDate>
      <link>https://forem.com/lukeo/the-rl-environment-platform-landscape-in-2026-3j5g</link>
      <guid>https://forem.com/lukeo/the-rl-environment-platform-landscape-in-2026-3j5g</guid>
      <description>&lt;p&gt;In my &lt;a href="https://dev.to/lukeo/setting-up-a-local-rl-environment-in-2026-and-what-i-wish-i-knew-57fe"&gt;last post&lt;/a&gt; I wrote about the pain of setting up a local RL environment from scratch. &lt;/p&gt;

&lt;p&gt;So Update guys hehe I spent some time doing some digging and here what I got :&lt;br&gt;
My focus is browser-based web navigation tasks, so I care a lot about headless browser support, reset speed, parallelism, and how well the reward signal reflects real task completion. Your priorities might differ.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this market exists at all
&lt;/h2&gt;

&lt;p&gt;It's worth stepping back to understand why RL environment platforms are becoming a thing.&lt;/p&gt;

&lt;p&gt;OpenAI, Anthropic, and Meta don't buy RL environments off the shelf. They build them internally. According to a &lt;a href="https://techcrunch.com/2025/09/21/silicon-valley-bets-big-on-environments-to-train-ai-agents/" rel="noopener noreferrer"&gt;TechCrunch investigation&lt;/a&gt;, Anthropic has discussed spending more than $1 billion on RL environments over the next year. OpenAI's ChatGPT Agent training relies on what researchers call "UI Gyms" browser-based environments simulating real software at scale. As &lt;a href="https://newsletter.semianalysis.com/p/rl-environments-and-rl-for-science" rel="noopener noreferrer"&gt;SemiAnalysis reported&lt;/a&gt;, the major labs each maintain distinct procurement strategies, with firms like Mercor, Surge, and Handshake acting as major environment and data suppliers.&lt;/p&gt;

&lt;p&gt;The market is moving fast. Mercor one of the largest AI training data platforms, used by the top 5 AI labs  acquired Sepal AI in February 2026 to deepen its RL environment capabilities, describing the acquisition as targeting the intersection of human data, RL environments, and specialized research. TechCrunch noted that Mercor is now pitching investors on domain-specific RL environments for coding, healthcare, and law.&lt;/p&gt;

&lt;p&gt;For everyone outside the top labs: building your own environment infrastructure from scratch is almost certainly the wrong move. The engineering cost is high, the maintenance is ongoing, and your core competency is probably the agent not the environment. That's exactly the gap the platforms below are trying to fill.&lt;/p&gt;




&lt;h2&gt;
  
  
  The landscape: 6 platforms worth knowing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Surge AI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Focus:&lt;/strong&gt; Enterprise RL environments, human-expert data pipelines&lt;/p&gt;

&lt;p&gt;&lt;a href="https://surgehq.ai/" rel="noopener noreferrer"&gt;Surge AI&lt;/a&gt; is one of the most established players in this space they partner with OpenAI, Anthropic, Meta, and Google, and have been building RL environments well before most startups entered the market. Their flagship environment suite includes CoreCraft, a large-scale enterprise simulation spanning 2,500+ entities and 23 tools, designed to test real-world agentic capabilities. Their research showed that even GPT-5 and Claude fail over 40% of agentic tasks in realistic RL environments which gives a sense of how seriously they approach environment design. The tradeoff: Surge is enterprise-grade and priced accordingly. Not the entry point for smaller teams.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Rise Data Labs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Focus:&lt;/strong&gt; Browser agents, human data pipelines, RL environment curation&lt;/p&gt;

&lt;p&gt;&lt;a href="https://risedatalabs.com/" rel="noopener noreferrer"&gt;Rise Data Labs&lt;/a&gt; operates at an interesting intersection they build RL training environments with a focus on human data and AI training data pipelines, and they also maintain a curated directory of providers across the ecosystem. That dual positioning gives them a broader view of the space than most pure-play platforms, and the task quality reflects it. Worth looking at both as a platform and as a resource for navigating the broader landscape especially for teams that aren't quite at Surge's scale.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Mercor
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Focus:&lt;/strong&gt; Domain-specific RL environments, expert data at scale&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mercor.com/" rel="noopener noreferrer"&gt;Mercor&lt;/a&gt; recently acquired Sepal AI to deepen its RL environment capabilities, targeting domain-specific tasks like coding, healthcare, and law. They're used by the top 5 AI labs and bring a strong human-expert network to environment and reward design. Still expanding their environment product, but worth watching closely especially as they integrate Sepal's infrastructure.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Prime Intellect
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Focus:&lt;/strong&gt; Research teams, custom environment infrastructure&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.primeintellect.ai/" rel="noopener noreferrer"&gt;Prime Intellect&lt;/a&gt; Open-source friendly and highly flexible you can bring your own environment via their Environments Hub, useful if your setup has unusual dependencies. Strong on distributed compute. The tradeoff is onboarding complexity: documentation assumes you already know what you want, better for experienced teams than newcomers.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Mechanize
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Focus:&lt;/strong&gt; Coding and software agent tasks&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mechanize.work/" rel="noopener noreferrer"&gt;Mechanize&lt;/a&gt; Purpose-built for code-related RL. Their "replication training" approach agents recreating implementations from spec produces strong reward signals for code tasks. Not the right tool for browser agents, but worth knowing about if your use case is code execution, repo navigation, or terminal interaction.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. HUD
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Focus:&lt;/strong&gt; General RL, end-to-end lifecycle&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.hud.ai/" rel="noopener noreferrer"&gt;HUD&lt;/a&gt; One of the more complete general-purpose platforms covers environment authoring, evaluation, and observability in one place. Useful if you don't want to stitch together separate tools. Performance on browser-specific tasks lags behind more specialized options, but for general RL workflows it covers the bases.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to think about the choice
&lt;/h2&gt;

&lt;p&gt;A few things worth keeping in mind when evaluating:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Match the platform to your task type.&lt;/strong&gt; A platform built for coding tasks won't give you what you need for browser agents, and vice versa. The more specialized the platform, the better it tends to perform in its lane and the worse outside it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human data integration matters more than most people think.&lt;/strong&gt; Platforms that incorporate real human feedback into the reward signal rather than purely synthetic signals tend to produce agents that generalize better. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evaluate independently from where you train.&lt;/strong&gt; If you train and evaluate on the same environment, you're measuring memorization, not generalization. Worth building this separation in early.&lt;/p&gt;




&lt;p&gt;If you've worked with any of these platforms or others I haven't covered, I'd genuinely like to hear what you've seen in the comments! &lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>agents</category>
      <category>python</category>
    </item>
    <item>
      <title>Setting up a local RL environment in 2026 and WHAT I wish I knew!!!</title>
      <dc:creator>Luca Ostermann</dc:creator>
      <pubDate>Mon, 27 Apr 2026 11:48:27 +0000</pubDate>
      <link>https://forem.com/lukeo/setting-up-a-local-rl-environment-in-2026-and-what-i-wish-i-knew-57fe</link>
      <guid>https://forem.com/lukeo/setting-up-a-local-rl-environment-in-2026-and-what-i-wish-i-knew-57fe</guid>
      <description>&lt;p&gt;I spent three days last month getting a reinforcement learning environment to run locally before I could write a single line of training code.&lt;/p&gt;

&lt;p&gt;Three days. For the setup.&lt;/p&gt;

&lt;p&gt;I'm writing this because I found almost no practical guide that covers the annoying parts, the ones that actually eat your time. So here's everything I wish someone had told me before I started.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Your "simple" environment is probably not simple
&lt;/h2&gt;

&lt;p&gt;I started with what I thought was a minimal setup: a custom browser-based environment for testing a web navigation agent. I figured I'd have something running in an afternoon.&lt;/p&gt;

&lt;p&gt;What I didn't account for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rendering backends.&lt;/strong&gt; If your env involves any visual observation (even a headless browser), you need a display server. On a Linux dev machine without a monitor, that means Xvfb or a virtual framebuffer. This alone took me half a day to debug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gym vs Gymnasium.&lt;/strong&gt; OpenAI Gym is deprecated. A lot of tutorials still use it. Gymnasium is the maintained fork. They're mostly compatible but not perfectly especially around &lt;code&gt;reset()&lt;/code&gt; return signatures. If you're getting &lt;code&gt;too many values to unpack&lt;/code&gt; errors, this is probably why.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step API changes.&lt;/strong&gt; Gymnasium introduced a new step API that returns 5 values instead of 4 (&lt;code&gt;terminated&lt;/code&gt; and &lt;code&gt;truncated&lt;/code&gt; are now separate). Half the example code online still uses the old API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lesson: read the Gymnasium migration docs before anything else. It takes 15 minutes and saves hours.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Dependency hell is real, and it's specifically bad for RL
&lt;/h2&gt;

&lt;p&gt;RL libraries have notoriously tangled dependencies. In my case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stable-baselines3 → requires torch &amp;gt;= 1.11
ray[rllib] → pins its own torch version
my browser env → needs playwright which needs its own chromium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These don't always play nice together. My recommendation: &lt;strong&gt;one environment per project, managed with &lt;code&gt;uv&lt;/code&gt; or at minimum a fresh &lt;code&gt;venv&lt;/code&gt;&lt;/strong&gt;. Don't try to share an environment across RL projects. It will break.&lt;/p&gt;

&lt;p&gt;Also: pin your versions immediately. RL libraries update fast and breaking changes are common. Future-you will thank present-you.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Episode resets are where bugs hide
&lt;/h2&gt;

&lt;p&gt;The most subtle bugs I've hit are in &lt;code&gt;reset()&lt;/code&gt;, not &lt;code&gt;step()&lt;/code&gt;. Specifically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;State leakage between episodes.&lt;/strong&gt; If your environment holds any mutable state (a browser session, a file handle, a DB connection), make sure &lt;code&gt;reset()&lt;/code&gt; actually clears it. I had an agent that looked like it was learning when it was just reusing the previous episode's state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seeding.&lt;/strong&gt; If you don't seed your environment properly, your results aren't reproducible. Gymnasium has a &lt;code&gt;seed&lt;/code&gt; parameter in &lt;code&gt;reset()&lt;/code&gt; now. Use it. Log the seed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow resets kill training speed.&lt;/strong&gt; If your environment takes 2 seconds to reset and you're running 10,000 episodes, that's 5+ hours just in resets. Profile this early.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Observation and action spaces: be boring
&lt;/h2&gt;

&lt;p&gt;I made the mistake of designing a fancy observation space early on — nested dicts, variable-length sequences, mixed types. It looked elegant. It was a nightmare to work with.&lt;/p&gt;

&lt;p&gt;For a first pass: flatten everything. Use &lt;code&gt;gym.spaces.Box&lt;/code&gt; with a fixed shape. Use &lt;code&gt;gym.spaces.Discrete&lt;/code&gt; for actions. You can make it fancy later once the training loop actually runs.&lt;/p&gt;

&lt;p&gt;The goal at setup is to get &lt;em&gt;something&lt;/em&gt; training, not to get the &lt;em&gt;right&lt;/em&gt; thing training.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Validate your environment before training
&lt;/h2&gt;

&lt;p&gt;This saved me from a week of confused debugging. Before running any RL algorithm on your env, run this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;gymnasium.utils.env_checker&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;check_env&lt;/span&gt;
&lt;span class="nf"&gt;check_env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will catch observation/action space mismatches, incorrect reset signatures, and a bunch of other subtle issues. It's not perfect but it's fast and it catches the obvious stuff.&lt;/p&gt;

&lt;p&gt;Also manually step through a few episodes with random actions and print everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;obs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action_space&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;obs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;obs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If this breaks, your RL algorithm will too — but with much less helpful error messages.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Local is good, but know its limits
&lt;/h2&gt;

&lt;p&gt;Local setup is great for iteration speed and not burning cloud credits. But there are limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parallelism is hard locally.&lt;/strong&gt; Most serious RL training benefits from running many environments in parallel. On a laptop or a single dev machine, you'll hit CPU/memory limits fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser-based environments are especially heavy.&lt;/strong&gt; Each environment instance might spin up its own browser process. 8 parallel envs = 8 browser processes. Your machine will notice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You'll eventually want to scale.&lt;/strong&gt; Whether that's a cloud VM, a university compute cluster, or an RL environment platform, local setup is a starting point — not the final destination.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm still figuring out the scaling part myself. If you've solved this in an interesting way, I'd genuinely like to hear it in the comments.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR  the checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Gymnasium&lt;/strong&gt;, not Gym. Read the migration docs.&lt;/li&gt;
&lt;li&gt;Isolate dependencies. Use &lt;code&gt;uv&lt;/code&gt; or a fresh &lt;code&gt;venv&lt;/code&gt; per project.&lt;/li&gt;
&lt;li&gt;Profile your &lt;code&gt;reset()&lt;/code&gt;. State leakage and slow resets are silent killers.&lt;/li&gt;
&lt;li&gt;Start with flat, boring observation and action spaces.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;check_env()&lt;/code&gt; before you touch an RL algorithm.&lt;/li&gt;
&lt;li&gt;Local is fine to start but plan for the day you need to scale.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you're setting up your first RL environment and hit something I didn't cover, drop it in the comments. I'm definitely still learning and would appreciate the discussion.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>machinelearning</category>
      <category>rlenvironement</category>
    </item>
  </channel>
</rss>
