Spaces:
Running
Running
File size: 7,375 Bytes
a75702e |
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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
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 = []
@tool
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"
@tool
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}'}"
@tool
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)
@tool
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)
@tool
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
@tool
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" |