Spaces:
Sleeping
Sleeping
| from langchain_core.tools import tool | |
| from typing import List, Dict | |
| from src.vectorstores.vectore_store import FlowerShopVectorStore | |
| import json | |
| vector_store = FlowerShopVectorStore() | |
| INVENTORY_FILE_PATH = './data/inventory.json' | |
| customers_database = [ | |
| {"name": "John Doe", "postcode": "SW1A 1AA", "dob": "1990-01-01", "customer_id": "CUST001", "first_line_address": "123 Main St", "phone_number": "07712345678", "email": "john.doe@example.com"}, | |
| {"name": "Jane Smith", "postcode": "E1 6AN", "dob": "1985-05-15", "customer_id": "CUST002", "first_line_address": "456 High St", "phone_number": "07723456789", "email": "jane.smith@example.com"}, | |
| ] | |
| orders_database = [ | |
| {"order_id": "ORD001", "customer_id": "CUST001", "status": "Processing", "items": ["Red Roses Bouquet"], "quantity": [1]}, | |
| {"order_id": "ORD002", "customer_id": "CUST002", "status": "Shipped", "items": ["Mixed Tulips", "Vase"], "quantity": [3, 1]}, | |
| ] | |
| with open(INVENTORY_FILE_PATH, 'r') as f: | |
| inventory_database = json.load(f) | |
| data_protection_checks = [] | |
| def data_protection_check(name: str, postcode: str, year_of_birth: int, month_of_birth: int, day_of_birth: int) -> Dict: | |
| """ | |
| Perform a data protection check against a customer to retrieve customer details. | |
| Args: | |
| name (str): Customer first and last name | |
| postcode (str): Customer registered address | |
| year_of_birth (int): The year the customer was born | |
| month_of_birth (int): The month the customer was born | |
| day_of_birth (int): The day the customer was born | |
| Returns: | |
| Dict: Customer details (name, postcode, dob, customer_id, first_line_address, email) | |
| """ | |
| data_protection_checks.append( | |
| { | |
| 'name': name, | |
| 'postcode': postcode, | |
| 'year_of_birth': year_of_birth, | |
| 'month_of_birth': month_of_birth, | |
| 'day_of_birth': day_of_birth | |
| } | |
| ) | |
| for customer in customers_database: | |
| if (customer['name'].lower() == name.lower() and | |
| customer['postcode'].lower() == postcode.lower() and | |
| int(customer['dob'][0:4]) == year_of_birth and | |
| int(customer["dob"][5:7]) == month_of_birth and | |
| int(customer["dob"][8:10]) == day_of_birth): | |
| return f"DPA check passed - Retrieved customer details:\n{customer}" | |
| return "DPA check failed, no customer with these details found" | |
| def create_new_customer(first_name: str, surname: str, year_of_birth: int, month_of_birth: int, day_of_birth: int, postcode: str, first_line_of_address: str, phone_number: str, email: str) -> str: | |
| """ | |
| Creates a customer profile, so that they can place orders. | |
| Args: | |
| first_name (str): Customers first name | |
| surname (str): Customers surname | |
| year_of_birth (int): Year customer was born | |
| month_of_birth (int): Month customer was born | |
| day_of_birth (int): Day customer was born | |
| postcode (str): Customer's postcode | |
| first_line_address (str): Customer's first line of address | |
| phone_number (str): Customer's phone number | |
| email (str): Customer's email address | |
| Returns: | |
| str: Confirmation that the profile has been created or any issues with the inputs | |
| """ | |
| if len(phone_number) != 11: | |
| return "Phone number must be 11 digits" | |
| customer_id = len(customers_database) + 1 | |
| customers_database.append({ | |
| 'name': first_name + ' ' + surname, | |
| 'dob': f'{year_of_birth}-{month_of_birth:02}-{day_of_birth:02}', | |
| 'postcode': postcode, | |
| 'first_line_address': first_line_of_address, | |
| 'phone_number': phone_number, | |
| 'email': email, | |
| 'customer_id': f'CUST{customer_id}' | |
| }) | |
| return f"Customer registered, with customer_id {f'CUST{customer_id}'}" | |
| def query_knowledge_base(query: str) -> List[Dict[str, str]]: | |
| """ | |
| Looks up information in a knowledge base to help with answering customer questions and getting information on business processes. | |
| Args: | |
| query (str): Question to ask the knowledge base | |
| Return: | |
| List[Dict[str, str]]: Potentially relevant question and answer pairs from the knowledge base | |
| """ | |
| return vector_store.query_faqs(query=query) | |
| def search_for_product_reccommendations(description: str): | |
| """ | |
| Looks up information in a knowledge base to help with product recommendation for customers. For example: | |
| "Boquets suitable for birthdays, maybe with red flowers" | |
| "A large boquet for a wedding" | |
| "A cheap boquet with wildflowers" | |
| Args: | |
| query (str): Description of product features | |
| Return: | |
| List[Dict[str, str]]: Potentially relevant products | |
| """ | |
| return vector_store.query_inventories(query=description) | |
| def retrieve_existing_customer_orders(customer_id: str) -> List[Dict]: | |
| """ | |
| Retrieves the orders associated with the customer, including their status, items and ids | |
| Args: | |
| customer_id (str): Customer unique id associated with the order | |
| Returns: | |
| List[Dict]: All the orders associated with the customer_id passed in | |
| """ | |
| customer_orders = [order for order in orders_database if order['customer_id'] == customer_id] | |
| if not customer_orders: | |
| return f"No orders associated with this customer id: {customer_id}" | |
| return customer_orders | |
| def place_order(items: Dict[str, int], customer_id: str) -> str: | |
| """ | |
| Places an order for the requested items, and for the required quantities. | |
| Args: | |
| items (Dict[str, int]): Dictionary of items to order, with item id as the key and the quantity of that item as the value. | |
| customer_id (str): The customer to place the order for | |
| Returns: | |
| str: Message indicating that the order has been placed, or, it hasnt been placed due to an issue | |
| """ | |
| # Check that the item ids are valid | |
| # Check that the quantities of items are valid | |
| availability_messages = [] | |
| valid_item_ids = [ | |
| item['id'] for item in inventory_database | |
| ] | |
| for item_id, quantity in items.items(): | |
| if item_id not in valid_item_ids: | |
| availability_messages.append(f'Item with id {item_id} is not found in the inventory') | |
| else: | |
| inventory_item = [item for item in inventory_database if item['id'] == item_id][0] | |
| if quantity > inventory_item['quantity']: | |
| availability_messages.append(f'There is insufficient quantity in the inventory for this item {inventory_item["name"]}\nAvailable: {inventory_item["quantity"]}\nRequested: {quantity}') | |
| if availability_messages: | |
| return "Order cannot be placed due to the following issues: \n" + '\n'.join(availability_messages) | |
| # Place the order (in pretend database) | |
| order_id = len(orders_database) + 1 | |
| orders_database.append( | |
| { | |
| 'order_id': order_id, | |
| 'customer_id': customer_id, | |
| 'status': 'Waiting for payment', | |
| 'items': list(items.keys()), | |
| 'quantity': list(items.values()) | |
| } | |
| ) | |
| # Update the inventory | |
| for item_id, quantity in items.items(): | |
| inventory_item = [item for item in inventory_database if item['id'] == item_id][0] | |
| inventory_item['quantity'] -= quantity | |
| return f"Order with id {order_id} has been placed successfully" |