Files
ds_drone_bot/api/routes/chat.py
T
2025-08-15 17:33:43 +01:00

117 lines
4.4 KiB
Python

# api/routes/chat_ai.py
from fastapi import APIRouter, Depends, HTTPException
from api.models.requests import ChatRequest, ChatMessage,SurveyRequest
from api.models.responses import ChatResponse,SurveyAgentResponse
from api.dependencies.auth import get_api_key
from src.llm.orchestrator import DroneBot, Message # Adjust import as needed
from src.llm.agent.flight_assesment import DroneAssessmentAgent
import json
from logger import logger
router = APIRouter(
prefix="/chat",
tags=["chat"]
)
@router.post("/booking-assistant", response_model=ChatResponse)
async def chat_ai(
request: ChatRequest,
_: str = Depends(get_api_key)
):
"""Chat with DroneBot using query and history."""
try:
logger.info(f"Starting chat request with query: {request.query}")
logger.info(f"History length: {len(request.history)}")
# Extract customer metadata if provided
customer_metadata = request.customer_metadata
if customer_metadata:
logger.info(f"Customer metadata provided: {list(customer_metadata.keys())}")
else:
logger.info("No customer metadata provided")
# Convert to internal Message format
history = [Message(role=msg.role, content=msg.content) for msg in request.history]
logger.info(f"Converted history to internal format: {len(history)} messages")
# Initialize DroneBot with history and customer metadata
logger.info("Initializing DroneBot...")
bot = DroneBot(history=history, use_openai_as_fallback=True, customer_metadata=customer_metadata)
logger.info("DroneBot initialized successfully")
# Get response from DroneBot
logger.info("Calling DroneBot.chat()...")
result = bot.chat(request.query)
logger.info(f"DroneBot response received: {result}")
# Validate result and final_message
if not result or "final_message" not in result:
logger.error(f"Invalid result from DroneBot: {result}")
raise HTTPException(
status_code=500,
detail="Invalid response from DroneBot: missing final_message"
)
final_message = result["final_message"]
logger.info(f"Final message extracted: {final_message}")
if not final_message or not isinstance(final_message, str):
logger.error(f"Final message is not a valid string: {type(final_message)} - {final_message}")
raise HTTPException(
status_code=500,
detail="Invalid response from DroneBot: final_message is not a valid string"
)
try:
logger.info("Attempting to parse final_message as JSON...")
message = json.loads(final_message)
logger.info("JSON parsing successful")
except json.JSONDecodeError as json_error:
logger.warning(f"JSON decode error: {json_error}")
logger.warning(f"Raw final_message: {final_message}")
# If JSON parsing fails, create a fallback structure
message = {
"message": final_message,
"options": None,
"requires_selection": False,
"end": "in_progress",
"form": {}
}
logger.info("Created fallback message structure")
logger.info(f"Final message to return: {message}")
return ChatResponse(
status="success",
message=message
)
except HTTPException:
logger.error("Re-raising HTTPException")
raise
except Exception as e:
logger.error(f"Unexpected error in chat_ai: {str(e)}", exc_info=True)
raise HTTPException(
status_code=500,
detail=str(e)
)
@router.post("/analyse-survey", response_model=SurveyAgentResponse)
async def run_survey_agent(
request: SurveyRequest,
_: str = Depends(get_api_key)
):
"""Chat with DroneBot using query and history."""
try:
booking_form_input = request.booking_form_input
#from test2 import booking_form_input
agent = DroneAssessmentAgent()
result = await agent.run(booking_form_input)
return SurveyAgentResponse(
status="success",
result=result
)
except Exception as e:
raise HTTPException(
status_code=500,
detail=str(e)
)