""" app/models.py — All typed request/response models for OpenEnv API contract. Pydantic V2 with strict validators. Never deviate from this contract. """ from pydantic import BaseModel, field_validator from typing import Optional, Dict, Any, List class StepAction(BaseModel): code: str filename: str task_id: str session_id: str @field_validator("code") @classmethod def code_not_empty(cls, v: str) -> str: if not v.strip(): raise ValueError("code cannot be empty") if len(v) > 50_000: raise ValueError("code exceeds 50KB limit — split into smaller modules") return v @field_validator("filename") @classmethod def filename_valid(cls, v: str) -> str: if not v.strip(): raise ValueError("filename cannot be empty") return v class StepObservation(BaseModel): scores: Dict[str, float] total_reward: float feedback: Dict[str, str] codegraph: Dict[str, Any] done: bool step_count: int class ResetObservation(BaseModel): session_id: str task_id: str problem_statement: str difficulty: str cwe_targets: List[str] codegraph: Dict[str, Any] starter_code: str naive_baseline: Dict[str, Any] class StateResponse(BaseModel): task_id: str step: int done: bool codegraph: Dict[str, Any] difficulty: Optional[str] = None cwe_targets: Optional[List[str]] = None