from __future__ import annotations from typing import Any from openenv.core import EnvClient from openenv.core.client_types import StepResult from models import BDOAction, BDOObservation, BDOState class BDOEnvClient(EnvClient[BDOAction, BDOObservation, BDOState]): """Typed OpenEnv client for the BDO.ai environment.""" def _step_payload(self, action: BDOAction) -> dict[str, Any]: return action.model_dump(mode="json", exclude_none=True) def _parse_result(self, payload: dict[str, Any]) -> StepResult[BDOObservation]: obs_data = dict(payload.get("observation", {})) obs_data["reward"] = payload.get("reward") obs_data["done"] = payload.get("done", False) observation = BDOObservation.model_validate(obs_data) if not observation.metadata and observation.info: observation.metadata = dict(observation.info) return StepResult( observation=observation, reward=payload.get("reward"), done=payload.get("done", False), ) def _parse_state(self, payload: dict[str, Any]) -> BDOState: return BDOState.model_validate(payload)