from openenv.core.env_server.types import Action, Observation from pydantic import Field B_CELL_ACTIONS = [ "INCREASE_HIGH", "INCREASE_LOW", "MAINTAIN", "REDUCE", ] T_CELL_ACTIONS = [ "ATTACK_HIGH", "ATTACK_MEDIUM", "ATTACK_LOW", "REST", ] class TICEAction(Action): b_cell_action: str = Field( ..., description=f"B cell command. One of: {B_CELL_ACTIONS}", ) t_cell_action: str = Field( ..., description=f"T cell command. One of: {T_CELL_ACTIONS}", ) class TICEObservation(Observation): tumor_trend: str = Field(description="'increasing', 'stable', or 'decreasing'") detection_signal: float = Field(description="Noisy B cell detection level [0,1]") t_cell_effectiveness: str = Field(description="'high', 'medium', or 'low'") resource_level: str = Field(description="'abundant', 'moderate', or 'scarce'") b_cell_fatigue: float = Field(description="B cell fatigue [0,1]") t_cell_fatigue: float = Field(description="T cell fatigue [0,1]") recent_outcome: str = Field( description="'strong_response', 'weak_response', or 'no_effect'" ) timestep: int = Field(description="Current timestep [0,50]") episode_phase: str = Field( description="'early' (t<15), 'mid' (15-35), or 'late' (t>35)" ) archetype: str = Field(description="Tumor archetype for this episode") difficulty: str = Field(description="Episode difficulty tier") feedback: str = Field(default="", description="Step outcome description") done: bool = Field(default=False) reward: float = Field(default=0.0) TiceAction = TICEAction TiceObservation = TICEObservation