import base64 import requests import gradio as gr from PIL import Image import numpy as np from datetime import datetime import os # OpenAI API Key api_key = os.getenv("OPENAI_API_KEY") # Function to encode the image def encode_image(image_array): # Convert numpy array to an image file and encode it in base64 img = Image.fromarray(np.uint8(image_array)) img_buffer = os.path.join( "/tmp", f"temp_image_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" ) img.save(img_buffer, format="JPEG") with open(img_buffer, "rb") as image_file: return base64.b64encode(image_file.read()).decode("utf-8") # Function to generate product description using OpenAI API def generate_product_description(image, description_type, custom_instruction=None): # Encode the uploaded image base64_image = encode_image(image) headers = {"Content-Type": "application/json", "Authorization": f"Bearer {api_key}"} # Set the description type or custom instruction description_prompts = { "Short Formal 📝": "Based on the image, craft a concise and compelling product description that highlights key features and benefits in a formal tone.", "Bullet Points 📋": "From the image, provide a detailed list of bullet points describing the product's features, benefits, and unique selling points.", "Amazon Optimized 🛒": "Create an Amazon-style product description based on the image, including key features, benefits, relevant keywords for SEO, and a persuasive call to action.", "Fashion 👗": "Generate a stylish and trendy product description for a fashion item shown in the image, emphasizing its design, materials, and how it fits into current fashion trends.", "Sport 🏀": "Using the image, develop an energetic and engaging product description for a sports-related item, highlighting its performance features and benefits for athletic activities.", "Technical Specifications ⚙️": "Extract and present the product's technical specifications from the image in a clear and concise manner, suitable for tech-savvy customers.", "SEO Optimized 🔍": "Write an SEO-friendly product description based on the image, incorporating relevant keywords and phrases to enhance search engine visibility.", "Social Media Style 📱": "Create a catchy and engaging product description suitable for social media platforms, using the image as inspiration.", "Luxury 💎": "Craft an elegant and sophisticated product description for the luxury item shown in the image, emphasizing exclusivity, premium quality, and craftsmanship.", "Kid-Friendly 🧸": "Generate a fun and appealing product description for a children's product based on the image, using language that resonates with both kids and parents.", "Health and Beauty 💄": "Develop a compelling product description for a health or beauty item shown in the image, highlighting its benefits, ingredients, and usage tips.", "Electronic Gadgets 📱": "Write a tech-focused product description for the electronic gadget in the image, focusing on its innovative features, specifications, and user advantages.", "Eco-Friendly 🌱": "Create an eco-conscious product description for the environmentally friendly product shown in the image, emphasizing sustainability and green benefits.", "Personalized Gifts 🎁": "Generate a heartfelt product description for the personalized gift in the image, highlighting customization options and sentimental value.", "Seasonal Promotion 🎉": "Craft a seasonal promotional product description based on the image, incorporating festive themes and limited-time offers to encourage immediate purchase.", "Clearance Sale 🏷️": "Write an urgent and enticing product description for the item in the image, emphasizing discounted prices and limited stock availability.", "Cross-Selling 🔗": "Develop a product description that not only highlights the item in the image but also suggests complementary products, encouraging additional purchases.", "Up-Selling ⬆️": "Create a persuasive product description that highlights premium features of the item in the image, encouraging customers to consider higher-end versions.", "Multi-Language Support 🌍": "Provide a product description based on the image in multiple languages to cater to a diverse customer base.", "User Testimonials ⭐": "Incorporate fictional user testimonials or reviews into the product description based on the image, adding credibility and social proof.", "Instructional 📘": "Write a product description that includes usage instructions or assembly steps for the item shown in the image.", "Bundle Offer 📦": "Craft a product description that promotes the item in the image as part of a bundle deal, highlighting the added value.", "Gift Guide Entry 🎁": "Generate a product description suitable for inclusion in a gift guide, emphasizing why the item in the image makes a great gift.", "Limited Edition 🚀": "Create an exclusive product description for the limited-edition item shown in the image, highlighting its uniqueness and scarcity.", "Subscription Model 🔄": "Write a product description that promotes the item in the image as part of a subscription service, detailing recurring benefits.", "B2B Focused 🏢": "Develop a professional product description suitable for business-to-business contexts, emphasizing features relevant to corporate clients.", } if description_type == "Other" and custom_instruction: instruction = custom_instruction else: instruction = description_prompts.get( description_type, "Create a product description based on the image." ) # Payload with base64 encoded image as a Data URL payload = { "model": "gpt-4o-mini", "messages": [ { "role": "user", "content": [ {"type": "text", "text": instruction}, { "type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}, }, ], } ], "max_tokens": 300, } response = requests.post( "https://api.openai.com/v1/chat/completions", headers=headers, json=payload ) response_data = response.json() # Handle errors if response.status_code != 200: raise ValueError( f"OpenAI API Error: {response_data.get('error', {}).get('message', 'Unknown Error')}" ) # Extract and return only the generated message content return response_data["choices"][0]["message"]["content"] # Custom CSS to match WordLift style css = """ body { font-family: 'Inter', sans-serif; background-color: #ffffff; color: #333333; } #output { height: 500px; overflow: auto; border: 1px solid #ccc; padding: 20px; font-size: 1em; /* Reduced font size */ border-radius: 8px; } button, select, input[type="button"], input[type="submit"] { background-color: #3452db; /* Correct WordLift blue */ color: white; border-radius: 5px; /* Slightly smaller radius */ padding: 10px 20px; border: none; font-size: 1em; cursor: pointer; box-shadow: none; /* Removed heavy shadow */ } button:hover, select:hover, input[type="button"]:hover, input[type="submit"]:hover { background-color: #2c44ba; /* Slightly darker shade for hover */ } .gr-box { border: 1px solid #e1e1e1; border-radius: 5px; box-shadow: none; /* Removed heavy shadow */ padding: 15px; /* Reduced padding */ } .gr-block { margin-bottom: 15px; /* Reduced margin */ } .output-text { font-size: 1.1em; /* Reduced font size */ color: #000000; padding: 10px; /* Reduced padding */ border-radius: 5px; box-shadow: none; /* Removed heavy shadow */ border: 1px solid #e1e1e1; } """ with gr.Blocks(css=css) as demo: gr.Markdown("

