Team Ai
Apppublic

openenv/coding_env

sourceHugging Faceupdated 3mo agoView on Hugging Face
21likes
python_codeact_env.py109 linesDownload Raw Back to server
1# Copyright (c) Meta Platforms, Inc. and affiliates.2# All rights reserved.3#4# This source code is licensed under the BSD-style license found in the5# LICENSE file in the root directory of this source tree.6 7"""8Python Code Action Environment.9 10This module provides a server-side environment implementation for executing11Python code actions using PyExecutor.12"""13 14import uuid15 16from core.env_server import Action, Environment, Observation, Transform17from core.tools import PyExecutor18 19from ..models import CodeAction, CodeObservation, CodeState20from .transforms import create_safe_coding_transform21 22class PythonCodeActEnv(Environment):23    """24    Python Code Action Environment for executing code and tracking state.25 26    This environment executes Python code submitted as CodeAction during step,27    maintains the last exit code in its state, and returns results wrapped28    in CodeObservation.29 30    Args:31        transform: Optional transform to apply to observations32        additional_imports: List of additional module imports to authorize33                          (e.g., ["numpy", "pandas", "matplotlib"])34 35    Example:36        >>> env = PythonCodeActEnv()37        >>> obs = env.reset()38        >>> action = CodeAction(code="print('Hello, World!')")39        >>> obs = env.step(action)40        >>> print(obs.stdout)  # "Hello, World!\n"41        >>> print(obs.exit_code)  # 042        >>> print(env.state.last_exit_code)  # 043    """44 45    def __init__(46        self,47    ):48        self.transform = create_safe_coding_transform()49        self._executor = PyExecutor()50        self._state = CodeState()51 52    def reset(self) -> Observation:53        """54        Reset environment and start fresh execution session.55 56        Returns:57            Initial observation with empty stdout/stderr and exit_code=058        """59        # Initialize fresh state60        self._state = CodeState(episode_id=str(uuid.uuid4()), step_count=0)61        # Add last_exit_code to state62        self._state.last_exit_code = 063 64        # Return initial observation65        observation = CodeObservation(66            stdout="",67            stderr="",68            exit_code=0,69        )70 71        return self._apply_transform(observation)72 73    def step(self, action: Action) -> Observation:74        """75        Execute code action and return observation.76 77        Args:78            action: CodeAction containing the code to execute79 80        Returns:81            CodeObservation with execution results (stdout, stderr, exit_code)82 83        Raises:84            ValueError: If action is not a CodeAction instance85        """86        if not isinstance(action, CodeAction):87            raise ValueError(f"Expected CodeAction, got {type(action)}")88 89        # Execute the code using PyExecutor90        result = self._executor.run(action.code)91 92        # Update state93        self._state.step_count += 194        self._state.last_exit_code = result.exit_code95 96        # Create observation from execution result97        observation = CodeObservation(98            stdout=result.stdout,99            stderr=result.stderr,100            exit_code=result.exit_code,101        )102 103        return self._apply_transform(observation)104 105    @property106    def state(self) -> CodeState:107        """Get current environment state including last exit code."""108        return self._state109