WalkXR-AI / Paul-Game-Jam-Phase-2.5 / src / schemas / emotional_state.py
emotional_state.py
Raw
from pydantic import BaseModel, Field


class CircumplexEmotionalState(BaseModel):
    """Russell's Circumplex Model of Affect"""

    valence: float = Field(default=0.0, ge=-1.0, le=1.0, description="Negative(-1) to Positive(+1)")
    arousal: float = Field(default=0.0, ge=-1.0, le=1.0, description="Calm(-1) to Excited(+1)")
    label: str = Field(default="neutral", description="Emotion label (e.g. anxious, happy, calm)")

    def summary(self) -> str:
        return f"{self.label} (valence={self.valence:.2f}, arousal={self.arousal:.2f})"


class EmotionSnapshot(BaseModel):
    """Emotion record for a single turn"""

    turn: int
    emotion: CircumplexEmotionalState
    confidence_level: float = Field(default=0.5, ge=0.0, le=1.0)