Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -1,9 +1,7 @@
|
|
1 |
-
from flask import Flask, request, send_file, abort
|
2 |
import requests
|
3 |
import io
|
4 |
from PIL import Image
|
5 |
-
from cachetools import TTLCache, cached
|
6 |
-
import random
|
7 |
import os
|
8 |
import urllib.parse
|
9 |
import hashlib
|
@@ -16,9 +14,6 @@ app = Flask(__name__)
|
|
16 |
MAX_WIDTH = 1384
|
17 |
MAX_HEIGHT = 1384
|
18 |
|
19 |
-
# Кэш на 10 минут
|
20 |
-
cache = TTLCache(maxsize=100, ttl=600)
|
21 |
-
|
22 |
# Получаем ключи из переменной окружения
|
23 |
keys = os.getenv("keys", "").split(',')
|
24 |
if not keys:
|
@@ -27,10 +22,6 @@ if not keys:
|
|
27 |
def get_random_key():
|
28 |
return random.choice(keys)
|
29 |
|
30 |
-
def generate_cache_key(prompt, width, height, seed, model_name):
|
31 |
-
# Создаем уникальный ключ на основе всех параметров, кроме ключа API
|
32 |
-
return hashlib.md5(f"{prompt}_{width}_{height}_{seed}_{model_name}".encode()).hexdigest()
|
33 |
-
|
34 |
def scale_dimensions(width, height, max_width, max_height):
|
35 |
"""Масштабирует размеры изображения, сохраняя соотношение сторон, и округляет до чисел, кратных 8."""
|
36 |
aspect_ratio = width / height
|
@@ -47,8 +38,7 @@ def scale_dimensions(width, height, max_width, max_height):
|
|
47 |
height = (height + 3) // 8 * 8
|
48 |
return width, height
|
49 |
|
50 |
-
|
51 |
-
def generate_cached_image(cache_key, prompt, width, height, seed, model_name, api_key):
|
52 |
headers = {
|
53 |
"Authorization": f"Bearer {api_key}",
|
54 |
"Content-Type": "application/json"
|
@@ -88,7 +78,7 @@ def get_image(prompt):
|
|
88 |
width = request.args.get('width', type=int, default=512)
|
89 |
height = request.args.get('height', type=int, default=512)
|
90 |
seed = request.args.get('seed', type=int, default=22)
|
91 |
-
model_name = request.args.get('model', default="black-forest-
|
92 |
api_key = request.args.get('key', default=None)
|
93 |
|
94 |
# Декодируем URL-кодированный prompt
|
@@ -137,6 +127,56 @@ def get_image(prompt):
|
|
137 |
mimetype='image/png'
|
138 |
)
|
139 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
140 |
@app.route('/')
|
141 |
def health_check():
|
142 |
return "OK", 200
|
|
|
1 |
+
from flask import Flask, request, send_file, render_template, abort
|
2 |
import requests
|
3 |
import io
|
4 |
from PIL import Image
|
|
|
|
|
5 |
import os
|
6 |
import urllib.parse
|
7 |
import hashlib
|
|
|
14 |
MAX_WIDTH = 1384
|
15 |
MAX_HEIGHT = 1384
|
16 |
|
|
|
|
|
|
|
17 |
# Получаем ключи из переменной окружения
|
18 |
keys = os.getenv("keys", "").split(',')
|
19 |
if not keys:
|
|
|
22 |
def get_random_key():
|
23 |
return random.choice(keys)
|
24 |
|
|
|
|
|
|
|
|
|
25 |
def scale_dimensions(width, height, max_width, max_height):
|
26 |
"""Масштабирует размеры изображения, сохраняя соотношение сторон, и округляет до чисел, кратных 8."""
|
27 |
aspect_ratio = width / height
|
|
|
38 |
height = (height + 3) // 8 * 8
|
39 |
return width, height
|
40 |
|
41 |
+
def generate_image(prompt, width, height, seed, model_name, api_key):
|
|
|
42 |
headers = {
|
43 |
"Authorization": f"Bearer {api_key}",
|
44 |
"Content-Type": "application/json"
|
|
|
78 |
width = request.args.get('width', type=int, default=512)
|
79 |
height = request.args.get('height', type=int, default=512)
|
80 |
seed = request.args.get('seed', type=int, default=22)
|
81 |
+
model_name = request.args.get('model', default="black-forest-labs_FLUX.1-dev").replace('_', '/')
|
82 |
api_key = request.args.get('key', default=None)
|
83 |
|
84 |
# Декодируем URL-кодированный prompt
|
|
|
127 |
mimetype='image/png'
|
128 |
)
|
129 |
|
130 |
+
@app.route('/play', methods=['GET', 'POST'])
|
131 |
+
def play():
|
132 |
+
if request.method == 'POST':
|
133 |
+
prompt = request.form.get('prompt', default="")
|
134 |
+
width = request.form.get('width', type=int, default=512)
|
135 |
+
height = request.form.get('height', type=int, default=512)
|
136 |
+
seed = request.form.get('seed', type=int, default=22)
|
137 |
+
model_name = request.form.get('model', default="black-forest-labs_FLUX.1-dev").replace('_', '/')
|
138 |
+
api_key = request.form.get('key', default=None)
|
139 |
+
|
140 |
+
# Определяем язык промпта
|
141 |
+
try:
|
142 |
+
language = detect(prompt)
|
143 |
+
except Exception as e:
|
144 |
+
app.logger.error(f"Error detecting language: {e}")
|
145 |
+
return send_error_image()
|
146 |
+
|
147 |
+
# Переводим промпт, если он не на английском языке
|
148 |
+
if language != 'en':
|
149 |
+
try:
|
150 |
+
translator = GoogleTranslator(source=language, target='en')
|
151 |
+
prompt = translator.translate(prompt)
|
152 |
+
except Exception as e:
|
153 |
+
app.logger.error(f"Error translating prompt: {e}")
|
154 |
+
return send_error_image()
|
155 |
+
|
156 |
+
# Масштабируем размеры изображения, если они превышают максимальные значения, и округляем до чисел, кратных 8
|
157 |
+
width, height = scale_dimensions(width, height, MAX_WIDTH, MAX_HEIGHT)
|
158 |
+
|
159 |
+
# Используем указанный ключ, если он предоставлен, иначе выбираем случайный ключ
|
160 |
+
if api_key is None:
|
161 |
+
api_key = get_random_key()
|
162 |
+
|
163 |
+
# Генерируем изображение без кэширования
|
164 |
+
image = generate_image(prompt, width, height, seed, model_name, api_key)
|
165 |
+
if image is None:
|
166 |
+
return send_error_image()
|
167 |
+
|
168 |
+
img_byte_arr = io.BytesIO()
|
169 |
+
image.save(img_byte_arr, format='PNG')
|
170 |
+
img_byte_arr = img_byte_arr.getvalue()
|
171 |
+
|
172 |
+
return send_file(
|
173 |
+
io.BytesIO(img_byte_arr),
|
174 |
+
mimetype='image/png'
|
175 |
+
)
|
176 |
+
|
177 |
+
# GET запрос - отображаем форму
|
178 |
+
return render_template('play.html')
|
179 |
+
|
180 |
@app.route('/')
|
181 |
def health_check():
|
182 |
return "OK", 200
|