Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,107 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from flask import Flask, request, jsonify
|
2 |
+
import aiohttp
|
3 |
+
import asyncio
|
4 |
+
import io
|
5 |
+
import cloudinary
|
6 |
+
import cloudinary.uploader
|
7 |
+
import cloudinary.api
|
8 |
+
import random
|
9 |
+
import os
|
10 |
+
|
11 |
+
app = Flask(__name__)
|
12 |
+
|
13 |
+
# Configure Cloudinary
|
14 |
+
cloudinary.config(
|
15 |
+
cloud_name='dpnixluze',
|
16 |
+
api_key='417356221754679',
|
17 |
+
api_secret='MjsdHI-8vvYg-yF8p5__aK_8OYs'
|
18 |
+
)
|
19 |
+
|
20 |
+
API_URL = "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-xl-base-1.0"
|
21 |
+
HEADERS = {"Authorization": f"Bearer {os.getenv('HUGGING_FACE_API_KEY')}"}
|
22 |
+
|
23 |
+
async def query(session, payload):
|
24 |
+
try:
|
25 |
+
async with session.post(API_URL, headers=HEADERS, json=payload) as response:
|
26 |
+
response.raise_for_status()
|
27 |
+
return await response.read()
|
28 |
+
except aiohttp.ClientError as e:
|
29 |
+
print(f"Error during API request: {e}")
|
30 |
+
return None
|
31 |
+
|
32 |
+
async def retry_query(payload, retries=5, delay=30):
|
33 |
+
async with aiohttp.ClientSession() as session:
|
34 |
+
for i in range(retries):
|
35 |
+
image_bytes = await query(session, payload)
|
36 |
+
if image_bytes:
|
37 |
+
return image_bytes
|
38 |
+
print(f"Retrying ({i + 1}/{retries})...")
|
39 |
+
await asyncio.sleep(delay)
|
40 |
+
return None
|
41 |
+
|
42 |
+
@app.route('/generate-image', methods=['POST'])
|
43 |
+
async def generate_image():
|
44 |
+
try:
|
45 |
+
data = request.json # This is synchronous
|
46 |
+
positive_prompt = data.get('positive_prompt', 'emma stone')
|
47 |
+
negative_prompt = data.get('negative_prompt', '[deformed | disfigured] , poorly drawn, [bad : wrong] anatomy, [extra | missing | floating | disconnected] limb, (mutated hands and fingers) , blurry,clothes, bad lighting, low-quality, deformed, text, poorly drawn, holding camera, bad art, bad angle, boring, low-resolution, worst quality, bad composition, disfigured')
|
48 |
+
style = data.get('style','');
|
49 |
+
|
50 |
+
|
51 |
+
if style == "cinematic":
|
52 |
+
style = "cinematic shot, dynamic lighting, 75mm, Technicolor, Panavision, cinemascope, sharp focus, fine details, 8k, HDR, realism, realistic, key visual, film still, superb cinematic color grading, depth of field"
|
53 |
+
elif style == "realistic":
|
54 |
+
style = "realistic style, natural lighting, true-to-life details, high resolution, sharp focus, fine textures, authentic colors, accurate proportions, high dynamic range, clear and photorealistic"
|
55 |
+
elif style == "sci-fi":
|
56 |
+
style = "sci-fi style, futuristic technology, cyberpunk cityscape, neon lights, advanced robotics, alien landscapes, holographic interfaces, space exploration, dystopian themes, high-tech machinery"
|
57 |
+
elif style == "disney":
|
58 |
+
style = "3d, Disney character style, animated, cartoonish, whimsical, colorful, playful, charming, magical, fantastical, cute, endearing, family-friendly, storybook quality, iconic, expressive, vibrant colors, smooth lines, simple shapes, happy and adventurous"
|
59 |
+
else:
|
60 |
+
style = "fantasy style, magical landscapes, mythical creatures, enchanted forests, fairy tale elements, mystical realms, legendary beings, glowing effects, ethereal atmosphere, magical artifacts, ancient ruins"
|
61 |
+
|
62 |
+
seed = random.randint(0, 10000)
|
63 |
+
|
64 |
+
payload = {
|
65 |
+
"inputs": f"{positive_prompt}, {style}",
|
66 |
+
"negative_prompt": negative_prompt,
|
67 |
+
"options": {
|
68 |
+
"resolution": "4096×2160",
|
69 |
+
"quality": "high",
|
70 |
+
"seed": seed
|
71 |
+
}
|
72 |
+
}
|
73 |
+
|
74 |
+
image_urls = []
|
75 |
+
|
76 |
+
for image_count in range(1): # Generate 3 images
|
77 |
+
# Retry mechanism with error handling
|
78 |
+
for attempt in range(3): # Try up to 3 times per image
|
79 |
+
image_bytes = await retry_query(payload)
|
80 |
+
if image_bytes:
|
81 |
+
try:
|
82 |
+
# Upload image to Cloudinary
|
83 |
+
upload_response = cloudinary.uploader.upload(io.BytesIO(image_bytes), resource_type="image")
|
84 |
+
cloudinary_url = upload_response.get('secure_url')
|
85 |
+
|
86 |
+
if cloudinary_url:
|
87 |
+
image_urls.append(cloudinary_url)
|
88 |
+
break # Break out of retry loop for this image
|
89 |
+
else:
|
90 |
+
raise Exception('Failed to upload image to Cloudinary.')
|
91 |
+
except Exception as upload_exception:
|
92 |
+
print(f"Upload attempt {attempt + 1} failed: {upload_exception}")
|
93 |
+
else:
|
94 |
+
print(f"Image generation attempt {attempt + 1} failed")
|
95 |
+
|
96 |
+
if image_urls:
|
97 |
+
return jsonify({'image_urls': image_urls})
|
98 |
+
else:
|
99 |
+
return jsonify({'error': 'Failed to generate and upload images after multiple attempts.'}), 500
|
100 |
+
|
101 |
+
except Exception as e:
|
102 |
+
print(f"Exception occurred: {e}")
|
103 |
+
return jsonify({'error': 'An unexpected error occurred.'}), 500
|
104 |
+
|
105 |
+
if __name__ == '__main__':
|
106 |
+
# app.run(debug=True)
|
107 |
+
app.run(host="0.0.0.0", port= 7860, debug= True)
|