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, ) 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