"""App Environment Client.""" from typing import Dict from openenv.core import EnvClient from openenv.core.client_types import StepResult from .models import AppAction, AppObservation, AppState class AppEnv(EnvClient[AppAction, AppObservation, AppState]): def _step_payload(self, action: AppAction) -> Dict: return { "placement": action.placement, "isSegmentation": action.isSegmentation, "findObjects": action.findObjects, "adjust": action.adjust, } def _parse_result(self, payload: Dict) -> StepResult[AppObservation]: obs_data = payload.get("observation", {}) observation = AppObservation( currentGrid=obs_data.get("currentGrid", []), positions=obs_data.get("positions", {}), objectsLeft=obs_data.get("objectsLeft", []), objectsFound=obs_data.get("objectsFound", []), reward=obs_data.get("reward", 0.0), isDone=obs_data.get("isDone", False), rewardFeedback=obs_data.get("rewardFeedback", []), rewardList=obs_data.get("rewardList", []), numberPlaced=obs_data.get("numberPlaced", 0), ObjectsPlaced=obs_data.get("ObjectsPlaced", {}), ) return StepResult( observation=observation, reward=payload.get("reward"), done=payload.get("done", obs_data.get("isDone", False)), ) def _parse_state(self, payload: Dict) -> AppState: return AppState( episode_id=payload.get("episode_id"), step_count=payload.get("step_count", 0), currentGrid=payload.get("currentGrid", []), weightedGrid=payload.get("weightedGrid", []), reward=payload.get("reward", 0.0), isDone=payload.get("isDone", False), objectsLeft=payload.get("objectsLeft", []), objectsFound=payload.get("objectsFound", []), ObjectsPresent=payload.get("ObjectsPresent", {}), rewardFeedback=payload.get("rewardFeedback", []), rewardList=payload.get("rewardList", []), numberPlaced=payload.get("numberPlaced", 0), ObjectsPlaced=payload.get("ObjectsPlaced", {}), )