from __future__ import annotations from dataclasses import dataclass, field from typing import Any, Literal import numpy as np SlotName = Literal["top", "bottom", "shoes", "accessory", "unknown"] @dataclass(slots=True) class WeatherContext: season: str = "all-season" temperature_c: float | None = None is_rainy: bool | None = None @dataclass(slots=True) class RecommendationContext: occasion: str = "casual" weather: WeatherContext = field(default_factory=WeatherContext) region: str = "global" user_profile: dict[str, Any] = field(default_factory=dict) @dataclass(slots=True) class EncodedWardrobeItem: item: dict[str, Any] vector: np.ndarray slot: SlotName metadata_text: str @dataclass(slots=True) class OutfitCandidate: top: EncodedWardrobeItem bottom: EncodedWardrobeItem shoes: EncodedWardrobeItem | None = None accessory: EncodedWardrobeItem | None = None score: float = 0.0 breakdown: dict[str, float] = field(default_factory=dict) reason: str = "" tip: str = "" def slot_items(self) -> list[EncodedWardrobeItem]: return [ slot_item for slot_item in [self.top, self.bottom, self.shoes, self.accessory] if slot_item is not None ]