from fastapi import APIRouter, HTTPException from backend.app.schemas.chatbot import ChatResponse , ChatRequest from backend.app.helper.dependencies import events_vector_db, travels_vector_db from backend.app.helper.dependencies import embedding_model , assistant router = APIRouter() @router.post("/chatbot/", response_model=ChatResponse) async def process_chat(request: ChatRequest): try: req_type = None chat_result = {} if request.message == "" or request.message is None: pass elif request.message == "##delete_ses$0sion%()@RFFJOBC": assistant.delete_session(request.session_id) return ChatResponse( response="Session deleted successfully.", recommendations=[], session_id=request.session_id, type='unknown' ) else : chat_result = assistant.extract_requirements( request.message, session_id=request.session_id ) recommendations = [] if chat_result.get('search_queries'): # print("Search Queries:", chat_result['search_queries'] ) req_type = chat_result.get('new_requirements', {}).get('type') db = events_vector_db if req_type.lower() == 'event' else travels_vector_db # Search both queries results_primary = db.search_by_query(chat_result['search_queries'][0], embedding_model, top_k=request.NoOfItems) results_secondary = db.search_by_query(chat_result['search_queries'][1], embedding_model, top_k=request.NoOfItems) # Combine & deduplicate combined = results_primary + results_secondary seen_ids = set() for result in sorted(combined, key=lambda x: x['similarity_score'], reverse=True): if result['id'] not in seen_ids: recommendations.append(str(result['id'])) seen_ids.add(result['id']) if len(recommendations) >= request.NoOfItems: break return ChatResponse( response=chat_result['response'] if chat_result.get('response') else "", recommendations=recommendations, session_id=request.session_id, type=req_type.lower() if req_type else 'unknown' ) except Exception as e: raise HTTPException(status_code=500, detail=f"Chat processing error: {str(e)}")