manzz05/kitchenflow-v2
1
1"""2KitchenFlow-v2: Models3Extends v1 models exactly — same field names, same types.4v2 additions are clearly marked so validators don't break.5"""6 7from typing import Any, Dict, List, Optional8from pydantic import Field9 10try:11 from openenv.core.env_server.interfaces import Action, Observation12except ImportError:13 try:14 from openenv.core.env_server import Action, Observation15 except ImportError:16 from pydantic import BaseModel17 class Action(BaseModel):18 metadata: Dict[str, Any] = Field(default_factory=dict)19 class Observation(BaseModel):20 done: bool = False21 reward: float = 0.022 metadata: Dict[str, Any] = Field(default_factory=dict)23 24 25class KitchenAction(Action):26 """27 dispatch_decisions maps order_id to action int:28 0 = wait29 1 = summon_driver30 2 = request_coordinator_priority (v2)31 3 = requery_gps (v2 chaos recovery)32 """33 dispatch_decisions: Dict[str, int] = Field(34 default_factory=dict,35 description="Map of order_id to action int. 0=wait, 1=summon_driver, 2=request_priority, 3=requery_gps",36 )37 38 39class KitchenObservation(Observation):40 """41 Full episode observation.42 All v1 fields preserved exactly.43 v2 fields added at bottom.44 """45 # v1 fields (preserved exactly)46 task_id: str = ""47 task_description: str = ""48 difficulty: str = ""49 time_min: int = 050 max_time_min: int = 3051 traffic_index: float = 1.052 orders: List[Dict[str, Any]] = Field(default_factory=list)53 orders_delivered: int = 054 orders_failed: int = 055 total_temp_penalty: float = 0.056 total_waste_penalty: float = 0.057 last_action_feedback: str = ""58 score: float = 0.059 attempts: int = 060 max_attempts: int = 3061 # v2 additions62 chaos_log: List[str] = Field(default_factory=list)63 coordinator_signals: Dict[str, str] = Field(default_factory=dict)64 curriculum_level: int = 165 chaos_level: int = 066 