| from __future__ import annotations |
|
|
| from typing import Any |
|
|
| from pydantic import Field |
| from openenv.core.env_server import Action, Environment, Observation, State |
|
|
| from agents import SmartCareerAgent |
| from logging_utils import get_logger |
|
|
| logger = get_logger("environment") |
|
|
|
|
| class CareerAction(Action): |
| query: str = "" |
|
|
|
|
| class CareerObservation(Observation): |
| output: dict[str, Any] |
|
|
|
|
| class CareerState(State): |
| last_query: str = "" |
| last_output: dict[str, Any] = Field(default_factory=dict) |
|
|
|
|
| class CareerEnvironment(Environment[CareerAction, CareerObservation, CareerState]): |
| def __init__(self) -> None: |
| super().__init__() |
| self._agent = SmartCareerAgent() |
| self._state = CareerState() |
| logger.info("CareerEnvironment initialized.") |
|
|
| def reset( |
| self, |
| seed: int | None = None, |
| episode_id: str | None = None, |
| **kwargs: Any, |
| ) -> CareerObservation: |
| logger.info("reset called seed=%r episode_id=%r", seed, episode_id) |
| self._agent = SmartCareerAgent() |
| self._state = CareerState(episode_id=episode_id) |
| return CareerObservation(output={"status": "ok"}, done=False, reward=None) |
|
|
| def step( |
| self, |
| action: CareerAction, |
| timeout_s: float | None = None, |
| **kwargs: Any, |
| ) -> CareerObservation: |
| query = action.query or "" |
| logger.info("step called query=%r timeout_s=%r", query, timeout_s) |
| result = self._agent.respond(query) |
|
|
| self._state.step_count += 1 |
| self._state.last_query = query |
| self._state.last_output = result |
|
|
| logger.info("step completed step_count=%s intent=%s", self._state.step_count, result.get("intent")) |
| return CareerObservation(output=result, done=False, reward=None) |
|
|
| @property |
| def state(self) -> CareerState: |
| logger.info("state requested step_count=%s", self._state.step_count) |
| return self._state |
|
|