arnavzz
feat: initial OpenEnv code debugging environment
c14504c
Raw
History Blame Contribute Delete
1.83 kB
"""
Simple HTTP client for the Code Debug OpenEnv server.
"""
from typing import Optional
import httpx
class CodeDebugClient:
def __init__(self, base_url: str = "http://localhost:7860", timeout: float = 30.0):
self.base_url = base_url.rstrip("/")
self._http = httpx.Client(base_url=self.base_url, timeout=timeout)
self.episode_id: Optional[str] = None
def reset(self, task_id: Optional[str] = None, seed: Optional[int] = None) -> dict:
payload: dict = {}
if task_id is not None:
payload["task_id"] = task_id
if seed is not None:
payload["seed"] = seed
resp = self._http.post("/reset", json=payload)
resp.raise_for_status()
data = resp.json()
self.episode_id = data["episode_id"]
return data
def step(self, code: str) -> dict:
if self.episode_id is None:
raise RuntimeError("No active episode. Call reset() first.")
resp = self._http.post(
f"/step/{self.episode_id}",
json={"action": {"code": code}},
)
resp.raise_for_status()
return resp.json()
def state(self) -> dict:
if self.episode_id is None:
raise RuntimeError("No active episode. Call reset() first.")
resp = self._http.get(f"/state/{self.episode_id}")
resp.raise_for_status()
return resp.json()
def list_tasks(self) -> list[dict]:
resp = self._http.get("/tasks")
resp.raise_for_status()
return resp.json()
def health(self) -> dict:
resp = self._http.get("/health")
resp.raise_for_status()
return resp.json()
def close(self):
self._http.close()
def __enter__(self):
return self
def __exit__(self, *args):
self.close()