|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
""" |
|
|
Echo Environment HTTP Client. |
|
|
|
|
|
This module provides the client for connecting to an Echo Environment server |
|
|
over HTTP. |
|
|
""" |
|
|
|
|
|
from typing import Any, Dict |
|
|
|
|
|
from core.client_types import StepResult |
|
|
|
|
|
from core.env_server.types import State |
|
|
from core.http_env_client import HTTPEnvClient |
|
|
|
|
|
from .models import EchoAction, EchoObservation |
|
|
|
|
|
|
|
|
class EchoEnv(HTTPEnvClient[EchoAction, EchoObservation]): |
|
|
""" |
|
|
HTTP client for the Echo Environment. |
|
|
|
|
|
This client connects to an EchoEnvironment HTTP server and provides |
|
|
methods to interact with it: reset(), step(), and state access. |
|
|
|
|
|
Example: |
|
|
>>> # Connect to a running server |
|
|
>>> client = EchoEnv(base_url="http://localhost:8000") |
|
|
>>> result = client.reset() |
|
|
>>> print(result.observation.echoed_message) |
|
|
>>> |
|
|
>>> # Send a message |
|
|
>>> result = client.step(EchoAction(message="Hello!")) |
|
|
>>> print(result.observation.echoed_message) |
|
|
>>> print(result.reward) |
|
|
|
|
|
Example with Docker: |
|
|
>>> # Automatically start container and connect |
|
|
>>> client = EchoEnv.from_docker_image("echo-env:latest") |
|
|
>>> result = client.reset() |
|
|
>>> result = client.step(EchoAction(message="Test")) |
|
|
""" |
|
|
|
|
|
def _step_payload(self, action: EchoAction) -> Dict: |
|
|
""" |
|
|
Convert EchoAction to JSON payload for step request. |
|
|
|
|
|
Args: |
|
|
action: EchoAction instance |
|
|
|
|
|
Returns: |
|
|
Dictionary representation suitable for JSON encoding |
|
|
""" |
|
|
return { |
|
|
"message": action.message, |
|
|
} |
|
|
|
|
|
def _parse_result(self, payload: Dict) -> StepResult[EchoObservation]: |
|
|
""" |
|
|
Parse server response into StepResult[EchoObservation]. |
|
|
|
|
|
Args: |
|
|
payload: JSON response from server |
|
|
|
|
|
Returns: |
|
|
StepResult with EchoObservation |
|
|
""" |
|
|
obs_data = payload.get("observation", {}) |
|
|
observation = EchoObservation( |
|
|
echoed_message=obs_data.get("echoed_message", ""), |
|
|
message_length=obs_data.get("message_length", 0), |
|
|
done=payload.get("done", False), |
|
|
reward=payload.get("reward"), |
|
|
metadata=obs_data.get("metadata", {}), |
|
|
) |
|
|
|
|
|
return StepResult( |
|
|
observation=observation, |
|
|
reward=payload.get("reward"), |
|
|
done=payload.get("done", False), |
|
|
) |
|
|
|
|
|
def _parse_state(self, payload: Dict) -> State: |
|
|
""" |
|
|
Parse server response into State object. |
|
|
|
|
|
Args: |
|
|
payload: JSON response from /state endpoint |
|
|
|
|
|
Returns: |
|
|
State object with episode_id and step_count |
|
|
""" |
|
|
return State( |
|
|
episode_id=payload.get("episode_id"), |
|
|
step_count=payload.get("step_count", 0), |
|
|
) |
|
|
|