"""Pydantic models for Email Triage OpenEnv.""" from datetime import datetime from enum import Enum from typing import Optional, List, Dict, Any from pydantic import BaseModel, Field class EmailCategory(str, Enum): """Email classification categories""" SPAM = "spam" NORMAL = "normal" URGENT = "urgent" BILLING = "billing" class Team(str, Enum): """Teams to route emails to""" SUPPORT = "support" SALES = "sales" BILLING = "billing" NONE = "none" class Email(BaseModel): """Represents an email message""" email_id: str subject: str body: str sender_domain: str timestamp: datetime is_vip_sender: bool = False sla_hours: Optional[int] = None class GroundTruth(BaseModel): """Ground truth labels for an email""" email_id: str category: EmailCategory team: Team priority: int = Field(ge=0, le=3) # 0=low, 3=high class Observation(BaseModel): """Observation returned after each step""" current_email: Email inbox_state: Dict[str, int] = Field( default_factory=lambda: { "pending": 0, "spam": 0, "urgent": 0, "processed": 0 } ) step_count: int = 0 task_name: str = "" info: Dict[str, Any] = Field(default_factory=dict) class Action(BaseModel): """Action taken by the agent""" classification: EmailCategory team: Team = Team.NONE priority: int = Field(ge=0, le=3, default=1) class Reward(BaseModel): """Reward signal for an action""" value: float = Field(ge=0.0, le=1.0) breakdown: Dict[str, float] = Field(default_factory=dict) class State(BaseModel): """Complete environment state""" current_observation: Observation current_reward: float done: bool info: Dict[str, Any] = Field(default_factory=dict) history: List[Dict[str, Any]] = Field(default_factory=list)