Buckets:

HuggingFaceDocBuilder's picture
download
raw
27.4 kB
import{s as Jn,n as bn,o as jn}from"../chunks/scheduler.2b22cead.js";import{S as _n,i as Ln,e as o,s as i,c as r,h as gn,a,d as l,b as s,f as yn,g as d,j as p,k as xn,l as Pn,m as n,n as u,t as m,o as c,p as f}from"../chunks/index.1a0e8013.js";import{C as Hn,H as v,E as Un}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.3f8a6e16.js";import{C as Ml}from"../chunks/CodeBlock.7eb1eb33.js";function In(Tl){let M,ze,We,Ge,T,Ve,h,Xe,C,hl="OpenEnv has two related but different ideas of “mode”:",qe,w,Cl="<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>",Fe,$,wl="This guide explains when to use each mode and how they interact with MCP tools.",Ye,y,Qe,x,$l="Use <strong>simulation mode</strong> when you need:",Oe,J,yl="<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>",Ke,b,xl="Use <strong>production mode</strong> when you need:",De,j,Jl="<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>",et,_,tt,L,bl="This split follows the core OpenEnv design principles:",lt,g,jl="<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>",nt,P,_l="In practice, simulation mode models <strong>trajectory time</strong> and production mode models <strong>service time</strong>.",it,H,st,U,Ll="Simulation mode is the default environment-control model.",ot,I,gl="In simulation mode, the orchestrator owns the episode:",at,E,Pl="<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>",pt,k,Hl="For environments with MCP tools, the canonical simulation-mode pattern is still <code>step()</code>.",rt,B,dt,A,Ul="That pattern matters because the training loop can then:",ut,Z,Il="<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>",mt,S,ct,R,El="When an <code>HTTPEnvServer</code> registers routes in simulation mode, it exposes the full control surface:",ft,W,kl="<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>",vt,N,Bl="This is the right mode for RL training infrastructure and for most environment testing.",Mt,z,Tt,G,Al="Production mode is for exposing tools directly.",ht,V,Zl="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.",Ct,X,Sl="Production mode keeps the MCP surface and removes the HTTP simulation control routes.",wt,q,$t,F,Rl="When an <code>HTTPEnvServer</code> registers routes in production mode, OpenEnv does <strong>not</strong> expose:",yt,Y,Wl="<li><code>/reset</code></li> <li><code>/step</code></li> <li><code>/state</code></li>",xt,Q,Nl="It still registers <code>/ws</code>, because the WebSocket transport remains part of the infrastructure boundary.",Jt,O,zl="That does <strong>not</strong> mean <code>/ws</code> should be exposed to agents.",bt,K,Gl="<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>",jt,D,Vl="In other words, production mode removes the HTTP simulation endpoints, but operators must still treat <code>/ws</code> as infrastructure-only.",_t,ee,Xl="This is the right mode when:",Lt,te,ql="<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>",gt,le,Pt,ne,Fl="MCP is available in both modes, but the role is different.",Ht,ie,Ut,se,Yl="MCP tools are part of the environment action space.",It,oe,Ql="<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>",Et,ae,Ol="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>.",kt,pe,Bt,re,Kl="MCP is the primary interface.",At,de,Dl="<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>",Zt,ue,St,me,en="The server-side switch happens when routes are registered.",Rt,ce,Wt,fe,tn="<code>ServerMode.SIMULATION</code> is the default route-registration mode.",Nt,ve,zt,Me,ln="For simulation-style interaction, use a client that participates in the OpenEnv control loop.",Gt,Te,nn="Examples:",Vt,he,sn="<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>",Xt,Ce,on="For direct MCP access, use an MCP-oriented client.",qt,we,an="Examples:",Ft,$e,pn="<li><code>MCPToolClient(base_url=...)</code></li> <li>environment-specific clients built on top of <code>MCPToolClient</code></li>",Yt,ye,rn="<code>MCPToolClient</code> defaults to production mode and rejects <code>mode=&quot;simulation&quot;</code>.",Qt,xe,Ot,Je,dn="<code>MCPEnvironment</code> supports mode-aware tool registration, so you can expose different tools depending on how the environment is being used.",Kt,be,Dt,je,un="This lets one environment preserve the training contract while still serving a cleaner production surface.",el,_e,tl,Le,mn="Choose <strong>simulation mode</strong> if the caller needs to control trajectories.",ll,ge,cn="Typical cases:",nl,Pe,fn="<li>RL training</li> <li>policy evaluation</li> <li>benchmarking with rewards</li> <li>environments where tool calls should count as agent actions</li>",il,He,vn="Choose <strong>production mode</strong> if the caller needs direct tool access.",sl,Ue,Mn="Typical cases:",ol,Ie,Tn="<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>",al,Ee,pl,ke,hn="The most common confusion is assuming that “MCP environment” automatically means “production mode only”.",rl,Be,Cn="That is not the model OpenEnv uses.",dl,Ae,wn="<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,Ze,ml,Se,$n='<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>',cl,Re,fl,Ne,vl;return T=new Hn({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),h=new v({props:{title:"Simulation vs Production Mode",local:"simulation-vs-production-mode",headingTag:"h1"}}),y=new v({props:{title:"The Short Version",local:"the-short-version",headingTag:"h2"}}),_=new v({props:{title:"Why OpenEnv Has Two Modes",local:"why-openenv-has-two-modes",headingTag:"h2"}}),H=new v({props:{title:"Simulation Mode",local:"simulation-mode",headingTag:"h2"}}),B=new Ml({props:{code:"ZnJvbSUyMG9wZW5lbnYuY29yZS5lbnZfc2VydmVyLm1jcF90eXBlcyUyMGltcG9ydCUyMENhbGxUb29sQWN0aW9uJTJDJTIwTGlzdFRvb2xzQWN0aW9uJTBBJTBBb2JzJTIwJTNEJTIwZW52LnN0ZXAoTGlzdFRvb2xzQWN0aW9uKCkpJTBBJTBBb2JzJTIwJTNEJTIwZW52LnN0ZXAoJTBBJTIwJTIwJTIwJTIwQ2FsbFRvb2xBY3Rpb24oJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdG9vbF9uYW1lJTNEJTIyZWNob19tZXNzYWdlJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYXJndW1lbnRzJTNEJTdCJTIybWVzc2FnZSUyMiUzQSUyMCUyMkhlbGxvJTIwZnJvbSUyMHNpbXVsYXRpb24lMjBtb2RlJTIyJTdEJTJDJTBBJTIwJTIwJTIwJTIwKSUwQSk=",highlighted:`<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>},
)
)`,lang:"python",wrap:!1}}),S=new v({props:{title:"Simulation-Mode Routes",local:"simulation-mode-routes",headingTag:"h3"}}),z=new v({props:{title:"Production Mode",local:"production-mode",headingTag:"h2"}}),q=new v({props:{title:"Production-Mode Routes",local:"production-mode-routes",headingTag:"h3"}}),le=new v({props:{title:"How MCP Fits Into Both Modes",local:"how-mcp-fits-into-both-modes",headingTag:"h2"}}),ie=new v({props:{title:"In simulation mode",local:"in-simulation-mode",headingTag:"h3"}}),pe=new v({props:{title:"In production mode",local:"in-production-mode",headingTag:"h3"}}),ue=new v({props:{title:"Server-Side Configuration",local:"server-side-configuration",headingTag:"h2"}}),ce=new Ml({props:{code:"ZnJvbSUyMGZhc3RhcGklMjBpbXBvcnQlMjBGYXN0QVBJJTBBJTBBZnJvbSUyMG9wZW5lbnYuY29yZS5lbnZfc2VydmVyLmh0dHBfc2VydmVyJTIwaW1wb3J0JTIwSFRUUEVudlNlcnZlciUwQWZyb20lMjBvcGVuZW52LmNvcmUuZW52X3NlcnZlci50eXBlcyUyMGltcG9ydCUyMFNlcnZlck1vZGUlMEElMEFhcHAlMjAlM0QlMjBGYXN0QVBJKCklMEFzZXJ2ZXIlMjAlM0QlMjBIVFRQRW52U2VydmVyKGVudiUzRE15RW52JTJDJTIwYWN0aW9uX2NscyUzRE15QWN0aW9uJTJDJTIwb2JzZXJ2YXRpb25fY2xzJTNETXlPYnNlcnZhdGlvbiklMEElMEElMjMlMjBUcmFpbmluZyUyMCUyRiUyMGV2YWx1YXRpb24lMEFzZXJ2ZXIucmVnaXN0ZXJfcm91dGVzKGFwcCUyQyUyMG1vZGUlM0RTZXJ2ZXJNb2RlLlNJTVVMQVRJT04pJTBBJTBBJTIzJTIwRGlyZWN0JTIwTUNQJTIwc2VydmluZyUwQXNlcnZlci5yZWdpc3Rlcl9yb3V0ZXMoYXBwJTJDJTIwbW9kZSUzRFNlcnZlck1vZGUuUFJPRFVDVElPTik=",highlighted:`<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)`,lang:"python",wrap:!1}}),ve=new v({props:{title:"Client-Side Patterns",local:"client-side-patterns",headingTag:"h2"}}),xe=new v({props:{title:"Mode-Aware Tools",local:"mode-aware-tools",headingTag:"h2"}}),be=new Ml({props:{code:"Y2xhc3MlMjBNeUVudihNQ1BFbnZpcm9ubWVudCklM0ElMEElMjAlMjAlMjAlMjBkZWYlMjBfX2luaXRfXyhzZWxmKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU0MHNlbGYudG9vbChtb2RlJTNEJTIyc2ltdWxhdGlvbiUyMiklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkZWYlMjBzY29yZV9jYW5kaWRhdGUoYW5zd2VyJTNBJTIwc3RyKSUyMC0lM0UlMjBzdHIlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjAlMjJVc2VkJTIwaW5zaWRlJTIwdGhlJTIwdHJhaW5pbmclMjBsb29wJTIyJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTQwc2VsZi50b29sKG1vZGUlM0QlMjJwcm9kdWN0aW9uJTIyKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGRlZiUyMGxvb2t1cF9kb2NzKHF1ZXJ5JTNBJTIwc3RyKSUyMC0lM0UlMjBzdHIlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjAlMjJVc2VkJTIwYnklMjBsaXZlJTIwTUNQJTIwY2xpZW50cyUyMg==",highlighted:`<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>`,lang:"python",wrap:!1}}),_e=new v({props:{title:"Choosing the Right Mode",local:"choosing-the-right-mode",headingTag:"h2"}}),Ee=new v({props:{title:"Common Mistake",local:"common-mistake",headingTag:"h2"}}),Ze=new v({props:{title:"Related Reading",local:"related-reading",headingTag:"h2"}}),Re=new Un({props:{source:"https://github.com/huggingface/openenv/blob/main/docs/source/guides/simulation-vs-production.md"}}),{c(){M=o("meta"),ze=i(),We=o("p"),Ge=i(),r(T.$$.fragment),Ve=i(),r(h.$$.fragment),Xe=i(),C=o("p"),C.textContent=hl,qe=i(),w=o("ul"),w.innerHTML=Cl,Fe=i(),$=o("p"),$.textContent=wl,Ye=i(),r(y.$$.fragment),Qe=i(),x=o("p"),x.innerHTML=$l,Oe=i(),J=o("ul"),J.innerHTML=yl,Ke=i(),b=o("p"),b.innerHTML=xl,De=i(),j=o("ul"),j.innerHTML=Jl,et=i(),r(_.$$.fragment),tt=i(),L=o("p"),L.textContent=bl,lt=i(),g=o("ul"),g.innerHTML=jl,nt=i(),P=o("p"),P.innerHTML=_l,it=i(),r(H.$$.fragment),st=i(),U=o("p"),U.textContent=Ll,ot=i(),I=o("p"),I.textContent=gl,at=i(),E=o("ol"),E.innerHTML=Pl,pt=i(),k=o("p"),k.innerHTML=Hl,rt=i(),r(B.$$.fragment),dt=i(),A=o("p"),A.textContent=Ul,ut=i(),Z=o("ul"),Z.innerHTML=Il,mt=i(),r(S.$$.fragment),ct=i(),R=o("p"),R.innerHTML=El,ft=i(),W=o("ul"),W.innerHTML=kl,vt=i(),N=o("p"),N.textContent=Bl,Mt=i(),r(z.$$.fragment),Tt=i(),G=o("p"),G.textContent=Al,ht=i(),V=o("p"),V.innerHTML=Zl,Ct=i(),X=o("p"),X.textContent=Sl,wt=i(),r(q.$$.fragment),$t=i(),F=o("p"),F.innerHTML=Rl,yt=i(),Y=o("ul"),Y.innerHTML=Wl,xt=i(),Q=o("p"),Q.innerHTML=Nl,Jt=i(),O=o("p"),O.innerHTML=zl,bt=i(),K=o("ul"),K.innerHTML=Gl,jt=i(),D=o("p"),D.innerHTML=Vl,_t=i(),ee=o("p"),ee.textContent=Xl,Lt=i(),te=o("ul"),te.innerHTML=ql,gt=i(),r(le.$$.fragment),Pt=i(),ne=o("p"),ne.textContent=Fl,Ht=i(),r(ie.$$.fragment),Ut=i(),se=o("p"),se.textContent=Yl,It=i(),oe=o("ul"),oe.innerHTML=Ql,Et=i(),ae=o("p"),ae.innerHTML=Ol,kt=i(),r(pe.$$.fragment),Bt=i(),re=o("p"),re.textContent=Kl,At=i(),de=o("ul"),de.innerHTML=Dl,Zt=i(),r(ue.$$.fragment),St=i(),me=o("p"),me.textContent=en,Rt=i(),r(ce.$$.fragment),Wt=i(),fe=o("p"),fe.innerHTML=tn,Nt=i(),r(ve.$$.fragment),zt=i(),Me=o("p"),Me.textContent=ln,Gt=i(),Te=o("p"),Te.textContent=nn,Vt=i(),he=o("ul"),he.innerHTML=sn,Xt=i(),Ce=o("p"),Ce.textContent=on,qt=i(),we=o("p"),we.textContent=an,Ft=i(),$e=o("ul"),$e.innerHTML=pn,Yt=i(),ye=o("p"),ye.innerHTML=rn,Qt=i(),r(xe.$$.fragment),Ot=i(),Je=o("p"),Je.innerHTML=dn,Kt=i(),r(be.$$.fragment),Dt=i(),je=o("p"),je.textContent=un,el=i(),r(_e.$$.fragment),tl=i(),Le=o("p"),Le.innerHTML=mn,ll=i(),ge=o("p"),ge.textContent=cn,nl=i(),Pe=o("ul"),Pe.innerHTML=fn,il=i(),He=o("p"),He.innerHTML=vn,sl=i(),Ue=o("p"),Ue.textContent=Mn,ol=i(),Ie=o("ul"),Ie.innerHTML=Tn,al=i(),r(Ee.$$.fragment),pl=i(),ke=o("p"),ke.textContent=hn,rl=i(),Be=o("p"),Be.textContent=Cn,dl=i(),Ae=o("ul"),Ae.innerHTML=wn,ul=i(),r(Ze.$$.fragment),ml=i(),Se=o("ul"),Se.innerHTML=$n,cl=i(),r(Re.$$.fragment),fl=i(),Ne=o("p"),this.h()},l(e){const t=gn("svelte-u9bgzb",document.head);M=a(t,"META",{name:!0,content:!0}),t.forEach(l),ze=s(e),We=a(e,"P",{}),yn(We).forEach(l),Ge=s(e),d(T.$$.fragment,e),Ve=s(e),d(h.$$.fragment,e),Xe=s(e),C=a(e,"P",{"data-svelte-h":!0}),p(C)!=="svelte-dvo29j"&&(C.textContent=hl),qe=s(e),w=a(e,"UL",{"data-svelte-h":!0}),p(w)!=="svelte-1l2sj1d"&&(w.innerHTML=Cl),Fe=s(e),$=a(e,"P",{"data-svelte-h":!0}),p($)!=="svelte-uls7em"&&($.textContent=wl),Ye=s(e),d(y.$$.fragment,e),Qe=s(e),x=a(e,"P",{"data-svelte-h":!0}),p(x)!=="svelte-z9goup"&&(x.innerHTML=$l),Oe=s(e),J=a(e,"UL",{"data-svelte-h":!0}),p(J)!=="svelte-1qoabzs"&&(J.innerHTML=yl),Ke=s(e),b=a(e,"P",{"data-svelte-h":!0}),p(b)!=="svelte-6zphc5"&&(b.innerHTML=xl),De=s(e),j=a(e,"UL",{"data-svelte-h":!0}),p(j)!=="svelte-cf5zc9"&&(j.innerHTML=Jl),et=s(e),d(_.$$.fragment,e),tt=s(e),L=a(e,"P",{"data-svelte-h":!0}),p(L)!=="svelte-1p9yoom"&&(L.textContent=bl),lt=s(e),g=a(e,"UL",{"data-svelte-h":!0}),p(g)!=="svelte-1vl1h9q"&&(g.innerHTML=jl),nt=s(e),P=a(e,"P",{"data-svelte-h":!0}),p(P)!=="svelte-eotcjb"&&(P.innerHTML=_l),it=s(e),d(H.$$.fragment,e),st=s(e),U=a(e,"P",{"data-svelte-h":!0}),p(U)!=="svelte-1eabqyi"&&(U.textContent=Ll),ot=s(e),I=a(e,"P",{"data-svelte-h":!0}),p(I)!=="svelte-bbqxkl"&&(I.textContent=gl),at=s(e),E=a(e,"OL",{"data-svelte-h":!0}),p(E)!=="svelte-1in3f78"&&(E.innerHTML=Pl),pt=s(e),k=a(e,"P",{"data-svelte-h":!0}),p(k)!=="svelte-rlwopq"&&(k.innerHTML=Hl),rt=s(e),d(B.$$.fragment,e),dt=s(e),A=a(e,"P",{"data-svelte-h":!0}),p(A)!=="svelte-1a3iiqt"&&(A.textContent=Ul),ut=s(e),Z=a(e,"UL",{"data-svelte-h":!0}),p(Z)!=="svelte-1awrs6u"&&(Z.innerHTML=Il),mt=s(e),d(S.$$.fragment,e),ct=s(e),R=a(e,"P",{"data-svelte-h":!0}),p(R)!=="svelte-17t4s71"&&(R.innerHTML=El),ft=s(e),W=a(e,"UL",{"data-svelte-h":!0}),p(W)!=="svelte-rdb7ib"&&(W.innerHTML=kl),vt=s(e),N=a(e,"P",{"data-svelte-h":!0}),p(N)!=="svelte-eygftw"&&(N.textContent=Bl),Mt=s(e),d(z.$$.fragment,e),Tt=s(e),G=a(e,"P",{"data-svelte-h":!0}),p(G)!=="svelte-1qa3n57"&&(G.textContent=Al),ht=s(e),V=a(e,"P",{"data-svelte-h":!0}),p(V)!=="svelte-18z6550"&&(V.innerHTML=Zl),Ct=s(e),X=a(e,"P",{"data-svelte-h":!0}),p(X)!=="svelte-abh4b9"&&(X.textContent=Sl),wt=s(e),d(q.$$.fragment,e),$t=s(e),F=a(e,"P",{"data-svelte-h":!0}),p(F)!=="svelte-15r4d6z"&&(F.innerHTML=Rl),yt=s(e),Y=a(e,"UL",{"data-svelte-h":!0}),p(Y)!=="svelte-1yz9gdt"&&(Y.innerHTML=Wl),xt=s(e),Q=a(e,"P",{"data-svelte-h":!0}),p(Q)!=="svelte-175uo9h"&&(Q.innerHTML=Nl),Jt=s(e),O=a(e,"P",{"data-svelte-h":!0}),p(O)!=="svelte-1gcqkb8"&&(O.innerHTML=zl),bt=s(e),K=a(e,"UL",{"data-svelte-h":!0}),p(K)!=="svelte-1vr4rxz"&&(K.innerHTML=Gl),jt=s(e),D=a(e,"P",{"data-svelte-h":!0}),p(D)!=="svelte-16rxiv8"&&(D.innerHTML=Vl),_t=s(e),ee=a(e,"P",{"data-svelte-h":!0}),p(ee)!=="svelte-g5yr9m"&&(ee.textContent=Xl),Lt=s(e),te=a(e,"UL",{"data-svelte-h":!0}),p(te)!=="svelte-1miqbor"&&(te.innerHTML=ql),gt=s(e),d(le.$$.fragment,e),Pt=s(e),ne=a(e,"P",{"data-svelte-h":!0}),p(ne)!=="svelte-6xuplo"&&(ne.textContent=Fl),Ht=s(e),d(ie.$$.fragment,e),Ut=s(e),se=a(e,"P",{"data-svelte-h":!0}),p(se)!=="svelte-10d20n"&&(se.textContent=Yl),It=s(e),oe=a(e,"UL",{"data-svelte-h":!0}),p(oe)!=="svelte-bebamp"&&(oe.innerHTML=Ql),Et=s(e),ae=a(e,"P",{"data-svelte-h":!0}),p(ae)!=="svelte-1hzsg98"&&(ae.innerHTML=Ol),kt=s(e),d(pe.$$.fragment,e),Bt=s(e),re=a(e,"P",{"data-svelte-h":!0}),p(re)!=="svelte-14725po"&&(re.textContent=Kl),At=s(e),de=a(e,"UL",{"data-svelte-h":!0}),p(de)!=="svelte-1jxr5xb"&&(de.innerHTML=Dl),Zt=s(e),d(ue.$$.fragment,e),St=s(e),me=a(e,"P",{"data-svelte-h":!0}),p(me)!=="svelte-nkzmzj"&&(me.textContent=en),Rt=s(e),d(ce.$$.fragment,e),Wt=s(e),fe=a(e,"P",{"data-svelte-h":!0}),p(fe)!=="svelte-r3xqhg"&&(fe.innerHTML=tn),Nt=s(e),d(ve.$$.fragment,e),zt=s(e),Me=a(e,"P",{"data-svelte-h":!0}),p(Me)!=="svelte-brt86z"&&(Me.textContent=ln),Gt=s(e),Te=a(e,"P",{"data-svelte-h":!0}),p(Te)!=="svelte-kvfsh7"&&(Te.textContent=nn),Vt=s(e),he=a(e,"UL",{"data-svelte-h":!0}),p(he)!=="svelte-1phb2aj"&&(he.innerHTML=sn),Xt=s(e),Ce=a(e,"P",{"data-svelte-h":!0}),p(Ce)!=="svelte-1nmcekc"&&(Ce.textContent=on),qt=s(e),we=a(e,"P",{"data-svelte-h":!0}),p(we)!=="svelte-kvfsh7"&&(we.textContent=an),Ft=s(e),$e=a(e,"UL",{"data-svelte-h":!0}),p($e)!=="svelte-1c55lxo"&&($e.innerHTML=pn),Yt=s(e),ye=a(e,"P",{"data-svelte-h":!0}),p(ye)!=="svelte-1ncgabo"&&(ye.innerHTML=rn),Qt=s(e),d(xe.$$.fragment,e),Ot=s(e),Je=a(e,"P",{"data-svelte-h":!0}),p(Je)!=="svelte-wy0qzd"&&(Je.innerHTML=dn),Kt=s(e),d(be.$$.fragment,e),Dt=s(e),je=a(e,"P",{"data-svelte-h":!0}),p(je)!=="svelte-pc7wk2"&&(je.textContent=un),el=s(e),d(_e.$$.fragment,e),tl=s(e),Le=a(e,"P",{"data-svelte-h":!0}),p(Le)!=="svelte-8cnyn7"&&(Le.innerHTML=mn),ll=s(e),ge=a(e,"P",{"data-svelte-h":!0}),p(ge)!=="svelte-li2fdf"&&(ge.textContent=cn),nl=s(e),Pe=a(e,"UL",{"data-svelte-h":!0}),p(Pe)!=="svelte-1xu5nth"&&(Pe.innerHTML=fn),il=s(e),He=a(e,"P",{"data-svelte-h":!0}),p(He)!=="svelte-1ec374d"&&(He.innerHTML=vn),sl=s(e),Ue=a(e,"P",{"data-svelte-h":!0}),p(Ue)!=="svelte-li2fdf"&&(Ue.textContent=Mn),ol=s(e),Ie=a(e,"UL",{"data-svelte-h":!0}),p(Ie)!=="svelte-x1uglo"&&(Ie.innerHTML=Tn),al=s(e),d(Ee.$$.fragment,e),pl=s(e),ke=a(e,"P",{"data-svelte-h":!0}),p(ke)!=="svelte-wji18l"&&(ke.textContent=hn),rl=s(e),Be=a(e,"P",{"data-svelte-h":!0}),p(Be)!=="svelte-1sn6l8d"&&(Be.textContent=Cn),dl=s(e),Ae=a(e,"UL",{"data-svelte-h":!0}),p(Ae)!=="svelte-t0t07c"&&(Ae.innerHTML=wn),ul=s(e),d(Ze.$$.fragment,e),ml=s(e),Se=a(e,"UL",{"data-svelte-h":!0}),p(Se)!=="svelte-1cbte1w"&&(Se.innerHTML=$n),cl=s(e),d(Re.$$.fragment,e),fl=s(e),Ne=a(e,"P",{}),yn(Ne).forEach(l),this.h()},h(){xn(M,"name","hf:doc:metadata"),xn(M,"content",En)},m(e,t){Pn(document.head,M),n(e,ze,t),n(e,We,t),n(e,Ge,t),u(T,e,t),n(e,Ve,t),u(h,e,t),n(e,Xe,t),n(e,C,t),n(e,qe,t),n(e,w,t),n(e,Fe,t),n(e,$,t),n(e,Ye,t),u(y,e,t),n(e,Qe,t),n(e,x,t),n(e,Oe,t),n(e,J,t),n(e,Ke,t),n(e,b,t),n(e,De,t),n(e,j,t),n(e,et,t),u(_,e,t),n(e,tt,t),n(e,L,t),n(e,lt,t),n(e,g,t),n(e,nt,t),n(e,P,t),n(e,it,t),u(H,e,t),n(e,st,t),n(e,U,t),n(e,ot,t),n(e,I,t),n(e,at,t),n(e,E,t),n(e,pt,t),n(e,k,t),n(e,rt,t),u(B,e,t),n(e,dt,t),n(e,A,t),n(e,ut,t),n(e,Z,t),n(e,mt,t),u(S,e,t),n(e,ct,t),n(e,R,t),n(e,ft,t),n(e,W,t),n(e,vt,t),n(e,N,t),n(e,Mt,t),u(z,e,t),n(e,Tt,t),n(e,G,t),n(e,ht,t),n(e,V,t),n(e,Ct,t),n(e,X,t),n(e,wt,t),u(q,e,t),n(e,$t,t),n(e,F,t),n(e,yt,t),n(e,Y,t),n(e,xt,t),n(e,Q,t),n(e,Jt,t),n(e,O,t),n(e,bt,t),n(e,K,t),n(e,jt,t),n(e,D,t),n(e,_t,t),n(e,ee,t),n(e,Lt,t),n(e,te,t),n(e,gt,t),u(le,e,t),n(e,Pt,t),n(e,ne,t),n(e,Ht,t),u(ie,e,t),n(e,Ut,t),n(e,se,t),n(e,It,t),n(e,oe,t),n(e,Et,t),n(e,ae,t),n(e,kt,t),u(pe,e,t),n(e,Bt,t),n(e,re,t),n(e,At,t),n(e,de,t),n(e,Zt,t),u(ue,e,t),n(e,St,t),n(e,me,t),n(e,Rt,t),u(ce,e,t),n(e,Wt,t),n(e,fe,t),n(e,Nt,t),u(ve,e,t),n(e,zt,t),n(e,Me,t),n(e,Gt,t),n(e,Te,t),n(e,Vt,t),n(e,he,t),n(e,Xt,t),n(e,Ce,t),n(e,qt,t),n(e,we,t),n(e,Ft,t),n(e,$e,t),n(e,Yt,t),n(e,ye,t),n(e,Qt,t),u(xe,e,t),n(e,Ot,t),n(e,Je,t),n(e,Kt,t),u(be,e,t),n(e,Dt,t),n(e,je,t),n(e,el,t),u(_e,e,t),n(e,tl,t),n(e,Le,t),n(e,ll,t),n(e,ge,t),n(e,nl,t),n(e,Pe,t),n(e,il,t),n(e,He,t),n(e,sl,t),n(e,Ue,t),n(e,ol,t),n(e,Ie,t),n(e,al,t),u(Ee,e,t),n(e,pl,t),n(e,ke,t),n(e,rl,t),n(e,Be,t),n(e,dl,t),n(e,Ae,t),n(e,ul,t),u(Ze,e,t),n(e,ml,t),n(e,Se,t),n(e,cl,t),u(Re,e,t),n(e,fl,t),n(e,Ne,t),vl=!0},p:bn,i(e){vl||(m(T.$$.fragment,e),m(h.$$.fragment,e),m(y.$$.fragment,e),m(_.$$.fragment,e),m(H.$$.fragment,e),m(B.$$.fragment,e),m(S.$$.fragment,e),m(z.$$.fragment,e),m(q.$$.fragment,e),m(le.$$.fragment,e),m(ie.$$.fragment,e),m(pe.$$.fragment,e),m(ue.$$.fragment,e),m(ce.$$.fragment,e),m(ve.$$.fragment,e),m(xe.$$.fragment,e),m(be.$$.fragment,e),m(_e.$$.fragment,e),m(Ee.$$.fragment,e),m(Ze.$$.fragment,e),m(Re.$$.fragment,e),vl=!0)},o(e){c(T.$$.fragment,e),c(h.$$.fragment,e),c(y.$$.fragment,e),c(_.$$.fragment,e),c(H.$$.fragment,e),c(B.$$.fragment,e),c(S.$$.fragment,e),c(z.$$.fragment,e),c(q.$$.fragment,e),c(le.$$.fragment,e),c(ie.$$.fragment,e),c(pe.$$.fragment,e),c(ue.$$.fragment,e),c(ce.$$.fragment,e),c(ve.$$.fragment,e),c(xe.$$.fragment,e),c(be.$$.fragment,e),c(_e.$$.fragment,e),c(Ee.$$.fragment,e),c(Ze.$$.fragment,e),c(Re.$$.fragment,e),vl=!1},d(e){e&&(l(ze),l(We),l(Ge),l(Ve),l(Xe),l(C),l(qe),l(w),l(Fe),l($),l(Ye),l(Qe),l(x),l(Oe),l(J),l(Ke),l(b),l(De),l(j),l(et),l(tt),l(L),l(lt),l(g),l(nt),l(P),l(it),l(st),l(U),l(ot),l(I),l(at),l(E),l(pt),l(k),l(rt),l(dt),l(A),l(ut),l(Z),l(mt),l(ct),l(R),l(ft),l(W),l(vt),l(N),l(Mt),l(Tt),l(G),l(ht),l(V),l(Ct),l(X),l(wt),l($t),l(F),l(yt),l(Y),l(xt),l(Q),l(Jt),l(O),l(bt),l(K),l(jt),l(D),l(_t),l(ee),l(Lt),l(te),l(gt),l(Pt),l(ne),l(Ht),l(Ut),l(se),l(It),l(oe),l(Et),l(ae),l(kt),l(Bt),l(re),l(At),l(de),l(Zt),l(St),l(me),l(Rt),l(Wt),l(fe),l(Nt),l(zt),l(Me),l(Gt),l(Te),l(Vt),l(he),l(Xt),l(Ce),l(qt),l(we),l(Ft),l($e),l(Yt),l(ye),l(Qt),l(Ot),l(Je),l(Kt),l(Dt),l(je),l(el),l(tl),l(Le),l(ll),l(ge),l(nl),l(Pe),l(il),l(He),l(sl),l(Ue),l(ol),l(Ie),l(al),l(pl),l(ke),l(rl),l(Be),l(dl),l(Ae),l(ul),l(ml),l(Se),l(cl),l(fl),l(Ne)),l(M),f(T,e),f(h,e),f(y,e),f(_,e),f(H,e),f(B,e),f(S,e),f(z,e),f(q,e),f(le,e),f(ie,e),f(pe,e),f(ue,e),f(ce,e),f(ve,e),f(xe,e),f(be,e),f(_e,e),f(Ee,e),f(Ze,e),f(Re,e)}}}const En='{"title":"Simulation vs Production Mode","local":"simulation-vs-production-mode","sections":[{"title":"The Short Version","local":"the-short-version","sections":[],"depth":2},{"title":"Why OpenEnv Has Two Modes","local":"why-openenv-has-two-modes","sections":[],"depth":2},{"title":"Simulation Mode","local":"simulation-mode","sections":[{"title":"Simulation-Mode Routes","local":"simulation-mode-routes","sections":[],"depth":3}],"depth":2},{"title":"Production Mode","local":"production-mode","sections":[{"title":"Production-Mode Routes","local":"production-mode-routes","sections":[],"depth":3}],"depth":2},{"title":"How MCP Fits Into Both Modes","local":"how-mcp-fits-into-both-modes","sections":[{"title":"In simulation mode","local":"in-simulation-mode","sections":[],"depth":3},{"title":"In production mode","local":"in-production-mode","sections":[],"depth":3}],"depth":2},{"title":"Server-Side Configuration","local":"server-side-configuration","sections":[],"depth":2},{"title":"Client-Side Patterns","local":"client-side-patterns","sections":[],"depth":2},{"title":"Mode-Aware Tools","local":"mode-aware-tools","sections":[],"depth":2},{"title":"Choosing the Right Mode","local":"choosing-the-right-mode","sections":[],"depth":2},{"title":"Common Mistake","local":"common-mistake","sections":[],"depth":2},{"title":"Related Reading","local":"related-reading","sections":[],"depth":2}],"depth":1}';function kn(Tl){return jn(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class Rn extends _n{constructor(M){super(),Ln(this,M,kn,In,Jn,{})}}export{Rn as component};

Xet Storage Details

Size:
27.4 kB
·
Xet hash:
c914b4e92c2d1ff81dbe7958be2dff1785bac36ddaa34eec431e511e06c2a43b

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