init
This commit is contained in:
76
backend/app/routers/ai_advisor.py
Normal file
76
backend/app/routers/ai_advisor.py
Normal file
@@ -0,0 +1,76 @@
|
||||
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
|
||||
Reference in New Issue
Block a user