IMG_OA / image_handler.py
API-Handler's picture
Upload 4 files
6349504 verified
# image_handler.py
import time
from typing import Dict, Any
from datetime import datetime
import requests
import base64
from requests.exceptions import RequestException
import tempfile
import os
class ImageHandler:
def __init__(self):
self.available_models = ["flux", "flux-realism", "flux-3d", "flux-pro",
"flux-anime", "flux-cablyai", "turbo", "flux-dark"]
self.base_url = "https://image.pollinations.ai/prompt/{prompt}"
def _get_size_dimensions(self, size: str) -> tuple:
size_map = {
"256x256": (256, 256),
"512x512": (512, 512),
"1024x1024": (1024, 1024),
"1792x1024": (1792, 1024),
"1024x1792": (1024, 1792)
}
return size_map.get(size, (768, 768))
def _save_temp_image(self, image_data: bytes) -> str:
"""Save image to temporary file and return its URL."""
temp_dir = tempfile.gettempdir()
temp_file = os.path.join(temp_dir, f"image_{int(time.time())}.jpg")
with open(temp_file, 'wb') as f:
f.write(image_data)
return f"file://{temp_file}"
def generate_images(self, params: Dict[str, Any]) -> Dict[str, Any]:
prompt = params.get("prompt")
n = min(params.get("n", 1), 10)
size = params.get("size", "1024x1024")
model = params.get("model", "flux-pro")
if model not in self.available_models:
model = "flux-pro"
response_format = params.get("response_format", "b64_json")
if response_format != "b64_json":
response_format = "bs64_json"
width, height = self._get_size_dimensions(size)
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:122.0) Gecko/20100101 Firefox/122.0",
}
images = []
for _ in range(n):
try:
url = self.base_url.format(prompt=prompt)
url += f"?width={width}&height={height}&model={model}"
response = requests.get(url, headers=headers, timeout=60)
response.raise_for_status()
# Get the image data
image_data = response.content
if response_format == "b64_json":
# Convert to base64
image_b64 = base64.b64encode(image_data).decode('utf-8')
images.append({"b64_json": image_b64})
else:
# Two options for URL:
# 1. Save locally and return file URL (good for testing)
# 2. Return the pollinations URL (might expire)
# Option 1: Local file
temp_url = self._save_temp_image(image_data)
images.append({"url": temp_url})
# Option 2: Pollinations URL (uncomment if preferred)
# images.append({"url": url})
except RequestException as e:
raise Exception(f"Image generation failed: {str(e)}")
return {
"created": int(datetime.now().timestamp()),
"data": images
}