66 lines
1.3 KiB
Python
66 lines
1.3 KiB
Python
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] = []
|