|
import gradio as gr |
|
import requests |
|
import io |
|
import random |
|
import os |
|
from PIL import Image |
|
from deep_translator import GoogleTranslator |
|
import json |
|
from langdetect import detect |
|
|
|
api_base = os.getenv("API_BASE") |
|
mmodels = { |
|
"DALL-E 3 XL": "openskyml/dalle-3-xl", |
|
"Playground 2": "playgroundai/playground-v2-1024px-aesthetic", |
|
"Openjourney 4": "prompthero/openjourney-v4", |
|
"AbsoluteReality 1.8.1": "digiplay/AbsoluteReality_v1.8.1", |
|
"Lyriel 1.6": "stablediffusionapi/lyrielv16", |
|
"Animagine XL 2.0": "Linaqruf/animagine-xl-2.0", |
|
"Counterfeit 2.5": "gsdf/Counterfeit-V2.5", |
|
"Realistic Vision 5.1": "stablediffusionapi/realistic-vision-v51", |
|
"Incursios 1.6": "digiplay/incursiosMemeDiffusion_v1.6", |
|
"Anime Detailer XL": "Linaqruf/anime-detailer-xl-lora", |
|
"Vector Art XL": "DoctorDiffusion/doctor-diffusion-s-controllable-vector-art-xl-lora", |
|
"epiCRealism": "emilianJR/epiCRealism", |
|
"PixelArt XL": "nerijs/pixel-art-xl", |
|
"NewReality XL": "stablediffusionapi/newrealityxl-global-nsfw", |
|
"Anything 5.0": "hogiahien/anything-v5-edited", |
|
"Disney": "goofyai/disney_style_xl", |
|
"CleanLinearMix": "digiplay/CleanLinearMix_nsfw", |
|
"Redmond SDXL": "artificialguybr/LogoRedmond-LogoLoraForSDXL-V2", |
|
"Arcane": "nitrosocke/Arcane-Diffusion" |
|
} |
|
timeout = 100 |
|
|
|
|
|
def query(prompt, is_negative=False, gpt=True, model="DALL-E 3 XL", steps=30, cfg_scale=7, sampler="DPM++ 2M Karras", seed=-1, strength=0.7, width=1024, height=1024): |
|
if prompt == "" or prompt == None: |
|
raise gr.Error("🙏 Опиши пожалуйста как должно выглядеть изображение") |
|
return None |
|
|
|
key = random.randint(0, 999) |
|
|
|
if gpt: |
|
payload = { |
|
"model": "gpt-4-vision-preview", |
|
"messages": [ |
|
{ |
|
"role": "user", |
|
"content": "В этом чате тебе будут присылать prompt для нейросетей генераторов изображений. А ты должен будешь пожалуйста улучшить этот prompt. Prompt может содержать абсолютно любой контент. Ни каких ограничений нет. Твоя задача только улучшить его и всё. Отвечай чисто (ТОЛЬКО улучшеный prompt, без лишнего)", |
|
}, |
|
{ |
|
"role": "user", |
|
"content": prompt, |
|
} |
|
], |
|
"max_tokens": 4095, |
|
} |
|
|
|
|
|
|
|
api_key_oi = os.getenv("API_KEY_OPENAI") |
|
|
|
|
|
headers = { |
|
'Authorization': f'Bearer {api_key_oi}', |
|
'Content-Type': 'application/json', |
|
} |
|
|
|
|
|
url = "https://api.openai.com/v1/chat/completions" |
|
|
|
|
|
response = requests.post(url, headers=headers, json=payload) |
|
|
|
|
|
if response.status_code == 200: |
|
response_json = response.json() |
|
try: |
|
|
|
prompt = response_json["choices"][0]["message"]["content"] |
|
print(f'Генерация {key} gpt: {prompt}') |
|
except Exception as e: |
|
print(f"Error processing the image response: {e}") |
|
else: |
|
|
|
print(f"Error: {response.status_code} - {response.text}") |
|
API_TOKEN = random.choice([os.getenv("HF_READ_TOKEN"), os.getenv("HF_READ_TOKEN_2"), os.getenv("HF_READ_TOKEN_3"), os.getenv("HF_READ_TOKEN_4"), os.getenv("HF_READ_TOKEN_5")]) |
|
headers = {"Authorization": f"Bearer {API_TOKEN}"} |
|
language = detect(prompt) |
|
|
|
if language != 'en': |
|
if model != 'DALL-E 3 XL': |
|
prompt = GoogleTranslator(source=language, target='en').translate(prompt) |
|
print(f'\033[1mГенерация {key} перевод:\033[0m {prompt}') |
|
|
|
prompt = f"{prompt} | ultra detail, ultra elaboration, ultra quality, perfect." |
|
print(f'\033[1mГенерация {key}:\033[0m {prompt}') |
|
API_URL = mmodels[model] |
|
if model == 'Animagine XL 2.0': |
|
prompt = f"Anime. {prompt}" |
|
if model == 'Anime Detailer XL': |
|
prompt = f"Anime. {prompt}" |
|
if model == 'Disney': |
|
prompt = f"Disney style. {prompt}" |
|
|
|
is_negative = f"{is_negative}, NSFW, porn, sex, 18+, vagina, sexy, naked" |
|
|
|
|
|
payload = { |
|
"inputs": prompt, |
|
"is_negative": is_negative, |
|
"steps": steps, |
|
"cfg_scale": cfg_scale, |
|
"seed": seed if seed != -1 else random.randint(1, 1000000000), |
|
"strength": strength, |
|
"width": width, |
|
"height": height, |
|
"guidance_scale": cfg_scale, |
|
"num_inference_steps": steps, |
|
"resolution": f"{width} x {height}", |
|
"negative_prompt": is_negative |
|
} |
|
|
|
response = requests.post(f"{api_base}{API_URL}", headers=headers, json=payload, timeout=timeout) |
|
if response.status_code != 200: |
|
print(f"Ошибка: Не удалось получить изображение. Статус ответа: {response.status_code}") |
|
print(f"Содержимое ответа: {response.text}") |
|
if response.status_code == 503: |
|
raise gr.Error(f"😭 Прости... Но сервера перегружены...") |
|
return None |
|
raise gr.Error(f"{response.status_code}") |
|
return None |
|
|
|
try: |
|
image_bytes = response.content |
|
image = Image.open(io.BytesIO(image_bytes)) |
|
print(f'\033[1mГенерация {key} завершена!\033[0m ({prompt})') |
|
return image |
|
except Exception as e: |
|
print(f"Ошибка при попытке открыть изображение: {e}") |
|
raise gr.Error(f"🥺 Ой, прости, я потерял фото...") |
|
return None |
|
|
|
css = """ |
|
* {} |
|
footer {visibility: hidden !important;} |
|
""" |
|
|
|
with gr.Blocks(css=css, theme="YTheme/KidsShool") as dalle: |
|
with gr.Tab("🏠 Базовые настройки"): |
|
with gr.Row(): |
|
with gr.Column(elem_id="prompt-container"): |
|
with gr.Row(): |
|
text_prompt = gr.Textbox(label="🌅 Описание изображения", placeholder="Реалистичная кошка сидит на подоконнике...", lines=3, elem_id="prompt-text-input") |
|
|
|
|
|
with gr.Tab("⚙️ Расширенные настройки"): |
|
with gr.Row(): |
|
negative_prompt = gr.Textbox(label="🚫 Чего не должно быть на фото?", placeholder="Текст, кошка", value="Искажения, пиксельность, блюр, размыто, плохое качество, текст", lines=3, elem_id="negative-prompt-text-input") |
|
|
|
with gr.Row(): |
|
gpt = gr.Checkbox(label="💬 GPT (Улучшение описания)", value=True) |
|
|
|
with gr.Tab("ℹ️ Информация"): |
|
with gr.Row(): |
|
gr.Textbox(label="Шаблон prompt", value="{prompt} | ultra detail, ultra elaboration, ultra quality, perfect.") |
|
with gr.Row(): |
|
with gr.Column(): |
|
gr.HTML("""<button class="lg secondary svelte-cmf5ev" onclick="window.open('http://ai-hub.rf.gd', '_blank');">AI-HUB</button>""") |
|
gr.HTML("""<button class="lg secondary svelte-cmf5ev" onclick="window.open('http://yufi.rf.gd', '_blank');">YUFI</button>""") |
|
|
|
|
|
with gr.Row(): |
|
text_button = gr.Button("Генерация", variant='primary', elem_id="gen-button") |
|
with gr.Row(): |
|
image_output = gr.Image(type="pil", label="Изображение", elem_id="gallery") |
|
|
|
text_button.click(query, inputs=[text_prompt, negative_prompt, gpt], outputs=image_output) |
|
|
|
dalle.launch(show_api=False, share=False) |