# envs/finqa_env/server/app.py """ FastAPI server for the FinQA environment. Environment Variables: FINQA_DATA_PATH: Path to data directory (default: /app/env/data) FINQA_MAX_STEPS: Maximum tool calls per episode (default: 50) FINQA_TASK: Task name (default: finqa) """ import json import os from typing import Any, Dict from openenv.core.env_server.http_server import create_app from openenv.core.env_server.mcp_types import CallToolAction, CallToolObservation from pydantic import field_validator from .finqa_environment import FinQAEnvironment DATA_PATH = os.environ.get("FINQA_DATA_PATH", "/app/env/data") MAX_STEPS = int(os.environ.get("FINQA_MAX_STEPS", "50")) TASK = os.environ.get("FINQA_TASK", "finqa") def _env_factory(): """Create a new FinQAEnvironment instance for each session.""" return FinQAEnvironment( data_path=DATA_PATH, max_steps=MAX_STEPS, task=TASK, ) class FinQACallToolAction(CallToolAction): """CallToolAction that accepts JSON strings for arguments (web UI sends strings).""" @field_validator("arguments", mode="before") @classmethod def parse_arguments(cls, v: Any) -> Dict[str, Any]: if isinstance(v, str): return json.loads(v) return v app = create_app( _env_factory, FinQACallToolAction, CallToolObservation, env_name="finqa_env" )