from openenv.core.env_client import EnvClient from openenv.core.client_types import StepResult from models import ToolCallAction, ToolCallObservation, ToolCallState, Scenario, ToolDefinition class ToolCallEnvClient(EnvClient[ToolCallAction, ToolCallObservation, ToolCallState]): """Client for interacting with the Tool Call RL Environment.""" def _step_payload(self, action: ToolCallAction) -> dict: """Convert action to JSON payload.""" return { "scenario_id": action.scenario_id, "tool_calls": action.tool_calls, "should_refuse": action.should_refuse, "reasoning": action.reasoning, } def _parse_result(self, payload: dict) -> StepResult: """Parse server JSON response into StepResult.""" tool_defs = [ToolDefinition(**td) for td in payload.get("tool_definitions", [])] obs = ToolCallObservation( scenario=Scenario(**payload["scenario"]), tool_definitions=tool_defs, queue_size=payload["queue_size"], current_step=payload["current_step"], reward=payload["reward"], done=payload["done"], ) return StepResult( observation=obs, reward=payload["reward"], done=payload["done"], ) def _parse_state(self, payload: dict) -> ToolCallState: """Parse server JSON response into ToolCallState.""" return ToolCallState( current_index=payload["current_index"], total_scenarios=payload["total_scenarios"], processed_scenario_ids=payload["processed_scenario_ids"], score=payload["score"], done=payload["done"], )