dsfsadfsdfdsf commited on
Commit
a9a44ea
·
verified ·
1 Parent(s): ac366eb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +281 -177
app.py CHANGED
@@ -2,267 +2,371 @@ import gradio as gr
2
  from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
3
  import torch
4
  import time
5
- import re
6
 
7
- # Загружаем модель для улучшения промтов
8
- print("🔄 Загружаю AI для улучшения промтов...")
9
 
10
- # Используем маленькую, но умную модель
11
- MODEL_NAME = "IlyaGusev/rubert_telegram_headlines" # Хорошо понимает русский
12
- # ИЛИ альтернатива: "cointegrated/rubert-tiny2" - еще меньше
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
- try:
15
- # Загружаем модель для генерации текста
16
- tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
17
- model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)
18
- print(f"✅ Модель {MODEL_NAME} загружена!")
19
- except Exception as e:
20
- print(f"⚠️ Не удалось загрузить основную модель: {e}")
21
- print("🔄 Использую альтернативную модель...")
22
- MODEL_NAME = "cointegrated/rubert-tiny2"
23
- tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
24
- model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)
25
- print(f"✅ Альтернативная модель загружена!")
26
 
27
- # Загружаем переводчик
28
- print("🔄 Загружаю переводчик...")
29
- translator = pipeline("translation_ru_to_en", model="Helsinki-NLP/opus-mt-ru-en", device="cpu")
30
- print("✅ Переводчик готов!")
31
 
32
- def ai_enhance_prompt(prompt_ru):
33
- """AI улучшает промт, генерируя новые детали"""
34
  try:
35
- # Создаем промт для AI
36
- system_prompt = """Ты эксперт по созданию промтов для генерации изображений.
37
- Улучши этот промт, добавив детали: опиши освещение, время суток, атмосферу, стиль, детали окружения.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
- Исходный промт: """
 
40
 
41
- full_prompt = system_prompt + prompt_ru + "\nУлучшенный промт: "
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
 
43
- # Токенизируем
44
- inputs = tokenizer(full_prompt, return_tensors="pt", max_length=512, truncation=True)
 
 
 
 
 
45
 
46
- # Генерируем улучшенный промт
47
  with torch.no_grad():
48
  outputs = model.generate(
49
  **inputs,
50
- max_new_tokens=100,
51
  temperature=0.8,
52
  do_sample=True,
53
  top_p=0.9,
54
  repetition_penalty=1.1,
55
- pad_token_id=tokenizer.eos_token_id
 
56
  )
57
 
58
- # Декодируем ответ
59
  response = tokenizer.decode(outputs[0], skip_special_tokens=True)
60
 
61
- # Извлекаем улучшенный промт (удаляем системный промт)
62
- if "Улучшенный промт:" in response:
63
- enhanced = response.split("Улучшенный промт:")[1].strip()
64
- else:
65
- # Fallback: добавляем базовые улучшения
66
- enhanced = prompt_ru + ", фотореалистично, высокое качество, детализированно, красивое освещение"
67
 
68
- # Убедимся, что промт не слишком короткий
69
- if len(enhanced.split()) < 8:
70
- enhanced += ", профессиональная фотография, чёткие детали, приятная атмосфера"
71
 
72
- return enhanced
73
 
74
  except Exception as e:
75
- print(f"Ошибка в AI улучшении: {e}")
76
- # Fallback на ручное улучшение
77
- return prompt_ru + ", фотореалистично, высокое качество, 8K, профессиональная фотография"
78
 
