78 lines
2.9 KiB
Python
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
|