from pydantic import BaseModel, Field from typing import Literal, List, Union, Optional class Behavior(BaseModel): type: str description: Optional[str] = None # Making the description field optional # --- Specific Behavior classes --- class AbnormalBreathing(Behavior): type: Literal['abnormal breathing'] description: Optional[Literal["Problems breathing, breathing sounds"]] = None class CrashFalling(Behavior): type: Literal['crash, falling from the sky'] description: Optional[Literal["Suddenly falling from the sky"]] = None class Diarrhea(Behavior): type: Literal['diarrhea'] description: Optional[Literal["Observed diarrhea"]] = None class Lameness(Behavior): type: Literal['lameness'] description: Optional[Literal["Apparent limping or not able to walk properly"]] = None class Neurological(Behavior): type: Literal['neurological'] description: Optional[Literal["Circling, incoordination, tremors, convulsions, fast eye movements"]] = None class OtherAbnormalBehavior(Behavior): type: Literal['other abnormal behavior'] description: Optional[Literal["Other than weakness, other than neurologic"]] = None class UnableToFly(Behavior): type: Literal['unable to fly'] description: Optional[Literal["Animal alert and tries to fly but can not take off"]] = None class Vomiting(Behavior): type: Literal['vomiting'] description: Optional[Literal["Throwing up undigested food, regurgitating"]] = None class Weakness(Behavior): type: Literal['weakness'] description: Optional[Literal["Non responsive, does not fly away when approached, lethargy"]] = None class NoChanges(Behavior): type: Literal['no changes'] description: Optional[Literal["Animal is acting normally"]] = None # Union of all possible behaviors BehaviorType = Union[ AbnormalBreathing, CrashFalling, Diarrhea, Lameness, Neurological, OtherAbnormalBehavior, UnableToFly, Vomiting, Weakness, NoChanges ] # Main class that logs multiple behaviors class Behaviors(BaseModel): behaviors_radio: str # e.g., "Yes" behaviors_type: Optional[List[BehaviorType]] = None