79
- def generate_negative_prompt(english_prompt):
80
- """AI генерирует негативный промт на основе английского промта"""
81
- try:
82
- # Анализируем промт и генерируем противоположные термины
83
- prompt_lower = english_prompt.lower()
84
-
85
- negative_terms = []
86
-
87
- # Базовые термины для исключения
88
- base_negative = ["blurry", "ugly", "deformed", "bad quality", "worst quality"]
89
- negative_terms.extend(base_negative)
90
-
91
- # Определяем, что исключать на основе промта
92
- if "realistic" in prompt_lower or "photoreal" in prompt_lower:
93
- negative_terms.extend(["cartoon", "anime", "painting", "drawing", "illustration"])
94
-
95
- if "bright" in prompt_lower or "sunny" in prompt_lower:
96
- negative_terms.extend(["dark", "dull", "underexposed"])
97
-
98
- if "portrait" in prompt_lower or "face" in prompt_lower:
99
- negative_terms.extend(["deformed face", "asymmetric eyes", "bad anatomy", "extra limbs"])
100
-
101
- if "detailed" in prompt_lower:
102
- negative_terms.extend(["simple", "plain", "boring"])
103
-
104
- if "beautiful" in prompt_lower or "gorgeous" in prompt_lower:
105
- negative_terms.extend(["unattractive", "messy", "dirty"])
106
-
107
- # Добавляем артефакты, которые всегда исключаем
108
- negative_terms.extend(["text", "watermark", "signature", "logo", "username"])
109
-
110
- # Убираем дубликаты
111
- unique_terms = []
112
- for term in negative_terms:
113
- if term not in unique_terms:
114
- unique_terms.append(term)
115
-
116
- return ", ".join(unique_terms)
117
-
118
- except Exception as e:
119
- print(f"Ошибка в генерации негативного промта: {e}")
120
- return "blurry, ugly, deformed, cartoon, text, watermark, bad quality"
121
 
122
- def process_full_pipeline(user_prompt):
123
- """Полный пайплайн обработки промта"""
 
 
 
124
  start_time = time.time()
 
 
125
 
126
- if not user_prompt.strip():
127
- return "Введите промт", "", "", "0.0s"
128
 
129
- print(f"🚀 Обрабатываю промт: {user_prompt}")
 
 
 
 
 
 
 
 
 
 
 
130
 
131
- # 1. AI улучшает русский промт
132
- print("🔄 Этап 1: AI улучшает промт...")
133
- enhanced_ru = ai_enhance_prompt(user_prompt)
134
 
135
- # 2. Переводим на английский
136
- print("🔄 Этап 2: Перевод на английский...")
137
  try:
138
- translated_result = translator(enhanced_ru, max_length=400)[0]
139
- optimized_en = translated_result['translation_text']
 
 
 
 
 
 
 
 
140
  except:
141
- # Fallback перевод
142
- optimized_en = enhanced_ru + ", photorealistic, high quality, detailed"
143
-
144
- # 3. AI генерирует негативный промт
145
- print("🔄 Этап 3: Генерация негативного промта...")
146
- negative_en = generate_negative_prompt(optimized_en)
147
-
148
- # 4. Улучшаем английский промт для Dreamlike
149
- if "photorealistic" not in optimized_en.lower():
150
- optimized_en += ", photorealistic"
151
- if "high quality" not in optimized_en.lower():
152
- optimized_en += ", high quality"
153
- if "detailed" not in optimized_en.lower():
154
- optimized_en += ", detailed"
155
 
156
- # 5. Добавляем стиль для Dreamlike Photoreal
157
- if "dreamlike" not in optimized_en.lower():
158
- optimized_en += ", dreamlike aesthetic"
159
 
160
- processing_time = time.time() - start_time
 
 
 
 
 
 
 
161
 
162
- print(f"✅ Готово! Время: {processing_time:.1f}с")
 
 
 
 
 
 
 
163
 
164
- return (
165
- enhanced_ru,
166
- optimized_en,
 
 
167
  negative_en,
168
- f"⏱️ {processing_time:.1f} сек | ✅ AI улучшила промт"
169
- )
170
 
171
- # Создаем простой и понятный интерфейс
172
- with gr.Blocks(title="AI Улучшитель промтов для Dreamlike", theme=gr.themes.Soft()) as demo:
 
173
  gr.Markdown("""
174
- # 🎨 AI Улучшитель промтов для Dreamlike Photoreal 2.0
175
- ### Нейросеть сама улучшит ваш промт, переведет и создаст негативный промт
176
  """)
