Buckets:
| import{s as zn,n as Dn,o as qn}from"../chunks/scheduler.2b22cead.js";import{S as Kn,i as ei,e as c,s as i,c as a,h as li,a as T,d as t,b as s,f as Pn,g as p,j as y,k as nn,l as ti,m as n,n as o,t as r,o as m,p as M}from"../chunks/index.1a0e8013.js";import{C as ni,H as w,E as ii}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.4dc233aa.js";import{C as g}from"../chunks/CodeBlock.2ace8102.js";function si(sn){let d,ml,ol,Ml,f,cl,U,Tl,J,an='Integration of OpenSpiel games with the OpenEnv framework. <a href="https://github.com/google-deepmind/open_spiel" rel="nofollow">OpenSpiel</a> is DeepMind’s collection of 70+ game environments for RL research.',yl,$,wl,b,pn="This environment supports 6 games across different categories:",gl,v,dl,j,on="<li><strong>Catch</strong> - Move horizontally to catch a falling ball</li> <li><strong>Cliff Walking</strong> - Navigate grid without falling off cliff (Sutton & Barto benchmark)</li> <li><strong>2048</strong> - Classic tile-merging puzzle game</li> <li><strong>Blackjack</strong> - Simplified blackjack (HIT/STAND only)</li>",ul,h,fl,u,rn="<li><strong>Tic-Tac-Toe</strong> - Classic 3x3 game</li> <li><strong>Kuhn Poker</strong> - 2-player simplified poker (game theory benchmark)</li>",Ul,I,Jl,C,mn="The simplest way to use the OpenSpiel environment is through the <code>OpenSpielEnv</code> class:",$l,B,bl,W,Mn="That’s it! The <code>OpenSpielEnv.from_docker_image()</code> method handles:",vl,Z,cn="<li>Starting the Docker container</li> <li>Waiting for the server to be ready</li> <li>Connecting to the environment</li> <li>Container cleanup when you call <code>close()</code></li>",jl,S,hl,E,Tn="OpenSpiel requires compilation from C++ source. The Docker build uses a <strong>pre-built base image</strong> by default to avoid long build times.",Il,G,Cl,k,yn="From the <strong>environment directory</strong> (<code>envs/openspiel_env/</code>):",Bl,A,Wl,N,wn="This uses the pre-built <code>ghcr.io/meta-pytorch/openenv-openspiel-base</code> image which already contains compiled OpenSpiel.",Zl,V,Sl,L,gn="If you need to customize OpenSpiel or can’t access the pre-built image:",El,_,Gl,F,kl,R,dn="You can easily deploy your OpenEnv environment to Hugging Face Spaces using the <code>openenv push</code> command:",Al,x,Nl,X,un="The <code>openenv push</code> command will:",Vl,Q,fn="<li>Validate that the directory is an OpenEnv environment (checks for <code>openenv.yaml</code>)</li> <li>Prepare a custom build for Hugging Face Docker space (enables web interface)</li> <li>Upload to Hugging Face (ensuring you’re logged in)</li>",Ll,O,_l,H,Un="<li>Authenticate with Hugging Face: The command will prompt for login if not already authenticated</li>",Fl,Y,Rl,P,Jn="<li><code>--directory</code>, <code>-d</code>: Directory containing the OpenEnv environment (defaults to current directory)</li> <li><code>--repo-id</code>, <code>-r</code>: Repository ID in format ‘username/repo-name’ (defaults to ‘username/env-name’ from openenv.yaml)</li> <li><code>--base-image</code>, <code>-b</code>: Base Docker image to use (overrides Dockerfile FROM)</li> <li><code>--private</code>: Deploy the space as private (default: public)</li> <li><code>--env-var</code>, <code>-e</code>: Public Space variable as <code>KEY=VALUE</code> (repeatable). Overrides matching keys from <code>variables:</code> in openenv.yaml.</li> <li><code>--secret</code>: Private Space secret as <code>KEY=VALUE</code> (repeatable). Value is never logged.</li>",xl,z,$n=`Space variables and secrets are only applied on direct Hugging Face Space | |
| pushes. They are not supported with <code>--registry</code>, and they cannot be staged via | |
| <code>--create-pr</code>.`,Xl,D,Ql,q,Ol,K,Hl,ee,bn=`Public variables that your server reads (e.g. <code>OPENSPIEL_GAME</code>) can be declared | |
| in <code>openenv.yaml</code> and will be set automatically on each <code>openenv push</code>:`,Yl,le,Pl,te,vn=`CLI <code>-e</code> overrides any matching key from the yaml. Secrets are <strong>never</strong> put in | |
| <code>openenv.yaml</code> — only on the CLI via <code>--secret KEY=VALUE</code>.`,zl,ne,jn=`After deployment, your space will be available at: | |
| <code>https://huggingface.co/spaces/<repo-id></code>`,Dl,ie,hn="The deployed space includes:",ql,se,In="<li><strong>Web Interface</strong> at <code>/web</code> - Interactive UI for exploring the environment</li> <li><strong>API Documentation</strong> at <code>/docs</code> - Full OpenAPI/Swagger interface</li> <li><strong>Health Check</strong> at <code>/health</code> - Container health monitoring</li>",Kl,ae,Cn="<p><strong>Note</strong>: The default Dockerfile uses a pre-built base image with OpenSpiel already compiled, so deployment is fast and works with standard CPU hardware. If you build your own base image, compilation requires more resources and time.</p>",et,pe,lt,oe,tt,re,nt,me,it,Me,Bn="<strong>OpenSpielAction</strong>: Contains the action to take",st,ce,Wn="<li><code>action_id</code> (int) - Action ID to execute</li> <li><code>game_name</code> (str) - Game name (default: “catch”)</li> <li><code>game_params</code> (Dict) - Optional game parameters</li>",at,Te,pt,ye,Zn="<strong>OpenSpielObservation</strong>: Contains the game state",ot,we,Sn="<li><code>info_state</code> (List[float]) - Agent’s information state vector</li> <li><code>legal_actions</code> (List[int]) - Legal action IDs</li> <li><code>game_phase</code> (str) - “initial”, “playing”, or “terminal”</li> <li><code>current_player_id</code> (int) - Current player (-1 for simultaneous)</li> <li><code>opponent_last_action</code> (Optional[int]) - Last opponent action</li> <li><code>done</code> (bool) - Whether the episode has ended</li> <li><code>reward</code> (Optional[float]) - Reward for the last action</li>",rt,ge,mt,de,En="<strong>OpenSpielState</strong>: Server-side state snapshot",Mt,ue,Gn="<li><code>episode_id</code> (str) - Unique identifier for the current episode</li> <li><code>step_count</code> (int) - Number of steps taken</li> <li><code>game_name</code> (str) - Game name</li> <li><code>agent_player</code> (int) - Agent’s player ID</li> <li><code>opponent_policy</code> (str) - Opponent policy name</li> <li><code>num_players</code> (int) - Total players</li>",ct,fe,Tt,Ue,yt,Je,kn=`<li><code>OPENSPIEL_GAME</code>: Game name (default: “catch”)</li> <li><code>OPENSPIEL_AGENT_PLAYER</code>: Player ID for agent (default: 0)</li> <li><code>OPENSPIEL_OPPONENT_POLICY</code>: Opponent policy for multi-player games | |
| <ul><li><code>random</code>: Uniform random (default)</li> <li><code>first</code>: Always picks first legal action</li> <li><code>last</code>: Always picks last legal action</li></ul></li>`,wt,$e,gt,be,dt,ve,ut,je,ft,he,An="If you already have an OpenSpiel environment server running:",Ut,Ie,Jt,Ce,$t,Be,bt,We,vt,Ze,jt,Se,Nn="<li><strong>Type</strong>: Single-player</li> <li><strong>Action Space</strong>: 3 actions (left, stay, right)</li> <li><strong>Observation</strong>: 5x5 grid flattened (25 dimensions)</li> <li><strong>Reward</strong>: +1 for catching ball, 0 otherwise</li> <li><strong>Episode Length</strong>: ~10 steps</li>",ht,Ee,It,Ge,Vn="<li><strong>Type</strong>: 2-player turn-based, perfect information</li> <li><strong>Players</strong>: Agent (X) vs Random Bot (O)</li> <li><strong>Action Space</strong>: 9 positions</li> <li><strong>Observation</strong>: 27 dimensions (3x3 board + game state)</li> <li><strong>Reward</strong>: +1 win, -1 loss, 0 draw/mid-game</li>",Ct,ke,Bt,Ae,Ln="<li><strong>Type</strong>: 2-player turn-based, imperfect information</li> <li><strong>Players</strong>: Agent vs Random Bot</li> <li><strong>Action Space</strong>: 2 actions (pass/fold, bet/call)</li> <li><strong>Observation</strong>: 6 dimensions (card + betting history)</li> <li><strong>Reward</strong>: Pot winnings (typically -1, 0, +1, +2)</li> <li><strong>Notes</strong>: THE benchmark for imperfect-information RL</li>",Wt,Ne,Zt,Ve,_n="<li><strong>Type</strong>: Single-player grid world</li> <li><strong>Action Space</strong>: 4 actions (up, down, left, right)</li> <li><strong>Observation</strong>: Position encoding</li> <li><strong>Reward</strong>: -1 per step, -100 for falling off cliff</li> <li><strong>Notes</strong>: Classic RL benchmark from Sutton & Barto</li>",St,Le,Et,_e,Fn="<li><strong>Type</strong>: Single-player puzzle</li> <li><strong>Action Space</strong>: 4 actions (up, down, left, right)</li> <li><strong>Observation</strong>: 4x4 grid with tile values</li> <li><strong>Reward</strong>: Points from merging tiles</li> <li><strong>Notes</strong>: Stochastic tile spawning</li>",Gt,Fe,kt,Re,Rn="<li><strong>Type</strong>: Single-player vs dealer</li> <li><strong>Action Space</strong>: 2 actions (HIT, STAND)</li> <li><strong>Observation</strong>: Player hand + dealer’s visible card</li> <li><strong>Reward</strong>: +1 win, -1 loss, 0 draw</li> <li><strong>Notes</strong>: Simplified version, no double/split</li>",At,xe,Nt,Xe,Vt,Qe,xn="Test the environment logic directly without starting the HTTP server (requires OpenSpiel installed locally):",Lt,Oe,_t,He,Ft,Ye,Xn="Run the server locally for development (requires OpenSpiel installed):",Rt,Pe,xt,ze,Qn="Or using the CLI entry point:",Xt,De,Qt,qe,Ot,Ke,Ht,el,On="This script will build and test all 6 supported games in Docker.",Yt,ll,Pt,tl,zt,nl,Dt,il,Hn="<li><strong>Simultaneous-move games</strong>: Only agent_player=0 supported</li> <li><strong>Multi-agent training</strong>: Single agent only (no self-play yet)</li> <li><strong>Opponent policies</strong>: Random and fixed only (no MCTS yet)</li> <li><strong>Build time</strong>: Building your own base image takes ~30-60 min (compiles OpenSpiel C++). Using the pre-built image is fast (~1-2 min) and works with standard hardware.</li>",qt,sl,Kt,al,Yn='<li><a href="https://arxiv.org/abs/1908.09453" rel="nofollow">OpenSpiel Paper (2019)</a></li> <li><a href="https://github.com/google-deepmind/open_spiel" rel="nofollow">OpenSpiel GitHub</a></li> <li><a href="https://openspiel.readthedocs.io/" rel="nofollow">OpenSpiel Documentation</a></li>',en,pl,ln,rl,tn;return f=new ni({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),U=new w({props:{title:"OpenSpiel Environment",local:"openspiel-environment",headingTag:"h1"}}),$=new w({props:{title:"Supported Games",local:"supported-games",headingTag:"h2"}}),v=new w({props:{title:"Single-Player Games (No Opponent)",local:"single-player-games-no-opponent",headingTag:"h3"}}),h=new w({props:{title:"Multi-Player Games (with Bot Opponent)",local:"multi-player-games-with-bot-opponent",headingTag:"h3"}}),I=new w({props:{title:"Quick Start",local:"quick-start",headingTag:"h2"}}),B=new g({props:{code:"ZnJvbSUyMG9wZW5zcGllbF9lbnYlMjBpbXBvcnQlMjBPcGVuU3BpZWxFbnYlMkMlMjBPcGVuU3BpZWxBY3Rpb24lMEElMEF0cnklM0ElMEElMjAlMjAlMjAlMjAlMjMlMjBDcmVhdGUlMjBlbnZpcm9ubWVudCUyMGZyb20lMjBEb2NrZXIlMjBpbWFnZSUwQSUyMCUyMCUyMCUyMGVudiUyMCUzRCUyME9wZW5TcGllbEVudi5mcm9tX2RvY2tlcl9pbWFnZSglMjJvcGVuc3BpZWwtZW52JTNBbGF0ZXN0JTIyKSUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMFJlc2V0JTIwdG8lMjBzdGFydCUyMGElMjBuZXclMjBlcGlzb2RlJTBBJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwZW52LnJlc2V0KCklMEElMjAlMjAlMjAlMjBwcmludChmJTIySW5pdGlhbCUyMHN0YXRlJTNBJTIwJTdCcmVzdWx0Lm9ic2VydmF0aW9uLmluZm9fc3RhdGUlN0QlMjIpJTBBJTIwJTIwJTIwJTIwcHJpbnQoZiUyMkxlZ2FsJTIwYWN0aW9ucyUzQSUyMCU3QnJlc3VsdC5vYnNlcnZhdGlvbi5sZWdhbF9hY3Rpb25zJTdEJTIyKSUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMFBsYXklMjB1bnRpbCUyMGRvbmUlMEElMjAlMjAlMjAlMjB3aGlsZSUyMG5vdCUyMHJlc3VsdC5kb25lJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWN0aW9uX2lkJTIwJTNEJTIwcmVzdWx0Lm9ic2VydmF0aW9uLmxlZ2FsX2FjdGlvbnMlNUIwJTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwZW52LnN0ZXAoT3BlblNwaWVsQWN0aW9uKGFjdGlvbl9pZCUzRGFjdGlvbl9pZCkpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQoZiUyMlJld2FyZCUzQSUyMCU3QnJlc3VsdC5yZXdhcmQlN0QlMkMlMjBEb25lJTNBJTIwJTdCcmVzdWx0LmRvbmUlN0QlMjIpJTBBJTBBZmluYWxseSUzQSUwQSUyMCUyMCUyMCUyMCUyMyUyMEFsd2F5cyUyMGNsZWFuJTIwdXAlMEElMjAlMjAlMjAlMjBlbnYuY2xvc2UoKQ==",highlighted:`<span class="hljs-keyword">from</span> openspiel_env <span class="hljs-keyword">import</span> OpenSpielEnv, OpenSpielAction | |
| <span class="hljs-keyword">try</span>: | |
| <span class="hljs-comment"># Create environment from Docker image</span> | |
| env = OpenSpielEnv.from_docker_image(<span class="hljs-string">"openspiel-env:latest"</span>) | |
| <span class="hljs-comment"># Reset to start a new episode</span> | |
| result = env.reset() | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Initial state: <span class="hljs-subst">{result.observation.info_state}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Legal actions: <span class="hljs-subst">{result.observation.legal_actions}</span>"</span>) | |
| <span class="hljs-comment"># Play until done</span> | |
| <span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> result.done: | |
| action_id = result.observation.legal_actions[<span class="hljs-number">0</span>] | |
| result = env.step(OpenSpielAction(action_id=action_id)) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Reward: <span class="hljs-subst">{result.reward}</span>, Done: <span class="hljs-subst">{result.done}</span>"</span>) | |
| <span class="hljs-keyword">finally</span>: | |
| <span class="hljs-comment"># Always clean up</span> | |
| env.close()`,lang:"python",wrap:!1}}),S=new w({props:{title:"Building the Docker Image",local:"building-the-docker-image",headingTag:"h2"}}),G=new w({props:{title:"Default Build (Recommended)",local:"default-build-recommended",headingTag:"h3"}}),A=new g({props:{code:"JTIzJTIwVXNlcyUyMHByZS1idWlsdCUyMGJhc2UlMjBpbWFnZSUyMGZyb20lMjBHSENSJTIwKGZhc3QlMkMlMjB+MS0yJTIwbWluKSUwQWRvY2tlciUyMGJ1aWxkJTIwLXQlMjBvcGVuc3BpZWwtZW52JTNBbGF0ZXN0JTIwLWYlMjBzZXJ2ZXIlMkZEb2NrZXJmaWxlJTIwLg==",highlighted:`<span class="hljs-comment"># Uses pre-built base image from GHCR (fast, ~1-2 min)</span> | |
| docker build -t openspiel-env:latest -f server/Dockerfile .`,lang:"bash",wrap:!1}}),V=new w({props:{title:"Building Your Own Base Image (Optional)",local:"building-your-own-base-image-optional",headingTag:"h3"}}),_=new g({props:{code:"JTIzJTIwU3RlcCUyMDElM0ElMjBCdWlsZCUyMHRoZSUyMGJhc2UlMjBpbWFnZSUyMChjb21waWxlcyUyME9wZW5TcGllbCUyQyUyMH4zMC02MCUyMG1pbiklMEFkb2NrZXIlMjBidWlsZCUyMC10JTIwb3BlbnNwaWVsLWJhc2UlM0FsYXRlc3QlMjAtZiUyMHNlcnZlciUyRkRvY2tlcmZpbGUub3BlbnNwaWVsLWJhc2UlMjAuJTBBJTBBJTIzJTIwU3RlcCUyMDIlM0ElMjBCdWlsZCUyMHRoZSUyMGVudmlyb25tZW50JTIwdXNpbmclMjB5b3VyJTIwbG9jYWwlMjBiYXNlJTIwaW1hZ2UlMEFkb2NrZXIlMjBidWlsZCUyMC10JTIwb3BlbnNwaWVsLWVudiUzQWxhdGVzdCUyMCU1QyUwQSUyMCUyMC0tYnVpbGQtYXJnJTIwT1BFTlNQSUVMX0JBU0VfSU1BR0UlM0RvcGVuc3BpZWwtYmFzZSUzQWxhdGVzdCUyMCU1QyUwQSUyMCUyMC1mJTIwc2VydmVyJTJGRG9ja2VyZmlsZSUyMC4=",highlighted:`<span class="hljs-comment"># Step 1: Build the base image (compiles OpenSpiel, ~30-60 min)</span> | |
| docker build -t openspiel-base:latest -f server/Dockerfile.openspiel-base . | |
| <span class="hljs-comment"># Step 2: Build the environment using your local base image</span> | |
| docker build -t openspiel-env:latest \\ | |
| --build-arg OPENSPIEL_BASE_IMAGE=openspiel-base:latest \\ | |
| -f server/Dockerfile .`,lang:"bash",wrap:!1}}),F=new w({props:{title:"Deploying to Hugging Face Spaces",local:"deploying-to-hugging-face-spaces",headingTag:"h2"}}),x=new g({props:{code:"JTIzJTIwRnJvbSUyMHRoZSUyMGVudmlyb25tZW50JTIwZGlyZWN0b3J5JTIwKGVudnMlMkZvcGVuc3BpZWxfZW52JTJGKSUwQW9wZW5lbnYlMjBwdXNoJTBBJTBBJTIzJTIwT3IlMjBzcGVjaWZ5JTIwb3B0aW9ucyUwQW9wZW5lbnYlMjBwdXNoJTIwLS1uYW1lc3BhY2UlMjBteS1vcmclMjAtLXByaXZhdGU=",highlighted:`<span class="hljs-comment"># From the environment directory (envs/openspiel_env/)</span> | |
| openenv push | |
| <span class="hljs-comment"># Or specify options</span> | |
| openenv push --namespace my-org --private`,lang:"bash",wrap:!1}}),O=new w({props:{title:"Prerequisites",local:"prerequisites",headingTag:"h3"}}),Y=new w({props:{title:"Options",local:"options",headingTag:"h3"}}),D=new w({props:{title:"Examples",local:"examples",headingTag:"h3"}}),q=new g({props:{code:"JTIzJTIwUHVzaCUyMHRvJTIweW91ciUyMHBlcnNvbmFsJTIwbmFtZXNwYWNlJTIwKGRlZmF1bHRzJTIwdG8lMjB1c2VybmFtZSUyRmVudi1uYW1lJTIwZnJvbSUyMG9wZW5lbnYueWFtbCklMEFvcGVuZW52JTIwcHVzaCUwQSUwQSUyMyUyMFB1c2glMjB0byUyMGElMjBzcGVjaWZpYyUyMHJlcG9zaXRvcnklMEFvcGVuZW52JTIwcHVzaCUyMC0tcmVwby1pZCUyMG15LW9yZyUyRm9wZW5zcGllbC1lbnYlMEElMEElMjMlMjBQdXNoJTIwYXMlMjBhJTIwcHJpdmF0ZSUyMHNwYWNlJTBBb3BlbmVudiUyMHB1c2glMjAtLXByaXZhdGUlMEElMEElMjMlMjBDb21iaW5lJTIwb3B0aW9ucyUwQW9wZW5lbnYlMjBwdXNoJTIwLS1yZXBvLWlkJTIwbXktb3JnJTJGb3BlbnNwaWVsLWVudiUyMC0tcHJpdmF0ZSUwQSUwQSUyMyUyMFNlbGVjdCUyMGElMjBnYW1lJTIwYXQlMjBwdXNoJTIwdGltZSUyMChvdmVycmlkZXMlMjB2YXJpYWJsZXMlM0ElMjBpbiUyMG9wZW5lbnYueWFtbCklMEFvcGVuZW52JTIwcHVzaCUyMC1lJTIwT1BFTlNQSUVMX0dBTUUlM0R0aWNfdGFjX3RvZSUwQSUwQSUyMyUyMFB1c2glMjB3aXRoJTIwYSUyMHByaXZhdGUlMjBzZWNyZXQlMjAobm90JTIwbG9nZ2VkJTJDJTIwc3RvcmVkJTIwZW5jcnlwdGVkJTIwaW4lMjB0aGUlMjBTcGFjZSklMEFvcGVuZW52JTIwcHVzaCUyMC0tc2VjcmV0JTIwT1BFTkFJX0FQSV9LRVklM0Rzay0uLi4=",highlighted:`<span class="hljs-comment"># Push to your personal namespace (defaults to username/env-name from openenv.yaml)</span> | |
| openenv push | |
| <span class="hljs-comment"># Push to a specific repository</span> | |
| openenv push --repo-id my-org/openspiel-env | |
| <span class="hljs-comment"># Push as a private space</span> | |
| openenv push --private | |
| <span class="hljs-comment"># Combine options</span> | |
| openenv push --repo-id my-org/openspiel-env --private | |
| <span class="hljs-comment"># Select a game at push time (overrides variables: in openenv.yaml)</span> | |
| openenv push -e OPENSPIEL_GAME=tic_tac_toe | |
| <span class="hljs-comment"># Push with a private secret (not logged, stored encrypted in the Space)</span> | |
| openenv push --secret OPENAI_API_KEY=sk-...`,lang:"bash",wrap:!1}}),K=new w({props:{title:"Declaring defaults in openenv.yaml",local:"declaring-defaults-in-openenvyaml",headingTag:"h3"}}),le=new g({props:{code:"dmFyaWFibGVzJTNBJTBBJTIwJTIwT1BFTlNQSUVMX0dBTUUlM0ElMjBjYXRjaA==",highlighted:`<span class="hljs-attr">variables:</span> | |
| <span class="hljs-attr">OPENSPIEL_GAME:</span> <span class="hljs-string">catch</span>`,lang:"yaml",wrap:!1}}),pe=new w({props:{title:"Running Specific Games",local:"running-specific-games",headingTag:"h2"}}),oe=new g({props:{code:"JTIzJTIwQ2F0Y2glMjAoZGVmYXVsdCklMEFkb2NrZXIlMjBydW4lMjAtcCUyMDgwMDAlM0E4MDAwJTIwb3BlbnNwaWVsLWVudiUzQWxhdGVzdCUwQSUwQSUyMyUyMFRpYy1UYWMtVG9lJTIwd2l0aCUyMHJhbmRvbSUyMG9wcG9uZW50JTBBZG9ja2VyJTIwcnVuJTIwLXAlMjA4MDAwJTNBODAwMCUyMC1lJTIwT1BFTlNQSUVMX0dBTUUlM0R0aWNfdGFjX3RvZSUyMG9wZW5zcGllbC1lbnYlM0FsYXRlc3QlMEElMEElMjMlMjBLdWhuJTIwUG9rZXIlMEFkb2NrZXIlMjBydW4lMjAtcCUyMDgwMDAlM0E4MDAwJTIwLWUlMjBPUEVOU1BJRUxfR0FNRSUzRGt1aG5fcG9rZXIlMjBvcGVuc3BpZWwtZW52JTNBbGF0ZXN0JTBBJTBBJTIzJTIwMjA0OCUwQWRvY2tlciUyMHJ1biUyMC1wJTIwODAwMCUzQTgwMDAlMjAtZSUyME9QRU5TUElFTF9HQU1FJTNEMjA0OCUyMG9wZW5zcGllbC1lbnYlM0FsYXRlc3QlMEElMEElMjMlMjBCbGFja2phY2slMEFkb2NrZXIlMjBydW4lMjAtcCUyMDgwMDAlM0E4MDAwJTIwLWUlMjBPUEVOU1BJRUxfR0FNRSUzRGJsYWNramFjayUyMG9wZW5zcGllbC1lbnYlM0FsYXRlc3QlMEElMEElMjMlMjBDbGlmZiUyMFdhbGtpbmclMEFkb2NrZXIlMjBydW4lMjAtcCUyMDgwMDAlM0E4MDAwJTIwLWUlMjBPUEVOU1BJRUxfR0FNRSUzRGNsaWZmX3dhbGtpbmclMjBvcGVuc3BpZWwtZW52JTNBbGF0ZXN0",highlighted:`<span class="hljs-comment"># Catch (default)</span> | |
| docker run -p 8000:8000 openspiel-env:latest | |
| <span class="hljs-comment"># Tic-Tac-Toe with random opponent</span> | |
| docker run -p 8000:8000 -e OPENSPIEL_GAME=tic_tac_toe openspiel-env:latest | |
| <span class="hljs-comment"># Kuhn Poker</span> | |
| docker run -p 8000:8000 -e OPENSPIEL_GAME=kuhn_poker openspiel-env:latest | |
| <span class="hljs-comment"># 2048</span> | |
| docker run -p 8000:8000 -e OPENSPIEL_GAME=2048 openspiel-env:latest | |
| <span class="hljs-comment"># Blackjack</span> | |
| docker run -p 8000:8000 -e OPENSPIEL_GAME=blackjack openspiel-env:latest | |
| <span class="hljs-comment"># Cliff Walking</span> | |
| docker run -p 8000:8000 -e OPENSPIEL_GAME=cliff_walking openspiel-env:latest`,lang:"bash",wrap:!1}}),re=new w({props:{title:"Environment Details",local:"environment-details",headingTag:"h2"}}),me=new w({props:{title:"Action",local:"action",headingTag:"h3"}}),Te=new w({props:{title:"Observation",local:"observation",headingTag:"h3"}}),ge=new w({props:{title:"State",local:"state",headingTag:"h3"}}),fe=new w({props:{title:"Configuration",local:"configuration",headingTag:"h2"}}),Ue=new w({props:{title:"Environment Variables",local:"environment-variables",headingTag:"h3"}}),$e=new w({props:{title:"Example: Tic-Tac-Toe with Fixed Opponent",local:"example-tic-tac-toe-with-fixed-opponent",headingTag:"h3"}}),be=new g({props:{code:"ZG9ja2VyJTIwcnVuJTIwLXAlMjA4MDAwJTNBODAwMCUyMCU1QyUwQSUyMCUyMC1lJTIwT1BFTlNQSUVMX0dBTUUlM0R0aWNfdGFjX3RvZSUyMCU1QyUwQSUyMCUyMC1lJTIwT1BFTlNQSUVMX09QUE9ORU5UX1BPTElDWSUzRGZpcnN0JTIwJTVDJTBBJTIwJTIwb3BlbnNwaWVsLWVudiUzQWxhdGVzdA==",highlighted:`docker run -p 8000:8000 \\ | |
| -e OPENSPIEL_GAME=tic_tac_toe \\ | |
| -e OPENSPIEL_OPPONENT_POLICY=first \\ | |
| openspiel-env:latest`,lang:"bash",wrap:!1}}),ve=new w({props:{title:"Advanced Usage",local:"advanced-usage",headingTag:"h2"}}),je=new w({props:{title:"Connecting to an Existing Server",local:"connecting-to-an-existing-server",headingTag:"h3"}}),Ie=new g({props:{code:"ZnJvbSUyMG9wZW5zcGllbF9lbnYlMjBpbXBvcnQlMjBPcGVuU3BpZWxFbnYlMkMlMjBPcGVuU3BpZWxBY3Rpb24lMEElMEElMjMlMjBDb25uZWN0JTIwdG8lMjBleGlzdGluZyUyMHNlcnZlciUwQWVudiUyMCUzRCUyME9wZW5TcGllbEVudihiYXNlX3VybCUzRCUyMmh0dHAlM0ElMkYlMkZsb2NhbGhvc3QlM0E4MDAwJTIyKSUwQSUwQSUyMyUyMFVzZSUyMGFzJTIwbm9ybWFsJTBBcmVzdWx0JTIwJTNEJTIwZW52LnJlc2V0KCklMEFyZXN1bHQlMjAlM0QlMjBlbnYuc3RlcChPcGVuU3BpZWxBY3Rpb24oYWN0aW9uX2lkJTNEcmVzdWx0Lm9ic2VydmF0aW9uLmxlZ2FsX2FjdGlvbnMlNUIwJTVEKSklMEElMEElMjMlMjBDbG9zZSUyMGNvbm5lY3Rpb24lMjAoZG9lcyUyME5PVCUyMHN0b3AlMjB0aGUlMjBzZXJ2ZXIpJTBBZW52LmNsb3NlKCk=",highlighted:`<span class="hljs-keyword">from</span> openspiel_env <span class="hljs-keyword">import</span> OpenSpielEnv, OpenSpielAction | |
| <span class="hljs-comment"># Connect to existing server</span> | |
| env = OpenSpielEnv(base_url=<span class="hljs-string">"http://localhost:8000"</span>) | |
| <span class="hljs-comment"># Use as normal</span> | |
| result = env.reset() | |
| result = env.step(OpenSpielAction(action_id=result.observation.legal_actions[<span class="hljs-number">0</span>])) | |
| <span class="hljs-comment"># Close connection (does NOT stop the server)</span> | |
| env.close()`,lang:"python",wrap:!1}}),Ce=new w({props:{title:"Connecting to HuggingFace Space",local:"connecting-to-huggingface-space",headingTag:"h3"}}),Be=new g({props:{code:"ZnJvbSUyMG9wZW5zcGllbF9lbnYlMjBpbXBvcnQlMjBPcGVuU3BpZWxFbnYlMkMlMjBPcGVuU3BpZWxBY3Rpb24lMEElMEElMjMlMjBDb25uZWN0JTIwdG8lMjByZW1vdGUlMjBTcGFjZSUwQWVudiUyMCUzRCUyME9wZW5TcGllbEVudihiYXNlX3VybCUzRCUyMmh0dHBzJTNBJTJGJTJGeW91ci11c2VybmFtZS1vcGVuc3BpZWwuaGYuc3BhY2UlMjIpJTBBJTBBcmVzdWx0JTIwJTNEJTIwZW52LnJlc2V0KCklMEFwcmludChmJTIyR2FtZSUzQSUyMCU3QnJlc3VsdC5vYnNlcnZhdGlvbi5nYW1lX3BoYXNlJTdEJTIyKSUwQXByaW50KGYlMjJMZWdhbCUyMGFjdGlvbnMlM0ElMjAlN0JyZXN1bHQub2JzZXJ2YXRpb24ubGVnYWxfYWN0aW9ucyU3RCUyMiklMEElMEFyZXN1bHQlMjAlM0QlMjBlbnYuc3RlcChPcGVuU3BpZWxBY3Rpb24oYWN0aW9uX2lkJTNEcmVzdWx0Lm9ic2VydmF0aW9uLmxlZ2FsX2FjdGlvbnMlNUIwJTVEKSklMEFlbnYuY2xvc2UoKQ==",highlighted:`<span class="hljs-keyword">from</span> openspiel_env <span class="hljs-keyword">import</span> OpenSpielEnv, OpenSpielAction | |
| <span class="hljs-comment"># Connect to remote Space</span> | |
| env = OpenSpielEnv(base_url=<span class="hljs-string">"https://your-username-openspiel.hf.space"</span>) | |
| result = env.reset() | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Game: <span class="hljs-subst">{result.observation.game_phase}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Legal actions: <span class="hljs-subst">{result.observation.legal_actions}</span>"</span>) | |
| result = env.step(OpenSpielAction(action_id=result.observation.legal_actions[<span class="hljs-number">0</span>])) | |
| env.close()`,lang:"python",wrap:!1}}),We=new w({props:{title:"Game-Specific Information",local:"game-specific-information",headingTag:"h2"}}),Ze=new w({props:{title:"1. Catch",local:"1-catch",headingTag:"h3"}}),Ee=new w({props:{title:"2. Tic-Tac-Toe",local:"2-tic-tac-toe",headingTag:"h3"}}),ke=new w({props:{title:"3. Kuhn Poker",local:"3-kuhn-poker",headingTag:"h3"}}),Ne=new w({props:{title:"4. Cliff Walking",local:"4-cliff-walking",headingTag:"h3"}}),Le=new w({props:{title:"5. 2048",local:"5-2048",headingTag:"h3"}}),Fe=new w({props:{title:"6. Blackjack",local:"6-blackjack",headingTag:"h3"}}),xe=new w({props:{title:"Development & Testing",local:"development--testing",headingTag:"h2"}}),Xe=new w({props:{title:"Direct Environment Testing",local:"direct-environment-testing",headingTag:"h3"}}),Oe=new g({props:{code:"ZnJvbSUyMG9wZW5zcGllbF9lbnYuc2VydmVyLm9wZW5zcGllbF9lbnZpcm9ubWVudCUyMGltcG9ydCUyME9wZW5TcGllbEVudmlyb25tZW50JTBBZnJvbSUyMG9wZW5zcGllbF9lbnYubW9kZWxzJTIwaW1wb3J0JTIwT3BlblNwaWVsQWN0aW9uJTBBJTBBJTIzJTIwQ3JlYXRlJTIwZW52aXJvbm1lbnQlMjBkaXJlY3RseSUwQWVudiUyMCUzRCUyME9wZW5TcGllbEVudmlyb25tZW50KGdhbWVfbmFtZSUzRCUyMmNhdGNoJTIyKSUwQSUwQSUyMyUyMFRlc3QlMjByZXNldCUwQW9icyUyMCUzRCUyMGVudi5yZXNldCgpJTBBcHJpbnQoZiUyMkluZm8lMjBzdGF0ZSUzQSUyMCU3Qm9icy5pbmZvX3N0YXRlJTdEJTIyKSUwQSUwQSUyMyUyMFRlc3QlMjBzdGVwJTBBb2JzJTIwJTNEJTIwZW52LnN0ZXAoT3BlblNwaWVsQWN0aW9uKGFjdGlvbl9pZCUzRDApKSUwQXByaW50KGYlMjJEb25lJTNBJTIwJTdCb2JzLmRvbmUlN0QlMkMlMjBSZXdhcmQlM0ElMjAlN0JvYnMucmV3YXJkJTdEJTIyKQ==",highlighted:`<span class="hljs-keyword">from</span> openspiel_env.server.openspiel_environment <span class="hljs-keyword">import</span> OpenSpielEnvironment | |
| <span class="hljs-keyword">from</span> openspiel_env.models <span class="hljs-keyword">import</span> OpenSpielAction | |
| <span class="hljs-comment"># Create environment directly</span> | |
| env = OpenSpielEnvironment(game_name=<span class="hljs-string">"catch"</span>) | |
| <span class="hljs-comment"># Test reset</span> | |
| obs = env.reset() | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Info state: <span class="hljs-subst">{obs.info_state}</span>"</span>) | |
| <span class="hljs-comment"># Test step</span> | |
| obs = env.step(OpenSpielAction(action_id=<span class="hljs-number">0</span>)) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Done: <span class="hljs-subst">{obs.done}</span>, Reward: <span class="hljs-subst">{obs.reward}</span>"</span>)`,lang:"python",wrap:!1}}),He=new w({props:{title:"Running Locally",local:"running-locally",headingTag:"h3"}}),Pe=new g({props:{code:"JTIzJTIwRnJvbSUyMHRoZSUyMGVudmlyb25tZW50JTIwZGlyZWN0b3J5JTBBY2QlMjBlbnZzJTJGb3BlbnNwaWVsX2VudiUwQSUwQSUyMyUyMEluc3RhbGwlMjBkZXBlbmRlbmNpZXMlMEF1diUyMHZlbnYlMjAlMjYlMjYlMjBzb3VyY2UlMjAudmVudiUyRmJpbiUyRmFjdGl2YXRlJTBBdXYlMjBwaXAlMjBpbnN0YWxsJTIwLWUlMjAuJTBBJTBBJTIzJTIwU3RhcnQlMjB0aGUlMjBzZXJ2ZXIlMEFweXRob24lMjAtbSUyMHV2aWNvcm4lMjBzZXJ2ZXIuYXBwJTNBYXBwJTIwLS1yZWxvYWQ=",highlighted:`<span class="hljs-comment"># From the environment directory</span> | |
| <span class="hljs-built_in">cd</span> envs/openspiel_env | |
| <span class="hljs-comment"># Install dependencies</span> | |
| uv venv && <span class="hljs-built_in">source</span> .venv/bin/activate | |
| uv pip install -e . | |
| <span class="hljs-comment"># Start the server</span> | |
| python -m uvicorn server.app:app --reload`,lang:"bash",wrap:!1}}),De=new g({props:{code:"dXYlMjBydW4lMjAtLXByb2plY3QlMjAuJTIwc2VydmVyJTIwLS1wb3J0JTIwODAwMA==",highlighted:"uv run --project . server --port 8000",lang:"bash",wrap:!1}}),qe=new w({props:{title:"Automated Testing (All 6 Games)",local:"automated-testing-all-6-games",headingTag:"h3"}}),Ke=new g({props:{code:"LiUyRnRlc3RfZG9ja2VyX2FsbF9nYW1lcy5zaA==",highlighted:"./test_docker_all_games.sh",lang:"bash",wrap:!1}}),ll=new w({props:{title:"Project Structure",local:"project-structure",headingTag:"h2"}}),tl=new g({props:{code:"b3BlbnNwaWVsX2VudiUyRiUwQSVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMF9faW5pdF9fLnB5JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwTW9kdWxlJTIwZXhwb3J0cyUwQSVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMFJFQURNRS5tZCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFRoaXMlMjBmaWxlJTBBJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwb3BlbmVudi55YW1sJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwT3BlbkVudiUyMG1hbmlmZXN0JTBBJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwcHlwcm9qZWN0LnRvbWwlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBQcm9qZWN0JTIwbWV0YWRhdGElMjBhbmQlMjBkZXBlbmRlbmNpZXMlMEElRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjBjbGllbnQucHklMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBPcGVuU3BpZWxFbnYlMjBjbGllbnQlMjBpbXBsZW1lbnRhdGlvbiUwQSVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMG1vZGVscy5weSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEFjdGlvbiUyQyUyME9ic2VydmF0aW9uJTJDJTIwYW5kJTIwU3RhdGUlMjBtb2RlbHMlMEElRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjB0ZXN0X2RvY2tlcl9hbGxfZ2FtZXMuc2glMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBBdXRvbWF0ZWQlMjB0ZXN0JTIwc2NyaXB0JTBBJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJTIwc2VydmVyJTJGJTBBJTIwJTIwJTIwJTIwJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwX19pbml0X18ucHklMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTZXJ2ZXIlMjBtb2R1bGUlMjBleHBvcnRzJTBBJTIwJTIwJTIwJTIwJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwb3BlbnNwaWVsX2Vudmlyb25tZW50LnB5JTIwJTIwJTIwJTIzJTIwQ29yZSUyME9wZW5TcGllbEVudmlyb25tZW50JTIwaW1wbGVtZW50YXRpb24lMEElMjAlMjAlMjAlMjAlRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjBvcHBvbmVudF9wb2xpY2llcy5weSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyME9wcG9uZW50JTIwcG9saWNpZXMlMjAocmFuZG9tJTJDJTIwZml4ZWQpJTBBJTIwJTIwJTIwJTIwJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwYXBwLnB5JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwRmFzdEFQSSUyMGFwcGxpY2F0aW9uJTBBJTIwJTIwJTIwJTIwJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwRG9ja2VyZmlsZSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEVudmlyb25tZW50JTIwY29udGFpbmVyJTIwKHVzZXMlMjBwcmUtYnVpbHQlMjBiYXNlKSUwQSUyMCUyMCUyMCUyMCVFMiU5NCU5NCVFMiU5NCU4MCVFMiU5NCU4MCUyMERvY2tlcmZpbGUub3BlbnNwaWVsLWJhc2UlMjAlMjAlMjMlMjBCYXNlJTIwaW1hZ2UlMjB3aXRoJTIwY29tcGlsZWQlMjBPcGVuU3BpZWw=",highlighted:`openspiel_env/ | |
| ├── __init__.py # Module exports | |
| ├── README.md # This file | |
| ├── openenv.yaml # OpenEnv manifest | |
| ├── pyproject.toml # Project metadata and dependencies | |
| ├── client.py # OpenSpielEnv client <span class="hljs-keyword">implementation</span> | |
| ├── models.py # Action, Observation, and State models | |
| ├── test_docker_all_games.sh # Automated test script | |
| └── server/ | |
| ├── __init__.py # Server <span class="hljs-keyword">module</span> exports | |
| ├── openspiel_environment.py # Core OpenSpielEnvironment <span class="hljs-keyword">implementation</span> | |
| ├── opponent_policies.py # Opponent policies (random, fixed) | |
| ├── app.py # FastAPI application | |
| ├── Dockerfile # Environment container (uses pre-built base) | |
| └── Dockerfile.openspiel-base # Base image <span class="hljs-keyword">with</span> compiled OpenSpiel`,lang:"",wrap:!1}}),nl=new w({props:{title:"Limitations",local:"limitations",headingTag:"h2"}}),sl=new w({props:{title:"References",local:"references",headingTag:"h2"}}),pl=new ii({props:{source:"https://github.com/huggingface/openenv/blob/main/docs/source/environments/openspiel.md"}}),{c(){d=c("meta"),ml=i(),ol=c("p"),Ml=i(),a(f.$$.fragment),cl=i(),a(U.$$.fragment),Tl=i(),J=c("p"),J.innerHTML=an,yl=i(),a($.$$.fragment),wl=i(),b=c("p"),b.textContent=pn,gl=i(),a(v.$$.fragment),dl=i(),j=c("ol"),j.innerHTML=on,ul=i(),a(h.$$.fragment),fl=i(),u=c("ol"),u.innerHTML=rn,Ul=i(),a(I.$$.fragment),Jl=i(),C=c("p"),C.innerHTML=mn,$l=i(),a(B.$$.fragment),bl=i(),W=c("p"),W.innerHTML=Mn,vl=i(),Z=c("ul"),Z.innerHTML=cn,jl=i(),a(S.$$.fragment),hl=i(),E=c("p"),E.innerHTML=Tn,Il=i(),a(G.$$.fragment),Cl=i(),k=c("p"),k.innerHTML=yn,Bl=i(),a(A.$$.fragment),Wl=i(),N=c("p"),N.innerHTML=wn,Zl=i(),a(V.$$.fragment),Sl=i(),L=c("p"),L.textContent=gn,El=i(),a(_.$$.fragment),Gl=i(),a(F.$$.fragment),kl=i(),R=c("p"),R.innerHTML=dn,Al=i(),a(x.$$.fragment),Nl=i(),X=c("p"),X.innerHTML=un,Vl=i(),Q=c("ol"),Q.innerHTML=fn,Ll=i(),a(O.$$.fragment),_l=i(),H=c("ul"),H.innerHTML=Un,Fl=i(),a(Y.$$.fragment),Rl=i(),P=c("ul"),P.innerHTML=Jn,xl=i(),z=c("p"),z.innerHTML=$n,Xl=i(),a(D.$$.fragment),Ql=i(),a(q.$$.fragment),Ol=i(),a(K.$$.fragment),Hl=i(),ee=c("p"),ee.innerHTML=bn,Yl=i(),a(le.$$.fragment),Pl=i(),te=c("p"),te.innerHTML=vn,zl=i(),ne=c("p"),ne.innerHTML=jn,Dl=i(),ie=c("p"),ie.textContent=hn,ql=i(),se=c("ul"),se.innerHTML=In,Kl=i(),ae=c("blockquote"),ae.innerHTML=Cn,et=i(),a(pe.$$.fragment),lt=i(),a(oe.$$.fragment),tt=i(),a(re.$$.fragment),nt=i(),a(me.$$.fragment),it=i(),Me=c("p"),Me.innerHTML=Bn,st=i(),ce=c("ul"),ce.innerHTML=Wn,at=i(),a(Te.$$.fragment),pt=i(),ye=c("p"),ye.innerHTML=Zn,ot=i(),we=c("ul"),we.innerHTML=Sn,rt=i(),a(ge.$$.fragment),mt=i(),de=c("p"),de.innerHTML=En,Mt=i(),ue=c("ul"),ue.innerHTML=Gn,ct=i(),a(fe.$$.fragment),Tt=i(),a(Ue.$$.fragment),yt=i(),Je=c("ul"),Je.innerHTML=kn,wt=i(),a($e.$$.fragment),gt=i(),a(be.$$.fragment),dt=i(),a(ve.$$.fragment),ut=i(),a(je.$$.fragment),ft=i(),he=c("p"),he.textContent=An,Ut=i(),a(Ie.$$.fragment),Jt=i(),a(Ce.$$.fragment),$t=i(),a(Be.$$.fragment),bt=i(),a(We.$$.fragment),vt=i(),a(Ze.$$.fragment),jt=i(),Se=c("ul"),Se.innerHTML=Nn,ht=i(),a(Ee.$$.fragment),It=i(),Ge=c("ul"),Ge.innerHTML=Vn,Ct=i(),a(ke.$$.fragment),Bt=i(),Ae=c("ul"),Ae.innerHTML=Ln,Wt=i(),a(Ne.$$.fragment),Zt=i(),Ve=c("ul"),Ve.innerHTML=_n,St=i(),a(Le.$$.fragment),Et=i(),_e=c("ul"),_e.innerHTML=Fn,Gt=i(),a(Fe.$$.fragment),kt=i(),Re=c("ul"),Re.innerHTML=Rn,At=i(),a(xe.$$.fragment),Nt=i(),a(Xe.$$.fragment),Vt=i(),Qe=c("p"),Qe.textContent=xn,Lt=i(),a(Oe.$$.fragment),_t=i(),a(He.$$.fragment),Ft=i(),Ye=c("p"),Ye.textContent=Xn,Rt=i(),a(Pe.$$.fragment),xt=i(),ze=c("p"),ze.textContent=Qn,Xt=i(),a(De.$$.fragment),Qt=i(),a(qe.$$.fragment),Ot=i(),a(Ke.$$.fragment),Ht=i(),el=c("p"),el.textContent=On,Yt=i(),a(ll.$$.fragment),Pt=i(),a(tl.$$.fragment),zt=i(),a(nl.$$.fragment),Dt=i(),il=c("ul"),il.innerHTML=Hn,qt=i(),a(sl.$$.fragment),Kt=i(),al=c("ul"),al.innerHTML=Yn,en=i(),a(pl.$$.fragment),ln=i(),rl=c("p"),this.h()},l(e){const l=li("svelte-u9bgzb",document.head);d=T(l,"META",{name:!0,content:!0}),l.forEach(t),ml=s(e),ol=T(e,"P",{}),Pn(ol).forEach(t),Ml=s(e),p(f.$$.fragment,e),cl=s(e),p(U.$$.fragment,e),Tl=s(e),J=T(e,"P",{"data-svelte-h":!0}),y(J)!=="svelte-cm7rh5"&&(J.innerHTML=an),yl=s(e),p($.$$.fragment,e),wl=s(e),b=T(e,"P",{"data-svelte-h":!0}),y(b)!=="svelte-6s7nks"&&(b.textContent=pn),gl=s(e),p(v.$$.fragment,e),dl=s(e),j=T(e,"OL",{"data-svelte-h":!0}),y(j)!=="svelte-1uzsx80"&&(j.innerHTML=on),ul=s(e),p(h.$$.fragment,e),fl=s(e),u=T(e,"OL",{start:!0,"data-svelte-h":!0}),y(u)!=="svelte-3cib6l"&&(u.innerHTML=rn),Ul=s(e),p(I.$$.fragment,e),Jl=s(e),C=T(e,"P",{"data-svelte-h":!0}),y(C)!=="svelte-1xb6o33"&&(C.innerHTML=mn),$l=s(e),p(B.$$.fragment,e),bl=s(e),W=T(e,"P",{"data-svelte-h":!0}),y(W)!=="svelte-y25bbt"&&(W.innerHTML=Mn),vl=s(e),Z=T(e,"UL",{"data-svelte-h":!0}),y(Z)!=="svelte-18k8876"&&(Z.innerHTML=cn),jl=s(e),p(S.$$.fragment,e),hl=s(e),E=T(e,"P",{"data-svelte-h":!0}),y(E)!=="svelte-1k62cef"&&(E.innerHTML=Tn),Il=s(e),p(G.$$.fragment,e),Cl=s(e),k=T(e,"P",{"data-svelte-h":!0}),y(k)!=="svelte-moa3rv"&&(k.innerHTML=yn),Bl=s(e),p(A.$$.fragment,e),Wl=s(e),N=T(e,"P",{"data-svelte-h":!0}),y(N)!=="svelte-1ngpor"&&(N.innerHTML=wn),Zl=s(e),p(V.$$.fragment,e),Sl=s(e),L=T(e,"P",{"data-svelte-h":!0}),y(L)!=="svelte-7q01t7"&&(L.textContent=gn),El=s(e),p(_.$$.fragment,e),Gl=s(e),p(F.$$.fragment,e),kl=s(e),R=T(e,"P",{"data-svelte-h":!0}),y(R)!=="svelte-1w0m59y"&&(R.innerHTML=dn),Al=s(e),p(x.$$.fragment,e),Nl=s(e),X=T(e,"P",{"data-svelte-h":!0}),y(X)!=="svelte-10tfdgm"&&(X.innerHTML=un),Vl=s(e),Q=T(e,"OL",{"data-svelte-h":!0}),y(Q)!=="svelte-jijyjb"&&(Q.innerHTML=fn),Ll=s(e),p(O.$$.fragment,e),_l=s(e),H=T(e,"UL",{"data-svelte-h":!0}),y(H)!=="svelte-348gc7"&&(H.innerHTML=Un),Fl=s(e),p(Y.$$.fragment,e),Rl=s(e),P=T(e,"UL",{"data-svelte-h":!0}),y(P)!=="svelte-1t7gmt"&&(P.innerHTML=Jn),xl=s(e),z=T(e,"P",{"data-svelte-h":!0}),y(z)!=="svelte-1qc2tki"&&(z.innerHTML=$n),Xl=s(e),p(D.$$.fragment,e),Ql=s(e),p(q.$$.fragment,e),Ol=s(e),p(K.$$.fragment,e),Hl=s(e),ee=T(e,"P",{"data-svelte-h":!0}),y(ee)!=="svelte-175ei34"&&(ee.innerHTML=bn),Yl=s(e),p(le.$$.fragment,e),Pl=s(e),te=T(e,"P",{"data-svelte-h":!0}),y(te)!=="svelte-1ydn26f"&&(te.innerHTML=vn),zl=s(e),ne=T(e,"P",{"data-svelte-h":!0}),y(ne)!=="svelte-16csr9h"&&(ne.innerHTML=jn),Dl=s(e),ie=T(e,"P",{"data-svelte-h":!0}),y(ie)!=="svelte-nvk5q8"&&(ie.textContent=hn),ql=s(e),se=T(e,"UL",{"data-svelte-h":!0}),y(se)!=="svelte-1vgii3r"&&(se.innerHTML=In),Kl=s(e),ae=T(e,"BLOCKQUOTE",{"data-svelte-h":!0}),y(ae)!=="svelte-qqrfam"&&(ae.innerHTML=Cn),et=s(e),p(pe.$$.fragment,e),lt=s(e),p(oe.$$.fragment,e),tt=s(e),p(re.$$.fragment,e),nt=s(e),p(me.$$.fragment,e),it=s(e),Me=T(e,"P",{"data-svelte-h":!0}),y(Me)!=="svelte-duvbje"&&(Me.innerHTML=Bn),st=s(e),ce=T(e,"UL",{"data-svelte-h":!0}),y(ce)!=="svelte-xa9f7n"&&(ce.innerHTML=Wn),at=s(e),p(Te.$$.fragment,e),pt=s(e),ye=T(e,"P",{"data-svelte-h":!0}),y(ye)!=="svelte-retmix"&&(ye.innerHTML=Zn),ot=s(e),we=T(e,"UL",{"data-svelte-h":!0}),y(we)!=="svelte-1wj8xso"&&(we.innerHTML=Sn),rt=s(e),p(ge.$$.fragment,e),mt=s(e),de=T(e,"P",{"data-svelte-h":!0}),y(de)!=="svelte-sdv76z"&&(de.innerHTML=En),Mt=s(e),ue=T(e,"UL",{"data-svelte-h":!0}),y(ue)!=="svelte-1oiz69v"&&(ue.innerHTML=Gn),ct=s(e),p(fe.$$.fragment,e),Tt=s(e),p(Ue.$$.fragment,e),yt=s(e),Je=T(e,"UL",{"data-svelte-h":!0}),y(Je)!=="svelte-1by7s4b"&&(Je.innerHTML=kn),wt=s(e),p($e.$$.fragment,e),gt=s(e),p(be.$$.fragment,e),dt=s(e),p(ve.$$.fragment,e),ut=s(e),p(je.$$.fragment,e),ft=s(e),he=T(e,"P",{"data-svelte-h":!0}),y(he)!=="svelte-1rul16v"&&(he.textContent=An),Ut=s(e),p(Ie.$$.fragment,e),Jt=s(e),p(Ce.$$.fragment,e),$t=s(e),p(Be.$$.fragment,e),bt=s(e),p(We.$$.fragment,e),vt=s(e),p(Ze.$$.fragment,e),jt=s(e),Se=T(e,"UL",{"data-svelte-h":!0}),y(Se)!=="svelte-13hg6jk"&&(Se.innerHTML=Nn),ht=s(e),p(Ee.$$.fragment,e),It=s(e),Ge=T(e,"UL",{"data-svelte-h":!0}),y(Ge)!=="svelte-5p6irt"&&(Ge.innerHTML=Vn),Ct=s(e),p(ke.$$.fragment,e),Bt=s(e),Ae=T(e,"UL",{"data-svelte-h":!0}),y(Ae)!=="svelte-1qw9g67"&&(Ae.innerHTML=Ln),Wt=s(e),p(Ne.$$.fragment,e),Zt=s(e),Ve=T(e,"UL",{"data-svelte-h":!0}),y(Ve)!=="svelte-et1e1w"&&(Ve.innerHTML=_n),St=s(e),p(Le.$$.fragment,e),Et=s(e),_e=T(e,"UL",{"data-svelte-h":!0}),y(_e)!=="svelte-ui7999"&&(_e.innerHTML=Fn),Gt=s(e),p(Fe.$$.fragment,e),kt=s(e),Re=T(e,"UL",{"data-svelte-h":!0}),y(Re)!=="svelte-1r0hnft"&&(Re.innerHTML=Rn),At=s(e),p(xe.$$.fragment,e),Nt=s(e),p(Xe.$$.fragment,e),Vt=s(e),Qe=T(e,"P",{"data-svelte-h":!0}),y(Qe)!=="svelte-1nli5sk"&&(Qe.textContent=xn),Lt=s(e),p(Oe.$$.fragment,e),_t=s(e),p(He.$$.fragment,e),Ft=s(e),Ye=T(e,"P",{"data-svelte-h":!0}),y(Ye)!=="svelte-kztlmr"&&(Ye.textContent=Xn),Rt=s(e),p(Pe.$$.fragment,e),xt=s(e),ze=T(e,"P",{"data-svelte-h":!0}),y(ze)!=="svelte-kafmnw"&&(ze.textContent=Qn),Xt=s(e),p(De.$$.fragment,e),Qt=s(e),p(qe.$$.fragment,e),Ot=s(e),p(Ke.$$.fragment,e),Ht=s(e),el=T(e,"P",{"data-svelte-h":!0}),y(el)!=="svelte-pfggyn"&&(el.textContent=On),Yt=s(e),p(ll.$$.fragment,e),Pt=s(e),p(tl.$$.fragment,e),zt=s(e),p(nl.$$.fragment,e),Dt=s(e),il=T(e,"UL",{"data-svelte-h":!0}),y(il)!=="svelte-h4sjab"&&(il.innerHTML=Hn),qt=s(e),p(sl.$$.fragment,e),Kt=s(e),al=T(e,"UL",{"data-svelte-h":!0}),y(al)!=="svelte-1sgzx45"&&(al.innerHTML=Yn),en=s(e),p(pl.$$.fragment,e),ln=s(e),rl=T(e,"P",{}),Pn(rl).forEach(t),this.h()},h(){nn(d,"name","hf:doc:metadata"),nn(d,"content",ai),nn(u,"start","5")},m(e,l){ti(document.head,d),n(e,ml,l),n(e,ol,l),n(e,Ml,l),o(f,e,l),n(e,cl,l),o(U,e,l),n(e,Tl,l),n(e,J,l),n(e,yl,l),o($,e,l),n(e,wl,l),n(e,b,l),n(e,gl,l),o(v,e,l),n(e,dl,l),n(e,j,l),n(e,ul,l),o(h,e,l),n(e,fl,l),n(e,u,l),n(e,Ul,l),o(I,e,l),n(e,Jl,l),n(e,C,l),n(e,$l,l),o(B,e,l),n(e,bl,l),n(e,W,l),n(e,vl,l),n(e,Z,l),n(e,jl,l),o(S,e,l),n(e,hl,l),n(e,E,l),n(e,Il,l),o(G,e,l),n(e,Cl,l),n(e,k,l),n(e,Bl,l),o(A,e,l),n(e,Wl,l),n(e,N,l),n(e,Zl,l),o(V,e,l),n(e,Sl,l),n(e,L,l),n(e,El,l),o(_,e,l),n(e,Gl,l),o(F,e,l),n(e,kl,l),n(e,R,l),n(e,Al,l),o(x,e,l),n(e,Nl,l),n(e,X,l),n(e,Vl,l),n(e,Q,l),n(e,Ll,l),o(O,e,l),n(e,_l,l),n(e,H,l),n(e,Fl,l),o(Y,e,l),n(e,Rl,l),n(e,P,l),n(e,xl,l),n(e,z,l),n(e,Xl,l),o(D,e,l),n(e,Ql,l),o(q,e,l),n(e,Ol,l),o(K,e,l),n(e,Hl,l),n(e,ee,l),n(e,Yl,l),o(le,e,l),n(e,Pl,l),n(e,te,l),n(e,zl,l),n(e,ne,l),n(e,Dl,l),n(e,ie,l),n(e,ql,l),n(e,se,l),n(e,Kl,l),n(e,ae,l),n(e,et,l),o(pe,e,l),n(e,lt,l),o(oe,e,l),n(e,tt,l),o(re,e,l),n(e,nt,l),o(me,e,l),n(e,it,l),n(e,Me,l),n(e,st,l),n(e,ce,l),n(e,at,l),o(Te,e,l),n(e,pt,l),n(e,ye,l),n(e,ot,l),n(e,we,l),n(e,rt,l),o(ge,e,l),n(e,mt,l),n(e,de,l),n(e,Mt,l),n(e,ue,l),n(e,ct,l),o(fe,e,l),n(e,Tt,l),o(Ue,e,l),n(e,yt,l),n(e,Je,l),n(e,wt,l),o($e,e,l),n(e,gt,l),o(be,e,l),n(e,dt,l),o(ve,e,l),n(e,ut,l),o(je,e,l),n(e,ft,l),n(e,he,l),n(e,Ut,l),o(Ie,e,l),n(e,Jt,l),o(Ce,e,l),n(e,$t,l),o(Be,e,l),n(e,bt,l),o(We,e,l),n(e,vt,l),o(Ze,e,l),n(e,jt,l),n(e,Se,l),n(e,ht,l),o(Ee,e,l),n(e,It,l),n(e,Ge,l),n(e,Ct,l),o(ke,e,l),n(e,Bt,l),n(e,Ae,l),n(e,Wt,l),o(Ne,e,l),n(e,Zt,l),n(e,Ve,l),n(e,St,l),o(Le,e,l),n(e,Et,l),n(e,_e,l),n(e,Gt,l),o(Fe,e,l),n(e,kt,l),n(e,Re,l),n(e,At,l),o(xe,e,l),n(e,Nt,l),o(Xe,e,l),n(e,Vt,l),n(e,Qe,l),n(e,Lt,l),o(Oe,e,l),n(e,_t,l),o(He,e,l),n(e,Ft,l),n(e,Ye,l),n(e,Rt,l),o(Pe,e,l),n(e,xt,l),n(e,ze,l),n(e,Xt,l),o(De,e,l),n(e,Qt,l),o(qe,e,l),n(e,Ot,l),o(Ke,e,l),n(e,Ht,l),n(e,el,l),n(e,Yt,l),o(ll,e,l),n(e,Pt,l),o(tl,e,l),n(e,zt,l),o(nl,e,l),n(e,Dt,l),n(e,il,l),n(e,qt,l),o(sl,e,l),n(e,Kt,l),n(e,al,l),n(e,en,l),o(pl,e,l),n(e,ln,l),n(e,rl,l),tn=!0},p:Dn,i(e){tn||(r(f.$$.fragment,e),r(U.$$.fragment,e),r($.$$.fragment,e),r(v.$$.fragment,e),r(h.$$.fragment,e),r(I.$$.fragment,e),r(B.$$.fragment,e),r(S.$$.fragment,e),r(G.$$.fragment,e),r(A.$$.fragment,e),r(V.$$.fragment,e),r(_.$$.fragment,e),r(F.$$.fragment,e),r(x.$$.fragment,e),r(O.$$.fragment,e),r(Y.$$.fragment,e),r(D.$$.fragment,e),r(q.$$.fragment,e),r(K.$$.fragment,e),r(le.$$.fragment,e),r(pe.$$.fragment,e),r(oe.$$.fragment,e),r(re.$$.fragment,e),r(me.$$.fragment,e),r(Te.$$.fragment,e),r(ge.$$.fragment,e),r(fe.$$.fragment,e),r(Ue.$$.fragment,e),r($e.$$.fragment,e),r(be.$$.fragment,e),r(ve.$$.fragment,e),r(je.$$.fragment,e),r(Ie.$$.fragment,e),r(Ce.$$.fragment,e),r(Be.$$.fragment,e),r(We.$$.fragment,e),r(Ze.$$.fragment,e),r(Ee.$$.fragment,e),r(ke.$$.fragment,e),r(Ne.$$.fragment,e),r(Le.$$.fragment,e),r(Fe.$$.fragment,e),r(xe.$$.fragment,e),r(Xe.$$.fragment,e),r(Oe.$$.fragment,e),r(He.$$.fragment,e),r(Pe.$$.fragment,e),r(De.$$.fragment,e),r(qe.$$.fragment,e),r(Ke.$$.fragment,e),r(ll.$$.fragment,e),r(tl.$$.fragment,e),r(nl.$$.fragment,e),r(sl.$$.fragment,e),r(pl.$$.fragment,e),tn=!0)},o(e){m(f.$$.fragment,e),m(U.$$.fragment,e),m($.$$.fragment,e),m(v.$$.fragment,e),m(h.$$.fragment,e),m(I.$$.fragment,e),m(B.$$.fragment,e),m(S.$$.fragment,e),m(G.$$.fragment,e),m(A.$$.fragment,e),m(V.$$.fragment,e),m(_.$$.fragment,e),m(F.$$.fragment,e),m(x.$$.fragment,e),m(O.$$.fragment,e),m(Y.$$.fragment,e),m(D.$$.fragment,e),m(q.$$.fragment,e),m(K.$$.fragment,e),m(le.$$.fragment,e),m(pe.$$.fragment,e),m(oe.$$.fragment,e),m(re.$$.fragment,e),m(me.$$.fragment,e),m(Te.$$.fragment,e),m(ge.$$.fragment,e),m(fe.$$.fragment,e),m(Ue.$$.fragment,e),m($e.$$.fragment,e),m(be.$$.fragment,e),m(ve.$$.fragment,e),m(je.$$.fragment,e),m(Ie.$$.fragment,e),m(Ce.$$.fragment,e),m(Be.$$.fragment,e),m(We.$$.fragment,e),m(Ze.$$.fragment,e),m(Ee.$$.fragment,e),m(ke.$$.fragment,e),m(Ne.$$.fragment,e),m(Le.$$.fragment,e),m(Fe.$$.fragment,e),m(xe.$$.fragment,e),m(Xe.$$.fragment,e),m(Oe.$$.fragment,e),m(He.$$.fragment,e),m(Pe.$$.fragment,e),m(De.$$.fragment,e),m(qe.$$.fragment,e),m(Ke.$$.fragment,e),m(ll.$$.fragment,e),m(tl.$$.fragment,e),m(nl.$$.fragment,e),m(sl.$$.fragment,e),m(pl.$$.fragment,e),tn=!1},d(e){e&&(t(ml),t(ol),t(Ml),t(cl),t(Tl),t(J),t(yl),t(wl),t(b),t(gl),t(dl),t(j),t(ul),t(fl),t(u),t(Ul),t(Jl),t(C),t($l),t(bl),t(W),t(vl),t(Z),t(jl),t(hl),t(E),t(Il),t(Cl),t(k),t(Bl),t(Wl),t(N),t(Zl),t(Sl),t(L),t(El),t(Gl),t(kl),t(R),t(Al),t(Nl),t(X),t(Vl),t(Q),t(Ll),t(_l),t(H),t(Fl),t(Rl),t(P),t(xl),t(z),t(Xl),t(Ql),t(Ol),t(Hl),t(ee),t(Yl),t(Pl),t(te),t(zl),t(ne),t(Dl),t(ie),t(ql),t(se),t(Kl),t(ae),t(et),t(lt),t(tt),t(nt),t(it),t(Me),t(st),t(ce),t(at),t(pt),t(ye),t(ot),t(we),t(rt),t(mt),t(de),t(Mt),t(ue),t(ct),t(Tt),t(yt),t(Je),t(wt),t(gt),t(dt),t(ut),t(ft),t(he),t(Ut),t(Jt),t($t),t(bt),t(vt),t(jt),t(Se),t(ht),t(It),t(Ge),t(Ct),t(Bt),t(Ae),t(Wt),t(Zt),t(Ve),t(St),t(Et),t(_e),t(Gt),t(kt),t(Re),t(At),t(Nt),t(Vt),t(Qe),t(Lt),t(_t),t(Ft),t(Ye),t(Rt),t(xt),t(ze),t(Xt),t(Qt),t(Ot),t(Ht),t(el),t(Yt),t(Pt),t(zt),t(Dt),t(il),t(qt),t(Kt),t(al),t(en),t(ln),t(rl)),t(d),M(f,e),M(U,e),M($,e),M(v,e),M(h,e),M(I,e),M(B,e),M(S,e),M(G,e),M(A,e),M(V,e),M(_,e),M(F,e),M(x,e),M(O,e),M(Y,e),M(D,e),M(q,e),M(K,e),M(le,e),M(pe,e),M(oe,e),M(re,e),M(me,e),M(Te,e),M(ge,e),M(fe,e),M(Ue,e),M($e,e),M(be,e),M(ve,e),M(je,e),M(Ie,e),M(Ce,e),M(Be,e),M(We,e),M(Ze,e),M(Ee,e),M(ke,e),M(Ne,e),M(Le,e),M(Fe,e),M(xe,e),M(Xe,e),M(Oe,e),M(He,e),M(Pe,e),M(De,e),M(qe,e),M(Ke,e),M(ll,e),M(tl,e),M(nl,e),M(sl,e),M(pl,e)}}}const ai='{"title":"OpenSpiel Environment","local":"openspiel-environment","sections":[{"title":"Supported Games","local":"supported-games","sections":[{"title":"Single-Player Games (No Opponent)","local":"single-player-games-no-opponent","sections":[],"depth":3},{"title":"Multi-Player Games (with Bot Opponent)","local":"multi-player-games-with-bot-opponent","sections":[],"depth":3}],"depth":2},{"title":"Quick Start","local":"quick-start","sections":[],"depth":2},{"title":"Building the Docker Image","local":"building-the-docker-image","sections":[{"title":"Default Build (Recommended)","local":"default-build-recommended","sections":[],"depth":3},{"title":"Building Your Own Base Image (Optional)","local":"building-your-own-base-image-optional","sections":[],"depth":3}],"depth":2},{"title":"Deploying to Hugging Face Spaces","local":"deploying-to-hugging-face-spaces","sections":[{"title":"Prerequisites","local":"prerequisites","sections":[],"depth":3},{"title":"Options","local":"options","sections":[],"depth":3},{"title":"Examples","local":"examples","sections":[],"depth":3},{"title":"Declaring defaults in openenv.yaml","local":"declaring-defaults-in-openenvyaml","sections":[],"depth":3}],"depth":2},{"title":"Running Specific Games","local":"running-specific-games","sections":[],"depth":2},{"title":"Environment Details","local":"environment-details","sections":[{"title":"Action","local":"action","sections":[],"depth":3},{"title":"Observation","local":"observation","sections":[],"depth":3},{"title":"State","local":"state","sections":[],"depth":3}],"depth":2},{"title":"Configuration","local":"configuration","sections":[{"title":"Environment Variables","local":"environment-variables","sections":[],"depth":3},{"title":"Example: Tic-Tac-Toe with Fixed Opponent","local":"example-tic-tac-toe-with-fixed-opponent","sections":[],"depth":3}],"depth":2},{"title":"Advanced Usage","local":"advanced-usage","sections":[{"title":"Connecting to an Existing Server","local":"connecting-to-an-existing-server","sections":[],"depth":3},{"title":"Connecting to HuggingFace Space","local":"connecting-to-huggingface-space","sections":[],"depth":3}],"depth":2},{"title":"Game-Specific Information","local":"game-specific-information","sections":[{"title":"1. Catch","local":"1-catch","sections":[],"depth":3},{"title":"2. Tic-Tac-Toe","local":"2-tic-tac-toe","sections":[],"depth":3},{"title":"3. Kuhn Poker","local":"3-kuhn-poker","sections":[],"depth":3},{"title":"4. Cliff Walking","local":"4-cliff-walking","sections":[],"depth":3},{"title":"5. 2048","local":"5-2048","sections":[],"depth":3},{"title":"6. Blackjack","local":"6-blackjack","sections":[],"depth":3}],"depth":2},{"title":"Development & Testing","local":"development--testing","sections":[{"title":"Direct Environment Testing","local":"direct-environment-testing","sections":[],"depth":3},{"title":"Running Locally","local":"running-locally","sections":[],"depth":3},{"title":"Automated Testing (All 6 Games)","local":"automated-testing-all-6-games","sections":[],"depth":3}],"depth":2},{"title":"Project Structure","local":"project-structure","sections":[],"depth":2},{"title":"Limitations","local":"limitations","sections":[],"depth":2},{"title":"References","local":"references","sections":[],"depth":2}],"depth":1}';function pi(sn){return qn(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class ci extends Kn{constructor(d){super(),ei(this,d,pi,si,zn,{})}}export{ci as component}; | |
Xet Storage Details
- Size:
- 49 kB
- Xet hash:
- b525b837ba904bbe29be7256d4888f376de2c2fa208e4dcc753c2cb6c6f286e3
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.