Im-prmpt-im / app.py
mrbeliever's picture
Update app.py
986b8bd verified
import streamlit as st
import requests
import os
import base64
from PIL import Image
from io import BytesIO
# Set page title and layout
st.set_page_config(page_title="AI Image Generator", layout="wide")
# Aspect Ratio Selection
aspect_ratios = {
"16:9 (1280x720)": (1280, 720),
"1:1 (1080x1080)": (1080, 1080),
"9:16 (720x1280)": (720, 1280),
"2:3 (800x1200)": (800, 1200),
}
# API key from environment variable
API_KEY = os.environ.get("NEBIUS_API_KEY")
if not API_KEY:
st.error("API key not found. Please set the `NEBIUS_API_KEY` environment variable.")
# Function to call Nebius API for prompt generation
def generate_caption(image_base64, api_key):
api_url = "https://api.studio.nebius.ai/v1/chat/completions"
headers = {"Authorization": f"Bearer {api_key}"}
payload = {
"model": "mistralai/Mistral-Small-3.1-24B-Instruct-2503",
"messages": [
{"role": "system", "content": "You are an image-to-text prompt converter for AI image generation."},
{"role": "user", "content": [
{"type": "text", "text": "Describe This Image In Detail under 100 words in this format: [image content/subject, description of action, state, and mood], [art form, style], [artist/photographer reference if needed], [additional settings such as camera and lens settings, lighting, colors, effects, texture, background, rendering]."},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{image_base64}"}},
]},
],
"temperature": 0.6,
}
try:
response = requests.post(api_url, json=payload, headers=headers)
if response.status_code == 200:
return response.json()
else:
st.error(f"API Error: {response.status_code}, {response.text}")
return {"error": response.text}
except Exception as e:
st.error(f"An exception occurred: {e}")
return {"error": str(e)}
# File uploader for image
uploaded_image = st.file_uploader("Upload an image", type=["png", "jpg", "jpeg"])
selected_aspect = st.selectbox("Select Aspect Ratio", list(aspect_ratios.keys()))
width, height = aspect_ratios[selected_aspect]
if uploaded_image and API_KEY:
image = Image.open(uploaded_image)
buffered = BytesIO()
image.save(buffered, format="PNG")
image_base64 = base64.b64encode(buffered.getvalue()).decode()
st.image(image, caption="Uploaded Image", use_container_width=True)
if st.button("Generate Image", use_container_width=True):
st.write("Wait AI Is Generating Image...")
result = generate_caption(image_base64, API_KEY)
if "error" in result:
st.error(f"Error: {result['error']}")
else:
try:
caption = result.get("choices", [{}])[0].get("message", {}).get("content", "No caption generated.")
# Construct the image generation URL
image_url = f"https://image.pollinations.ai/prompt/{requests.utils.quote(caption)}?width={width}&height={height}&nologo=true&model=flux&enhance=true&seed=119"
st.image(image_url, caption="Generated Image", use_container_width=True)
# Download button for the generated image
st.download_button(
label="Download Image",
data=requests.get(image_url).content, # Fetch the image data
file_name="generated_image.png",
mime="image/png",
use_container_width=True
)
except Exception as e:
st.error(f"Error processing the response: {e}")
else:
st.info("Please upload an image and select an aspect ratio.")