cyberandy's picture
Update app.py
397f6ad verified
raw
history blame
2.74 kB
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, text_input=None):
# Encode the uploaded image
base64_image = encode_image(image)
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}"
}
# Payload with base64 encoded image as a Data URL
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()
# Handle errors
if response.status_code != 200:
raise ValueError(f"OpenAI API Error: {response_data.get('error', {}).get('message', 'Unknown Error')}")
# Extract and return the generated message
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]
)
# Launch Gradio app
demo.queue(api_open=False)
demo.launch(debug=True)