File size: 4,551 Bytes
397f6ad
 
c7dae24
 
 
a2d1710
397f6ad
c7dae24
397f6ad
 
c7dae24
f41d654
397f6ad
 
 
a2d1710
f41d654
 
 
397f6ad
f41d654
397f6ad
 
c7dae24
f41d654
a2d1710
f41d654
397f6ad
 
c7dae24
f41d654
 
 
 
 
 
 
 
 
397f6ad
a2d1710
f41d654
 
 
 
 
 
 
397f6ad
 
 
 
a2d1710
 
 
f41d654
a2d1710
 
f41d654
 
 
a2d1710
 
f41d654
397f6ad
c7dae24
f41d654
 
 
397f6ad
c7dae24
397f6ad
 
f41d654
 
 
 
 
 
397f6ad
c7dae24
 
 
 
 
 
 
 
 
 
f41d654
21ebaa7
c7dae24
 
 
f41d654
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c7dae24
 
 
 
f41d654
 
 
 
 
 
 
 
 
 
c7dae24
f41d654
 
 
c7dae24
 
397f6ad
c7dae24
397f6ad
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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": "Create a compelling and succinct product description from the image.",
        "Bullet Points": "Provide a detailed product description in bullet points based on the image.",
        "Amazon Optimized": "Write an Amazon-style product description that includes key features, benefits, and a call to action.",
        "Fashion": "Generate a stylish and trendy product description suitable for a fashion item based on the image.",
        "Sport": "Create an energetic and engaging product description for a sports-related item based on the image.",
    }

    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"]


css = """
  #output {
    height: 500px;
    overflow: auto;
    border: 1px solid #ccc;
  }
"""

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")
                description_type = gr.Dropdown(
                    label="Select Description Type",
                    choices=[
                        "Short Formal",
                        "Bullet Points",
                        "Amazon Optimized",
                        "Fashion",
                        "Sport",
                        "Other",
                    ],
                    value="Short Formal",
                )
                custom_instruction = gr.Textbox(
                    label="Custom Instruction (Only for 'Other')", visible=False
                )
                submit_btn = gr.Button(value="Submit")
            with gr.Column():
                output_text = gr.Textbox(label="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)