|
import gradio as gr |
|
from openai import OpenAI |
|
from PIL import Image |
|
import base64 |
|
import io |
|
|
|
def pil_to_base64(image, max_size=1024): |
|
""" |
|
Convert a PIL image to a base64 string, resizing if necessary. |
|
""" |
|
if max(image.size) > max_size: |
|
image.thumbnail((max_size, max_size)) |
|
buffered = io.BytesIO() |
|
image.save(buffered, format="JPEG") |
|
return base64.b64encode(buffered.getvalue()).decode() |
|
|
|
def generate_story(image, genre, api_key): |
|
""" |
|
Generate a travel story based on the provided image and genre using the OpenRouter API. |
|
""" |
|
if not image: |
|
return "Please upload an image." |
|
if not genre: |
|
return "Please enter a genre." |
|
if not api_key: |
|
return "Please enter your OpenRouter API key." |
|
|
|
try: |
|
image_base64 = pil_to_base64(image) |
|
client = OpenAI( |
|
base_url="https://openrouter.ai/api/v1", |
|
api_key=api_key, |
|
) |
|
prompt = f"Generate a {genre} story based on this travel photo." |
|
messages = [ |
|
{ |
|
"role": "user", |
|
"content": [ |
|
{"type": "text", "text": prompt}, |
|
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_base64}"}} |
|
] |
|
} |
|
] |
|
completion = client.chat.completions.create( |
|
model="meta-llama/llama-3.2-11b-vision-instruct:free", |
|
messages=messages |
|
) |
|
story = completion.choices[0].message.content |
|
return story |
|
except Exception as e: |
|
return f"Error: {str(e)}" |
|
|
|
# Gradio Interface |
|
with gr.Blocks() as demo: |
|
gr.Markdown("# Interactive Travel Story Generator") |
|
gr.Markdown("Upload a travel photo, select a genre, and provide your OpenRouter API key to generate a personalized travel story.") |
|
gr.Markdown("Note: You need an OpenRouter API key to use this app. Get one at [OpenRouter](https://openrouter.ai/).") |
|
|
|
with gr.Row(): |
|
image_input = gr.Image(type="pil", label="Upload Travel Photo") |
|
genre_input = gr.Textbox(label="Story Genre (e.g., adventure, romance, mystery, fantasy, historical)") |
|
api_key_input = gr.Textbox(label="OpenRouter API Key", type="password") |
|
|
|
generate_button = gr.Button("Generate Story") |
|
output_text = gr.Textbox(label="Generated Story", lines=10) |
|
|
|
generate_button.click( |
|
fn=generate_story, |
|
inputs=[image_input, genre_input, api_key_input], |
|
outputs=output_text |
|
) |
|
|
|
demo.launch() |