177
 
 
 
 
 
178
  # Ввод
179
  with gr.Row():
180
  input_prompt = gr.Textbox(
181
- label="📝 Введите ваш промт на русском",
182
- placeholder="Пример: девушка в лесу на закате",
183
- lines=3,
184
  scale=4
185
  )
186
 
187
- # Кнопка
188
- submit_btn = gr.Button("🚀 Улучшить промт с помощью AI", variant="primary", size="lg")
 
 
 
189
 
190
- # Результаты
191
  with gr.Row():
192
  with gr.Column():
193
- gr.Markdown("### 🇷🇺 Улучшенный промт (AI-генерация)")
194
- output_ru = gr.Textbox(
 
195
  label="",
196
  lines=4,
197
- interactive=True
198
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
 
200
  with gr.Row():
201
  with gr.Column():
202
- gr.Markdown("### 🇬🇧 Промт для Dreamlike (английский)")
203
- output_en = gr.Textbox(
204
  label="",
205
- lines=4,
 
 
 
 
 
 
 
 
 
206
  interactive=True
207
  )
208
-
209
- gr.Markdown("### 🚫 Негативный промт (английский)")
210
- gr.Markdown("**Скопируйте это в Negative Prompt:**")
211
- output_negative = gr.Textbox(
212
- label="",
213
- lines=3,
214
- interactive=True
215
- )
216
 
217
  # Информация
218
- info_text = gr.Textbox(
219
- label="📊 Информация",
220
- value="🔄 Готов к работе! Введите промт и нажмите кнопку.",
221
  interactive=False
222
  )
223
 
224
- # Примеры
225
- gr.Markdown("### 🧪 Примеры для теста:")
 
226
  examples = gr.Examples(
227
  examples=[
228
- ["девушка в лесу на закате"],
229
- ["космонавт на луне с гитарой"],
230
- ["киберпанк город ночью с неоном"],
231
- ["старый волшебник в библиотеке"],
232
- ["кошка в шляпе читает книгу"]
233
  ],
234
  inputs=[input_prompt],
235
- label="Кликните на пример:"
 
 
236
  )
237
 
238
- # Обработчики
239
- def process_and_update(prompt):
240
- enhanced, english, negative, info = process_full_pipeline(prompt)
241
- return enhanced, english, negative, info
242
-
243
- submit_btn.click(
244
- fn=process_and_update,
245
  inputs=[input_prompt],
246
- outputs=[output_ru, output_en, output_negative, info_text]
247
  )
248
 
249
  input_prompt.submit(
250
- fn=process_and_update,
251
  inputs=[input_prompt],
252
- outputs=[output_ru, output_en, output_negative, info_text]
253
  )
254
 
255
- # Приветственное сообщение
256
  demo.load(
257
- fn=lambda: "✅ Система готова! AI модели загружены. Введите промт.",
258
- outputs=[info_text]
 
 
 
259
  )
260
 
261
- # Запуск
262
  if __name__ == "__main__":
263
  demo.launch(
264
  server_name="0.0.0.0",
265
  share=False,
266
- server_port=7860,
267
- show_error=True
268
  )
 
2
  from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
3
  import torch
4
  import time
5
+ from typing import Dict, Tuple
6
 
7
+ print("🤖 ЗАГРУЖАЮ 3 AI ДЛЯ ТЕСТА...")
 
8
 
9
+ # ================== КОНФИГУРАЦИЯ МОДЕЛЕЙ ==================
10
+ MODELS_CONFIG = {
11
+ "stablelm": {
12
+ "name": "stabilityai/stablelm-2-1_6b",
13
+ "display_name": "🔧 StableLM-2-1.6B",
14
+ "description": "Стабильный, хорошо структурирует",
15
+ "prompt_template": """<|start_header_id|>system<|end_header_id|>
16
+ Ты эксперт по созданию детализированных промтов для фотореалистичной генерации.
17
+ Возьми исходную идею и добавь КОНКРЕТНЫЕ детали: описание объектов, освещение, атмосферу, мелкие детали.
18
+ Сделай описание максимально наглядным для AI-генератора.<|eot_id|>
19
+ <|start_header_id|>user<|end_header_id|>
20
+ Исходная идея: {prompt}<|eot_id|>
21
+ <|start_header_id|>assistant<|end_header_id|>
22
+ Детализированный промт:"""
23
+ },
24
+
25
+ "qwen": {
26
+ "name": "Qwen/Qwen2.5-1.5B-Instruct",
27
+ "display_name": "🎨 Qwen2.5-1.5B",
28
+ "description": "Креативный, отличный русский",
29
+ "prompt_template": """<|im_start|>system
30
+ Ты художник-концептуалист. Придумай КРАСИВОЕ и ДЕТАЛЬНОЕ описание для генерации фотореалистичного изображения.
31
+ Добавь: детали объектов, освещение, атмосферу, настроение, мелкие элементы фона.
32
+ Будь максимально креативным!<|im_end|>
33
+ <|im_start|>user
34
+ Идея: {prompt}<|im_end|>
35
+ <|im_start|>assistant
36
+ Детализированное описание:"""
37
+ },
38
+
39
+ "tinyllama": {
40
+ "name": "TinyLlama/TinyLlama-1.1B-Chat-v1.0",
41
+ "display_name": "⚡ TinyLlama-1.1B",
42
+ "description": "Быстрый, хорош для простых промтов",
43
+ "prompt_template": """<|system|>
44
+ Ты помощник для создания промтов. Улучши это описание, добавив детали для фотореалистичной генерации.</s>
45
+ <|user|>
46
+ Базовое описание: {prompt}</s>
47
+ <|assistant|>
48
+ Улучшенный промт:"""
49
+ }
50
+ }
51
 
52
+ # Загружаем модели
53
+ models = {}
54
+ tokenizers = {}
 
 
 
 
 
 
 
 
 
55
 
56
+ print("🔄 Загружаю модели (это займет 1-2 минуты)...")
 
 
 
57
 
58
+ for model_id, config in MODELS_CONFIG.items():
 
59
  try:
60
+ print(f"📥 Загрузка {config['display_name']}...")
61
+
62
+ # Загружаем токенизатор
63
+ tokenizer = AutoTokenizer.from_pretrained(
64
+ config["name"],
65
+ trust_remote_code=True
66
+ )
67
+
68
+ # Загружаем модель
69
+ model = AutoModelForCausalLM.from_pretrained(
70
+ config["name"],
71
+ torch_dtype=torch.float16,
72
+ device_map="auto",
73
+ trust_remote_code=True,
74
+ low_cpu_mem_usage=True
75
+ )
76
+
77
+ # Настраиваем специальные токены
78
+ if model_id == "tinyllama":
79
+ tokenizer.pad_token = tokenizer.eos_token
80
 
81
+ models[model_id] = model
82
+ tokenizers[model_id] = tokenizer
83
 
84
+ print(f" {config['display_name']} загружена!")
85
+
86
+ except Exception as e:
87
+ print(f"❌ Ошибка загрузки {config['display_name']}: {e}")
88
+ models[model_id] = None
89
+ tokenizers[model_id] = None
90
+
91
+ # Загружаем переводчик
92
+ print("🌐 Загружаю переводчик...")
93
+ translator = pipeline("translation_ru_to_en", model="Helsinki-NLP/opus-mt-ru-en")
94
+ print("✅ Переводчик готов!")
95
+
96
+ # ================== ФУНКЦИИ ГЕНЕРАЦИИ ==================
97
+ def generate_with_model(prompt_ru: str, model_id: str) -> str:
98
+ """Генерация улучшенного промта с выбранной моделью"""
99
+ if models.get(model_id) is None:
100
+ return f"❌ Модель {model_id} не загружена"
101
+
102
+ model = models[model_id]
103
+ tokenizer = tokenizers[model_id]
104
+ config = MODELS_CONFIG[model_id]
105
+
106
+ try:
107
+ # Формируем промт
108
+ system_prompt = config["prompt_template"].format(prompt=prompt_ru)
109
 
110
+ # Токенизация
111
+ inputs = tokenizer(
112
+ system_prompt,
113
+ return_tensors="pt",
114
+ truncation=True,
115
+ max_length=512
116
+ )
117
 
118
+ # Генерация
119
  with torch.no_grad():
120
  outputs = model.generate(
121
  **inputs,
122
+ max_new_tokens=200,
123
  temperature=0.8,
124
  do_sample=True,
125
  top_p=0.9,
126
  repetition_penalty=1.1,
127
+ pad_token_id=tokenizer.eos_token_id,
128
+ eos_token_id=tokenizer.eos_token_id
129
  )
130
 
131
+ # Декодирование
132
  response = tokenizer.decode(outputs[0], skip_special_tokens=True)
133
 
134
+ # Извлекаем только сгенерированный текст
135
+ generated_text = response.replace(system_prompt, "").strip()
 
 
 
 
136
 
137
+ # Очищаем от лишних метаданных
138
+ for end_token in ["<|endoftext|>", "</s>", "<|im_end|>", "<|end_header_id|>"]:
139
+ generated_text = generated_text.split(end_token)[0].strip()
140
 
141
+ return generated_text if generated_text else prompt_ru + " [модель не сгенерировала улучшение]"
142
 
143
  except Exception as e:
144
+ print(f"Ошибка генерации {model_id}: {e}")
145
+ return prompt_ru + f" [ошибка: {str(e)[:50]}]"
 
146
 
147
+ def generate_negative_prompt(english_prompt: str) -> str:
148
+ """Генерация негативного промта"""
149
+ base_negative = [
150
+ "blurry", "ugly", "deformed", "bad quality", "worst quality",
151
+ "cartoon", "anime", "painting", "drawing", "illustration",
152
+ "text", "watermark", "signature", "logo", "username",
153
+ "bad anatomy", "extra limbs", "mutated hands"
154
+ ]
155
+
156
+ # Анализируем промт
157
+ prompt_lower = english_prompt.lower()
158
+
159
+ if any(word in prompt_lower for word in ["realistic", "photoreal", "photo"]):
160
+ base_negative.extend(["unrealistic", "artificial", "CGI"])
161
+
162
+ if any(word in prompt_lower for word in ["bright", "sunny", "light"]):
163
+ base_negative.extend(["dark", "dull", "underexposed"])
164
+
165
+ if any(word in prompt_lower for word in ["detailed", "intricate"]):
166
+ base_negative.extend(["simple", "plain", "boring"])
167
+
168
+ # Убираем дубликаты
169
+ unique_terms = list(dict.fromkeys(base_negative))
170
+ return ", ".join(unique_terms)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
 
172
+ def test_all_models(prompt_ru: str):
173
+ """Тестируем все 3 модели и сравниваем результаты"""
174
+ if not prompt_ru.strip():
175
+ return ["Введите промт"] * 3, "", "", "❌ Введите промт"
176
+
177
  start_time = time.time()
178
+ results = {}
179
+ processing_times = {}
180
 
181
+ print(f"\n🧪 ТЕСТИРУЕМ: '{prompt_ru}'")
 
182
 
183
+ # Тестируем каждую модель
184
+ for model_id in ["stablelm", "qwen", "tinyllama"]:
185
+ model_start = time.time()
186
+
187
+ if models.get(model_id) is None:
188
+ results[model_id] = f"❌ {MODELS_CONFIG[model_id]['display_name']} не загружена"
189
+ else:
190
+ enhanced = generate_with_model(prompt_ru, model_id)
191
+ results[model_id] = enhanced
192
+
193
+ processing_times[model_id] = time.time() - model_start
194
+ print(f" {MODELS_CONFIG[model_id]['display_name']}: {processing_times[model_id]:.1f}с")
195
 
196
+ # Выбираем лучший результат для перевода (берем Qwen если есть)
197
+ best_ru = results.get("qwen") or results.get("stablelm") or results.get("tinyllama")
 
198
 
199
+ # Переводим на английский
 
200
  try:
201
+ translated = translator(best_ru, max_length=400)[0]['translation_text']
202
+
203
+ # Добавляем ключевые слова для Dreamlike
204
+ if "photorealistic" not in translated.lower():
205
+ translated += ", photorealistic"
206
+ if "high quality" not in translated.lower():
207
+ translated += ", high quality"
208
+ if "detailed" not in translated.lower():
209
+ translated += ", detailed"
210
+
211
  except:
212
+ translated = best_ru + ", photorealistic, high quality, detailed"
 
 
 
 
 
 
 
 
 
 
 
 
 
213
 
214
+ # Генерируем негативный промт
215
+ negative_en = generate_negative_prompt(translated)
 
216
 
217
+ # Формируем информацию
218
+ total_time = time.time() - start_time
219
+ time_info = {
220
+ "stablelm": f"{processing_times.get('stablelm', 0):.1f}с",
221
+ "qwen": f"{processing_times.get('qwen', 0):.1f}с",
222
+ "tinyllama": f"{processing_times.get('tinyllama', 0):.1f}с",
223
+ "total": f"{total_time:.1f}с"
224
+ }
225
 
226
+ info_text = f"""
227
+ ⏱️ ВРЕМЯ ОБРАБОТКИ:
228
+ • StableLM-1.6B: {time_info['stablelm']}
229
+ • Qwen2.5-1.5B: {time_info['qwen']}
230
+ • TinyLlama-1.1B: {time_info['tinyllama']}
231
+ • Всего: {time_info['total']}
232
+ ✅ Использован для перевода: {MODELS_CONFIG.get('qwen', {}).get('display_name', 'Qwen') if results.get('qwen') else 'StableLM'}
233
+ """
234
 
235
+ return [
236
+ results.get("stablelm", ""),
237
+ results.get("qwen", ""),
238
+ results.get("tinyllama", ""),
239
+ translated,
240
  negative_en,
241
+ info_text
242
+ ]
243
 
244
+ # ================== ИНТЕРФЕЙС GRADIO ==================
245
+ with gr.Blocks(title="AI Баттл: 3 модели для улучшения промтов", theme=gr.themes.Soft()) as demo:
246
+
247
  gr.Markdown("""
248
+ # 🥊 AI БАТТЛ: 3 МОДЕЛИ ДЛЯ УЛУЧШЕНИЯ ПРОМТОВ
249
+ ### Сравниваем StableLM-1.6B vs Qwen2.5-1.5B vs TinyLlama-1.1B
250
  """)
251
 
252
+ # Статус загрузки моделей
253
+ loaded_models = [m for m, val in models.items() if val is not None]
254
+ gr.Markdown(f"### ✅ ЗАГРУЖЕНО МОДЕЛЕЙ: {len(loaded_models)}/3")
255
+
256
  # Ввод
257
  with gr.Row():
258
  input_prompt = gr.Textbox(
259
+ label="🎯 Введите промт для теста",
260
+ placeholder="Пример: девушка в магическом лесу на закате",
261
+ lines=2,
262
  scale=4
263
  )
264
 
265
+ # Кнопка теста
266
+ test_btn = gr.Button("🚀 ПРОТЕСТИРОВАТЬ ВСЕ 3 AI", variant="primary", size="lg")
267
+
268
+ # Результаты 3-х моделей
269
+ gr.Markdown("## 📊 РЕЗУЛЬТАТЫ МОДЕЛЕЙ:")
270
 
 
271
  with gr.Row():
272
  with gr.Column():
273
+ gr.Markdown("### 🔧 StableLM-2-1.6B")
274
+ gr.Markdown("*Стабильный, хорошо структурирует*")
275
+ output_stablelm = gr.Textbox(
276
  label="",
277
  lines=4,
278
+ show_label=False
279
  )
280
+
281
+ with gr.Column():
282
+ gr.Markdown("### 🎨 Qwen2.5-1.5B")
283
+ gr.Markdown("*Креативный, отличный русский*")
284
+ output_qwen = gr.Textbox(
285
+ label="",
286
+ lines=4,
287
+ show_label=False
288
+ )
289
+
290
+ with gr.Column():
291
+ gr.Markdown("### ⚡ TinyLlama-1.1B")
292
+ gr.Markdown("*Быстрый, хорош для простых промтов*")
293
+ output_tinyllama = gr.Textbox(
294
+ label="",
295
+ lines=4,
296
+ show_label=False
297
+ )
298
+
299
+ # Финальные промты для использования
300
+ gr.Markdown("## 🎯 ФИНАЛЬНЫЕ ПРОМТЫ ДЛЯ DREAMLIKE:")
301
 
302
  with gr.Row():
303
  with gr.Column():
304
+ gr.Markdown("### 🇬🇧 Английский промт (выбран лучший)")
305
+ output_english = gr.Textbox(
306
  label="",
307
+ lines=3,
308
+ interactive=True
309
+ )
310
+
311
+ with gr.Column():
312
+ gr.Markdown("### 🚫 Негативный промт")
313
+ gr.Markdown("*Для Negative Prompt в Dreamlike*")
314
+ output_negative = gr.Textbox(
315
+ label="",
316
+ lines=3,
317
  interactive=True
318
  )
 
 
 
 
 
 
 
 
319
 
320
  # Информация
321
+ output_info = gr.Textbox(
322
+ label="📈 СТАТИСТИКА И ИНФОРМАЦИЯ",
323
+ lines=5,
324
  interactive=False
325
  )
326
 
327
+ # Примеры для быстрого теста
328
+ gr.Markdown("### 🧪 БЫСТРЫЕ ТЕСТ-КЕЙСЫ:")
329
+
330
  examples = gr.Examples(
331
  examples=[
332
+ ["девушка в магическом лесу на закате"],
333
+ ["киберпанк город ночью с неоновыми вывесками"],
334
+ ["космонавт на луне играет на гитаре"],
335
+ ["старый волшебник в древней библиотеке"],
336
+ ["кошка в шляпе читает книгу в кафе"]
337
  ],
338
  inputs=[input_prompt],
339
+ outputs=[output_stablelm, output_qwen, output_tinyllama, output_english, output_negative, output_info],
340
+ fn=test_all_models,
341
+ label="Кликните для теста:"
342
  )
343
 
344
+ # Обработчик
345
+ test_btn.click(
346
+ fn=test_all_models,
 
 
 
 
347
  inputs=[input_prompt],
348
+ outputs=[output_stablelm, output_qwen, output_tinyllama, output_english, output_negative, output_info]
349
  )
350
 
351
  input_prompt.submit(
352
+ fn=test_all_models,
353
  inputs=[input_prompt],
354
+ outputs=[output_stablelm, output_qwen, output_tinyllama, output_english, output_negative, output_info]
355
  )
356
 
357
+ # Инициализация
358
  demo.load(
359
+ fn=lambda: f"✅ Система готова! Загружено моделей: {len(loaded_models)}/3\n"
360
+ f"• 🔧 StableLM-2-1.6B: {'✅' if models.get('stablelm') else '❌'}\n"
361
+ f"• 🎨 Qwen2.5-1.5B: {'✅' if models.get('qwen') else '❌'}\n"
362
+ f"• ⚡ TinyLlama-1.1B: {'✅' if models.get('tinyllama') else '❌'}",
363
+ outputs=[output_info]
364
  )
365
 
366
+ # ================== ЗАПУСК ==================
367
  if __name__ == "__main__":
368
  demo.launch(
369
  server_name="0.0.0.0",
370
  share=False,
371
+ server_port=7860
 
372
  )