Buckets:

download
raw
36.4 kB
import{s as Ls,n as Ds,o as Os}from"../chunks/scheduler.2b22cead.js";import{S as Ps,i as Ks,e as T,s as n,c as i,h as te,a as c,d as e,b as a,f as qs,g as o,j as y,k as Hs,l as se,m as l,n as p,t as M,o as r,p as m}from"../chunks/index.1a0e8013.js";import{C as ee,H as J,E as le}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.361fc810.js";import{C as h}from"../chunks/CodeBlock.0beca4be.js";function ne($s){let w,ut,bt,It,j,gt,U,Ct,b,Bs="A chat-based environment for LLMs with built-in tokenization and message history management. This environment is designed to work directly with language models and provides a minimal, flexible foundation for conversation-based RL training.",ft,d,$t,u,vs="ChatEnvironment is a lightweight environment that:",Bt,I,Zs="<li>Manages conversation history in Huggingface chat format</li> <li>Handles tokenization internally using any compatible tokenizer</li> <li>Stores both messages and tokens for efficient model interaction</li> <li>Provides a clean interface for building chat-based RL agents</li>",vt,g,ks="ChatEnvironment can be used in <strong>two ways</strong>:",Zt,C,Ws="<li><strong>Direct usage</strong>: Import and use ChatEnvironment directly in your Python code (best for local development)</li> <li><strong>HTTP client</strong>: Use ChatEnv client to connect to a ChatEnvironment server (best for distributed/containerized deployments)</li>",kt,f,Wt,$,Et,B,Gt,v,Xt,Z,Nt,k,zt,W,Es="Before using the HTTP client, build the Docker image:",Yt,E,Vt,G,Qt,X,At,N,Rt,z,Gs="Actions contain only tokens (PyTorch tensors) that interface directly with models:",_t,Y,Ft,V,St,Q,Xs="Observations contain both the message history and flattened tokens:",xt,A,qt,R,Ht,_,Ns="Internal state tracking message and token history:",Lt,F,Dt,S,Ot,x,Pt,q,zs="Resets the environment to initial state with optional system prompt.",Kt,H,ts,L,Ys="Takes an action (tokens), decodes to text, adds to history, returns updated observation.",ss,D,es,O,Vs="Convenience method to convert a message dict to a tokenized ChatAction.",ls,P,ns,K,as,tt,is,st,os,et,Qs="You can add transforms to compute rewards or modify observations:",ps,lt,Ms,nt,rs,at,As="If you’re generating tokens from a model, you can create actions directly:",ms,it,Js,ot,Ts,pt,Rs="ChatEnvironment is intentionally minimal and flexible:",cs,Mt,_s="<li><strong>No HTTP overhead</strong>: Works directly with Python objects and tensors</li> <li><strong>Tokenizer ownership</strong>: Environment handles tokenization consistently</li> <li><strong>Dual representation</strong>: Maintains both human-readable messages and model-ready tokens</li> <li><strong>Transform support</strong>: Extensible reward computation and observation modification</li> <li><strong>Type-safe</strong>: Uses typed Messages compatible with Huggingface format</li>",ys,rt,hs,mt,Fs="ChatEnvironment pairs naturally with language models:",ws,Jt,js,Tt,Us,ct,bs,yt,ds,ht,Ss="<li>Python 3.10+</li> <li>PyTorch</li> <li>A tokenizer with <code>apply_chat_template</code> method (e.g., Huggingface transformers)</li>",us,wt,Is,jt,xs="<li>ChatEnvironment does <strong>not</strong> generate responses - it only manages conversation state</li> <li>You need to provide tokens from your model or other source</li> <li>The environment is thread-safe for single-threaded use only</li> <li>For multi-turn conversations, alternate between user and assistant messages</li>",gs,Ut,Cs,dt,fs;return j=new ee({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),U=new J({props:{title:"Chat Environment",local:"chat-environment",headingTag:"h1"}}),d=new J({props:{title:"Overview",local:"overview",headingTag:"h2"}}),f=new J({props:{title:"Quick Start",local:"quick-start",headingTag:"h2"}}),$=new J({props:{title:"Option 1: Direct Usage (Local)",local:"option-1-direct-usage-local",headingTag:"h3"}}),B=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMEFmcm9tJTIwZW52cy5jaGF0X2VudiUyMGltcG9ydCUyMENoYXRBY3Rpb24lMkMlMjBDaGF0T2JzZXJ2YXRpb24lMEFmcm9tJTIwZW52cy5jaGF0X2Vudi5zZXJ2ZXIlMjBpbXBvcnQlMjBDaGF0RW52aXJvbm1lbnQlMEFmcm9tJTIwb3BlbmVudi5jb3JlLmVudl9zZXJ2ZXIlMjBpbXBvcnQlMjBNZXNzYWdlJTBBJTBBJTIzJTIwSW5pdGlhbGl6ZSUyMHdpdGglMjBhJTIwdG9rZW5pemVyJTIwYW5kJTIwb3B0aW9uYWwlMjBzeXN0ZW0lMjBwcm9tcHQlMEF0b2tlbml6ZXIlMjAlM0QlMjBBdXRvVG9rZW5pemVyLmZyb21fcHJldHJhaW5lZCglMjJncHQyJTIyKSUwQWVudiUyMCUzRCUyMENoYXRFbnZpcm9ubWVudCglMEElMjAlMjAlMjAlMjB0b2tlbml6ZXIlM0R0b2tlbml6ZXIlMkMlMEElMjAlMjAlMjAlMjBzeXN0ZW1fcHJvbXB0JTNEJTIyWW91JTIwYXJlJTIwYSUyMGhlbHBmdWwlMjBhc3Npc3RhbnQuJTIyJTJDJTBBJTIwJTIwJTIwJTIwc3lzdGVtX3JvbGUlM0QlMjJzeXN0ZW0lMjIlMEEpJTBBJTBBJTIzJTIwUmVzZXQlMjB0aGUlMjBlbnZpcm9ubWVudCUwQW9icyUyMCUzRCUyMGVudi5yZXNldCgpJTBBcHJpbnQoZiUyMk1lc3NhZ2VzJTNBJTIwJTdCb2JzLm1lc3NhZ2VzJTdEJTIyKSUwQXByaW50KGYlMjJUb2tlbnMlMjBzaGFwZSUzQSUyMCU3Qm9icy50b2tlbnMuc2hhcGUlN0QlMjIpJTBBJTBBJTIzJTIwQ3JlYXRlJTIwYW4lMjBhY3Rpb24lMjBmcm9tJTIwYSUyMG1lc3NhZ2UlMEF1c2VyX21lc3NhZ2UlM0ElMjBNZXNzYWdlJTIwJTNEJTIwJTdCJTIycm9sZSUyMiUzQSUyMCUyMnVzZXIlMjIlMkMlMjAlMjJjb250ZW50JTIyJTNBJTIwJTIySGVsbG8hJTIyJTdEJTBBYWN0aW9uJTIwJTNEJTIwZW52Lm1lc3NhZ2VfdG9fYWN0aW9uKHVzZXJfbWVzc2FnZSklMEElMEElMjMlMjBTdGVwJTIwdGhlJTIwZW52aXJvbm1lbnQlMEFvYnMlMjAlM0QlMjBlbnYuc3RlcChhY3Rpb24pJTBBcHJpbnQoZiUyMlVwZGF0ZWQlMjBtZXNzYWdlcyUzQSUyMCU3Qm9icy5tZXNzYWdlcyU3RCUyMiklMEFwcmludChmJTIyVXBkYXRlZCUyMHRva2VucyUyMHNoYXBlJTNBJTIwJTdCb2JzLnRva2Vucy5zaGFwZSU3RCUyMik=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer
<span class="hljs-keyword">from</span> envs.chat_env <span class="hljs-keyword">import</span> ChatAction, ChatObservation
<span class="hljs-keyword">from</span> envs.chat_env.server <span class="hljs-keyword">import</span> ChatEnvironment
<span class="hljs-keyword">from</span> openenv.core.env_server <span class="hljs-keyword">import</span> Message
<span class="hljs-comment"># Initialize with a tokenizer and optional system prompt</span>
tokenizer = AutoTokenizer.from_pretrained(<span class="hljs-string">&quot;gpt2&quot;</span>)
env = ChatEnvironment(
tokenizer=tokenizer,
system_prompt=<span class="hljs-string">&quot;You are a helpful assistant.&quot;</span>,
system_role=<span class="hljs-string">&quot;system&quot;</span>
)
<span class="hljs-comment"># Reset the environment</span>
obs = env.reset()
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Messages: <span class="hljs-subst">{obs.messages}</span>&quot;</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Tokens shape: <span class="hljs-subst">{obs.tokens.shape}</span>&quot;</span>)
<span class="hljs-comment"># Create an action from a message</span>
user_message: Message = {<span class="hljs-string">&quot;role&quot;</span>: <span class="hljs-string">&quot;user&quot;</span>, <span class="hljs-string">&quot;content&quot;</span>: <span class="hljs-string">&quot;Hello!&quot;</span>}
action = env.message_to_action(user_message)
<span class="hljs-comment"># Step the environment</span>
obs = env.step(action)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Updated messages: <span class="hljs-subst">{obs.messages}</span>&quot;</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Updated tokens shape: <span class="hljs-subst">{obs.tokens.shape}</span>&quot;</span>)`,lang:"python",wrap:!1}}),v=new J({props:{title:"Option 2: HTTP Client (Distributed)",local:"option-2-http-client-distributed",headingTag:"h3"}}),Z=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMEFmcm9tJTIwZW52cy5jaGF0X2VudiUyMGltcG9ydCUyMENoYXRFbnYlMkMlMjBDaGF0QWN0aW9uJTBBaW1wb3J0JTIwdG9yY2glMEElMEElMjMlMjBDcmVhdGUlMjBlbnZpcm9ubWVudCUyMGZyb20lMjBEb2NrZXIlMjBpbWFnZSUwQWNsaWVudCUyMCUzRCUyMENoYXRFbnYuZnJvbV9kb2NrZXJfaW1hZ2UoJTIyY2hhdC1lbnYlM0FsYXRlc3QlMjIpJTBBJTBBJTIzJTIwT3IlMjBjb25uZWN0JTIwdG8lMjBleGlzdGluZyUyMHNlcnZlciUwQSUyMyUyMGNsaWVudCUyMCUzRCUyMENoYXRFbnYoYmFzZV91cmwlM0QlMjJodHRwJTNBJTJGJTJGbG9jYWxob3N0JTNBODAwMCUyMiklMEElMEElMjMlMjBSZXNldCUwQXJlc3VsdCUyMCUzRCUyMGNsaWVudC5yZXNldCgpJTBBcHJpbnQoZiUyMkluaXRpYWwlMjBtZXNzYWdlcyUzQSUyMCU3QnJlc3VsdC5vYnNlcnZhdGlvbi5tZXNzYWdlcyU3RCUyMiklMEElMEElMjMlMjBTZW5kJTIwYW4lMjBhY3Rpb24lMjB3aXRoJTIwdG9rZW5zJTBBdG9rZW5pemVyJTIwJTNEJTIwQXV0b1Rva2VuaXplci5mcm9tX3ByZXRyYWluZWQoJTIyZ3B0MiUyMiklMEFtZXNzYWdlJTIwJTNEJTIwJTdCJTIycm9sZSUyMiUzQSUyMCUyMnVzZXIlMjIlMkMlMjAlMjJjb250ZW50JTIyJTNBJTIwJTIySGVsbG8hJTIyJTdEJTBBYWN0aW9uJTIwJTNEJTIwY2xpZW50Lm1lc3NhZ2VfdG9fYWN0aW9uKG1lc3NhZ2UlMkMlMjB0b2tlbml6ZXIpJTBBJTBBcmVzdWx0JTIwJTNEJTIwY2xpZW50LnN0ZXAoYWN0aW9uKSUwQXByaW50KGYlMjJNZXNzYWdlcyUzQSUyMCU3QnJlc3VsdC5vYnNlcnZhdGlvbi5tZXNzYWdlcyU3RCUyMiklMEFwcmludChmJTIyUmV3YXJkJTNBJTIwJTdCcmVzdWx0LnJld2FyZCU3RCUyMiklMEElMEElMjMlMjBDbGVhbnVwJTBBY2xpZW50LmNsb3NlKCk=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer
<span class="hljs-keyword">from</span> envs.chat_env <span class="hljs-keyword">import</span> ChatEnv, ChatAction
<span class="hljs-keyword">import</span> torch
<span class="hljs-comment"># Create environment from Docker image</span>
client = ChatEnv.from_docker_image(<span class="hljs-string">&quot;chat-env:latest&quot;</span>)
<span class="hljs-comment"># Or connect to existing server</span>
<span class="hljs-comment"># client = ChatEnv(base_url=&quot;http://localhost:8000&quot;)</span>
<span class="hljs-comment"># Reset</span>
result = client.reset()
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Initial messages: <span class="hljs-subst">{result.observation.messages}</span>&quot;</span>)
<span class="hljs-comment"># Send an action with tokens</span>
tokenizer = AutoTokenizer.from_pretrained(<span class="hljs-string">&quot;gpt2&quot;</span>)
message = {<span class="hljs-string">&quot;role&quot;</span>: <span class="hljs-string">&quot;user&quot;</span>, <span class="hljs-string">&quot;content&quot;</span>: <span class="hljs-string">&quot;Hello!&quot;</span>}
action = client.message_to_action(message, tokenizer)
result = client.step(action)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Messages: <span class="hljs-subst">{result.observation.messages}</span>&quot;</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Reward: <span class="hljs-subst">{result.reward}</span>&quot;</span>)
<span class="hljs-comment"># Cleanup</span>
client.close()`,lang:"python",wrap:!1}}),k=new J({props:{title:"Building the Docker Image",local:"building-the-docker-image",headingTag:"h3"}}),E=new h({props:{code:"JTIzJTIwRnJvbSUyMHByb2plY3QlMjByb290JTBBZG9ja2VyJTIwYnVpbGQlMjAtdCUyMGNoYXQtZW52JTNBbGF0ZXN0JTIwLWYlMjBlbnZzJTJGY2hhdF9lbnYlMkZzZXJ2ZXIlMkZEb2NrZXJmaWxlJTIwLiUwQSUwQSUyMyUyME9wdGlvbmFsbHklMjBzcGVjaWZ5JTIwYSUyMGRpZmZlcmVudCUyMHRva2VuaXplciUwQWRvY2tlciUyMGJ1aWxkJTIwLXQlMjBjaGF0LWVudiUzQWxhdGVzdCUyMCU1QyUwQSUyMCUyMC0tYnVpbGQtYXJnJTIwVE9LRU5JWkVSX05BTUUlM0RtZXRhLWxsYW1hJTJGTGxhbWEtMi03Yi1jaGF0LWhmJTIwJTVDJTBBJTIwJTIwLWYlMjBlbnZzJTJGY2hhdF9lbnYlMkZzZXJ2ZXIlMkZEb2NrZXJmaWxlJTIwLg==",highlighted:`<span class="hljs-comment"># From project root</span>
docker build -t chat-env:latest -f envs/chat_env/server/Dockerfile .
<span class="hljs-comment"># Optionally specify a different tokenizer</span>
docker build -t chat-env:latest \\
--build-arg TOKENIZER_NAME=meta-llama/Llama-2-7b-chat-hf \\
-f envs/chat_env/server/Dockerfile .`,lang:"bash",wrap:!1}}),G=new J({props:{title:"Architecture",local:"architecture",headingTag:"h2"}}),X=new J({props:{title:"Data Models",local:"data-models",headingTag:"h3"}}),N=new J({props:{title:"ChatAction",local:"chataction",headingTag:"h4"}}),Y=new h({props:{code:"JTQwZGF0YWNsYXNzJTBBY2xhc3MlMjBDaGF0QWN0aW9uKEFjdGlvbiklM0ElMEElMjAlMjAlMjAlMjB0b2tlbnMlM0ElMjB0b3JjaC5UZW5zb3IlMjAlMjAlMjMlMjBSZXF1aXJlZCUyQyUyMGNhbm5vdCUyMGJlJTIwZW1wdHk=",highlighted:`<span class="hljs-meta">@dataclass</span>
<span class="hljs-keyword">class</span> <span class="hljs-title class_">ChatAction</span>(<span class="hljs-title class_ inherited__">Action</span>):
tokens: torch.Tensor <span class="hljs-comment"># Required, cannot be empty</span>`,lang:"python",wrap:!1}}),V=new J({props:{title:"ChatObservation",local:"chatobservation",headingTag:"h4"}}),A=new h({props:{code:"JTQwZGF0YWNsYXNzJTBBY2xhc3MlMjBDaGF0T2JzZXJ2YXRpb24oT2JzZXJ2YXRpb24pJTNBJTBBJTIwJTIwJTIwJTIwbWVzc2FnZXMlM0ElMjBsaXN0JTVCTWVzc2FnZSU1RCUyMCUyMCUyMyUyMExpc3QlMjBvZiUyMCU3QiUyMnJvbGUlMjIlM0ElMjBzdHIlMkMlMjAlMjJjb250ZW50JTIyJTNBJTIwc3RyJTdEJTBBJTIwJTIwJTIwJTIwdG9rZW5zJTNBJTIwdG9yY2guVGVuc29yJTIwJTIwJTIwJTIwJTIwJTIzJTIwRmxhdHRlbmVkJTIwdGVuc29yJTIwb2YlMjBhbGwlMjBjb252ZXJzYXRpb24lMjB0b2tlbnMlMEElMjAlMjAlMjAlMjAlMjMlMjBJbmhlcml0ZWQlM0ElMjBkb25lJTJDJTIwcmV3YXJkJTJDJTIwbWV0YWRhdGE=",highlighted:`<span class="hljs-meta">@dataclass</span>
<span class="hljs-keyword">class</span> <span class="hljs-title class_">ChatObservation</span>(<span class="hljs-title class_ inherited__">Observation</span>):
messages: <span class="hljs-built_in">list</span>[Message] <span class="hljs-comment"># List of {&quot;role&quot;: str, &quot;content&quot;: str}</span>
tokens: torch.Tensor <span class="hljs-comment"># Flattened tensor of all conversation tokens</span>
<span class="hljs-comment"># Inherited: done, reward, metadata</span>`,lang:"python",wrap:!1}}),R=new J({props:{title:"ChatState",local:"chatstate",headingTag:"h4"}}),F=new h({props:{code:"JTQwZGF0YWNsYXNzJTBBY2xhc3MlMjBDaGF0U3RhdGUoU3RhdGUpJTNBJTBBJTIwJTIwJTIwJTIwaGlzdG9yeV9tZXNzYWdlcyUzQSUyMGxpc3QlNUJNZXNzYWdlJTVEJTBBJTIwJTIwJTIwJTIwaGlzdG9yeV90b2tlbnMlM0ElMjBsaXN0JTVCdG9yY2guVGVuc29yJTVEJTBBJTIwJTIwJTIwJTIwJTIzJTIwSW5oZXJpdGVkJTNBJTIwZXBpc29kZV9pZCUyQyUyMHN0ZXBfY291bnQ=",highlighted:`<span class="hljs-meta">@dataclass</span>
<span class="hljs-keyword">class</span> <span class="hljs-title class_">ChatState</span>(<span class="hljs-title class_ inherited__">State</span>):
history_messages: <span class="hljs-built_in">list</span>[Message]
history_tokens: <span class="hljs-built_in">list</span>[torch.Tensor]
<span class="hljs-comment"># Inherited: episode_id, step_count</span>`,lang:"python",wrap:!1}}),S=new J({props:{title:"Key Methods",local:"key-methods",headingTag:"h3"}}),x=new J({props:{title:"reset() -> ChatObservation",local:"reset--gt-chatobservation",headingTag:"h4"}}),H=new J({props:{title:"step(action: ChatAction) -> ChatObservation",local:"stepaction-chataction--gt-chatobservation",headingTag:"h4"}}),D=new J({props:{title:"message_to_action(message: Message) -> ChatAction",local:"messagetoactionmessage-message--gt-chataction",headingTag:"h4"}}),P=new J({props:{title:"Usage Patterns",local:"usage-patterns",headingTag:"h2"}}),K=new J({props:{title:"Basic Conversation",local:"basic-conversation",headingTag:"h3"}}),tt=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMEFmcm9tJTIwZW52cy5jaGF0X2Vudi5zZXJ2ZXIlMjBpbXBvcnQlMjBDaGF0RW52aXJvbm1lbnQlMEFmcm9tJTIwb3BlbmVudi5jb3JlLmVudl9zZXJ2ZXIlMjBpbXBvcnQlMjBNZXNzYWdlJTBBJTBBdG9rZW5pemVyJTIwJTNEJTIwQXV0b1Rva2VuaXplci5mcm9tX3ByZXRyYWluZWQoJTIyZ3B0MiUyMiklMEFlbnYlMjAlM0QlMjBDaGF0RW52aXJvbm1lbnQodG9rZW5pemVyJTNEdG9rZW5pemVyKSUwQSUwQSUyMyUyMFJlc2V0JTBBb2JzJTIwJTNEJTIwZW52LnJlc2V0KCklMEElMEElMjMlMjBVc2VyJTIwdHVybiUwQXVzZXJfbXNnJTNBJTIwTWVzc2FnZSUyMCUzRCUyMCU3QiUyMnJvbGUlMjIlM0ElMjAlMjJ1c2VyJTIyJTJDJTIwJTIyY29udGVudCUyMiUzQSUyMCUyMldoYXQlMjBpcyUyMDIlMkIyJTNGJTIyJTdEJTBBYWN0aW9uJTIwJTNEJTIwZW52Lm1lc3NhZ2VfdG9fYWN0aW9uKHVzZXJfbXNnKSUwQW9icyUyMCUzRCUyMGVudi5zdGVwKGFjdGlvbiklMEElMEElMjMlMjBBc3Npc3RhbnQlMjB0dXJuJTBBYXNzaXN0YW50X21zZyUzQSUyME1lc3NhZ2UlMjAlM0QlMjAlN0IlMjJyb2xlJTIyJTNBJTIwJTIyYXNzaXN0YW50JTIyJTJDJTIwJTIyY29udGVudCUyMiUzQSUyMCUyMjIlMkIyJTIwZXF1YWxzJTIwNC4lMjIlN0QlMEFhY3Rpb24lMjAlM0QlMjBlbnYubWVzc2FnZV90b19hY3Rpb24oYXNzaXN0YW50X21zZyklMEFvYnMlMjAlM0QlMjBlbnYuc3RlcChhY3Rpb24pJTBBJTBBJTIzJTIwQWNjZXNzJTIwY29udmVyc2F0aW9uJTIwaGlzdG9yeSUwQXByaW50KGYlMjJGdWxsJTIwY29udmVyc2F0aW9uJTNBJTIwJTdCb2JzLm1lc3NhZ2VzJTdEJTIyKSUwQXByaW50KGYlMjJBbGwlMjB0b2tlbnMlM0ElMjAlN0JvYnMudG9rZW5zJTdEJTIyKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer
<span class="hljs-keyword">from</span> envs.chat_env.server <span class="hljs-keyword">import</span> ChatEnvironment
<span class="hljs-keyword">from</span> openenv.core.env_server <span class="hljs-keyword">import</span> Message
tokenizer = AutoTokenizer.from_pretrained(<span class="hljs-string">&quot;gpt2&quot;</span>)
env = ChatEnvironment(tokenizer=tokenizer)
<span class="hljs-comment"># Reset</span>
obs = env.reset()
<span class="hljs-comment"># User turn</span>
user_msg: Message = {<span class="hljs-string">&quot;role&quot;</span>: <span class="hljs-string">&quot;user&quot;</span>, <span class="hljs-string">&quot;content&quot;</span>: <span class="hljs-string">&quot;What is 2+2?&quot;</span>}
action = env.message_to_action(user_msg)
obs = env.step(action)
<span class="hljs-comment"># Assistant turn</span>
assistant_msg: Message = {<span class="hljs-string">&quot;role&quot;</span>: <span class="hljs-string">&quot;assistant&quot;</span>, <span class="hljs-string">&quot;content&quot;</span>: <span class="hljs-string">&quot;2+2 equals 4.&quot;</span>}
action = env.message_to_action(assistant_msg)
obs = env.step(action)
<span class="hljs-comment"># Access conversation history</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Full conversation: <span class="hljs-subst">{obs.messages}</span>&quot;</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;All tokens: <span class="hljs-subst">{obs.tokens}</span>&quot;</span>)`,lang:"python",wrap:!1}}),st=new J({props:{title:"With Transforms",local:"with-transforms",headingTag:"h3"}}),lt=new h({props:{code:"ZnJvbSUyMG9wZW5lbnYuY29yZS5lbnZfc2VydmVyJTIwaW1wb3J0JTIwVHJhbnNmb3JtJTJDJTIwT2JzZXJ2YXRpb24lMEElMEFjbGFzcyUyMExlbmd0aFJld2FyZFRyYW5zZm9ybShUcmFuc2Zvcm0pJTNBJTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyUmV3YXJkJTIwYmFzZWQlMjBvbiUyMHJlc3BvbnNlJTIwbGVuZ3RoLiUyMiUyMiUyMiUwQSUwQSUyMCUyMCUyMCUyMGRlZiUyMF9fY2FsbF9fKHNlbGYlMkMlMjBvYnNlcnZhdGlvbiUzQSUyME9ic2VydmF0aW9uKSUyMC0lM0UlMjBPYnNlcnZhdGlvbiUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwaGFzYXR0cihvYnNlcnZhdGlvbiUyQyUyMCdtZXNzYWdlcycpJTIwYW5kJTIwb2JzZXJ2YXRpb24ubWVzc2FnZXMlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsYXN0X21lc3NhZ2UlMjAlM0QlMjBvYnNlcnZhdGlvbi5tZXNzYWdlcyU1Qi0xJTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb2JzZXJ2YXRpb24ucmV3YXJkJTIwJTNEJTIwbGVuKGxhc3RfbWVzc2FnZSU1Qidjb250ZW50JyU1RCklMjAqJTIwMC4xJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwb2JzZXJ2YXRpb24lMEElMEFlbnYlMjAlM0QlMjBDaGF0RW52aXJvbm1lbnQoJTBBJTIwJTIwJTIwJTIwdG9rZW5pemVyJTNEdG9rZW5pemVyJTJDJTBBJTIwJTIwJTIwJTIwdHJhbnNmb3JtJTNETGVuZ3RoUmV3YXJkVHJhbnNmb3JtKCklMEEp",highlighted:`<span class="hljs-keyword">from</span> openenv.core.env_server <span class="hljs-keyword">import</span> Transform, Observation
<span class="hljs-keyword">class</span> <span class="hljs-title class_">LengthRewardTransform</span>(<span class="hljs-title class_ inherited__">Transform</span>):
<span class="hljs-string">&quot;&quot;&quot;Reward based on response length.&quot;&quot;&quot;</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__call__</span>(<span class="hljs-params">self, observation: Observation</span>) -&gt; Observation:
<span class="hljs-keyword">if</span> <span class="hljs-built_in">hasattr</span>(observation, <span class="hljs-string">&#x27;messages&#x27;</span>) <span class="hljs-keyword">and</span> observation.messages:
last_message = observation.messages[-<span class="hljs-number">1</span>]
observation.reward = <span class="hljs-built_in">len</span>(last_message[<span class="hljs-string">&#x27;content&#x27;</span>]) * <span class="hljs-number">0.1</span>
<span class="hljs-keyword">return</span> observation
env = ChatEnvironment(
tokenizer=tokenizer,
transform=LengthRewardTransform()
)`,lang:"python",wrap:!1}}),nt=new J({props:{title:"Direct Token Usage",local:"direct-token-usage",headingTag:"h3"}}),it=new h({props:{code:"aW1wb3J0JTIwdG9yY2glMEFmcm9tJTIwZW52cy5jaGF0X2VudiUyMGltcG9ydCUyMENoYXRBY3Rpb24lMEElMEElMjMlMjBBc3N1bWUlMjB5b3UlMjBoYXZlJTIwdG9rZW5zJTIwZnJvbSUyMHlvdXIlMjBtb2RlbCUwQWdlbmVyYXRlZF90b2tlbnMlMjAlM0QlMjB0b3JjaC50ZW5zb3IoJTVCJTVCMSUyQyUyMDIlMkMlMjAzJTJDJTIwNCUyQyUyMDUlNUQlNUQpJTBBJTBBJTIzJTIwQ3JlYXRlJTIwYWN0aW9uJTIwZGlyZWN0bHklMEFhY3Rpb24lMjAlM0QlMjBDaGF0QWN0aW9uKHRva2VucyUzRGdlbmVyYXRlZF90b2tlbnMpJTBBJTBBJTIzJTIwU3RlcCUyMGVudmlyb25tZW50JTBBb2JzJTIwJTNEJTIwZW52LnN0ZXAoYWN0aW9uKQ==",highlighted:`<span class="hljs-keyword">import</span> torch
<span class="hljs-keyword">from</span> envs.chat_env <span class="hljs-keyword">import</span> ChatAction
<span class="hljs-comment"># Assume you have tokens from your model</span>
generated_tokens = torch.tensor([[<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>]])
<span class="hljs-comment"># Create action directly</span>
action = ChatAction(tokens=generated_tokens)
<span class="hljs-comment"># Step environment</span>
obs = env.step(action)`,lang:"python",wrap:!1}}),ot=new J({props:{title:"Design Philosophy",local:"design-philosophy",headingTag:"h2"}}),rt=new J({props:{title:"Integration with Models",local:"integration-with-models",headingTag:"h2"}}),Jt=new h({props:{code:"JTIzJTIwUHNldWRvLWNvZGUlMjBmb3IlMjBSTCUyMHRyYWluaW5nJTIwbG9vcCUwQW1vZGVsJTIwJTNEJTIwWW91ckxhbmd1YWdlTW9kZWwoKSUwQWVudiUyMCUzRCUyMENoYXRFbnZpcm9ubWVudCh0b2tlbml6ZXIlM0Rtb2RlbC50b2tlbml6ZXIpJTBBJTBBZm9yJTIwZXBpc29kZSUyMGluJTIwcmFuZ2UobnVtX2VwaXNvZGVzKSUzQSUwQSUyMCUyMCUyMCUyMG9icyUyMCUzRCUyMGVudi5yZXNldCgpJTBBJTBBJTIwJTIwJTIwJTIwd2hpbGUlMjBub3QlMjBvYnMuZG9uZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyME1vZGVsJTIwZ2VuZXJhdGVzJTIwcmVzcG9uc2UlMjB0b2tlbnMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhY3Rpb25fdG9rZW5zJTIwJTNEJTIwbW9kZWwuZ2VuZXJhdGUob2JzLnRva2VucyklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhY3Rpb24lMjAlM0QlMjBDaGF0QWN0aW9uKHRva2VucyUzRGFjdGlvbl90b2tlbnMpJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwU3RlcCUyMGVudmlyb25tZW50JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb2JzJTIwJTNEJTIwZW52LnN0ZXAoYWN0aW9uKSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFVzZSUyMG9icy5yZXdhcmQlMjBmb3IlMjBSTCUyMHVwZGF0ZXMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBtb2RlbC51cGRhdGUob2JzLnJld2FyZCk=",highlighted:`<span class="hljs-comment"># Pseudo-code for RL training loop</span>
model = YourLanguageModel()
env = ChatEnvironment(tokenizer=model.tokenizer)
<span class="hljs-keyword">for</span> episode <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(num_episodes):
obs = env.reset()
<span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> obs.done:
<span class="hljs-comment"># Model generates response tokens</span>
action_tokens = model.generate(obs.tokens)
action = ChatAction(tokens=action_tokens)
<span class="hljs-comment"># Step environment</span>
obs = env.step(action)
<span class="hljs-comment"># Use obs.reward for RL updates</span>
model.update(obs.reward)`,lang:"python",wrap:!1}}),Tt=new J({props:{title:"Project Structure",local:"project-structure",headingTag:"h2"}}),ct=new h({props:{code:"Y2hhdF9lbnYlMkYlMEElRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjBfX2luaXRfXy5weSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyME1vZHVsZSUyMGV4cG9ydHMlMjAoQ2hhdEVudiUyQyUyMENoYXRBY3Rpb24lMkMlMjBldGMuKSUwQSVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMFJFQURNRS5tZCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFRoaXMlMjBmaWxlJTBBJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwY2xpZW50LnB5JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwQ2hhdEVudiUyMEhUVFAlMjBjbGllbnQlMEElRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjBtb2RlbHMucHklMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBDaGF0QWN0aW9uJTJDJTIwQ2hhdE9ic2VydmF0aW9uJTJDJTIwQ2hhdFN0YXRlJTBBJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJTIwc2VydmVyJTJGJTBBJTIwJTIwJTIwJTIwJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwX19pbml0X18ucHklMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTZXJ2ZXIlMjBtb2R1bGUlMjBleHBvcnRzJTBBJTIwJTIwJTIwJTIwJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwY2hhdF9lbnZpcm9ubWVudC5weSUyMCUyMCUyMyUyMENvcmUlMjBDaGF0RW52aXJvbm1lbnQlMjBpbXBsZW1lbnRhdGlvbiUwQSUyMCUyMCUyMCUyMCVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMGFwcC5weSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEZhc3RBUEklMjBzZXJ2ZXIlMjBhcHBsaWNhdGlvbiUwQSUyMCUyMCUyMCUyMCVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMHRlc3RfY2hhdF9lbnYucHklMjAlMjAlMjAlMjAlMjAlMjMlMjBVbml0JTIwdGVzdHMlMEElMjAlMjAlMjAlMjAlRTIlOTQlOTQlRTIlOTQlODAlRTIlOTQlODAlMjBEb2NrZXJmaWxlJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwQ29udGFpbmVyJTIwaW1hZ2UlMjBmb3IlMjBIVFRQJTIwc2VydmVy",highlighted:`chat_env/
├── __init__.py <span class="hljs-meta"># Module exports (ChatEnv, ChatAction, etc.)</span>
├── README.md <span class="hljs-meta"># This file</span>
├── <span class="hljs-keyword">client</span>.py <span class="hljs-meta"># ChatEnv HTTP client</span>
├── models.py <span class="hljs-meta"># ChatAction, ChatObservation, ChatState</span>
└── <span class="hljs-keyword">server</span>/
├── __init__.py <span class="hljs-meta"># Server module exports</span>
├── chat_environment.py <span class="hljs-meta"># Core ChatEnvironment implementation</span>
├── app.py <span class="hljs-meta"># FastAPI server application</span>
├── test_chat_env.py <span class="hljs-meta"># Unit tests</span>
└── Dockerfile <span class="hljs-meta"># Container image for HTTP server</span>`,lang:"",wrap:!1}}),yt=new J({props:{title:"Requirements",local:"requirements",headingTag:"h2"}}),wt=new J({props:{title:"Notes",local:"notes",headingTag:"h2"}}),Ut=new le({props:{source:"https://github.com/huggingface/openenv/blob/main/docs/source/environments/chat.md"}}),{c(){w=T("meta"),ut=n(),bt=T("p"),It=n(),i(j.$$.fragment),gt=n(),i(U.$$.fragment),Ct=n(),b=T("p"),b.textContent=Bs,ft=n(),i(d.$$.fragment),$t=n(),u=T("p"),u.textContent=vs,Bt=n(),I=T("ul"),I.innerHTML=Zs,vt=n(),g=T("p"),g.innerHTML=ks,Zt=n(),C=T("ol"),C.innerHTML=Ws,kt=n(),i(f.$$.fragment),Wt=n(),i($.$$.fragment),Et=n(),i(B.$$.fragment),Gt=n(),i(v.$$.fragment),Xt=n(),i(Z.$$.fragment),Nt=n(),i(k.$$.fragment),zt=n(),W=T("p"),W.textContent=Es,Yt=n(),i(E.$$.fragment),Vt=n(),i(G.$$.fragment),Qt=n(),i(X.$$.fragment),At=n(),i(N.$$.fragment),Rt=n(),z=T("p"),z.textContent=Gs,_t=n(),i(Y.$$.fragment),Ft=n(),i(V.$$.fragment),St=n(),Q=T("p"),Q.textContent=Xs,xt=n(),i(A.$$.fragment),qt=n(),i(R.$$.fragment),Ht=n(),_=T("p"),_.textContent=Ns,Lt=n(),i(F.$$.fragment),Dt=n(),i(S.$$.fragment),Ot=n(),i(x.$$.fragment),Pt=n(),q=T("p"),q.textContent=zs,Kt=n(),i(H.$$.fragment),ts=n(),L=T("p"),L.textContent=Ys,ss=n(),i(D.$$.fragment),es=n(),O=T("p"),O.textContent=Vs,ls=n(),i(P.$$.fragment),ns=n(),i(K.$$.fragment),as=n(),i(tt.$$.fragment),is=n(),i(st.$$.fragment),os=n(),et=T("p"),et.textContent=Qs,ps=n(),i(lt.$$.fragment),Ms=n(),i(nt.$$.fragment),rs=n(),at=T("p"),at.textContent=As,ms=n(),i(it.$$.fragment),Js=n(),i(ot.$$.fragment),Ts=n(),pt=T("p"),pt.textContent=Rs,cs=n(),Mt=T("ol"),Mt.innerHTML=_s,ys=n(),i(rt.$$.fragment),hs=n(),mt=T("p"),mt.textContent=Fs,ws=n(),i(Jt.$$.fragment),js=n(),i(Tt.$$.fragment),Us=n(),i(ct.$$.fragment),bs=n(),i(yt.$$.fragment),ds=n(),ht=T("ul"),ht.innerHTML=Ss,us=n(),i(wt.$$.fragment),Is=n(),jt=T("ul"),jt.innerHTML=xs,gs=n(),i(Ut.$$.fragment),Cs=n(),dt=T("p"),this.h()},l(t){const s=te("svelte-u9bgzb",document.head);w=c(s,"META",{name:!0,content:!0}),s.forEach(e),ut=a(t),bt=c(t,"P",{}),qs(bt).forEach(e),It=a(t),o(j.$$.fragment,t),gt=a(t),o(U.$$.fragment,t),Ct=a(t),b=c(t,"P",{"data-svelte-h":!0}),y(b)!=="svelte-jwmbxs"&&(b.textContent=Bs),ft=a(t),o(d.$$.fragment,t),$t=a(t),u=c(t,"P",{"data-svelte-h":!0}),y(u)!=="svelte-1qc77o6"&&(u.textContent=vs),Bt=a(t),I=c(t,"UL",{"data-svelte-h":!0}),y(I)!=="svelte-s8ipgv"&&(I.innerHTML=Zs),vt=a(t),g=c(t,"P",{"data-svelte-h":!0}),y(g)!=="svelte-pseueh"&&(g.innerHTML=ks),Zt=a(t),C=c(t,"OL",{"data-svelte-h":!0}),y(C)!=="svelte-m8kj6n"&&(C.innerHTML=Ws),kt=a(t),o(f.$$.fragment,t),Wt=a(t),o($.$$.fragment,t),Et=a(t),o(B.$$.fragment,t),Gt=a(t),o(v.$$.fragment,t),Xt=a(t),o(Z.$$.fragment,t),Nt=a(t),o(k.$$.fragment,t),zt=a(t),W=c(t,"P",{"data-svelte-h":!0}),y(W)!=="svelte-1wzw9hf"&&(W.textContent=Es),Yt=a(t),o(E.$$.fragment,t),Vt=a(t),o(G.$$.fragment,t),Qt=a(t),o(X.$$.fragment,t),At=a(t),o(N.$$.fragment,t),Rt=a(t),z=c(t,"P",{"data-svelte-h":!0}),y(z)!=="svelte-cxq4fn"&&(z.textContent=Gs),_t=a(t),o(Y.$$.fragment,t),Ft=a(t),o(V.$$.fragment,t),St=a(t),Q=c(t,"P",{"data-svelte-h":!0}),y(Q)!=="svelte-z6f9v4"&&(Q.textContent=Xs),xt=a(t),o(A.$$.fragment,t),qt=a(t),o(R.$$.fragment,t),Ht=a(t),_=c(t,"P",{"data-svelte-h":!0}),y(_)!=="svelte-16fcon0"&&(_.textContent=Ns),Lt=a(t),o(F.$$.fragment,t),Dt=a(t),o(S.$$.fragment,t),Ot=a(t),o(x.$$.fragment,t),Pt=a(t),q=c(t,"P",{"data-svelte-h":!0}),y(q)!=="svelte-107hzpp"&&(q.textContent=zs),Kt=a(t),o(H.$$.fragment,t),ts=a(t),L=c(t,"P",{"data-svelte-h":!0}),y(L)!=="svelte-xih7e0"&&(L.textContent=Ys),ss=a(t),o(D.$$.fragment,t),es=a(t),O=c(t,"P",{"data-svelte-h":!0}),y(O)!=="svelte-n1mxh1"&&(O.textContent=Vs),ls=a(t),o(P.$$.fragment,t),ns=a(t),o(K.$$.fragment,t),as=a(t),o(tt.$$.fragment,t),is=a(t),o(st.$$.fragment,t),os=a(t),et=c(t,"P",{"data-svelte-h":!0}),y(et)!=="svelte-1061vn3"&&(et.textContent=Qs),ps=a(t),o(lt.$$.fragment,t),Ms=a(t),o(nt.$$.fragment,t),rs=a(t),at=c(t,"P",{"data-svelte-h":!0}),y(at)!=="svelte-8amrhu"&&(at.textContent=As),ms=a(t),o(it.$$.fragment,t),Js=a(t),o(ot.$$.fragment,t),Ts=a(t),pt=c(t,"P",{"data-svelte-h":!0}),y(pt)!=="svelte-14m2xzi"&&(pt.textContent=Rs),cs=a(t),Mt=c(t,"OL",{"data-svelte-h":!0}),y(Mt)!=="svelte-1ovpczi"&&(Mt.innerHTML=_s),ys=a(t),o(rt.$$.fragment,t),hs=a(t),mt=c(t,"P",{"data-svelte-h":!0}),y(mt)!=="svelte-t8dxf2"&&(mt.textContent=Fs),ws=a(t),o(Jt.$$.fragment,t),js=a(t),o(Tt.$$.fragment,t),Us=a(t),o(ct.$$.fragment,t),bs=a(t),o(yt.$$.fragment,t),ds=a(t),ht=c(t,"UL",{"data-svelte-h":!0}),y(ht)!=="svelte-1ow1cwq"&&(ht.innerHTML=Ss),us=a(t),o(wt.$$.fragment,t),Is=a(t),jt=c(t,"UL",{"data-svelte-h":!0}),y(jt)!=="svelte-1raaav0"&&(jt.innerHTML=xs),gs=a(t),o(Ut.$$.fragment,t),Cs=a(t),dt=c(t,"P",{}),qs(dt).forEach(e),this.h()},h(){Hs(w,"name","hf:doc:metadata"),Hs(w,"content",ae)},m(t,s){se(document.head,w),l(t,ut,s),l(t,bt,s),l(t,It,s),p(j,t,s),l(t,gt,s),p(U,t,s),l(t,Ct,s),l(t,b,s),l(t,ft,s),p(d,t,s),l(t,$t,s),l(t,u,s),l(t,Bt,s),l(t,I,s),l(t,vt,s),l(t,g,s),l(t,Zt,s),l(t,C,s),l(t,kt,s),p(f,t,s),l(t,Wt,s),p($,t,s),l(t,Et,s),p(B,t,s),l(t,Gt,s),p(v,t,s),l(t,Xt,s),p(Z,t,s),l(t,Nt,s),p(k,t,s),l(t,zt,s),l(t,W,s),l(t,Yt,s),p(E,t,s),l(t,Vt,s),p(G,t,s),l(t,Qt,s),p(X,t,s),l(t,At,s),p(N,t,s),l(t,Rt,s),l(t,z,s),l(t,_t,s),p(Y,t,s),l(t,Ft,s),p(V,t,s),l(t,St,s),l(t,Q,s),l(t,xt,s),p(A,t,s),l(t,qt,s),p(R,t,s),l(t,Ht,s),l(t,_,s),l(t,Lt,s),p(F,t,s),l(t,Dt,s),p(S,t,s),l(t,Ot,s),p(x,t,s),l(t,Pt,s),l(t,q,s),l(t,Kt,s),p(H,t,s),l(t,ts,s),l(t,L,s),l(t,ss,s),p(D,t,s),l(t,es,s),l(t,O,s),l(t,ls,s),p(P,t,s),l(t,ns,s),p(K,t,s),l(t,as,s),p(tt,t,s),l(t,is,s),p(st,t,s),l(t,os,s),l(t,et,s),l(t,ps,s),p(lt,t,s),l(t,Ms,s),p(nt,t,s),l(t,rs,s),l(t,at,s),l(t,ms,s),p(it,t,s),l(t,Js,s),p(ot,t,s),l(t,Ts,s),l(t,pt,s),l(t,cs,s),l(t,Mt,s),l(t,ys,s),p(rt,t,s),l(t,hs,s),l(t,mt,s),l(t,ws,s),p(Jt,t,s),l(t,js,s),p(Tt,t,s),l(t,Us,s),p(ct,t,s),l(t,bs,s),p(yt,t,s),l(t,ds,s),l(t,ht,s),l(t,us,s),p(wt,t,s),l(t,Is,s),l(t,jt,s),l(t,gs,s),p(Ut,t,s),l(t,Cs,s),l(t,dt,s),fs=!0},p:Ds,i(t){fs||(M(j.$$.fragment,t),M(U.$$.fragment,t),M(d.$$.fragment,t),M(f.$$.fragment,t),M($.$$.fragment,t),M(B.$$.fragment,t),M(v.$$.fragment,t),M(Z.$$.fragment,t),M(k.$$.fragment,t),M(E.$$.fragment,t),M(G.$$.fragment,t),M(X.$$.fragment,t),M(N.$$.fragment,t),M(Y.$$.fragment,t),M(V.$$.fragment,t),M(A.$$.fragment,t),M(R.$$.fragment,t),M(F.$$.fragment,t),M(S.$$.fragment,t),M(x.$$.fragment,t),M(H.$$.fragment,t),M(D.$$.fragment,t),M(P.$$.fragment,t),M(K.$$.fragment,t),M(tt.$$.fragment,t),M(st.$$.fragment,t),M(lt.$$.fragment,t),M(nt.$$.fragment,t),M(it.$$.fragment,t),M(ot.$$.fragment,t),M(rt.$$.fragment,t),M(Jt.$$.fragment,t),M(Tt.$$.fragment,t),M(ct.$$.fragment,t),M(yt.$$.fragment,t),M(wt.$$.fragment,t),M(Ut.$$.fragment,t),fs=!0)},o(t){r(j.$$.fragment,t),r(U.$$.fragment,t),r(d.$$.fragment,t),r(f.$$.fragment,t),r($.$$.fragment,t),r(B.$$.fragment,t),r(v.$$.fragment,t),r(Z.$$.fragment,t),r(k.$$.fragment,t),r(E.$$.fragment,t),r(G.$$.fragment,t),r(X.$$.fragment,t),r(N.$$.fragment,t),r(Y.$$.fragment,t),r(V.$$.fragment,t),r(A.$$.fragment,t),r(R.$$.fragment,t),r(F.$$.fragment,t),r(S.$$.fragment,t),r(x.$$.fragment,t),r(H.$$.fragment,t),r(D.$$.fragment,t),r(P.$$.fragment,t),r(K.$$.fragment,t),r(tt.$$.fragment,t),r(st.$$.fragment,t),r(lt.$$.fragment,t),r(nt.$$.fragment,t),r(it.$$.fragment,t),r(ot.$$.fragment,t),r(rt.$$.fragment,t),r(Jt.$$.fragment,t),r(Tt.$$.fragment,t),r(ct.$$.fragment,t),r(yt.$$.fragment,t),r(wt.$$.fragment,t),r(Ut.$$.fragment,t),fs=!1},d(t){t&&(e(ut),e(bt),e(It),e(gt),e(Ct),e(b),e(ft),e($t),e(u),e(Bt),e(I),e(vt),e(g),e(Zt),e(C),e(kt),e(Wt),e(Et),e(Gt),e(Xt),e(Nt),e(zt),e(W),e(Yt),e(Vt),e(Qt),e(At),e(Rt),e(z),e(_t),e(Ft),e(St),e(Q),e(xt),e(qt),e(Ht),e(_),e(Lt),e(Dt),e(Ot),e(Pt),e(q),e(Kt),e(ts),e(L),e(ss),e(es),e(O),e(ls),e(ns),e(as),e(is),e(os),e(et),e(ps),e(Ms),e(rs),e(at),e(ms),e(Js),e(Ts),e(pt),e(cs),e(Mt),e(ys),e(hs),e(mt),e(ws),e(js),e(Us),e(bs),e(ds),e(ht),e(us),e(Is),e(jt),e(gs),e(Cs),e(dt)),e(w),m(j,t),m(U,t),m(d,t),m(f,t),m($,t),m(B,t),m(v,t),m(Z,t),m(k,t),m(E,t),m(G,t),m(X,t),m(N,t),m(Y,t),m(V,t),m(A,t),m(R,t),m(F,t),m(S,t),m(x,t),m(H,t),m(D,t),m(P,t),m(K,t),m(tt,t),m(st,t),m(lt,t),m(nt,t),m(it,t),m(ot,t),m(rt,t),m(Jt,t),m(Tt,t),m(ct,t),m(yt,t),m(wt,t),m(Ut,t)}}}const ae='{"title":"Chat Environment","local":"chat-environment","sections":[{"title":"Overview","local":"overview","sections":[],"depth":2},{"title":"Quick Start","local":"quick-start","sections":[{"title":"Option 1: Direct Usage (Local)","local":"option-1-direct-usage-local","sections":[],"depth":3},{"title":"Option 2: HTTP Client (Distributed)","local":"option-2-http-client-distributed","sections":[],"depth":3},{"title":"Building the Docker Image","local":"building-the-docker-image","sections":[],"depth":3}],"depth":2},{"title":"Architecture","local":"architecture","sections":[{"title":"Data Models","local":"data-models","sections":[{"title":"ChatAction","local":"chataction","sections":[],"depth":4},{"title":"ChatObservation","local":"chatobservation","sections":[],"depth":4},{"title":"ChatState","local":"chatstate","sections":[],"depth":4}],"depth":3},{"title":"Key Methods","local":"key-methods","sections":[{"title":"reset() -&gt; ChatObservation","local":"reset--gt-chatobservation","sections":[],"depth":4},{"title":"step(action: ChatAction) -&gt; ChatObservation","local":"stepaction-chataction--gt-chatobservation","sections":[],"depth":4},{"title":"message_to_action(message: Message) -&gt; ChatAction","local":"messagetoactionmessage-message--gt-chataction","sections":[],"depth":4}],"depth":3}],"depth":2},{"title":"Usage Patterns","local":"usage-patterns","sections":[{"title":"Basic Conversation","local":"basic-conversation","sections":[],"depth":3},{"title":"With Transforms","local":"with-transforms","sections":[],"depth":3},{"title":"Direct Token Usage","local":"direct-token-usage","sections":[],"depth":3}],"depth":2},{"title":"Design Philosophy","local":"design-philosophy","sections":[],"depth":2},{"title":"Integration with Models","local":"integration-with-models","sections":[],"depth":2},{"title":"Project Structure","local":"project-structure","sections":[],"depth":2},{"title":"Requirements","local":"requirements","sections":[],"depth":2},{"title":"Notes","local":"notes","sections":[],"depth":2}],"depth":1}';function ie($s){return Os(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class me extends Ps{constructor(w){super(),Ks(this,w,ie,ne,Ls,{})}}export{me as component};

Xet Storage Details

Size:
36.4 kB
·
Xet hash:
01e56200da0cda5cb0d17ea7f3ec41db6bee57b7c84a1c0744eeb06660694f99

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