Spaces:
Runtime error
Runtime error
| import json | |
| from collections import defaultdict | |
| # Configure OpenAI KEY | |
| import os | |
| from dotenv import load_dotenv | |
| from openai import OpenAI | |
| # Load environment variables from .env file | |
| load_dotenv() | |
| api_key = os.getenv("OPENAI_API_KEY") # 'ollama' | |
| model = "gpt-4o-mini" # "gpt-4o-mini" | |
| base_url = None | |
| products_file = 'products.json' | |
| categories_file = 'categories.json' | |
| delimiter = "####" | |
| step_2_system_message_content = f""" | |
| You will be provided with customer service a conversation. \ | |
| The most recent user query will be delimited with \ | |
| {delimiter} characters. | |
| Output a python list of objects, where each object has \ | |
| the following format: | |
| 'category': <one of Computers and Laptops, \ | |
| Smartphones and Accessories, \ | |
| Televisions and Home Theater Systems, \ | |
| Gaming Consoles and Accessories, | |
| Audio Equipment, Cameras and Camcorders>, | |
| OR | |
| 'products': <a list of products that must \ | |
| be found in the allowed products below> | |
| Where the categories and products must be found in \ | |
| the customer service query. | |
| If a product is mentioned, it must be associated with \ | |
| the correct category in the allowed products list below. | |
| If no products or categories are found, output an \ | |
| empty list. | |
| Only list products and categories that have not already \ | |
| been mentioned and discussed in the earlier parts of \ | |
| the conversation. | |
| Allowed products: | |
| Computers and Laptops category: | |
| TechPro Ultrabook | |
| BlueWave Gaming Laptop | |
| PowerLite Convertible | |
| TechPro Desktop | |
| BlueWave Chromebook | |
| Smartphones and Accessories category: | |
| SmartX ProPhone | |
| MobiTech PowerCase | |
| SmartX MiniPhone | |
| MobiTech Wireless Charger | |
| SmartX EarBuds | |
| Televisions and Home Theater Systems category: | |
| CineView 4K TV | |
| SoundMax Home Theater | |
| CineView 8K TV | |
| SoundMax Soundbar | |
| CineView OLED TV | |
| Gaming Consoles and Accessories category: | |
| GameSphere X | |
| ProGamer Controller | |
| GameSphere Y | |
| ProGamer Racing Wheel | |
| GameSphere VR Headset | |
| Audio Equipment category: | |
| AudioPhonic Noise-Canceling Headphones | |
| WaveSound Bluetooth Speaker | |
| AudioPhonic True Wireless Earbuds | |
| WaveSound Soundbar | |
| AudioPhonic Turntable | |
| Cameras and Camcorders category: | |
| FotoSnap DSLR Camera | |
| ActionCam 4K | |
| FotoSnap Mirrorless Camera | |
| ZoomMaster Camcorder | |
| FotoSnap Instant Camera | |
| Only output the list of objects, with nothing else. | |
| """ | |
| step_2_system_message = {'role':'system', 'content': step_2_system_message_content} | |
| # sys message for response to user | |
| step_4_system_message_content = f""" | |
| You are a customer service assistant for a large electronic store. \ | |
| Respond in a friendly and helpful tone, with VERY concise answers. \ | |
| Make sure to ask the user relevant follow-up questions. | |
| """ | |
| step_4_system_message = {'role':'system', 'content': step_4_system_message_content} | |
| # sys message for evaluation | |
| step_6_system_message_content = f""" | |
| You are an assistant that evaluates whether \ | |
| customer service agent responses sufficiently \ | |
| answer customer questions, and also validates that \ | |
| all the facts the assistant cites from the product \ | |
| information are correct. | |
| The conversation history, product information, user and customer \ | |
| service agent messages will be delimited by \ | |
| 3 backticks, i.e. ```. | |
| Respond with a Y or N character, with no punctuation: | |
| Y - if the output sufficiently answers the question \ | |
| AND the response correctly uses product information | |
| N - otherwise | |
| Output a single letter only. | |
| """ | |
| step_6_system_message = {'role':'system', 'content': step_6_system_message_content} | |
| # Set your OpenAI API key from the environment variable | |
| #api_key = os.getenv("HYPERBOLIC_API_KEY") # 'ollama' | |
| #model = "meta-llama/Llama-3.2-90B-Vision-Instruct" # "gpt-4o-mini" | |
| #base_url = "https://api.hyperbolic.xyz/v1/" # ollama 'http://localhost:11434/v1/' | |
| client = OpenAI( | |
| base_url=base_url, | |
| api_key=api_key | |
| ) | |
| def get_completion_from_messages(messages, | |
| model="gpt-4o-mini", | |
| temperature=0, | |
| max_tokens=500): | |
| ''' | |
| Encapsulate a function to access LLM | |
| Parameters: | |
| messages: This is a list of messages, each message is a dictionary containing role and content. The role can be 'system', 'user' or 'assistant', and the content is the message of the role. | |
| model: The model to be called, default is gpt-4o-mini (ChatGPT) | |
| temperature: This determines the randomness of the model output, default is 0, meaning the output will be very deterministic. Increasing temperature will make the output more random. | |
| max_tokens: This determines the maximum number of tokens in the model output. | |
| ''' | |
| response = client.chat.completions.create( | |
| messages=messages, | |
| model = model, | |
| temperature=temperature, # This determines the randomness of the model's output | |
| max_tokens=max_tokens, # This determines the maximum number of tokens in the model's output | |
| ) | |
| return response.choices[0].message.content | |
| def create_categories(): | |
| categories_dict = { | |
| 'Billing': [ | |
| 'Unsubscribe or upgrade', | |
| 'Add a payment method', | |
| 'Explanation for charge', | |
| 'Dispute a charge'], | |
| 'Technical Support':[ | |
| 'General troubleshooting' | |
| 'Device compatibility', | |
| 'Software updates'], | |
| 'Account Management':[ | |
| 'Password reset' | |
| 'Update personal information', | |
| 'Close account', | |
| 'Account security'], | |
| 'General Inquiry':[ | |
| 'Product information' | |
| 'Pricing', | |
| 'Feedback', | |
| 'Speak to a human'] | |
| } | |
| with open(categories_file, 'w') as file: | |
| json.dump(categories_dict, file) | |
| return categories_dict | |
| def get_categories(): | |
| with open(categories_file, 'r') as file: | |
| categories = json.load(file) | |
| return categories | |
| def get_product_list(): | |
| """ | |
| 具体原理参见第四节课 | |
| """ | |
| products = get_products() | |
| product_list = [] | |
| for product in products.keys(): | |
| product_list.append(product) | |
| return product_list | |
| def get_products_and_category(): | |
| """ | |
| 具体原理参见第五节课 | |
| """ | |
| products = get_products() | |
| products_by_category = defaultdict(list) | |
| for product_name, product_info in products.items(): | |
| category = product_info.get('category') | |
| if category: | |
| products_by_category[category].append(product_info.get('name')) | |
| return dict(products_by_category) | |
| def get_products(): | |
| with open(products_file, 'r') as file: | |
| products = json.load(file) | |
| return products | |
| # Get cate and products from user | |
| def find_category_and_product(user_input, products_and_category): | |
| delimiter = "####" | |
| system_message = f""" | |
| You will be provided with customer service queries. \ | |
| The customer service query will be delimited with {delimiter} characters. | |
| Output a python list of json objects, where each object has the following format: | |
| 'category': <one of Computers and Laptops, Smartphones and Accessories, Televisions and Home Theater Systems, \ | |
| Gaming Consoles and Accessories, Audio Equipment, Cameras and Camcorders>, | |
| OR | |
| 'products': <a list of products that must be found in the allowed products below> | |
| Where the categories and products must be found in the customer service query. | |
| If a product is mentioned, it must be associated with the correct category in the allowed products list below. | |
| If no products or categories are found, output an empty list. | |
| The allowed products are provided in JSON format. | |
| The keys of each item represent the category. | |
| The values of each item is a list of products that are within that category. | |
| Allowed products: {products_and_category} | |
| """ | |
| messages = [ | |
| {'role':'system', 'content': system_message}, | |
| {'role':'user', 'content': f"{delimiter}{user_input}{delimiter}"}, | |
| ] | |
| return get_completion_from_messages(messages) | |
| # Add allowed products | |
| def find_category_and_product_only(user_input,products_and_category): | |
| delimiter = "####" | |
| system_message = f""" | |
| You will be provided with customer service queries. \ | |
| The customer service query will be delimited with {delimiter} characters. | |
| Output a python list of objects, where each object has the following format: | |
| 'category': <one of Computers and Laptops, Smartphones and Accessories, Televisions and Home Theater Systems, \ | |
| Gaming Consoles and Accessories, Audio Equipment, Cameras and Camcorders>, | |
| OR | |
| 'products': <a list of products that must be found in the allowed products below> | |
| Where the categories and products must be found in the customer service query. | |
| If a product is mentioned, it must be associated with the correct category in the allowed products list below. | |
| If no products or categories are found, output an empty list. | |
| Allowed products: | |
| Computers and Laptops category: | |
| TechPro Ultrabook | |
| BlueWave Gaming Laptop | |
| PowerLite Convertible | |
| TechPro Desktop | |
| BlueWave Chromebook | |
| Smartphones and Accessories category: | |
| SmartX ProPhone | |
| MobiTech PowerCase | |
| SmartX MiniPhone | |
| MobiTech Wireless Charger | |
| SmartX EarBuds | |
| Televisions and Home Theater Systems category: | |
| CineView 4K TV | |
| SoundMax Home Theater | |
| CineView 8K TV | |
| SoundMax Soundbar | |
| CineView OLED TV | |
| Gaming Consoles and Accessories category: | |
| GameSphere X | |
| ProGamer Controller | |
| GameSphere Y | |
| ProGamer Racing Wheel | |
| GameSphere VR Headset | |
| Audio Equipment category: | |
| AudioPhonic Noise-Canceling Headphones | |
| WaveSound Bluetooth Speaker | |
| AudioPhonic True Wireless Earbuds | |
| WaveSound Soundbar | |
| AudioPhonic Turntable | |
| Cameras and Camcorders category: | |
| FotoSnap DSLR Camera | |
| ActionCam 4K | |
| FotoSnap Mirrorless Camera | |
| ZoomMaster Camcorder | |
| FotoSnap Instant Camera | |
| Only output the list of objects, nothing else. | |
| """ | |
| messages = [ | |
| {'role':'system', 'content': system_message}, | |
| {'role':'user', 'content': f"{delimiter}{user_input}{delimiter}"}, | |
| ] | |
| return get_completion_from_messages(messages) | |
| # Get product from user query | |
| def get_products_from_query(user_msg): | |
| products_and_category = get_products_and_category() | |
| delimiter = "####" | |
| system_message = f""" | |
| You will be provided with customer service queries. \ | |
| The customer service query will be delimited with {delimiter} characters. | |
| Output a python list of json objects, where each object has the following format: | |
| 'category': <one of Computers and Laptops, Smartphones and Accessories, Televisions and Home Theater Systems, \ | |
| Gaming Consoles and Accessories, Audio Equipment, Cameras and Camcorders>, | |
| OR | |
| 'products': <a list of products that must be found in the allowed products below> | |
| Where the categories and products must be found in the customer service query. | |
| If a product is mentioned, it must be associated with the correct category in the allowed products list below. | |
| If no products or categories are found, output an empty list. | |
| The allowed products are provided in JSON format. | |
| The keys of each item represent the category. | |
| The values of each item is a list of products that are within that category. | |
| Allowed products: {products_and_category} | |
| """ | |
| messages = [ | |
| {'role':'system', 'content': system_message}, | |
| {'role':'user', 'content': f"{delimiter}{user_msg}{delimiter}"}, | |
| ] | |
| category_and_product_response = get_completion_from_messages(messages) | |
| return category_and_product_response | |
| def get_product_by_name(name): | |
| products = get_products() | |
| return products.get(name, None) | |
| def get_products_by_category(category): | |
| products = get_products() | |
| return [product for product in products.values() if product["category"] == category] | |
| def get_mentioned_product_info(data_list): | |
| """ | |
| 具体原理参见第五、六节课 | |
| """ | |
| product_info_l = [] | |
| if data_list is None: | |
| return product_info_l | |
| for data in data_list: | |
| try: | |
| if "products" in data: | |
| products_list = data["products"] | |
| for product_name in products_list: | |
| product = get_product_by_name(product_name) | |
| if product: | |
| product_info_l.append(product) | |
| else: | |
| print(f"Error: Product '{product_name}' not found") | |
| elif "category" in data: | |
| category_name = data["category"] | |
| category_products = get_products_by_category(category_name) | |
| for product in category_products: | |
| product_info_l.append(product) | |
| else: | |
| print("Error: Invalid object format") | |
| except Exception as e: | |
| print(f"Error: {e}") | |
| return product_info_l | |
| def read_string_to_list(input_string): | |
| if input_string is None: | |
| return None | |
| try: | |
| input_string = input_string.replace("'", "\"") # Replace single quotes with double quotes for valid JSON | |
| data = json.loads(input_string) | |
| return data | |
| except json.JSONDecodeError: | |
| print("Error: Invalid JSON string") | |
| return None | |
| def generate_output_string(data_list): | |
| output_string = "" | |
| if data_list is None: | |
| return output_string | |
| for data in data_list: | |
| try: | |
| if "products" in data: | |
| products_list = data["products"] | |
| for product_name in products_list: | |
| product = get_product_by_name(product_name) | |
| if product: | |
| output_string += json.dumps(product, indent=4) + "\n" | |
| else: | |
| print(f"Error: Product '{product_name}' not found") | |
| elif "category" in data: | |
| category_name = data["category"] | |
| category_products = get_products_by_category(category_name) | |
| for product in category_products: | |
| output_string += json.dumps(product, indent=4) + "\n" | |
| else: | |
| print("Error: Invalid object format") | |
| except Exception as e: | |
| print(f"Error: {e}") | |
| return output_string | |
| # Example usage: | |
| #product_information_for_user_message_1 = generate_output_string(category_and_product_list) | |
| #print(product_information_for_user_message_1) | |
| # Answer questions from customers | |
| def answer_user_msg(user_msg,product_info): | |
| """ | |
| 代码参见第五节课 | |
| """ | |
| delimiter = "####" | |
| system_message = f""" | |
| You are a customer service assistant for a large electronic store. \ | |
| Respond in a friendly and helpful tone, with concise answers. \ | |
| Make sure to ask the user relevant follow up questions. | |
| """ | |
| # user_msg = f""" | |
| # tell me about the smartx pro phone and the fotosnap camera, the dslr one. Also what tell me about your tvs""" | |
| messages = [ | |
| {'role':'system', 'content': system_message}, | |
| {'role':'user', 'content': f"{delimiter}{user_msg}{delimiter}"}, | |
| {'role':'assistant', 'content': f"Relevant product information:\n{product_info}"}, | |
| ] | |
| response = get_completion_from_messages(messages) | |
| return response | |
| # 创建并存入商品数据 | |
| def create_products(): | |
| """ | |
| Create products dictionary and save it to a file named products.json | |
| """ | |
| # product information | |
| # fun fact: all these products are fake and were generated by a language model | |
| products = { | |
| "TechPro Ultrabook": { | |
| "name": "TechPro Ultrabook", | |
| "category": "Computers and Laptops", | |
| "brand": "TechPro", | |
| "model_number": "TP-UB100", | |
| "warranty": "1 year", | |
| "rating": 4.5, | |
| "features": ["13.3-inch display", "8GB RAM", "256GB SSD", "Intel Core i5 processor"], | |
| "description": "A sleek and lightweight ultrabook for everyday use.", | |
| "price": 799.99 | |
| }, | |
| "BlueWave Gaming Laptop": { | |
| "name": "BlueWave Gaming Laptop", | |
| "category": "Computers and Laptops", | |
| "brand": "BlueWave", | |
| "model_number": "BW-GL200", | |
| "warranty": "2 years", | |
| "rating": 4.7, | |
| "features": ["15.6-inch display", "16GB RAM", "512GB SSD", "NVIDIA GeForce RTX 3060"], | |
| "description": "A high-performance gaming laptop for an immersive experience.", | |
| "price": 1199.99 | |
| }, | |
| "PowerLite Convertible": { | |
| "name": "PowerLite Convertible", | |
| "category": "Computers and Laptops", | |
| "brand": "PowerLite", | |
| "model_number": "PL-CV300", | |
| "warranty": "1 year", | |
| "rating": 4.3, | |
| "features": ["14-inch touchscreen", "8GB RAM", "256GB SSD", "360-degree hinge"], | |
| "description": "A versatile convertible laptop with a responsive touchscreen.", | |
| "price": 699.99 | |
| }, | |
| "TechPro Desktop": { | |
| "name": "TechPro Desktop", | |
| "category": "Computers and Laptops", | |
| "brand": "TechPro", | |
| "model_number": "TP-DT500", | |
| "warranty": "1 year", | |
| "rating": 4.4, | |
| "features": ["Intel Core i7 processor", "16GB RAM", "1TB HDD", "NVIDIA GeForce GTX 1660"], | |
| "description": "A powerful desktop computer for work and play.", | |
| "price": 999.99 | |
| }, | |
| "BlueWave Chromebook": { | |
| "name": "BlueWave Chromebook", | |
| "category": "Computers and Laptops", | |
| "brand": "BlueWave", | |
| "model_number": "BW-CB100", | |
| "warranty": "1 year", | |
| "rating": 4.1, | |
| "features": ["11.6-inch display", "4GB RAM", "32GB eMMC", "Chrome OS"], | |
| "description": "A compact and affordable Chromebook for everyday tasks.", | |
| "price": 249.99 | |
| }, | |
| "SmartX ProPhone": { | |
| "name": "SmartX ProPhone", | |
| "category": "Smartphones and Accessories", | |
| "brand": "SmartX", | |
| "model_number": "SX-PP10", | |
| "warranty": "1 year", | |
| "rating": 4.6, | |
| "features": ["6.1-inch display", "128GB storage", "12MP dual camera", "5G"], | |
| "description": "A powerful smartphone with advanced camera features.", | |
| "price": 899.99 | |
| }, | |
| "MobiTech PowerCase": { | |
| "name": "MobiTech PowerCase", | |
| "category": "Smartphones and Accessories", | |
| "brand": "MobiTech", | |
| "model_number": "MT-PC20", | |
| "warranty": "1 year", | |
| "rating": 4.3, | |
| "features": ["5000mAh battery", "Wireless charging", "Compatible with SmartX ProPhone"], | |
| "description": "A protective case with built-in battery for extended usage.", | |
| "price": 59.99 | |
| }, | |
| "SmartX MiniPhone": { | |
| "name": "SmartX MiniPhone", | |
| "category": "Smartphones and Accessories", | |
| "brand": "SmartX", | |
| "model_number": "SX-MP5", | |
| "warranty": "1 year", | |
| "rating": 4.2, | |
| "features": ["4.7-inch display", "64GB storage", "8MP camera", "4G"], | |
| "description": "A compact and affordable smartphone for basic tasks.", | |
| "price": 399.99 | |
| }, | |
| "MobiTech Wireless Charger": { | |
| "name": "MobiTech Wireless Charger", | |
| "category": "Smartphones and Accessories", | |
| "brand": "MobiTech", | |
| "model_number": "MT-WC10", | |
| "warranty": "1 year", | |
| "rating": 4.5, | |
| "features": ["10W fast charging", "Qi-compatible", "LED indicator", "Compact design"], | |
| "description": "A convenient wireless charger for a clutter-free workspace.", | |
| "price": 29.99 | |
| }, | |
| "SmartX EarBuds": { | |
| "name": "SmartX EarBuds", | |
| "category": "Smartphones and Accessories", | |
| "brand": "SmartX", | |
| "model_number": "SX-EB20", | |
| "warranty": "1 year", | |
| "rating": 4.4, | |
| "features": ["True wireless", "Bluetooth 5.0", "Touch controls", "24-hour battery life"], | |
| "description": "Experience true wireless freedom with these comfortable earbuds.", | |
| "price": 99.99 | |
| }, | |
| "CineView 4K TV": { | |
| "name": "CineView 4K TV", | |
| "category": "Televisions and Home Theater Systems", | |
| "brand": "CineView", | |
| "model_number": "CV-4K55", | |
| "warranty": "2 years", | |
| "rating": 4.8, | |
| "features": ["55-inch display", "4K resolution", "HDR", "Smart TV"], | |
| "description": "A stunning 4K TV with vibrant colors and smart features.", | |
| "price": 599.99 | |
| }, | |
| "SoundMax Home Theater": { | |
| "name": "SoundMax Home Theater", | |
| "category": "Televisions and Home Theater Systems", | |
| "brand": "SoundMax", | |
| "model_number": "SM-HT100", | |
| "warranty": "1 year", | |
| "rating": 4.4, | |
| "features": ["5.1 channel", "1000W output", "Wireless subwoofer", "Bluetooth"], | |
| "description": "A powerful home theater system for an immersive audio experience.", | |
| "price": 399.99 | |
| }, | |
| "CineView 8K TV": { | |
| "name": "CineView 8K TV", | |
| "category": "Televisions and Home Theater Systems", | |
| "brand": "CineView", | |
| "model_number": "CV-8K65", | |
| "warranty": "2 years", | |
| "rating": 4.9, | |
| "features": ["65-inch display", "8K resolution", "HDR", "Smart TV"], | |
| "description": "Experience the future of television with this stunning 8K TV.", | |
| "price": 2999.99 | |
| }, | |
| "SoundMax Soundbar": { | |
| "name": "SoundMax Soundbar", | |
| "category": "Televisions and Home Theater Systems", | |
| "brand": "SoundMax", | |
| "model_number": "SM-SB50", | |
| "warranty": "1 year", | |
| "rating": 4.3, | |
| "features": ["2.1 channel", "300W output", "Wireless subwoofer", "Bluetooth"], | |
| "description": "Upgrade your TV's audio with this sleek and powerful soundbar.", | |
| "price": 199.99 | |
| }, | |
| "CineView OLED TV": { | |
| "name": "CineView OLED TV", | |
| "category": "Televisions and Home Theater Systems", | |
| "brand": "CineView", | |
| "model_number": "CV-OLED55", | |
| "warranty": "2 years", | |
| "rating": 4.7, | |
| "features": ["55-inch display", "4K resolution", "HDR", "Smart TV"], | |
| "description": "Experience true blacks and vibrant colors with this OLED TV.", | |
| "price": 1499.99 | |
| }, | |
| "GameSphere X": { | |
| "name": "GameSphere X", | |
| "category": "Gaming Consoles and Accessories", | |
| "brand": "GameSphere", | |
| "model_number": "GS-X", | |
| "warranty": "1 year", | |
| "rating": 4.9, | |
| "features": ["4K gaming", "1TB storage", "Backward compatibility", "Online multiplayer"], | |
| "description": "A next-generation gaming console for the ultimate gaming experience.", | |
| "price": 499.99 | |
| }, | |
| "ProGamer Controller": { | |
| "name": "ProGamer Controller", | |
| "category": "Gaming Consoles and Accessories", | |
| "brand": "ProGamer", | |
| "model_number": "PG-C100", | |
| "warranty": "1 year", | |
| "rating": 4.2, | |
| "features": ["Ergonomic design", "Customizable buttons", "Wireless", "Rechargeable battery"], | |
| "description": "A high-quality gaming controller for precision and comfort.", | |
| "price": 59.99 | |
| }, | |
| "GameSphere Y": { | |
| "name": "GameSphere Y", | |
| "category": "Gaming Consoles and Accessories", | |
| "brand": "GameSphere", | |
| "model_number": "GS-Y", | |
| "warranty": "1 year", | |
| "rating": 4.8, | |
| "features": ["4K gaming", "500GB storage", "Backward compatibility", "Online multiplayer"], | |
| "description": "A compact gaming console with powerful performance.", | |
| "price": 399.99 | |
| }, | |
| "ProGamer Racing Wheel": { | |
| "name": "ProGamer Racing Wheel", | |
| "category": "Gaming Consoles and Accessories", | |
| "brand": "ProGamer", | |
| "model_number": "PG-RW200", | |
| "warranty": "1 year", | |
| "rating": 4.5, | |
| "features": ["Force feedback", "Adjustable pedals", "Paddle shifters", "Compatible with GameSphere X"], | |
| "description": "Enhance your racing games with this realistic racing wheel.", | |
| "price": 249.99 | |
| }, | |
| "GameSphere VR Headset": { | |
| "name": "GameSphere VR Headset", | |
| "category": "Gaming Consoles and Accessories", | |
| "brand": "GameSphere", | |
| "model_number": "GS-VR", | |
| "warranty": "1 year", | |
| "rating": 4.6, | |
| "features": ["Immersive VR experience", "Built-in headphones", "Adjustable headband", "Compatible with GameSphere X"], | |
| "description": "Step into the world of virtual reality with this comfortable VR headset.", | |
| "price": 299.99 | |
| }, | |
| "AudioPhonic Noise-Canceling Headphones": { | |
| "name": "AudioPhonic Noise-Canceling Headphones", | |
| "category": "Audio Equipment", | |
| "brand": "AudioPhonic", | |
| "model_number": "AP-NC100", | |
| "warranty": "1 year", | |
| "rating": 4.6, | |
| "features": ["Active noise-canceling", "Bluetooth", "20-hour battery life", "Comfortable fit"], | |
| "description": "Experience immersive sound with these noise-canceling headphones.", | |
| "price": 199.99 | |
| }, | |
| "WaveSound Bluetooth Speaker": { | |
| "name": "WaveSound Bluetooth Speaker", | |
| "category": "Audio Equipment", | |
| "brand": "WaveSound", | |
| "model_number": "WS-BS50", | |
| "warranty": "1 year", | |
| "rating": 4.5, | |
| "features": ["Portable", "10-hour battery life", "Water-resistant", "Built-in microphone"], | |
| "description": "A compact and versatile Bluetooth speaker for music on the go.", | |
| "price": 49.99 | |
| }, | |
| "AudioPhonic True Wireless Earbuds": { | |
| "name": "AudioPhonic True Wireless Earbuds", | |
| "category": "Audio Equipment", | |
| "brand": "AudioPhonic", | |
| "model_number": "AP-TW20", | |
| "warranty": "1 year", | |
| "rating": 4.4, | |
| "features": ["True wireless", "Bluetooth 5.0", "Touch controls", "18-hour battery life"], | |
| "description": "Enjoy music without wires with these comfortable true wireless earbuds.", | |
| "price": 79.99 | |
| }, | |
| "WaveSound Soundbar": { | |
| "name": "WaveSound Soundbar", | |
| "category": "Audio Equipment", | |
| "brand": "WaveSound", | |
| "model_number": "WS-SB40", | |
| "warranty": "1 year", | |
| "rating": 4.3, | |
| "features": ["2.0 channel", "80W output", "Bluetooth", "Wall-mountable"], | |
| "description": "Upgrade your TV's audio with this slim and powerful soundbar.", | |
| "price": 99.99 | |
| }, | |
| "AudioPhonic Turntable": { | |
| "name": "AudioPhonic Turntable", | |
| "category": "Audio Equipment", | |
| "brand": "AudioPhonic", | |
| "model_number": "AP-TT10", | |
| "warranty": "1 year", | |
| "rating": 4.2, | |
| "features": ["3-speed", "Built-in speakers", "Bluetooth", "USB recording"], | |
| "description": "Rediscover your vinyl collection with this modern turntable.", | |
| "price": 149.99 | |
| }, | |
| "FotoSnap DSLR Camera": { | |
| "name": "FotoSnap DSLR Camera", | |
| "category": "Cameras and Camcorders", | |
| "brand": "FotoSnap", | |
| "model_number": "FS-DSLR200", | |
| "warranty": "1 year", | |
| "rating": 4.7, | |
| "features": ["24.2MP sensor", "1080p video", "3-inch LCD", "Interchangeable lenses"], | |
| "description": "Capture stunning photos and videos with this versatile DSLR camera.", | |
| "price": 599.99 | |
| }, | |
| "ActionCam 4K": { | |
| "name": "ActionCam 4K", | |
| "category": "Cameras and Camcorders", | |
| "brand": "ActionCam", | |
| "model_number": "AC-4K", | |
| "warranty": "1 year", | |
| "rating": 4.4, | |
| "features": ["4K video", "Waterproof", "Image stabilization", "Wi-Fi"], | |
| "description": "Record your adventures with this rugged and compact 4K action camera.", | |
| "price": 299.99 | |
| }, | |
| "FotoSnap Mirrorless Camera": { | |
| "name": "FotoSnap Mirrorless Camera", | |
| "category": "Cameras and Camcorders", | |
| "brand": "FotoSnap", | |
| "model_number": "FS-ML100", | |
| "warranty": "1 year", | |
| "rating": 4.6, | |
| "features": ["20.1MP sensor", "4K video", "3-inch touchscreen", "Interchangeable lenses"], | |
| "description": "A compact and lightweight mirrorless camera with advanced features.", | |
| "price": 799.99 | |
| }, | |
| "ZoomMaster Camcorder": { | |
| "name": "ZoomMaster Camcorder", | |
| "category": "Cameras and Camcorders", | |
| "brand": "ZoomMaster", | |
| "model_number": "ZM-CM50", | |
| "warranty": "1 year", | |
| "rating": 4.3, | |
| "features": ["1080p video", "30x optical zoom", "3-inch LCD", "Image stabilization"], | |
| "description": "Capture life's moments with this easy-to-use camcorder.", | |
| "price": 249.99 | |
| }, | |
| "FotoSnap Instant Camera": { | |
| "name": "FotoSnap Instant Camera", | |
| "category": "Cameras and Camcorders", | |
| "brand": "FotoSnap", | |
| "model_number": "FS-IC10", | |
| "warranty": "1 year", | |
| "rating": 4.1, | |
| "features": ["Instant prints", "Built-in flash", "Selfie mirror", "Battery-powered"], | |
| "description": "Create instant memories with this fun and portable instant camera.", | |
| "price": 69.99 | |
| } | |
| } | |
| products_file = 'products.json' | |
| with open(products_file, 'w') as file: | |
| json.dump(products, file) | |
| return products |