WordLift Product Description Generation - [FREE]

") with gr.Tab(label="WordLift Product Description Generation"): with gr.Row(): with gr.Column(): input_img = gr.Image(label="Input Picture", elem_classes="gr-box") description_type = gr.Dropdown( label="Select Description Type", choices=[ "Short Formal 📝", "Bullet Points 📋", "Amazon Optimized 🛒", "Fashion 👗", "Sport 🏀", "Technical Specifications ⚙️", "SEO Optimized 🔍", "Social Media Style 📱", "Luxury 💎", "Kid-Friendly 🧸", "Health and Beauty 💄", "Electronic Gadgets 📱", "Eco-Friendly 🌱", "Personalized Gifts 🎁", "Seasonal Promotion 🎉", "Clearance Sale 🏷️", "Cross-Selling 🔗", "Up-Selling ⬆️", "Multi-Language Support 🌍", "User Testimonials ⭐", "Instructional 📘", "Bundle Offer 📦", "Gift Guide Entry 🎁", "Limited Edition 🚀", "Subscription Model 🔄", "B2B Focused 🏢", "Other", ], value="Short Formal 📝", elem_classes="gr-box" ) custom_instruction = gr.Textbox( label="Custom Instruction (Only for 'Other')", visible=False, elem_classes="gr-box" ) submit_btn = gr.Button(value="Submit", elem_classes="gr-box") with gr.Column(): output_text = gr.Markdown(label="Output Text", show_copy_button=True, elem_classes="output-text") # Toggle visibility of custom instruction based on selected type def toggle_custom_instruction(type_selection): return gr.update(visible=(type_selection == "Other")) description_type.change( toggle_custom_instruction, inputs=[description_type], outputs=[custom_instruction], ) submit_btn.click( generate_product_description, [input_img, description_type, custom_instruction], [output_text], ) # Launch Gradio app demo.queue(api_open=False) demo.launch(debug=True)