from pydantic import BaseModel, Field class BoundingBox(BaseModel): x: float y: float z: float class FileInfoResponse(BaseModel): filename: str format: str volume_cm3: float surface_area_cm2: float bounding_box_mm: BoundingBox is_watertight: bool triangle_count: int class MaterialInfo(BaseModel): id: int name: str density_g_cm3: float price_per_gram: float class CalculationResult(BaseModel): material: MaterialInfo weight_grams: float material_cost_rub: float print_time_hours: float time_cost_rub: float post_processing_cost_rub: float subtotal_rub: float quantity: int quantity_discount_percent: int total_rub: float estimated_days: int class CalculateResponse(BaseModel): success: bool = True calculation_id: str file_info: FileInfoResponse calculation: CalculationResult class AdvisorRequest(BaseModel): task_description: str budget_preference: str = "optimal" file_info: dict | None = None class AdvisorAlternative(BaseModel): material_id: int name: str why: str class AdvisorResponse(BaseModel): recommended_material_id: int recommended_material_name: str reasoning: str alternatives: list[AdvisorAlternative] = [] questions: list[str] = []