Spaces:
Build error
Build error
File size: 5,545 Bytes
078556c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
import data_manager
import gemini_client
import re
import os
def extract_order_id(query):
"""Attempts to extract an order ID (assumed to be a number) from the query."""
match = re.search(r'\b\d+\b', query)
if match:
return int(match.group(0))
return None
def format_prompt(query, order_details=None, order_items=None, recent_orders=None):
"""Formats the prompt for the Gemini API, including context."""
prompt = f"You are an e-commerce customer support assistant. Answer the user's query based *only* on the provided information. If the information is insufficient, say so.\n\nUser Query: \"{query}\"\n\n"
if order_details:
prompt += "--- Order Information ---\n"
prompt += f"Order ID: {order_details.get('order_id')}\n"
prompt += f"Customer: {order_details.get('user_name')} ({order_details.get('email')})\n"
prompt += f"Date: {order_details.get('order_date')}\n"
prompt += f"Status: {order_details.get('status')}\n"
prompt += f"Total: ${order_details.get('total_amount'):.2f}\n"
if order_items:
prompt += "\n--- Items in Order ---\n"
for item in order_items:
prompt += f"- {item.get('product_name')} (Qty: {item.get('quantity')}, Price/Unit: ${item.get('price_per_unit'):.2f})\n"
if recent_orders:
prompt += "\n--- Recent Orders ---\n"
for order in recent_orders:
prompt += f"- Order ID: {order.get('order_id')}, Date: {order.get('order_date')}, Status: {order.get('status')}, Total: ${order.get('total_amount'):.2f}\n"
prompt += "\n---\nAssistant Response:"
return prompt
def main():
"""Main loop for the chatbot interaction."""
print("Welcome to the E-commerce Chat Assistant!")
print("You can ask about order status, items, or recent orders.")
print("Example: 'What is the status of order 1?' or 'Show my recent orders for alice@example.com'")
print("Type 'quit' to exit.")
# Basic way to identify user - could be improved with login simulation
user_email = input("Please enter your email address to start: ")
user_info = data_manager.get_user_by_email(user_email)
if not user_info:
print(f"User with email {user_email} not found. Exiting.")
return
print(f"Welcome, {user_info['name']}!")
user_id = user_info['user_id']
while True:
query = input("\nYour query: ")
if query.lower() == 'quit':
break
order_id = extract_order_id(query)
order_details = None
order_items = None
recent_orders = None
try:
# Determine context based on query and extracted info
if order_id:
order_details = data_manager.get_order_details(order_id)
if order_details:
# Security check: Ensure the order belongs to the logged-in user
if order_details['email'] != user_email:
print(f"Order {order_id} does not belong to user {user_email}.")
order_details = None # Clear details if not authorized
else:
# Fetch items only if order details are valid and authorized
order_items = data_manager.get_order_items(order_id)
else:
print(f"Order ID {order_id} not found.")
# Check for recent orders query (simple keyword check)
elif "recent orders" in query.lower() or "my orders" in query.lower():
recent_orders = data_manager.get_user_recent_orders(user_id)
if not recent_orders:
print("You have no recent orders.")
# Construct and send prompt if we have relevant context
if order_details or recent_orders:
prompt = format_prompt(query, order_details, order_items, recent_orders)
print("\nAssistant thinking...")
response = gemini_client.get_gemini_response(prompt)
print(f"\nAssistant: {response}")
elif order_id and not order_details:
# Already handled the "not found" or "not authorized" message
pass
else:
# If no specific context found, try sending the query directly (less reliable)
# Or inform the user context is needed
# print("Could not determine specific order information. Trying a general query...")
# prompt = format_prompt(query) # Send without specific context
# response = gemini_client.get_gemini_response(prompt)
# print(f"\nAssistant: {response}")
print("Please specify an order ID or ask about 'recent orders'.")
except FileNotFoundError as e:
print(f"Error: {e}. Please ensure the database exists.")
break
except Exception as e:
print(f"An unexpected error occurred: {e}")
print("Goodbye!")
if __name__ == "__main__":
# Optional: Run data generation if DB doesn't exist?
# For simplicity, we assume generate_data.py is run manually first.
if not os.path.exists(data_manager.DB_PATH):
print(f"Database not found at {data_manager.DB_PATH}.")
print("Please run 'python generate_data.py' first to create and populate the database.")
else:
main()
|