Buckets:
| import{s as wt,n as Jt,o as Tt}from"../chunks/scheduler.2b22cead.js";import{S as Ut,i as ft,e as c,s,c as i,h as jt,a as u,d as t,b as a,f as dt,g as p,j as y,k as yt,l as ht,m as n,n as m,t as r,o as M,p as o}from"../chunks/index.1a0e8013.js";import{C as bt,H as d,E as $t}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.e853488c.js";import{C as w}from"../chunks/CodeBlock.c9342566.js";function Ct(_l){let J,Ze,Ie,Be,T,xe,U,Qe,f,zl='A multi-agent snake game environment for OpenEnv, based on <a href="https://github.com/kc-ml2/marlenv" rel="nofollow">marlenv</a>’s Snake-v1. This environment provides a single-agent interface to the classic snake game where the snake must navigate a grid, eat fruits, and avoid walls and its own body.',We,j,Ae,h,Yl="The Snake environment wraps the marlenv Snake-v1 environment to provide a clean OpenEnv-compatible interface. Multiple snakes can battle on a fixed size grid map, but this implementation focuses on single-agent gameplay.",Se,b,Ge,$,Fl=`<li><strong>Grid-based gameplay</strong>: Configurable grid size (default: 20x20)</li> <li><strong>Fruit collection</strong>: Snake grows when eating fruits</li> <li><strong>Partial observability</strong>: Optional vision range for limited field of view</li> <li><strong>Customizable rewards</strong>: Configurable reward function for different game aspects</li> <li><strong>Two control modes</strong>: | |
| <ul><li><code>snake</code>: Relative actions (turn left/right)</li> <li><code>human</code>: Global directions (up/down/left/right)</li></ul></li>`,Ee,C,Ve,g,Ll="<li>Snake dies when its head hits a wall or its own body</li> <li>Snake grows by one unit when it eats a fruit</li> <li>Episode ends when the snake dies or reaches maximum steps</li> <li>Rewards can be customized for: eating fruits, survival time, and death penalty</li>",Ne,v,Re,I,Xe,k,_e,Z,ze,B,Ye,x,Hl="Then connect from another terminal:",Fe,Q,Le,W,He,A,Dl="The action space depends on the <code>observer</code> mode:",De,S,qe,G,ql="Relative actions based on current direction:",Pe,E,Pl="<li><code>0</code>: No-op (continue in same direction)</li> <li><code>1</code>: Turn left (90 degrees counterclockwise)</li> <li><code>2</code>: Turn right (90 degrees clockwise)</li>",Ke,V,Oe,N,Kl="Global directional actions:",el,R,Ol="<li><code>0</code>: No-op</li> <li><code>1</code>: Move left</li> <li><code>2</code>: Move right</li> <li><code>3</code>: Move down</li> <li><code>4</code>: Move up</li>",ll,X,tl,_,et="Each observation includes:",nl,z,lt="<li><code>grid</code>: The full game grid as a 2D array (height × width)</li> <li><code>observation</code>: Encoded observation based on vision range</li> <li><code>episode_score</code>: Cumulative score in current episode</li> <li><code>episode_steps</code>: Number of steps taken</li> <li><code>episode_fruits</code>: Number of fruits eaten</li> <li><code>episode_kills</code>: Number of kills (always 0 in single-agent mode)</li> <li><code>alive</code>: Whether the snake is still alive</li>",sl,Y,al,F,il,L,pl,H,ml,D,tt="You can customize the reward function to encourage different behaviors:",rl,q,Ml,P,ol,K,cl,O,nt="From the repository root:",ul,ee,dl,le,st="The Dockerfile uses <code>pip install</code> with <code>requirements.txt</code> for maximum compatibility.",yl,te,wl,ne,Jl,se,Tl,ae,at="When <code>ENABLE_WEB_INTERFACE=true</code> is set, you can access the web interface at <code>http://localhost:8000/web</code> to interact with the environment through your browser.",Ul,ie,fl,pe,it="The snake environment requires:",jl,me,pt="<li><code>marlenv</code>: Multi-agent snake game implementation</li> <li><code>gym==0.24.1</code>: OpenAI Gym (required by marlenv)</li> <li><code>numpy</code>: Numerical operations</li> <li>Standard OpenEnv dependencies (fastapi, pydantic, uvicorn)</li>",hl,re,mt="These are automatically installed when using Docker or installing via pip.",bl,Me,$l,oe,Cl,ce,gl,ue,vl,de,rt="If you encounter issues installing marlenv, you can install it from source:",Il,ye,kl,we,Zl,Je,Mt="Make sure you’re in the correct directory when running the server:",Bl,Te,xl,Ue,Ql,fe,ot="Ensure the base image is built first:",Wl,je,Al,he,Sl,be,ct="The underlying snake game is from marlenv:",Gl,$e,El,Ce,Vl,ge,ut="BSD 3-Clause License - See LICENSE file in the root directory.",Nl,ve,Rl,ke,Xl;return T=new bt({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),U=new d({props:{title:"Snake Environment",local:"snake-environment",headingTag:"h1"}}),j=new d({props:{title:"Overview",local:"overview",headingTag:"h2"}}),b=new d({props:{title:"Features",local:"features",headingTag:"h3"}}),C=new d({props:{title:"Game Rules",local:"game-rules",headingTag:"h3"}}),v=new d({props:{title:"Quick Start",local:"quick-start",headingTag:"h2"}}),I=new d({props:{title:"Using Docker (Recommended)",local:"using-docker-recommended",headingTag:"h3"}}),k=new w({props:{code:"ZnJvbSUyMGVudnMuc25ha2VfZW52JTIwaW1wb3J0JTIwU25ha2VBY3Rpb24lMkMlMjBTbmFrZUVudiUwQSUwQSUyMyUyMFN0YXJ0JTIwZW52aXJvbm1lbnQlMjBmcm9tJTIwRG9ja2VyJTIwaW1hZ2UlMEFjbGllbnQlMjAlM0QlMjBTbmFrZUVudi5mcm9tX2RvY2tlcl9pbWFnZSglMjJzbmFrZS1lbnYlM0FsYXRlc3QlMjIpJTBBJTBBJTIzJTIwUmVzZXQlMjB0byUyMHN0YXJ0JTIwbmV3JTIwZXBpc29kZSUwQXJlc3VsdCUyMCUzRCUyMGNsaWVudC5yZXNldCgpJTBBcHJpbnQoZiUyMlNuYWtlJTIwYWxpdmUlM0ElMjAlN0JyZXN1bHQub2JzZXJ2YXRpb24uYWxpdmUlN0QlMjIpJTBBcHJpbnQoZiUyMkdyaWQlMjBzaGFwZSUzQSUyMCU3QmxlbihyZXN1bHQub2JzZXJ2YXRpb24uZ3JpZCklN0R4JTdCbGVuKHJlc3VsdC5vYnNlcnZhdGlvbi5ncmlkJTVCMCU1RCklN0QlMjIpJTBBJTBBJTIzJTIwVGFrZSUyMGFjdGlvbnMlMEFyZXN1bHQlMjAlM0QlMjBjbGllbnQuc3RlcChTbmFrZUFjdGlvbihhY3Rpb24lM0QwKSklMjAlMjAlMjMlMjBDb250aW51ZSUyMHN0cmFpZ2h0JTBBcHJpbnQoZiUyMlJld2FyZCUzQSUyMCU3QnJlc3VsdC5yZXdhcmQlN0QlMjIpJTBBcHJpbnQoZiUyMlNjb3JlJTNBJTIwJTdCcmVzdWx0Lm9ic2VydmF0aW9uLmVwaXNvZGVfc2NvcmUlN0QlMjIpJTBBJTBBcmVzdWx0JTIwJTNEJTIwY2xpZW50LnN0ZXAoU25ha2VBY3Rpb24oYWN0aW9uJTNEMSkpJTIwJTIwJTIzJTIwVHVybiUyMGxlZnQlMEFyZXN1bHQlMjAlM0QlMjBjbGllbnQuc3RlcChTbmFrZUFjdGlvbihhY3Rpb24lM0QyKSklMjAlMjAlMjMlMjBUdXJuJTIwcmlnaHQlMEElMEElMjMlMjBDaGVjayUyMGdhbWUlMjBzdGF0ZSUwQXN0YXRlJTIwJTNEJTIwY2xpZW50LnN0YXRlKCklMEFwcmludChmJTIyRXBpc29kZSUzQSUyMCU3QnN0YXRlLmVwaXNvZGVfaWQlN0QlMjIpJTBBcHJpbnQoZiUyMlN0ZXBzJTNBJTIwJTdCc3RhdGUuc3RlcF9jb3VudCU3RCUyMiklMEElMEElMjMlMjBDbGVhbnVwJTBBY2xpZW50LmNsb3NlKCk=",highlighted:`<span class="hljs-keyword">from</span> envs.snake_env <span class="hljs-keyword">import</span> SnakeAction, SnakeEnv | |
| <span class="hljs-comment"># Start environment from Docker image</span> | |
| client = SnakeEnv.from_docker_image(<span class="hljs-string">"snake-env:latest"</span>) | |
| <span class="hljs-comment"># Reset to start new episode</span> | |
| result = client.reset() | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Snake alive: <span class="hljs-subst">{result.observation.alive}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Grid shape: <span class="hljs-subst">{<span class="hljs-built_in">len</span>(result.observation.grid)}</span>x<span class="hljs-subst">{<span class="hljs-built_in">len</span>(result.observation.grid[<span class="hljs-number">0</span>])}</span>"</span>) | |
| <span class="hljs-comment"># Take actions</span> | |
| result = client.step(SnakeAction(action=<span class="hljs-number">0</span>)) <span class="hljs-comment"># Continue straight</span> | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Reward: <span class="hljs-subst">{result.reward}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Score: <span class="hljs-subst">{result.observation.episode_score}</span>"</span>) | |
| result = client.step(SnakeAction(action=<span class="hljs-number">1</span>)) <span class="hljs-comment"># Turn left</span> | |
| result = client.step(SnakeAction(action=<span class="hljs-number">2</span>)) <span class="hljs-comment"># Turn right</span> | |
| <span class="hljs-comment"># Check game state</span> | |
| state = client.state() | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Episode: <span class="hljs-subst">{state.episode_id}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Steps: <span class="hljs-subst">{state.step_count}</span>"</span>) | |
| <span class="hljs-comment"># Cleanup</span> | |
| client.close()`,lang:"python",wrap:!1}}),Z=new d({props:{title:"Using Local Server",local:"using-local-server",headingTag:"h3"}}),B=new w({props:{code:"JTIzJTIwSW5zdGFsbCUyMGRlcGVuZGVuY2llcyUwQWNkJTIwc3JjJTJGZW52cyUyRnNuYWtlX2VudiUwQXBpcCUyMGluc3RhbGwlMjAtZSUyMC4lMEElMEElMjMlMjBSdW4lMjBzZXJ2ZXIlMEF1diUyMHJ1biUyMC0tcHJvamVjdCUyMC4lMjBzZXJ2ZXI=",highlighted:`<span class="hljs-comment"># Install dependencies</span> | |
| <span class="hljs-built_in">cd</span> src/envs/snake_env | |
| pip install -e . | |
| <span class="hljs-comment"># Run server</span> | |
| uv run --project . server`,lang:"bash",wrap:!1}}),Q=new w({props:{code:"ZnJvbSUyMGVudnMuc25ha2VfZW52JTIwaW1wb3J0JTIwU25ha2VBY3Rpb24lMkMlMjBTbmFrZUVudiUwQSUwQSUyMyUyMENvbm5lY3QlMjB0byUyMHJ1bm5pbmclMjBzZXJ2ZXIlMEFjbGllbnQlMjAlM0QlMjBTbmFrZUVudihiYXNlX3VybCUzRCUyMmh0dHAlM0ElMkYlMkZsb2NhbGhvc3QlM0E4MDAwJTIyKSUwQXJlc3VsdCUyMCUzRCUyMGNsaWVudC5yZXNldCgpJTBBcmVzdWx0JTIwJTNEJTIwY2xpZW50LnN0ZXAoU25ha2VBY3Rpb24oYWN0aW9uJTNEMCkp",highlighted:`<span class="hljs-keyword">from</span> envs.snake_env <span class="hljs-keyword">import</span> SnakeAction, SnakeEnv | |
| <span class="hljs-comment"># Connect to running server</span> | |
| client = SnakeEnv(base_url=<span class="hljs-string">"http://localhost:8000"</span>) | |
| result = client.reset() | |
| result = client.step(SnakeAction(action=<span class="hljs-number">0</span>))`,lang:"python",wrap:!1}}),W=new d({props:{title:"Actions",local:"actions",headingTag:"h2"}}),S=new d({props:{title:"Snake Mode (Default)",local:"snake-mode-default",headingTag:"h3"}}),V=new d({props:{title:"Human Mode",local:"human-mode",headingTag:"h3"}}),X=new d({props:{title:"Observations",local:"observations",headingTag:"h2"}}),Y=new d({props:{title:"Configuration",local:"configuration",headingTag:"h2"}}),F=new d({props:{title:"Environment Parameters",local:"environment-parameters",headingTag:"h3"}}),L=new w({props:{code:"ZnJvbSUyMGVudnMuc25ha2VfZW52LnNlcnZlci5zbmFrZV9lbnZpcm9ubWVudCUyMGltcG9ydCUyMFNuYWtlRW52aXJvbm1lbnQlMEElMEFlbnYlMjAlM0QlMjBTbmFrZUVudmlyb25tZW50KCUwQSUyMCUyMCUyMCUyMGhlaWdodCUzRDIwJTJDJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwR3JpZCUyMGhlaWdodCUyMChkZWZhdWx0JTNBJTIwMjApJTBBJTIwJTIwJTIwJTIwd2lkdGglM0QyMCUyQyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEdyaWQlMjB3aWR0aCUyMChkZWZhdWx0JTNBJTIwMjApJTBBJTIwJTIwJTIwJTIwc25ha2VfbGVuZ3RoJTNEMyUyQyUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEluaXRpYWwlMjBzbmFrZSUyMGxlbmd0aCUyMChkZWZhdWx0JTNBJTIwMyklMEElMjAlMjAlMjAlMjB2aXNpb25fcmFuZ2UlM0Q1JTJDJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwUGFydGlhbCUyMG9ic2VydmFiaWxpdHklMjAoTm9uZSUyMGZvciUyMGZ1bGwlMjBncmlkKSUwQSUyMCUyMCUyMCUyMG9ic2VydmVyJTNEJ3NuYWtlJyUyQyUyMCUyMCUyMCUyMCUyMyUyMCdzbmFrZSclMjBvciUyMCdodW1hbiclMjBtb2RlJTBBJTIwJTIwJTIwJTIwbWF4X2VwaXNvZGVfc3RlcHMlM0QxMDAwJTJDJTIwJTIwJTIzJTIwTWF4aW11bSUyMHN0ZXBzJTIwcGVyJTIwZXBpc29kZSUwQSUyMCUyMCUyMCUyMHJld2FyZF9kaWN0JTNEJTdCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwQ3VzdG9tJTIwcmV3YXJkJTIwZnVuY3Rpb24lMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAnZnJ1aXQnJTNBJTIwMS4wJTJDJTIwJTIwJTIwJTIwJTIzJTIwUmV3YXJkJTIwZm9yJTIwZWF0aW5nJTIwZnJ1aXQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAna2lsbCclM0ElMjAwLjAlMkMlMjAlMjAlMjAlMjAlMjAlMjMlMjBSZXdhcmQlMjBmb3IlMjBraWxscyUyMChtdWx0aS1hZ2VudCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAnbG9zZSclM0ElMjAtMS4wJTJDJTIwJTIwJTIwJTIwJTIzJTIwUGVuYWx0eSUyMGZvciUyMGRlYXRoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJ3dpbiclM0ElMjAwLjAlMkMlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBSZXdhcmQlMjBmb3IlMjB3aW5uaW5nJTIwKG11bHRpLWFnZW50KSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCd0aW1lJyUzQSUyMDAuMCUyQyUyMCUyMCUyMCUyMCUyMCUyMyUyMFJld2FyZCUyMHBlciUyMHRpbWVzdGVwJTBBJTIwJTIwJTIwJTIwJTdEJTBBKQ==",highlighted:`<span class="hljs-keyword">from</span> envs.snake_env.server.snake_environment <span class="hljs-keyword">import</span> SnakeEnvironment | |
| env = SnakeEnvironment( | |
| height=<span class="hljs-number">20</span>, <span class="hljs-comment"># Grid height (default: 20)</span> | |
| width=<span class="hljs-number">20</span>, <span class="hljs-comment"># Grid width (default: 20)</span> | |
| snake_length=<span class="hljs-number">3</span>, <span class="hljs-comment"># Initial snake length (default: 3)</span> | |
| vision_range=<span class="hljs-number">5</span>, <span class="hljs-comment"># Partial observability (None for full grid)</span> | |
| observer=<span class="hljs-string">'snake'</span>, <span class="hljs-comment"># 'snake' or 'human' mode</span> | |
| max_episode_steps=<span class="hljs-number">1000</span>, <span class="hljs-comment"># Maximum steps per episode</span> | |
| reward_dict={ <span class="hljs-comment"># Custom reward function</span> | |
| <span class="hljs-string">'fruit'</span>: <span class="hljs-number">1.0</span>, <span class="hljs-comment"># Reward for eating fruit</span> | |
| <span class="hljs-string">'kill'</span>: <span class="hljs-number">0.0</span>, <span class="hljs-comment"># Reward for kills (multi-agent)</span> | |
| <span class="hljs-string">'lose'</span>: -<span class="hljs-number">1.0</span>, <span class="hljs-comment"># Penalty for death</span> | |
| <span class="hljs-string">'win'</span>: <span class="hljs-number">0.0</span>, <span class="hljs-comment"># Reward for winning (multi-agent)</span> | |
| <span class="hljs-string">'time'</span>: <span class="hljs-number">0.0</span>, <span class="hljs-comment"># Reward per timestep</span> | |
| } | |
| )`,lang:"python",wrap:!1}}),H=new d({props:{title:"Custom Rewards",local:"custom-rewards",headingTag:"h3"}}),q=new w({props:{code:"JTIzJTIwRW5jb3VyYWdlJTIwc3Vydml2YWwlMEFyZXdhcmRfZGljdCUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCdmcnVpdCclM0ElMjAxLjAlMkMlMEElMjAlMjAlMjAlMjAnbG9zZSclM0ElMjAtMTAuMCUyQyUwQSUyMCUyMCUyMCUyMCd0aW1lJyUzQSUyMDAuMDElMkMlMjAlMjAlMjMlMjBTbWFsbCUyMHJld2FyZCUyMGZvciUyMHN0YXlpbmclMjBhbGl2ZSUwQSU3RCUwQSUwQSUyMyUyMEZhc3QlMjBmcnVpdCUyMGNvbGxlY3Rpb24lMEFyZXdhcmRfZGljdCUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCdmcnVpdCclM0ElMjAxMC4wJTJDJTBBJTIwJTIwJTIwJTIwJ2xvc2UnJTNBJTIwLTEuMCUyQyUwQSUyMCUyMCUyMCUyMCd0aW1lJyUzQSUyMC0wLjAxJTJDJTIwJTIwJTIzJTIwUGVuYWx0eSUyMGZvciUyMHRha2luZyUyMHRvbyUyMGxvbmclMEElN0Q=",highlighted:`<span class="hljs-comment"># Encourage survival</span> | |
| reward_dict = { | |
| <span class="hljs-string">'fruit'</span>: <span class="hljs-number">1.0</span>, | |
| <span class="hljs-string">'lose'</span>: -<span class="hljs-number">10.0</span>, | |
| <span class="hljs-string">'time'</span>: <span class="hljs-number">0.01</span>, <span class="hljs-comment"># Small reward for staying alive</span> | |
| } | |
| <span class="hljs-comment"># Fast fruit collection</span> | |
| reward_dict = { | |
| <span class="hljs-string">'fruit'</span>: <span class="hljs-number">10.0</span>, | |
| <span class="hljs-string">'lose'</span>: -<span class="hljs-number">1.0</span>, | |
| <span class="hljs-string">'time'</span>: -<span class="hljs-number">0.01</span>, <span class="hljs-comment"># Penalty for taking too long</span> | |
| }`,lang:"python",wrap:!1}}),P=new d({props:{title:"Building and Deployment",local:"building-and-deployment",headingTag:"h2"}}),K=new d({props:{title:"Build Docker Image",local:"build-docker-image",headingTag:"h3"}}),ee=new w({props:{code:"JTIzJTIwQnVpbGQlMjBiYXNlJTIwaW1hZ2UlMjBmaXJzdCUyMChpZiUyMG5vdCUyMGFscmVhZHklMjBidWlsdCklMEFkb2NrZXIlMjBidWlsZCUyMC10JTIwb3BlbmVudi1iYXNlJTNBbGF0ZXN0JTIwLWYlMjBzcmMlMkZvcGVuZW52JTJGY29yZSUyRmNvbnRhaW5lcnMlMkZpbWFnZXMlMkZEb2NrZXJmaWxlJTIwLiUwQSUwQSUyMyUyMEJ1aWxkJTIwc25ha2UlMjBlbnZpcm9ubWVudCUyMGltYWdlJTBBZG9ja2VyJTIwYnVpbGQlMjAtdCUyMHNuYWtlLWVudiUzQWxhdGVzdCUyMC1mJTIwZW52cyUyRnNuYWtlX2VudiUyRnNlcnZlciUyRkRvY2tlcmZpbGUlMjAu",highlighted:`<span class="hljs-comment"># Build base image first (if not already built)</span> | |
| docker build -t openenv-base:latest -f src/openenv/core/containers/images/Dockerfile . | |
| <span class="hljs-comment"># Build snake environment image</span> | |
| docker build -t snake-env:latest -f envs/snake_env/server/Dockerfile .`,lang:"bash",wrap:!1}}),te=new d({props:{title:"Run Docker Container",local:"run-docker-container",headingTag:"h3"}}),ne=new w({props:{code:"JTIzJTIwUnVuJTIwdGhlJTIwY29udGFpbmVyJTBBZG9ja2VyJTIwcnVuJTIwLXAlMjA4MDAwJTNBODAwMCUyMHNuYWtlLWVudiUzQWxhdGVzdCUwQSUwQSUyMyUyME9yJTIwd2l0aCUyMGVudmlyb25tZW50JTIwdmFyaWFibGVzJTBBZG9ja2VyJTIwcnVuJTIwLXAlMjA4MDAwJTNBODAwMCUyMCU1QyUwQSUyMCUyMC1lJTIwRU5BQkxFX1dFQl9JTlRFUkZBQ0UlM0R0cnVlJTIwJTVDJTBBJTIwJTIwc25ha2UtZW52JTNBbGF0ZXN0",highlighted:`<span class="hljs-comment"># Run the container</span> | |
| docker run -p 8000:8000 snake-env:latest | |
| <span class="hljs-comment"># Or with environment variables</span> | |
| docker run -p 8000:8000 \\ | |
| -e ENABLE_WEB_INTERFACE=<span class="hljs-literal">true</span> \\ | |
| snake-env:latest`,lang:"bash",wrap:!1}}),se=new d({props:{title:"Web Interface",local:"web-interface",headingTag:"h3"}}),ie=new d({props:{title:"Dependencies",local:"dependencies",headingTag:"h2"}}),Me=new d({props:{title:"Example Training Loop",local:"example-training-loop",headingTag:"h2"}}),oe=new w({props:{code:"ZnJvbSUyMGVudnMuc25ha2VfZW52JTIwaW1wb3J0JTIwU25ha2VBY3Rpb24lMkMlMjBTbmFrZUVudiUwQWltcG9ydCUyMHJhbmRvbSUwQSUwQSUyMyUyMENvbm5lY3QlMjB0byUyMGVudmlyb25tZW50JTBBZW52JTIwJTNEJTIwU25ha2VFbnYuZnJvbV9kb2NrZXJfaW1hZ2UoJTIyc25ha2UtZW52JTNBbGF0ZXN0JTIyKSUwQSUwQSUyMyUyMFRyYWluaW5nJTIwbG9vcCUwQWZvciUyMGVwaXNvZGUlMjBpbiUyMHJhbmdlKDEwKSUzQSUwQSUyMCUyMCUyMCUyMHJlc3VsdCUyMCUzRCUyMGVudi5yZXNldCgpJTBBJTIwJTIwJTIwJTIwdG90YWxfcmV3YXJkJTIwJTNEJTIwMCUwQSUyMCUyMCUyMCUyMGRvbmUlMjAlM0QlMjBGYWxzZSUwQSUwQSUyMCUyMCUyMCUyMHdoaWxlJTIwbm90JTIwZG9uZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFNpbXBsZSUyMHJhbmRvbSUyMHBvbGljeSUyMChyZXBsYWNlJTIwd2l0aCUyMHlvdXIlMjBhZ2VudCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhY3Rpb24lMjAlM0QlMjBTbmFrZUFjdGlvbihhY3Rpb24lM0RyYW5kb20ucmFuZGludCgwJTJDJTIwMikpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwZW52LnN0ZXAoYWN0aW9uKSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRvdGFsX3Jld2FyZCUyMCUyQiUzRCUyMHJlc3VsdC5yZXdhcmQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkb25lJTIwJTNEJTIwcmVzdWx0LmRvbmUlMEElMEElMjAlMjAlMjAlMjBwcmludChmJTIyRXBpc29kZSUyMCU3QmVwaXNvZGUlN0QlM0ElMjBSZXdhcmQlM0QlN0J0b3RhbF9yZXdhcmQlN0QlMkMlMjAlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmJTIyRnJ1aXRzJTNEJTdCcmVzdWx0Lm9ic2VydmF0aW9uLmVwaXNvZGVfZnJ1aXRzJTdEJTJDJTIwJTIyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZiUyMlN0ZXBzJTNEJTdCcmVzdWx0Lm9ic2VydmF0aW9uLmVwaXNvZGVfc3RlcHMlN0QlMjIpJTBBJTBBZW52LmNsb3NlKCk=",highlighted:`<span class="hljs-keyword">from</span> envs.snake_env <span class="hljs-keyword">import</span> SnakeAction, SnakeEnv | |
| <span class="hljs-keyword">import</span> random | |
| <span class="hljs-comment"># Connect to environment</span> | |
| env = SnakeEnv.from_docker_image(<span class="hljs-string">"snake-env:latest"</span>) | |
| <span class="hljs-comment"># Training loop</span> | |
| <span class="hljs-keyword">for</span> episode <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">10</span>): | |
| result = env.reset() | |
| total_reward = <span class="hljs-number">0</span> | |
| done = <span class="hljs-literal">False</span> | |
| <span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> done: | |
| <span class="hljs-comment"># Simple random policy (replace with your agent)</span> | |
| action = SnakeAction(action=random.randint(<span class="hljs-number">0</span>, <span class="hljs-number">2</span>)) | |
| result = env.step(action) | |
| total_reward += result.reward | |
| done = result.done | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Episode <span class="hljs-subst">{episode}</span>: Reward=<span class="hljs-subst">{total_reward}</span>, "</span> | |
| <span class="hljs-string">f"Fruits=<span class="hljs-subst">{result.observation.episode_fruits}</span>, "</span> | |
| <span class="hljs-string">f"Steps=<span class="hljs-subst">{result.observation.episode_steps}</span>"</span>) | |
| env.close()`,lang:"python",wrap:!1}}),ce=new d({props:{title:"Troubleshooting",local:"troubleshooting",headingTag:"h2"}}),ue=new d({props:{title:"marlenv Installation Issues",local:"marlenv-installation-issues",headingTag:"h3"}}),ye=new w({props:{code:"cGlwJTIwaW5zdGFsbCUyMGdpdCUyQmh0dHBzJTNBJTJGJTJGZ2l0aHViLmNvbSUyRmtjLW1sMiUyRm1hcmxlbnYuZ2l0",highlighted:"pip install git+https://github.com/kc-ml2/marlenv.git",lang:"bash",wrap:!1}}),we=new d({props:{title:"Import Errors",local:"import-errors",headingTag:"h3"}}),Te=new w({props:{code:"Y2QlMjBzcmMlMkZlbnZzJTJGc25ha2VfZW52JTBBdXYlMjBydW4lMjAtLXByb2plY3QlMjAuJTIwc2VydmVy",highlighted:`<span class="hljs-built_in">cd</span> src/envs/snake_env | |
| uv run --project . server`,lang:"bash",wrap:!1}}),Ue=new d({props:{title:"Docker Build Issues",local:"docker-build-issues",headingTag:"h3"}}),je=new w({props:{code:"ZG9ja2VyJTIwYnVpbGQlMjAtdCUyMG9wZW5lbnYtYmFzZSUzQWxhdGVzdCUyMC1mJTIwc3JjJTJGb3BlbmVudiUyRmNvcmUlMkZjb250YWluZXJzJTJGaW1hZ2VzJTJGRG9ja2VyZmlsZSUyMC4=",highlighted:"docker build -t openenv-base:latest -f src/openenv/core/containers/images/Dockerfile .",lang:"bash",wrap:!1}}),he=new d({props:{title:"Citation",local:"citation",headingTag:"h2"}}),$e=new w({props:{code:"JTQwTUlTQyU3Qm1hcmxlbnYyMDIxJTJDJTBBJTIwJTIwJTIwJTIwYXV0aG9yJTIwJTNEJTIwJTdCTUwyJTdEJTJDJTBBJTIwJTIwJTIwJTIwdGl0bGUlMjAlM0QlMjAlN0JNYXJsZW52JTJDJTIwTXVsdGktYWdlbnQlMjBSZWluZm9yY2VtZW50JTIwTGVhcm5pbmclMjBFbnZpcm9ubWVudCU3RCUyQyUwQSUyMCUyMCUyMCUyMGhvd3B1Ymxpc2hlZCUyMCUzRCUyMCU3QiU1Q3VybCU3Qmh0dHAlM0ElMkYlMkZnaXRodWIuY29tJTJGa2MtbWwyJTJGbWFybGVudiU3RCU3RCUyQyUwQSUyMCUyMCUyMCUyMHllYXIlMjAlM0QlMjAlN0IyMDIxJTdEJTBBJTdE",highlighted:`@MISC{marlenv2021, | |
| author = {ML2}, | |
| title = {Marlenv, Multi-agent Reinforcement Learning Environment}, | |
| howpublished = {\\url{http:<span class="hljs-regexp">//gi</span>thub.com<span class="hljs-regexp">/kc-ml2/m</span>arlenv}}, | |
| year = {<span class="hljs-number">2021</span>} | |
| }`,lang:"bibtex",wrap:!1}}),Ce=new d({props:{title:"License",local:"license",headingTag:"h2"}}),ve=new $t({props:{source:"https://github.com/huggingface/openenv/blob/main/docs/source/environments/snake.md"}}),{c(){J=c("meta"),Ze=s(),Ie=c("p"),Be=s(),i(T.$$.fragment),xe=s(),i(U.$$.fragment),Qe=s(),f=c("p"),f.innerHTML=zl,We=s(),i(j.$$.fragment),Ae=s(),h=c("p"),h.textContent=Yl,Se=s(),i(b.$$.fragment),Ge=s(),$=c("ul"),$.innerHTML=Fl,Ee=s(),i(C.$$.fragment),Ve=s(),g=c("ul"),g.innerHTML=Ll,Ne=s(),i(v.$$.fragment),Re=s(),i(I.$$.fragment),Xe=s(),i(k.$$.fragment),_e=s(),i(Z.$$.fragment),ze=s(),i(B.$$.fragment),Ye=s(),x=c("p"),x.textContent=Hl,Fe=s(),i(Q.$$.fragment),Le=s(),i(W.$$.fragment),He=s(),A=c("p"),A.innerHTML=Dl,De=s(),i(S.$$.fragment),qe=s(),G=c("p"),G.textContent=ql,Pe=s(),E=c("ul"),E.innerHTML=Pl,Ke=s(),i(V.$$.fragment),Oe=s(),N=c("p"),N.textContent=Kl,el=s(),R=c("ul"),R.innerHTML=Ol,ll=s(),i(X.$$.fragment),tl=s(),_=c("p"),_.textContent=et,nl=s(),z=c("ul"),z.innerHTML=lt,sl=s(),i(Y.$$.fragment),al=s(),i(F.$$.fragment),il=s(),i(L.$$.fragment),pl=s(),i(H.$$.fragment),ml=s(),D=c("p"),D.textContent=tt,rl=s(),i(q.$$.fragment),Ml=s(),i(P.$$.fragment),ol=s(),i(K.$$.fragment),cl=s(),O=c("p"),O.textContent=nt,ul=s(),i(ee.$$.fragment),dl=s(),le=c("p"),le.innerHTML=st,yl=s(),i(te.$$.fragment),wl=s(),i(ne.$$.fragment),Jl=s(),i(se.$$.fragment),Tl=s(),ae=c("p"),ae.innerHTML=at,Ul=s(),i(ie.$$.fragment),fl=s(),pe=c("p"),pe.textContent=it,jl=s(),me=c("ul"),me.innerHTML=pt,hl=s(),re=c("p"),re.textContent=mt,bl=s(),i(Me.$$.fragment),$l=s(),i(oe.$$.fragment),Cl=s(),i(ce.$$.fragment),gl=s(),i(ue.$$.fragment),vl=s(),de=c("p"),de.textContent=rt,Il=s(),i(ye.$$.fragment),kl=s(),i(we.$$.fragment),Zl=s(),Je=c("p"),Je.textContent=Mt,Bl=s(),i(Te.$$.fragment),xl=s(),i(Ue.$$.fragment),Ql=s(),fe=c("p"),fe.textContent=ot,Wl=s(),i(je.$$.fragment),Al=s(),i(he.$$.fragment),Sl=s(),be=c("p"),be.textContent=ct,Gl=s(),i($e.$$.fragment),El=s(),i(Ce.$$.fragment),Vl=s(),ge=c("p"),ge.textContent=ut,Nl=s(),i(ve.$$.fragment),Rl=s(),ke=c("p"),this.h()},l(e){const l=jt("svelte-u9bgzb",document.head);J=u(l,"META",{name:!0,content:!0}),l.forEach(t),Ze=a(e),Ie=u(e,"P",{}),dt(Ie).forEach(t),Be=a(e),p(T.$$.fragment,e),xe=a(e),p(U.$$.fragment,e),Qe=a(e),f=u(e,"P",{"data-svelte-h":!0}),y(f)!=="svelte-1nef75w"&&(f.innerHTML=zl),We=a(e),p(j.$$.fragment,e),Ae=a(e),h=u(e,"P",{"data-svelte-h":!0}),y(h)!=="svelte-1kumpav"&&(h.textContent=Yl),Se=a(e),p(b.$$.fragment,e),Ge=a(e),$=u(e,"UL",{"data-svelte-h":!0}),y($)!=="svelte-1khajy5"&&($.innerHTML=Fl),Ee=a(e),p(C.$$.fragment,e),Ve=a(e),g=u(e,"UL",{"data-svelte-h":!0}),y(g)!=="svelte-s7la8q"&&(g.innerHTML=Ll),Ne=a(e),p(v.$$.fragment,e),Re=a(e),p(I.$$.fragment,e),Xe=a(e),p(k.$$.fragment,e),_e=a(e),p(Z.$$.fragment,e),ze=a(e),p(B.$$.fragment,e),Ye=a(e),x=u(e,"P",{"data-svelte-h":!0}),y(x)!=="svelte-nvz436"&&(x.textContent=Hl),Fe=a(e),p(Q.$$.fragment,e),Le=a(e),p(W.$$.fragment,e),He=a(e),A=u(e,"P",{"data-svelte-h":!0}),y(A)!=="svelte-1b6ts9c"&&(A.innerHTML=Dl),De=a(e),p(S.$$.fragment,e),qe=a(e),G=u(e,"P",{"data-svelte-h":!0}),y(G)!=="svelte-129bwaz"&&(G.textContent=ql),Pe=a(e),E=u(e,"UL",{"data-svelte-h":!0}),y(E)!=="svelte-10zrap9"&&(E.innerHTML=Pl),Ke=a(e),p(V.$$.fragment,e),Oe=a(e),N=u(e,"P",{"data-svelte-h":!0}),y(N)!=="svelte-6ckwp2"&&(N.textContent=Kl),el=a(e),R=u(e,"UL",{"data-svelte-h":!0}),y(R)!=="svelte-11ru4w9"&&(R.innerHTML=Ol),ll=a(e),p(X.$$.fragment,e),tl=a(e),_=u(e,"P",{"data-svelte-h":!0}),y(_)!=="svelte-1pp1dsy"&&(_.textContent=et),nl=a(e),z=u(e,"UL",{"data-svelte-h":!0}),y(z)!=="svelte-kh6ug0"&&(z.innerHTML=lt),sl=a(e),p(Y.$$.fragment,e),al=a(e),p(F.$$.fragment,e),il=a(e),p(L.$$.fragment,e),pl=a(e),p(H.$$.fragment,e),ml=a(e),D=u(e,"P",{"data-svelte-h":!0}),y(D)!=="svelte-6m7e20"&&(D.textContent=tt),rl=a(e),p(q.$$.fragment,e),Ml=a(e),p(P.$$.fragment,e),ol=a(e),p(K.$$.fragment,e),cl=a(e),O=u(e,"P",{"data-svelte-h":!0}),y(O)!=="svelte-y1tsrv"&&(O.textContent=nt),ul=a(e),p(ee.$$.fragment,e),dl=a(e),le=u(e,"P",{"data-svelte-h":!0}),y(le)!=="svelte-g4o0by"&&(le.innerHTML=st),yl=a(e),p(te.$$.fragment,e),wl=a(e),p(ne.$$.fragment,e),Jl=a(e),p(se.$$.fragment,e),Tl=a(e),ae=u(e,"P",{"data-svelte-h":!0}),y(ae)!=="svelte-1h8nice"&&(ae.innerHTML=at),Ul=a(e),p(ie.$$.fragment,e),fl=a(e),pe=u(e,"P",{"data-svelte-h":!0}),y(pe)!=="svelte-1irqyo4"&&(pe.textContent=it),jl=a(e),me=u(e,"UL",{"data-svelte-h":!0}),y(me)!=="svelte-34eqx7"&&(me.innerHTML=pt),hl=a(e),re=u(e,"P",{"data-svelte-h":!0}),y(re)!=="svelte-1x3n5aj"&&(re.textContent=mt),bl=a(e),p(Me.$$.fragment,e),$l=a(e),p(oe.$$.fragment,e),Cl=a(e),p(ce.$$.fragment,e),gl=a(e),p(ue.$$.fragment,e),vl=a(e),de=u(e,"P",{"data-svelte-h":!0}),y(de)!=="svelte-3baj5x"&&(de.textContent=rt),Il=a(e),p(ye.$$.fragment,e),kl=a(e),p(we.$$.fragment,e),Zl=a(e),Je=u(e,"P",{"data-svelte-h":!0}),y(Je)!=="svelte-179ur32"&&(Je.textContent=Mt),Bl=a(e),p(Te.$$.fragment,e),xl=a(e),p(Ue.$$.fragment,e),Ql=a(e),fe=u(e,"P",{"data-svelte-h":!0}),y(fe)!=="svelte-1bujyhf"&&(fe.textContent=ot),Wl=a(e),p(je.$$.fragment,e),Al=a(e),p(he.$$.fragment,e),Sl=a(e),be=u(e,"P",{"data-svelte-h":!0}),y(be)!=="svelte-xl76y5"&&(be.textContent=ct),Gl=a(e),p($e.$$.fragment,e),El=a(e),p(Ce.$$.fragment,e),Vl=a(e),ge=u(e,"P",{"data-svelte-h":!0}),y(ge)!=="svelte-12aa665"&&(ge.textContent=ut),Nl=a(e),p(ve.$$.fragment,e),Rl=a(e),ke=u(e,"P",{}),dt(ke).forEach(t),this.h()},h(){yt(J,"name","hf:doc:metadata"),yt(J,"content",gt)},m(e,l){ht(document.head,J),n(e,Ze,l),n(e,Ie,l),n(e,Be,l),m(T,e,l),n(e,xe,l),m(U,e,l),n(e,Qe,l),n(e,f,l),n(e,We,l),m(j,e,l),n(e,Ae,l),n(e,h,l),n(e,Se,l),m(b,e,l),n(e,Ge,l),n(e,$,l),n(e,Ee,l),m(C,e,l),n(e,Ve,l),n(e,g,l),n(e,Ne,l),m(v,e,l),n(e,Re,l),m(I,e,l),n(e,Xe,l),m(k,e,l),n(e,_e,l),m(Z,e,l),n(e,ze,l),m(B,e,l),n(e,Ye,l),n(e,x,l),n(e,Fe,l),m(Q,e,l),n(e,Le,l),m(W,e,l),n(e,He,l),n(e,A,l),n(e,De,l),m(S,e,l),n(e,qe,l),n(e,G,l),n(e,Pe,l),n(e,E,l),n(e,Ke,l),m(V,e,l),n(e,Oe,l),n(e,N,l),n(e,el,l),n(e,R,l),n(e,ll,l),m(X,e,l),n(e,tl,l),n(e,_,l),n(e,nl,l),n(e,z,l),n(e,sl,l),m(Y,e,l),n(e,al,l),m(F,e,l),n(e,il,l),m(L,e,l),n(e,pl,l),m(H,e,l),n(e,ml,l),n(e,D,l),n(e,rl,l),m(q,e,l),n(e,Ml,l),m(P,e,l),n(e,ol,l),m(K,e,l),n(e,cl,l),n(e,O,l),n(e,ul,l),m(ee,e,l),n(e,dl,l),n(e,le,l),n(e,yl,l),m(te,e,l),n(e,wl,l),m(ne,e,l),n(e,Jl,l),m(se,e,l),n(e,Tl,l),n(e,ae,l),n(e,Ul,l),m(ie,e,l),n(e,fl,l),n(e,pe,l),n(e,jl,l),n(e,me,l),n(e,hl,l),n(e,re,l),n(e,bl,l),m(Me,e,l),n(e,$l,l),m(oe,e,l),n(e,Cl,l),m(ce,e,l),n(e,gl,l),m(ue,e,l),n(e,vl,l),n(e,de,l),n(e,Il,l),m(ye,e,l),n(e,kl,l),m(we,e,l),n(e,Zl,l),n(e,Je,l),n(e,Bl,l),m(Te,e,l),n(e,xl,l),m(Ue,e,l),n(e,Ql,l),n(e,fe,l),n(e,Wl,l),m(je,e,l),n(e,Al,l),m(he,e,l),n(e,Sl,l),n(e,be,l),n(e,Gl,l),m($e,e,l),n(e,El,l),m(Ce,e,l),n(e,Vl,l),n(e,ge,l),n(e,Nl,l),m(ve,e,l),n(e,Rl,l),n(e,ke,l),Xl=!0},p:Jt,i(e){Xl||(r(T.$$.fragment,e),r(U.$$.fragment,e),r(j.$$.fragment,e),r(b.$$.fragment,e),r(C.$$.fragment,e),r(v.$$.fragment,e),r(I.$$.fragment,e),r(k.$$.fragment,e),r(Z.$$.fragment,e),r(B.$$.fragment,e),r(Q.$$.fragment,e),r(W.$$.fragment,e),r(S.$$.fragment,e),r(V.$$.fragment,e),r(X.$$.fragment,e),r(Y.$$.fragment,e),r(F.$$.fragment,e),r(L.$$.fragment,e),r(H.$$.fragment,e),r(q.$$.fragment,e),r(P.$$.fragment,e),r(K.$$.fragment,e),r(ee.$$.fragment,e),r(te.$$.fragment,e),r(ne.$$.fragment,e),r(se.$$.fragment,e),r(ie.$$.fragment,e),r(Me.$$.fragment,e),r(oe.$$.fragment,e),r(ce.$$.fragment,e),r(ue.$$.fragment,e),r(ye.$$.fragment,e),r(we.$$.fragment,e),r(Te.$$.fragment,e),r(Ue.$$.fragment,e),r(je.$$.fragment,e),r(he.$$.fragment,e),r($e.$$.fragment,e),r(Ce.$$.fragment,e),r(ve.$$.fragment,e),Xl=!0)},o(e){M(T.$$.fragment,e),M(U.$$.fragment,e),M(j.$$.fragment,e),M(b.$$.fragment,e),M(C.$$.fragment,e),M(v.$$.fragment,e),M(I.$$.fragment,e),M(k.$$.fragment,e),M(Z.$$.fragment,e),M(B.$$.fragment,e),M(Q.$$.fragment,e),M(W.$$.fragment,e),M(S.$$.fragment,e),M(V.$$.fragment,e),M(X.$$.fragment,e),M(Y.$$.fragment,e),M(F.$$.fragment,e),M(L.$$.fragment,e),M(H.$$.fragment,e),M(q.$$.fragment,e),M(P.$$.fragment,e),M(K.$$.fragment,e),M(ee.$$.fragment,e),M(te.$$.fragment,e),M(ne.$$.fragment,e),M(se.$$.fragment,e),M(ie.$$.fragment,e),M(Me.$$.fragment,e),M(oe.$$.fragment,e),M(ce.$$.fragment,e),M(ue.$$.fragment,e),M(ye.$$.fragment,e),M(we.$$.fragment,e),M(Te.$$.fragment,e),M(Ue.$$.fragment,e),M(je.$$.fragment,e),M(he.$$.fragment,e),M($e.$$.fragment,e),M(Ce.$$.fragment,e),M(ve.$$.fragment,e),Xl=!1},d(e){e&&(t(Ze),t(Ie),t(Be),t(xe),t(Qe),t(f),t(We),t(Ae),t(h),t(Se),t(Ge),t($),t(Ee),t(Ve),t(g),t(Ne),t(Re),t(Xe),t(_e),t(ze),t(Ye),t(x),t(Fe),t(Le),t(He),t(A),t(De),t(qe),t(G),t(Pe),t(E),t(Ke),t(Oe),t(N),t(el),t(R),t(ll),t(tl),t(_),t(nl),t(z),t(sl),t(al),t(il),t(pl),t(ml),t(D),t(rl),t(Ml),t(ol),t(cl),t(O),t(ul),t(dl),t(le),t(yl),t(wl),t(Jl),t(Tl),t(ae),t(Ul),t(fl),t(pe),t(jl),t(me),t(hl),t(re),t(bl),t($l),t(Cl),t(gl),t(vl),t(de),t(Il),t(kl),t(Zl),t(Je),t(Bl),t(xl),t(Ql),t(fe),t(Wl),t(Al),t(Sl),t(be),t(Gl),t(El),t(Vl),t(ge),t(Nl),t(Rl),t(ke)),t(J),o(T,e),o(U,e),o(j,e),o(b,e),o(C,e),o(v,e),o(I,e),o(k,e),o(Z,e),o(B,e),o(Q,e),o(W,e),o(S,e),o(V,e),o(X,e),o(Y,e),o(F,e),o(L,e),o(H,e),o(q,e),o(P,e),o(K,e),o(ee,e),o(te,e),o(ne,e),o(se,e),o(ie,e),o(Me,e),o(oe,e),o(ce,e),o(ue,e),o(ye,e),o(we,e),o(Te,e),o(Ue,e),o(je,e),o(he,e),o($e,e),o(Ce,e),o(ve,e)}}}const gt='{"title":"Snake Environment","local":"snake-environment","sections":[{"title":"Overview","local":"overview","sections":[{"title":"Features","local":"features","sections":[],"depth":3},{"title":"Game Rules","local":"game-rules","sections":[],"depth":3}],"depth":2},{"title":"Quick Start","local":"quick-start","sections":[{"title":"Using Docker (Recommended)","local":"using-docker-recommended","sections":[],"depth":3},{"title":"Using Local Server","local":"using-local-server","sections":[],"depth":3}],"depth":2},{"title":"Actions","local":"actions","sections":[{"title":"Snake Mode (Default)","local":"snake-mode-default","sections":[],"depth":3},{"title":"Human Mode","local":"human-mode","sections":[],"depth":3}],"depth":2},{"title":"Observations","local":"observations","sections":[],"depth":2},{"title":"Configuration","local":"configuration","sections":[{"title":"Environment Parameters","local":"environment-parameters","sections":[],"depth":3},{"title":"Custom Rewards","local":"custom-rewards","sections":[],"depth":3}],"depth":2},{"title":"Building and Deployment","local":"building-and-deployment","sections":[{"title":"Build Docker Image","local":"build-docker-image","sections":[],"depth":3},{"title":"Run Docker Container","local":"run-docker-container","sections":[],"depth":3},{"title":"Web Interface","local":"web-interface","sections":[],"depth":3}],"depth":2},{"title":"Dependencies","local":"dependencies","sections":[],"depth":2},{"title":"Example Training Loop","local":"example-training-loop","sections":[],"depth":2},{"title":"Troubleshooting","local":"troubleshooting","sections":[{"title":"marlenv Installation Issues","local":"marlenv-installation-issues","sections":[],"depth":3},{"title":"Import Errors","local":"import-errors","sections":[],"depth":3},{"title":"Docker Build Issues","local":"docker-build-issues","sections":[],"depth":3}],"depth":2},{"title":"Citation","local":"citation","sections":[],"depth":2},{"title":"License","local":"license","sections":[],"depth":2}],"depth":1}';function vt(_l){return Tt(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class xt extends Ut{constructor(J){super(),ft(this,J,vt,Ct,wt,{})}}export{xt as component}; | |
Xet Storage Details
- Size:
- 33.7 kB
- Xet hash:
- 7f5731cb8a02d8d3508d13699af8159f099d4e1345185e191ee8f98806835707
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.