|
import base64 |
|
import requests |
|
import gradio as gr |
|
from PIL import Image |
|
import numpy as np |
|
from datetime import datetime |
|
import os |
|
|
|
|
|
api_key = os.getenv("OPENAI_API_KEY") |
|
|
|
|
|
def encode_image(image_array): |
|
|
|
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") |
|
|
|
|
|
def generate_product_description(image, text_input=None): |
|
|
|
base64_image = encode_image(image) |
|
|
|
headers = { |
|
"Content-Type": "application/json", |
|
"Authorization": f"Bearer {api_key}" |
|
} |
|
|
|
|
|
payload = { |
|
"model": "gpt-4o-mini", |
|
"messages": [ |
|
{ |
|
"role": "user", |
|
"content": [ |
|
{"type": "text", "text": text_input or "What's in this image?"}, |
|
{ |
|
"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() |
|
|
|
|
|
if response.status_code != 200: |
|
raise ValueError(f"OpenAI API Error: {response_data.get('error', {}).get('message', 'Unknown Error')}") |
|
|
|
|
|
return response_data["choices"][0]["message"] |
|
|
|
css = """ |
|
#output { |
|
height: 500px; |
|
overflow: auto; |
|
border: 1px solid #ccc; |
|
} |
|
""" |
|
|
|
with gr.Blocks(css=css) as demo: |
|
gr.Markdown("WordLift Product Description Generation - [GPT-4o-mini Demo]") |
|
with gr.Tab(label="WordLift Product Description Generation"): |
|
with gr.Row(): |
|
with gr.Column(): |
|
input_img = gr.Image(label="Input Picture") |
|
text_input = gr.Textbox(label="Additional Instructions (Optional)") |
|
submit_btn = gr.Button(value="Submit") |
|
with gr.Column(): |
|
output_text = gr.Textbox(label="Output Text") |
|
|
|
submit_btn.click( |
|
generate_product_description, [input_img, text_input], [output_text] |
|
) |
|
|
|
|
|
demo.queue(api_open=False) |
|
demo.launch(debug=True) |
|
|