from __future__ import annotations from typing import Optional, List, Dict, Any from pydantic import BaseModel, Field, field_validator class ContentSignals(BaseModel): target: str = "none" is_protected_class: bool = False toxicity_level: float = 0.5 is_direct_attack: bool = False context_type: str = "statement" intent: str = "ambiguous" confidence: float = 0.5 abusive_language_present: bool = False content_flags: List[str] = Field(default_factory=list) @field_validator("toxicity_level", "confidence") @classmethod def clamp_0_1(cls, v: float) -> float: return max(0.0, min(1.0, float(v))) model_config = {"extra": "ignore"} class TrustAction(BaseModel): action_type: str = "" tool_name: Optional[str] = None signals: Optional[ContentSignals] = None final_decision: Optional[str] = None model_config = {"extra": "ignore"} class TrustObservation(BaseModel): ticket_id: str = "" post_text: str = "" image_description: str = "" comments_found: Optional[str] = None user_history_found: Optional[str] = None entity_status_found: Optional[str] = None policy_found: Optional[str] = None extracted_signals: Optional[Dict[str, Any]] = None validation_result: Optional[Dict[str, Any]] = None step_number: int = 0 info: Optional[Dict[str, Any]] = None done: bool = False reward: Optional[float] = None model_config = {"extra": "ignore"} class TrustState(BaseModel): episode_id: Optional[str] = None step_count: int = 0 current_task_id: Optional[str] = None difficulty: Optional[str] = None ambiguity_level: Optional[str] = None risk_level: Optional[str] = None tools_used: List[str] = Field(default_factory=list) signals_extracted: bool = False is_done: bool = False model_config = {"extra": "ignore"}