Spaces:
Sleeping
Sleeping
from openai import Client | |
from supabase import create_client | |
import os | |
import json | |
# Initialize Supabase client | |
url: str = os.getenv('SUPABASE_URL') | |
key: str = os.getenv('SUPABASE_KEY') | |
supabase = create_client(url, key) | |
client = Client(api_key=os.getenv('OPENAI_API_KEY'),organization=os.getenv('ORG_ID')) | |
def combine_json_arrays(items, values): | |
combined = [] | |
# Iterate over both arrays simultaneously | |
for item, value in zip(items, values): | |
combined_item = { | |
"item_description": item["mention_text"] if isinstance(item, dict) else None, | |
"item_value": value["normalizedValue"]["text"] if isinstance(value, dict) and value.get("normalizedValue") else None | |
} | |
combined.append(combined_item) | |
# Handle remaining items in the first array (if any) | |
if len(items) > len(values): | |
for item in items[len(values):]: | |
combined_item = { | |
"item_description": item["mention_text"] if isinstance(item, dict) else None, | |
"item_value": None # No corresponding value | |
} | |
combined.append(combined_item) | |
# Handle remaining values in the second array (if any) | |
elif len(values) > len(items): | |
for value in values[len(items):]: | |
combined_item = { | |
"item_description": None, # No corresponding item | |
"item_value": value["normalizedValue"]["text"] if isinstance(value, dict) and value.get("normalizedValue") else None | |
} | |
combined.append(combined_item) | |
return combined | |
def prompt_for_categorization(data): | |
output_json = """ | |
{ | |
{ | |
"item_description":"HAND CHARM NECKLACE", | |
"metadata":{ | |
"Tops": [], | |
"Bottoms": [], | |
"Footwear": [], | |
"Accessories": ["Jewelry"], | |
"Activewear": [], | |
"Others": [] | |
} | |
}, | |
{ | |
"item_description":"Jersey Top Slim fit", | |
"metadata":{ | |
"Tops": ["T Shirts"], | |
"Bottoms": [], | |
"Footwear": [], | |
"Accessories": [], | |
"Activewear": [], | |
"Others": [] | |
} | |
} | |
} | |
""" | |
system_prompt = """ You will act as a fashion assistant where you will be provided with a JSON array of fashion items, each containing an "item_description" and an "item_value". Your task is to categorize strictly categorize each item into predefined fashion categories and subcategories: | |
- Tops:T-Shirts, Shirts, Blouses, Tank Tops, Sweaters ,Coats, Jackets, Raincoats, Blazers, Hoodies, Sweatshirts | |
- Bottoms: Pants, Jeans, Shorts, Skirts | |
- Footwear: Sneakers, Sandals, Heels , Socks | |
- Accessories:Belts, Hats, Bags, Scarves, Jewelry, Watches | |
- Activewear: Sports Bras, Yoga Pants, Athletic Shorts | |
- Classify all the other categories as Others . | |
You will be given an input json as follows : \n""" + data + f"""\n Based on the above data you have to strictly generate output json and return only and only the output json as given :\n""" \ | |
+ output_json # Concatenate output_json directly to the previous line | |
return system_prompt | |
async def extract_fashion_categories(user_id:str , email:str, message_id:str): | |
response = supabase.table("document_ai_entities").select("line_item_description").eq("user_id",user_id).eq("email",email).eq("message_id",message_id).execute() | |
print("printing response.data") | |
print(response.data) | |
items = response.data[0].get('line_item_description',None) | |
values = response.data[0].get('line_item_amount',None) | |
print("items",items) | |
# print("values",values) | |
# combined_json = combine_json_arrays(items,values) | |
# print(combined_json) | |
prompt = prompt_for_categorization(items) | |
completion = client.chat.completions.create( | |
model="gpt-4o-mini", | |
messages=[ | |
{ | |
"role": "user", | |
"content": prompt | |
} | |
], | |
response_format={ "type": "json_object" } | |
) | |
print("Printing GPT response") | |
print(completion.choices[0].message) | |
response = ( | |
supabase.table("document_ai_entities") | |
.update({"categorised_data": json.loads(completion.choices[0].message.content)}) | |
.eq("user_id", user_id) | |
.eq('email',email) | |
.eq('message_id',message_id) | |
.execute() | |
) | |