|
|
|
|
|
|
|
|
|
|
|
|
| """
|
| FastAPI application for the He Demo Environment.
|
|
|
| This module creates an HTTP server that exposes the HeDemoEnvironment
|
| over HTTP and WebSocket endpoints, compatible with EnvClient.
|
|
|
| Endpoints:
|
| - POST /reset: Reset the environment
|
| - POST /step: Execute an action
|
| - GET /state: Get current environment state
|
| - GET /schema: Get action/observation schemas
|
| - WS /ws: WebSocket endpoint for persistent sessions
|
|
|
| Usage:
|
| # Development (with auto-reload):
|
| uvicorn server.app:app --reload --host 0.0.0.0 --port 8000
|
|
|
| # Production:
|
| uvicorn server.app:app --host 0.0.0.0 --port 8000 --workers 4
|
|
|
| # Or run directly:
|
| python -m server.app
|
| """
|
|
|
| try:
|
| from openenv.core.env_server.http_server import create_app
|
| except Exception as e:
|
| raise ImportError(
|
| "openenv is required for the web interface. Install dependencies with '\n uv sync\n'"
|
| ) from e
|
|
|
| from fastapi import FastAPI
|
| from he_demo.models import EnergyOptimizationAction, EnergyOptimizationObservation
|
| from he_demo.server.he_demo_environment import EnergyOptimizationEnvironment
|
| from he_demo.task_graders import get_grader_metadata, TASK_GRADERS
|
|
|
|
|
|
|
| app = create_app(
|
| EnergyOptimizationEnvironment,
|
| EnergyOptimizationAction,
|
| EnergyOptimizationObservation,
|
| env_name="energy_optimization",
|
| max_concurrent_envs=1,
|
| )
|
|
|
|
|
|
|
|
|
|
|
|
|
| @app.get("/graders")
|
| def get_graders():
|
| """
|
| Get all available task graders with metadata.
|
|
|
| This endpoint exposes all graders for external validation tools to detect.
|
| Each grader returns scores from 0.0 (worst) to 1.0 (best).
|
|
|
| Returns:
|
| List of grader metadata including name, difficulty, targets, and descriptions.
|
| """
|
| return {
|
| "graders": get_grader_metadata(),
|
| "total_graders": len(TASK_GRADERS),
|
| "grader_names": list(TASK_GRADERS.keys())
|
| }
|
|
|
|
|
| @app.get("/graders/{task_name}")
|
| def get_grader_info(task_name: str):
|
| """
|
| Get metadata for a specific grader.
|
|
|
| Args:
|
| task_name: Name of the task
|
|
|
| Returns:
|
| Grader metadata including difficulty, targets, and real-world application.
|
| """
|
| metadata = get_grader_metadata(task_name)
|
| return {
|
| "task_name": task_name,
|
| "metadata": metadata
|
| }
|
|
|
|
|
| @app.get("/graders/info")
|
| def graders_info():
|
| """
|
| Get comprehensive information about all graders including:
|
| - Number of tasks with graders (should be >= 3)
|
| - Task names and descriptions
|
| - Real-world applications
|
| - Scoring methodology
|
|
|
| Returns:
|
| Comprehensive grader information for validator tool detection
|
| """
|
| return {
|
| "environment": "Energy & Memory RAM Optimization",
|
| "total_tasks_with_graders": len(TASK_GRADERS),
|
| "minimum_required_graders": 3,
|
| "validation_status": "PASS" if len(TASK_GRADERS) >= 3 else "FAIL",
|
| "graders": get_grader_metadata(),
|
| "scoring_scale": "0.0 (worst) to 1.0 (best)",
|
| "real_world_application": "System resource optimization for data centers, edge computing, and mobile devices"
|
| }
|
|
|
|
|
| def main(host: str = "0.0.0.0", port: int = 8000):
|
| """
|
| Entry point for direct execution via uv run or python -m.
|
|
|
| This function enables running the server without Docker:
|
| uv run --project . server
|
| uv run --project . server --port 8001
|
| python -m he_demo.server.app
|
|
|
| Args:
|
| host: Host address to bind to (default: "0.0.0.0")
|
| port: Port number to listen on (default: 8000)
|
|
|
| For production deployments, consider using uvicorn directly with
|
| multiple workers:
|
| uvicorn he_demo.server.app:app --workers 4
|
| """
|
| import uvicorn
|
|
|
| uvicorn.run(app, host=host, port=port)
|
|
|
|
|
| if __name__ == "__main__":
|
| import argparse
|
|
|
| parser = argparse.ArgumentParser()
|
| parser.add_argument("--port", type=int, default=8000)
|
| args = parser.parse_args()
|
| main(port=args.port)
|
|
|
|
|
|
|
| if False:
|
| main()
|
|
|