Buckets:

hf-doc-build/doc-dev / openenv /pr_749 /en /guides /simulation-vs-production.html
HuggingFaceDocBuilder's picture
download
raw
41.8 kB
<meta charset="utf-8" /><meta name="hf:doc:metadata" content="{&quot;title&quot;:&quot;Simulation vs Production Mode&quot;,&quot;local&quot;:&quot;simulation-vs-production-mode&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;The Short Version&quot;,&quot;local&quot;:&quot;the-short-version&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Why OpenEnv Has Two Modes&quot;,&quot;local&quot;:&quot;why-openenv-has-two-modes&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Simulation Mode&quot;,&quot;local&quot;:&quot;simulation-mode&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;Simulation-Mode Routes&quot;,&quot;local&quot;:&quot;simulation-mode-routes&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3}],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Production Mode&quot;,&quot;local&quot;:&quot;production-mode&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;Production-Mode Routes&quot;,&quot;local&quot;:&quot;production-mode-routes&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3}],&quot;depth&quot;:2},{&quot;title&quot;:&quot;How MCP Fits Into Both Modes&quot;,&quot;local&quot;:&quot;how-mcp-fits-into-both-modes&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;In simulation mode&quot;,&quot;local&quot;:&quot;in-simulation-mode&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3},{&quot;title&quot;:&quot;In production mode&quot;,&quot;local&quot;:&quot;in-production-mode&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3}],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Server-Side Configuration&quot;,&quot;local&quot;:&quot;server-side-configuration&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Client-Side Patterns&quot;,&quot;local&quot;:&quot;client-side-patterns&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Mode-Aware Tools&quot;,&quot;local&quot;:&quot;mode-aware-tools&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Choosing the Right Mode&quot;,&quot;local&quot;:&quot;choosing-the-right-mode&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Common Mistake&quot;,&quot;local&quot;:&quot;common-mistake&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Related Reading&quot;,&quot;local&quot;:&quot;related-reading&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2}],&quot;depth&quot;:1}">
<link href="/docs/openenv/pr_749/en/_app/immutable/assets/0.e3b0c442.css" rel="modulepreload">
<link rel="modulepreload" href="/docs/openenv/pr_749/en/_app/immutable/entry/start.85477f45.js">
<link rel="modulepreload" href="/docs/openenv/pr_749/en/_app/immutable/chunks/scheduler.2b22cead.js">
<link rel="modulepreload" href="/docs/openenv/pr_749/en/_app/immutable/chunks/singletons.63566282.js">
<link rel="modulepreload" href="/docs/openenv/pr_749/en/_app/immutable/chunks/paths.dd876c7b.js">
<link rel="modulepreload" href="/docs/openenv/pr_749/en/_app/immutable/entry/app.51835dc5.js">
<link rel="modulepreload" href="/docs/openenv/pr_749/en/_app/immutable/chunks/preload-helper.0820fbc7.js">
<link rel="modulepreload" href="/docs/openenv/pr_749/en/_app/immutable/chunks/index.1a0e8013.js">
<link rel="modulepreload" href="/docs/openenv/pr_749/en/_app/immutable/nodes/0.167255c0.js">
<link rel="modulepreload" href="/docs/openenv/pr_749/en/_app/immutable/chunks/each.e59479a4.js">
<link rel="modulepreload" href="/docs/openenv/pr_749/en/_app/immutable/nodes/50.44944fd3.js">
<link rel="modulepreload" href="/docs/openenv/pr_749/en/_app/immutable/chunks/Heading.c0d3f116.js">
<link rel="modulepreload" href="/docs/openenv/pr_749/en/_app/immutable/chunks/MermaidChart.svelte_svelte_type_style_lang.21bcf336.js">
<link rel="modulepreload" href="/docs/openenv/pr_749/en/_app/immutable/chunks/CodeBlock.c8d73295.js"><!-- HEAD_svelte-u9bgzb_START --><meta name="hf:doc:metadata" content="{&quot;title&quot;:&quot;Simulation vs Production Mode&quot;,&quot;local&quot;:&quot;simulation-vs-production-mode&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;The Short Version&quot;,&quot;local&quot;:&quot;the-short-version&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Why OpenEnv Has Two Modes&quot;,&quot;local&quot;:&quot;why-openenv-has-two-modes&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Simulation Mode&quot;,&quot;local&quot;:&quot;simulation-mode&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;Simulation-Mode Routes&quot;,&quot;local&quot;:&quot;simulation-mode-routes&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3}],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Production Mode&quot;,&quot;local&quot;:&quot;production-mode&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;Production-Mode Routes&quot;,&quot;local&quot;:&quot;production-mode-routes&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3}],&quot;depth&quot;:2},{&quot;title&quot;:&quot;How MCP Fits Into Both Modes&quot;,&quot;local&quot;:&quot;how-mcp-fits-into-both-modes&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;In simulation mode&quot;,&quot;local&quot;:&quot;in-simulation-mode&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3},{&quot;title&quot;:&quot;In production mode&quot;,&quot;local&quot;:&quot;in-production-mode&quot;,&quot;sections&quot;:[],&quot;depth&quot;:3}],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Server-Side Configuration&quot;,&quot;local&quot;:&quot;server-side-configuration&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Client-Side Patterns&quot;,&quot;local&quot;:&quot;client-side-patterns&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Mode-Aware Tools&quot;,&quot;local&quot;:&quot;mode-aware-tools&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Choosing the Right Mode&quot;,&quot;local&quot;:&quot;choosing-the-right-mode&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Common Mistake&quot;,&quot;local&quot;:&quot;common-mistake&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Related Reading&quot;,&quot;local&quot;:&quot;related-reading&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2}],&quot;depth&quot;:1}"><!-- HEAD_svelte-u9bgzb_END --> <p></p> <div class="items-center shrink-0 min-w-[100px] max-sm:min-w-[50px] justify-end ml-auto flex" style="float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"><div class="inline-flex rounded-md max-sm:rounded-sm"><button class="inline-flex items-center gap-1 h-7 max-sm:h-7 px-2 max-sm:px-1.5 text-sm font-medium text-gray-800 border border-r-0 rounded-l-md max-sm:rounded-l-sm border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-live="polite"><span class="inline-flex items-center justify-center rounded-md p-0.5 max-sm:p-0 hover:text-gray-800 dark:hover:text-gray-200"><svg class="sm:size-3.5 size-3" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg></span> <span>Copy page</span></button> <button class="inline-flex items-center justify-center w-6 max-sm:w-5 h-7 max-sm:h-7 disabled:pointer-events-none text-sm text-gray-500 hover:text-gray-700 dark:hover:text-white rounded-r-md max-sm:rounded-r-sm border border-l transition border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-haspopup="menu" aria-expanded="false" aria-label="Open copy menu"><svg class="transition-transform text-gray-400 overflow-visible sm:size-3.5 size-3 rotate-0" width="1em" height="1em" viewBox="0 0 12 7" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L6 6L11 1" stroke="currentColor"></path></svg></button></div> </div> <h1 class="relative group"><a id="simulation-vs-production-mode" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#simulation-vs-production-mode"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Simulation vs Production Mode</span></h1> <p data-svelte-h="svelte-dvo29j">OpenEnv has two related but different ideas of “mode”:</p> <ul data-svelte-h="svelte-1l2sj1d"><li><strong>Simulation mode</strong> is for training, evaluation, and any workflow where the orchestrator controls episode boundaries.</li> <li><strong>Production mode</strong> is for exposing tools directly to clients over MCP without the training loop controlling <code>reset()</code>, <code>step()</code>, or <code>state()</code>.</li></ul> <p data-svelte-h="svelte-uls7em">This guide explains when to use each mode and how they interact with MCP tools.</p> <h2 class="relative group"><a id="the-short-version" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#the-short-version"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>The Short Version</span></h2> <p data-svelte-h="svelte-z9goup">Use <strong>simulation mode</strong> when you need:</p> <ul data-svelte-h="svelte-1qoabzs"><li><code>reset()</code>, <code>step()</code>, and <code>state()</code></li> <li>rewards and <code>done</code> signals</li> <li>one action per step in a controlled trajectory</li> <li>training or evaluation loops</li></ul> <p data-svelte-h="svelte-6zphc5">Use <strong>production mode</strong> when you need:</p> <ul data-svelte-h="svelte-cf5zc9"><li>direct MCP tool access</li> <li>no simulation control routes</li> <li>an agent or client talking to tools as a live service</li> <li>the environment to get out of the way and expose the tool interface directly</li></ul> <h2 class="relative group"><a id="why-openenv-has-two-modes" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#why-openenv-has-two-modes"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Why OpenEnv Has Two Modes</span></h2> <p data-svelte-h="svelte-1p9yoom">This split follows the core OpenEnv design principles:</p> <ul data-svelte-h="svelte-1vl1h9q"><li>training and evaluation need a controlled step loop</li> <li>production integrations need direct tool access</li> <li>the same environment should support both without inventing separate environment implementations</li></ul> <p data-svelte-h="svelte-eotcjb">In practice, simulation mode models <strong>trajectory time</strong> and production mode models <strong>service time</strong>.</p> <h2 class="relative group"><a id="simulation-mode" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#simulation-mode"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Simulation Mode</span></h2> <p data-svelte-h="svelte-1eabqyi">Simulation mode is the default environment-control model.</p> <p data-svelte-h="svelte-bbqxkl">In simulation mode, the orchestrator owns the episode:</p> <ol data-svelte-h="svelte-1in3f78"><li>Call <code>reset()</code> to start an episode.</li> <li>Call <code>step()</code> for each action.</li> <li>Read <code>reward</code>, <code>done</code>, and <code>state()</code> as part of the rollout.</li></ol> <p data-svelte-h="svelte-rlwopq">For environments with MCP tools, the canonical simulation-mode pattern is still <code>step()</code>.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class="language-python "><!-- HTML_TAG_START --><span class="hljs-keyword">from</span> openenv.core.env_server.mcp_types <span class="hljs-keyword">import</span> CallToolAction, ListToolsAction
obs = env.step(ListToolsAction())
obs = env.step(
CallToolAction(
tool_name=<span class="hljs-string">&quot;echo_message&quot;</span>,
arguments={<span class="hljs-string">&quot;message&quot;</span>: <span class="hljs-string">&quot;Hello from simulation mode&quot;</span>},
)
)<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-1a3iiqt">That pattern matters because the training loop can then:</p> <ul data-svelte-h="svelte-1awrs6u"><li>count tool usage as actions</li> <li>assign rewards to tool interactions</li> <li>record a full trajectory</li> <li>preserve the same <code>reset</code>/<code>step</code> contract across environments</li></ul> <h3 class="relative group"><a id="simulation-mode-routes" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#simulation-mode-routes"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Simulation-Mode Routes</span></h3> <p data-svelte-h="svelte-17t4s71">When an <code>HTTPEnvServer</code> registers routes in simulation mode, it exposes the full control surface:</p> <ul data-svelte-h="svelte-rdb7ib"><li><code>/ws</code></li> <li><code>/mcp</code></li> <li><code>/reset</code></li> <li><code>/step</code></li> <li><code>/state</code></li></ul> <p data-svelte-h="svelte-eygftw">This is the right mode for RL training infrastructure and for most environment testing.</p> <h2 class="relative group"><a id="production-mode" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#production-mode"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Production Mode</span></h2> <p data-svelte-h="svelte-1qa3n57">Production mode is for exposing tools directly.</p> <p data-svelte-h="svelte-18z6550">In production mode, clients should interact with MCP tools as a service instead of driving the environment through <code>reset()</code> and <code>step()</code> as a trajectory loop.</p> <p data-svelte-h="svelte-abh4b9">Production mode keeps the MCP surface and removes the HTTP simulation control routes.</p> <h3 class="relative group"><a id="production-mode-routes" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#production-mode-routes"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Production-Mode Routes</span></h3> <p data-svelte-h="svelte-15r4d6z">When an <code>HTTPEnvServer</code> registers routes in production mode, OpenEnv does <strong>not</strong> expose:</p> <ul data-svelte-h="svelte-1yz9gdt"><li><code>/reset</code></li> <li><code>/step</code></li> <li><code>/state</code></li></ul> <p data-svelte-h="svelte-175uo9h">It still registers <code>/ws</code>, because the WebSocket transport remains part of the infrastructure boundary.</p> <p data-svelte-h="svelte-1gcqkb8">That does <strong>not</strong> mean <code>/ws</code> should be exposed to agents.</p> <ul data-svelte-h="svelte-1vr4rxz"><li><code>/ws</code> is for orchestration and simulation control</li> <li><code>/mcp</code> is the agent-facing boundary</li> <li>production deployments should restrict <code>/ws</code> at the network, auth, or gateway layer if agents can reach the service directly</li></ul> <p data-svelte-h="svelte-16rxiv8">In other words, production mode removes the HTTP simulation endpoints, but operators must still treat <code>/ws</code> as infrastructure-only.</p> <p data-svelte-h="svelte-g5yr9m">This is the right mode when:</p> <ul data-svelte-h="svelte-1miqbor"><li>you are serving a tool-backed environment to external clients</li> <li>you do not want callers controlling episode boundaries</li> <li>the MCP interface is the product surface</li></ul> <h2 class="relative group"><a id="how-mcp-fits-into-both-modes" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#how-mcp-fits-into-both-modes"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>How MCP Fits Into Both Modes</span></h2> <p data-svelte-h="svelte-6xuplo">MCP is available in both modes, but the role is different.</p> <h3 class="relative group"><a id="in-simulation-mode" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#in-simulation-mode"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>In simulation mode</span></h3> <p data-svelte-h="svelte-10d20n">MCP tools are part of the environment action space.</p> <ul data-svelte-h="svelte-bebamp"><li>tool discovery can still happen</li> <li>tool calls are modeled as actions</li> <li>rewards and episode control remain in the OpenEnv loop</li></ul> <p data-svelte-h="svelte-1hzsg98">This is why examples such as <code>examples/echo_mcp_demo.py</code> use <code>ListToolsAction</code> and <code>CallToolAction</code> through <code>step()</code>.</p> <h3 class="relative group"><a id="in-production-mode" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#in-production-mode"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>In production mode</span></h3> <p data-svelte-h="svelte-14725po">MCP is the primary interface.</p> <ul data-svelte-h="svelte-1jxr5xb"><li>clients call tools directly</li> <li>OpenEnv does not present simulation-control endpoints</li> <li>the service behaves like a live MCP endpoint, not an RL rollout loop</li></ul> <h2 class="relative group"><a id="server-side-configuration" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#server-side-configuration"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Server-Side Configuration</span></h2> <p data-svelte-h="svelte-nkzmzj">The server-side switch happens when routes are registered.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class="language-python "><!-- HTML_TAG_START --><span class="hljs-keyword">from</span> fastapi <span class="hljs-keyword">import</span> FastAPI
<span class="hljs-keyword">from</span> openenv.core.env_server.http_server <span class="hljs-keyword">import</span> HTTPEnvServer
<span class="hljs-keyword">from</span> openenv.core.env_server.types <span class="hljs-keyword">import</span> ServerMode
app = FastAPI()
server = HTTPEnvServer(env=MyEnv, action_cls=MyAction, observation_cls=MyObservation)
<span class="hljs-comment"># Training / evaluation</span>
server.register_routes(app, mode=ServerMode.SIMULATION)
<span class="hljs-comment"># Direct MCP serving</span>
server.register_routes(app, mode=ServerMode.PRODUCTION)<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-r3xqhg"><code>ServerMode.SIMULATION</code> is the default route-registration mode.</p> <h2 class="relative group"><a id="client-side-patterns" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#client-side-patterns"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Client-Side Patterns</span></h2> <p data-svelte-h="svelte-brt86z">For simulation-style interaction, use a client that participates in the OpenEnv control loop.</p> <p data-svelte-h="svelte-kvfsh7">Examples:</p> <ul data-svelte-h="svelte-1phb2aj"><li>an environment-specific <code>EnvClient[...]</code> subclass</li> <li><code>GenericEnvClient(base_url=..., mode=&quot;simulation&quot;)</code></li> <li><code>step(ListToolsAction())</code> and <code>step(CallToolAction(...))</code> for MCP-backed environments</li></ul> <p data-svelte-h="svelte-1nmcekc">For direct MCP access, use an MCP-oriented client.</p> <p data-svelte-h="svelte-kvfsh7">Examples:</p> <ul data-svelte-h="svelte-1c55lxo"><li><code>MCPToolClient(base_url=...)</code></li> <li>environment-specific clients built on top of <code>MCPToolClient</code></li></ul> <p data-svelte-h="svelte-1ncgabo"><code>MCPToolClient</code> defaults to production mode and rejects <code>mode=&quot;simulation&quot;</code>.</p> <h2 class="relative group"><a id="mode-aware-tools" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#mode-aware-tools"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Mode-Aware Tools</span></h2> <p data-svelte-h="svelte-wy0qzd"><code>MCPEnvironment</code> supports mode-aware tool registration, so you can expose different tools depending on how the environment is being used.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class="language-python "><!-- HTML_TAG_START --><span class="hljs-keyword">class</span> <span class="hljs-title class_">MyEnv</span>(<span class="hljs-title class_ inherited__">MCPEnvironment</span>):
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self</span>):
<span class="hljs-meta"> @self.tool(<span class="hljs-params">mode=<span class="hljs-string">&quot;simulation&quot;</span></span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">score_candidate</span>(<span class="hljs-params">answer: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-keyword">return</span> <span class="hljs-string">&quot;Used inside the training loop&quot;</span>
<span class="hljs-meta"> @self.tool(<span class="hljs-params">mode=<span class="hljs-string">&quot;production&quot;</span></span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">lookup_docs</span>(<span class="hljs-params">query: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-keyword">return</span> <span class="hljs-string">&quot;Used by live MCP clients&quot;</span><!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-pc7wk2">This lets one environment preserve the training contract while still serving a cleaner production surface.</p> <h2 class="relative group"><a id="choosing-the-right-mode" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#choosing-the-right-mode"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Choosing the Right Mode</span></h2> <p data-svelte-h="svelte-8cnyn7">Choose <strong>simulation mode</strong> if the caller needs to control trajectories.</p> <p data-svelte-h="svelte-li2fdf">Typical cases:</p> <ul data-svelte-h="svelte-1xu5nth"><li>RL training</li> <li>policy evaluation</li> <li>benchmarking with rewards</li> <li>environments where tool calls should count as agent actions</li></ul> <p data-svelte-h="svelte-1ec374d">Choose <strong>production mode</strong> if the caller needs direct tool access.</p> <p data-svelte-h="svelte-li2fdf">Typical cases:</p> <ul data-svelte-h="svelte-x1uglo"><li>agent runtimes that speak MCP directly</li> <li>demos and hosted services</li> <li>integrations where <code>reset()</code> and <code>step()</code> should not be public</li></ul> <h2 class="relative group"><a id="common-mistake" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#common-mistake"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Common Mistake</span></h2> <p data-svelte-h="svelte-wji18l">The most common confusion is assuming that “MCP environment” automatically means “production mode only”.</p> <p data-svelte-h="svelte-1sn6l8d">That is not the model OpenEnv uses.</p> <ul data-svelte-h="svelte-t0t07c"><li>An MCP-backed environment can still run in <strong>simulation mode</strong>.</li> <li>In simulation mode, MCP tool interactions are represented through the OpenEnv step loop.</li> <li>Production mode changes the public control surface, not the underlying environment concept.</li></ul> <h2 class="relative group"><a id="related-reading" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#related-reading"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Related Reading</span></h2> <ul data-svelte-h="svelte-1cbte1w"><li><a href="../reference/core">Core API</a></li> <li><a href="../tutorials/index">Getting Started Tutorials</a></li> <li><a href="https://github.com/huggingface/OpenEnv/blob/main/rfcs/002-env-spec.md" rel="nofollow">RFC 002: Environment Spec</a></li> <li><a href="https://github.com/huggingface/OpenEnv/blob/main/rfcs/005-agentic-harnesses.md" rel="nofollow">RFC 005: Agentic Harnesses</a></li></ul> <a class="!text-gray-400 !no-underline text-sm flex items-center not-prose mt-4" href="https://github.com/huggingface/openenv/blob/main/docs/source/guides/simulation-vs-production.md" target="_blank"><svg class="mr-1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M31,16l-7,7l-1.41-1.41L28.17,16l-5.58-5.59L24,9l7,7z"></path><path d="M1,16l7-7l1.41,1.41L3.83,16l5.58,5.59L8,23l-7-7z"></path><path d="M12.419,25.484L17.639,6.552l1.932,0.518L14.351,26.002z"></path></svg> <span data-svelte-h="svelte-zjs2n5"><span class="underline">Update</span> on GitHub</span></a> <p></p>
<script>
{
__sveltekit_1qwoa43 = {
assets: "/docs/openenv/pr_749/en",
base: "/docs/openenv/pr_749/en",
env: {}
};
const element = document.currentScript.parentElement;
const data = [null,null];
Promise.all([
import("/docs/openenv/pr_749/en/_app/immutable/entry/start.85477f45.js"),
import("/docs/openenv/pr_749/en/_app/immutable/entry/app.51835dc5.js")
]).then(([kit, app]) => {
kit.start(app, element, {
node_ids: [0, 50],
data,
form: null,
error: null
});
});
}
</script>

Xet Storage Details

Size:
41.8 kB
·
Xet hash:
6431b6cd568cabc33eece5556fffc8e0fe6b8811b4daa6525c96feebd584820e

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.