Files
filam3d/backend/app/routers/ai_advisor.py
2026-03-22 16:07:31 +03:00

78 lines
2.9 KiB
Python

import logging
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.database import get_db
from app.models.material import Material
from app.schemas.calculate import AdvisorRequest, AdvisorResponse, AdvisorAlternative
from app.services.ai_advisor import get_material_recommendation
logger = logging.getLogger("app.routers.ai_advisor")
router = APIRouter()
@router.post("/advisor", response_model=AdvisorResponse)
async def advisor(request: AdvisorRequest, db: AsyncSession = Depends(get_db)):
logger.info("===== POST /api/advisor =====")
logger.info("Task description: %s", request.task_description)
logger.info("Budget preference: %s", request.budget_preference)
logger.info("File info: %s", request.file_info)
logger.info("Fetching materials from database...")
result = await db.execute(select(Material).where(Material.is_active == True).order_by(Material.id))
materials = result.scalars().all()
logger.info("Found %d active materials", len(materials))
materials_data = [
{
"id": m.id,
"name": m.name,
"category": m.category,
"density_g_cm3": m.density_g_cm3,
"price_per_gram": m.price_per_gram,
"max_temp_c": m.max_temp_c,
"min_temp_c": m.min_temp_c,
"strength": m.strength,
"flexibility": m.flexibility,
"chemical_resistance": m.chemical_resistance,
"uv_resistance": m.uv_resistance,
"food_safe": m.food_safe,
"description": m.description,
}
for m in materials
]
logger.info("Calling AI advisor service...")
try:
rec = await get_material_recommendation(
task_description=request.task_description,
materials_data=materials_data,
budget_preference=request.budget_preference,
file_info=request.file_info,
db=db,
)
logger.info("AI advisor returned recommendation: material_id=%s, name=%s",
rec.get("recommended_material_id"), rec.get("recommended_material_name"))
except ValueError as e:
logger.error("AI advisor ValueError: %s", str(e))
raise HTTPException(400, str(e))
except Exception as e:
logger.error("AI advisor unexpected error: %s", str(e), exc_info=True)
raise HTTPException(500, f"Ошибка AI-сервиса: {str(e)}")
response = AdvisorResponse(
recommended_material_id=rec.get("recommended_material_id", 1),
recommended_material_name=rec.get("recommended_material_name", ""),
reasoning=rec.get("reasoning", ""),
alternatives=[
AdvisorAlternative(**alt) for alt in rec.get("alternatives", [])
],
questions=rec.get("questions", []),
)
logger.info("===== /api/advisor complete =====")
return response