VAKYA/Report_generation
0
1# Copyright (c) Meta-style OSS header for OpenEnv-style environments.2 3"""Typed Action, Observation, Reward, and State models for the daily report environment."""4 5from __future__ import annotations6 7from typing import Any, Dict, List, Literal, Optional8 9from pydantic import BaseModel, Field10 11try:12 from openenv.core.env_server.types import Action, Observation, State13except ImportError:14 from openenv_core.env_server.types import Action, Observation, State # type: ignore15 16 17TaskName = Literal["daily_header", "daily_summary", "daily_full"]18 19 20class ReportReward(BaseModel):21 """Decomposed reward for debugging and learning (all components in [0, 1] where noted)."""22 23 progress_score: float = Field(24 ..., ge=0.0, le=1.0, description="Task grader after this step (0–1)"25 )26 delta_progress: float = Field(27 ..., description="Change in grader since previous step (can be negative)"28 )29 step_total: float = Field(30 ...,31 ge=0.0,32 le=1.0,33 description="Shaped reward for this step (progress delta + bonuses − penalties, clamped)",34 )35 36 37class DailyReportAction(Action):38 """Agent command for assembling a scheduled daily merge (MRG) PDF report."""39 40 command: Literal[41 "set_header_field",42 "set_summary_metric",43 "add_kpi_row",44 "finalize_pdf",45 "submit_report",46 "noop",47 ]48 key: Optional[str] = Field(49 default=None,50 description="Header key (title, report_date, author) or metric key (revenue_musd, incidents, uptime_pct)",51 )52 value: Optional[str] = Field(default=None, description="Value to set for header or metric")53 row_cells: Optional[List[str]] = Field(54 default=None,55 description="One KPI table row (hard task): cells left-to-right",56 )57 58 59class DailyReportObservation(Observation):60 """What the agent sees after each step."""61 62 task: TaskName63 instructions: str64 static_data: Dict[str, Any] = Field(default_factory=dict)65 header_fields: Dict[str, str] = Field(default_factory=dict)66 summary_metrics: Dict[str, str] = Field(default_factory=dict)67 kpi_rows: List[List[str]] = Field(default_factory=list)68 pdf_generated: bool = False69 submitted: bool = False70 graded_score: float = Field(0.0, ge=0.0, le=1.0)71 max_steps: int = 3072 steps_remaining: int = 3073 feedback: str = ""74 last_action_error: Optional[str] = None75 reward_detail: Optional[ReportReward] = None76 77 78class DailyReportState(State):79 """Serializable server state beyond episode_id / step_count."""80 81 task: TaskName = "daily_header"82 header_fields: Dict[str, str] = Field(default_factory=dict)83 summary_metrics: Dict[str, str] = Field(default_factory=dict)84 kpi_rows: List[List[str]] = Field(default_factory=list)85 pdf_generated: bool = False86 submitted: bool = False87 graded_score: float = 0.088 last_action_error: Optional[str] = None89 repeat_action_streak: int = 090 last_action_fingerprint: Optional[str] = None91 