openenv / server /models.py
jeromerichard's picture
Fix: add server/app.py, uv.lock, project.scripts entry point
7cf2ffd
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"}