|
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() |
|
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""" |
|
|
|
|
|
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') |
|
|
|
|
|
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.""" |
|
|
|
|
|
transaction_date = transaction_data.get('t_dat', 'Unknown') |
|
sales_channel_id = transaction_data.get('sales_channel_id', 'Unknown') |
|
price = transaction_data.get('price', 'Unknown') |
|
|
|
|
|
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') |
|
|
|
|
|
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""" |
|
|
|
|
|
customer_info = recommendations[0]['customer'][0] |
|
customer_id = customer_info.get('customer_id', 'Unknown') |
|
customer_name = customer_info.get('name', customer_id[:8]) |
|
customer_age = customer_info.get('age', 'Unknown') |
|
|
|
customer_info = { |
|
"customer name": customer_name, |
|
"customer age": customer_age |
|
} |
|
|
|
|
|
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__": |
|
|
|
product_ids = ["0110065002", "0111609001"] |
|
|
|
|
|
customer_id = ["04a183a27a6877e560e1025216d0a3b40d88668c68366da17edfb18ed89c574c"] |
|
|
|
|
|
print("Images:", get_images_from_id(product_ids)) |
|
print("Recommendations:", get_recommendations(customer_id)) |
|
|
|
|
|
|