"""OpenEnv data models for the VisionCoder environment.""" from __future__ import annotations from typing import Any, Dict, Optional from pydantic import BaseModel, Field class Action(BaseModel): """An action submitted by the agent: raw HTML code to evaluate.""" html: str session_id: Optional[str] = None # required for multi-step episodes class Observation(BaseModel): """The environment's response after reset() or step(). On reset(): screenshot_b64 and session_id are populated, reward is None, done is False. On step(): reward, render_low, render_full are populated; done is True at max steps. """ done: bool = False reward: Optional[float] = None metadata: Dict[str, Any] = Field(default_factory=dict) screenshot_b64: Optional[str] = None # target screenshot (after reset) render_low: Optional[str] = None # low-res render of submitted HTML (after step) render_full: Optional[str] = None # full-res render of submitted HTML (after step) session_id: Optional[str] = None # session identifier (after reset) prompt: str = "" class State(BaseModel): """Episode metadata tracked by the environment.""" episode_id: str = "" session_id: str = "" step_count: int = 0 sample_index: int = 0 max_steps: int = 0 class RenderRequest(BaseModel): """Request body for the /render endpoint.""" html: str class RenderResponse(BaseModel): """Response from the /render endpoint.""" image_b64: str # full-res PNG (base64) image_low_b64: str # low-res PNG (base64)