from fastapi import APIRouter, status, HTTPException from models.query import Query from routes import search_products, purchase, order_management, account_management, customer_support from services.nlp import recognize_intent, recognize_entities, extract_keywords, generate_response from services.utils import clean_text, encode_and_normalize, extract_order_id_from_query router = APIRouter() FUNCTION_DESCRIPTIONS_FOR_PRODUCTS = { "search_products_by_keywords": "User wants to find products based on keywords", "search_products_by_filters": "User wants to refine search results with filters", "get_product_details": "User wants detailed information about a specific product" } FUNCTION_DESCRIPTIONS_FOR_ORDERS = { "get_order_location": "Find the location (city or state) of a specific order using an identification number order", "get_recent_order": "Track the most recent order of a customer", "get_order_details": "Get details about a specific order using an identification number order", "get_order_quantity": "Calculate the total number of products in a specific order", "get_order_amount": "Calculate the total amount spent in a specific order", "cancel_order": "Process order cancellation requests" } def query_processing(query: Query): cleaned_text = clean_text(query.text) query.intent = recognize_intent(cleaned_text) query.entities = recognize_entities(cleaned_text) query.keywords = extract_keywords(cleaned_text) encoded_query = encode_and_normalize(cleaned_text) if query.intent == "search for products": return {"products": search_products.handle_search_products_by_keywords(encoded_query)} elif query.intent == "order management": order_id = extract_order_id_from_query(query.text) if order_id: return order_management.handle_track_order(order_id) else: return "Please provide an Order Number" else: return None @router.post("/") async def handle_response(query: Query): context_from_elasticsearch = query_processing(query) return {"generative response": generate_response(query, context_from_elasticsearch)}