Spaces:
Sleeping
Sleeping
| import requests | |
| import json | |
| import os | |
| def make_api_request(endpoint, ids): | |
| """ | |
| Generic function to make API requests with error handling | |
| :param endpoint: The specific API endpoint (e.g. 'get-images-from-id') | |
| :param ids: List of IDs to query | |
| :return: JSON response or None if error occurs | |
| """ | |
| api_key = os.environ.get("RECOMMENDER_KEY") | |
| if not api_key: | |
| raise ValueError("API key is not set") | |
| headers = { | |
| "x-api-key": api_key, | |
| "Content-Type": "application/json" | |
| } | |
| payload = {"ids": ids} | |
| try: | |
| recommender_url = os.environ.get("RECOMMENDER_URL") | |
| if not recommender_url: | |
| raise ValueError("Recommender URL is not set") | |
| response = requests.post(f"{recommender_url}/{endpoint}", | |
| headers=headers, | |
| data=json.dumps(payload)) | |
| response.raise_for_status() # Raise an exception for bad status codes | |
| return response.json() | |
| except requests.exceptions.RequestException as e: | |
| print(f"Error occurred while calling {endpoint}: {e}") | |
| return None | |
| def get_images_from_id(ids): | |
| """Get images for specific product IDs""" | |
| return make_api_request("get-images-from-id", ids) | |
| def parse_article_data(article_data): | |
| """Parse the article data and return a dictionary""" | |
| # get the article information | |
| article_info = article_data['article'] | |
| aricle_id = article_info.get('article_id', 'Unknown') | |
| article_name = article_info.get('prod_name', 'Unknown') | |
| article_type = article_info.get('department_name', 'Unknown') | |
| article_color = article_info.get('perceived_colour_master_name', 'Unknown') | |
| # get the article images | |
| article_images = get_images_from_id([aricle_id]) | |
| img_url = 'no image' | |
| if len(article_images) > 0: | |
| img_url = article_images[0].get('url', 'no image') | |
| return { | |
| "product_name": article_name, | |
| "product_type": article_type, | |
| "product_color": article_color, | |
| "product_image_url": img_url | |
| } | |
| def parse_transaction_data(transaction_data): | |
| """Parse the transaction data and return a dictionary with article information.""" | |
| # Retrieve general transaction details | |
| transaction_date = transaction_data.get('t_dat', 'Unknown') | |
| sales_channel_id = transaction_data.get('sales_channel_id', 'Unknown') | |
| price = transaction_data.get('price', 'Unknown') | |
| # Get the article information | |
| article_info = transaction_data.get('article', {}) | |
| article_id = article_info.get('article_id', 'Unknown') | |
| article_name = article_info.get('prod_name', 'Unknown') | |
| article_type = article_info.get('department_name', 'Unknown') | |
| article_color = article_info.get('perceived_colour_master_name', 'Unknown') | |
| article_detail = article_info.get('detail_desc', 'Unknown') | |
| # Get the article images | |
| article_images = get_images_from_id([article_id]) | |
| img_url = 'no image' | |
| if article_images: | |
| img_url = article_images[0].get('url', 'no image') | |
| return { | |
| "transaction_date": transaction_date, | |
| "sales_channel_id": sales_channel_id, | |
| "price": price, | |
| "product_name": article_name, | |
| "product_type": article_type, | |
| "product_color": article_color, | |
| "product_image_url": img_url, | |
| "article_id": article_id | |
| } | |
| def parse_recommendations(recommendations, max_recs=2, max_transactions=2, only_with_images=True): | |
| """Parse the recommendations and return a list of product IDs""" | |
| # get the client information | |
| customer_info = recommendations[0]['customer'][0] | |
| customer_id = customer_info.get('customer_id', 'Unknown') | |
| customer_name = customer_info.get('name', customer_id[:8]) # TODO change to real customer name | |
| customer_age = customer_info.get('age', 'Unknown') | |
| customer_info = { | |
| "customer name": customer_name, | |
| "customer age": customer_age | |
| } | |
| # get the recommendations | |
| formatted_recommendations = [parse_article_data(article) for article in recommendations[0]['prediction']] | |
| formatted_transactions = [parse_transaction_data(transaction) for transaction in recommendations[0]['transactions']] | |
| print("formatted_recommendations", len(formatted_recommendations)) | |
| print("formatted_transactions", len(formatted_transactions)) | |
| if only_with_images: | |
| formatted_recommendations = [rec for rec in formatted_recommendations if rec['product_image_url'] != 'no image'] | |
| formatted_transactions = [t for t in formatted_transactions if t['product_image_url'] != 'no image'] | |
| if len(formatted_recommendations) > max_recs: | |
| formatted_recommendations = formatted_recommendations[:max_recs] | |
| if len(formatted_transactions) > max_transactions: | |
| formatted_transactions = formatted_transactions[:max_transactions] | |
| print("formatted_recommendations", len(formatted_recommendations)) | |
| print("formatted_transactions", len(formatted_transactions)) | |
| return customer_info, formatted_recommendations, formatted_transactions | |
| def get_recommendations(customer_ids, max_recs=4, max_transactions=2): | |
| """Get product recommendations for specific customer IDs""" | |
| if isinstance(customer_ids, str): | |
| customer_ids = [customer_ids] | |
| recommendations = make_api_request("get-recommendations", customer_ids) | |
| if recommendations: | |
| return parse_recommendations(recommendations, max_recs, max_transactions) | |
| else: | |
| raise ValueError("Error occurred while fetching recommendations.") | |
| return None | |
| if __name__ == "__main__": | |
| # Example product IDs | |
| product_ids = ["0110065002", "0111609001"] | |
| # Example customer ID | |
| customer_id = ["04a183a27a6877e560e1025216d0a3b40d88668c68366da17edfb18ed89c574c"] | |
| # Demonstrate different API calls | |
| print("Images:", get_images_from_id(product_ids)) | |
| print("Recommendations:", get_recommendations(customer_id)) | |