arnavzz
feat: initial OpenEnv code debugging environment
c14504c
"""
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()