dsfsadfsdfdsf commited on
Commit
9d4c47a
·
verified ·
1 Parent(s): b8e58d2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +178 -298
app.py CHANGED
@@ -2,234 +2,150 @@ import gradio as gr
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 [
@@ -237,136 +153,100 @@ def test_all_models(prompt_ru: str):
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
  )
 
2
  from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
3
  import torch
4
  import time
 
5
 
6
+ print("🤖 ВСЕ 3 AI ЗАГРУЖЕНЫ! Готовлю оптимизированный интерфейс...")
7
 
8
+ # ================== КОНФИГУРАЦИЯ УЖЕ ЗАГРУЖЕННЫХ МОДЕЛЕЙ ==================
9
  MODELS_CONFIG = {
10
  "stablelm": {
11
  "name": "stabilityai/stablelm-2-1_6b",
12
  "display_name": "🔧 StableLM-2-1.6B",
13
+ "description": "Уже загружена (76с на обработку)",
14
+ "max_tokens": 100 # Уменьшаем для скорости
 
 
 
 
 
 
 
15
  },
16
 
17
  "qwen": {
18
+ "name": "Qwen/Qwen2.5-1.5B-Instruct",
19
  "display_name": "🎨 Qwen2.5-1.5B",
20
+ "description": "Уже загружена",
21
+ "max_tokens": 120
 
 
 
 
 
 
 
22
  },
23
 
24
  "tinyllama": {
25
  "name": "TinyLlama/TinyLlama-1.1B-Chat-v1.0",
26
+ "display_name": "⚡ TinyLlama-1.1B",
27
+ "description": "Уже загружена",
28
+ "max_tokens": 80
 
 
 
 
 
29
  }
30
  }
31
 
32
+ # Используем загруженные модели (они уже в памяти)
33
+ try:
34
+ from app import models, tokenizers # Пытаемся получить из предыдущего запуска
35
+ print("✅ Использую уже загруженные модели")
36
+ except:
37
+ print("⚠️ Модели не найдены, загружаю заново...")
38
+ models = {}
39
+ tokenizers = {}
40
+
41
+ for model_id, config in MODELS_CONFIG.items():
42
+ try:
43
+ print(f"📥 Загрузк�� {config['display_name']}...")
44
+ tokenizer = AutoTokenizer.from_pretrained(config["name"], trust_remote_code=True)
45
+ model = AutoModelForCausalLM.from_pretrained(
46
+ config["name"],
47
+ torch_dtype=torch.float32, # Используем float32 для CPU
48
+ device_map="auto",
49
+ trust_remote_code=True
50
+ )
51
+ models[model_id] = model
52
+ tokenizers[model_id] = tokenizer
53
+ print(f"✅ {config['display_name']} загружена!")
54
+ except Exception as e:
55
+ print(f"❌ Ошибка: {e}")
56
+ models[model_id] = None
 
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
  # Загружаем переводчик
 
59
  translator = pipeline("translation_ru_to_en", model="Helsinki-NLP/opus-mt-ru-en")
 
60
 
61
+ # ================== ОПТИМИЗИРОВАННЫЕ ФУНКЦИИ ==================
62
+ def fast_generate(prompt_ru: str, model_id: str) -> str:
63
+ """Быстрая генерация с оптимизацией для CPU"""
64
  if models.get(model_id) is None:
65
+ return f"❌ Модель не загружена"
66
 
67
+ config = MODELS_CONFIG[model_id]
68
  model = models[model_id]
69
  tokenizer = tokenizers[model_id]
 
70
 
71
  try:
72
+ # Простые промты для каждой модели
73
+ if model_id == "stablelm":
74
+ system_prompt = f"Детализируй это описание для фотореалистичного изображения: {prompt_ru}\nДетализированное описание:"
75
+ elif model_id == "qwen":
76
+ system_prompt = f"<|im_start|>system\nУлучши описание для AI-генератора изображений<|im_end|>\n<|im_start|>user\n{prompt_ru}<|im_end|>\n<|im_start|>assistant\n"
77
+ else: # tinyllama
78
+ system_prompt = f"<|system|>\nУлучши описание</s>\n<|user|>\n{prompt_ru}</s>\n<|assistant|>\n"
79
+
80
+ # Быстрая токенизация
81
+ inputs = tokenizer(system_prompt, return_tensors="pt", max_length=200, truncation=True)
82
+
83
+ # Быстрая генерация с минимальными параметрами
84
  with torch.no_grad():
85
  outputs = model.generate(
86
  **inputs,
87
+ max_new_tokens=config["max_tokens"],
 
88
  do_sample=True,
89
+ temperature=0.7,
90
  top_p=0.9,
91
+ pad_token_id=tokenizer.eos_token_id
 
 
92
  )
93
 
94
+ # Быстрое декодирование
95
  response = tokenizer.decode(outputs[0], skip_special_tokens=True)
96
+ generated = response.replace(system_prompt, "").strip()
97
 
98
+ # Очистка
99
+ for end_marker in ["<|endoftext|>", "</s>", "<|im_end|>", "<|end_header_id|>"]:
100
+ if end_marker in generated:
101
+ generated = generated.split(end_marker)[0].strip()
 
 
102
 
103
+ return generated[:500] # Ограничиваем длину
104
 
105
  except Exception as e:
106
+ print(f"Ошибка в {model_id}: {e}")
107
+ return prompt_ru + " [генерация не удалась]"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
 
109
+ def compare_models(prompt_ru: str):
110
+ """Сравниваем все модели"""
111
  if not prompt_ru.strip():
112
+ empty = "Введите промт"
113
+ return [empty]*3, "", "", "Введите промт"
114
 
115
+ print(f"\n⚡ ТЕСТ: '{prompt_ru[:50]}...'")
 
 
116
 
117
+ results = {}
118
+ times = {}
119
 
120
+ # Тестируем в обратном порядке (сначала быстрые)
121
+ for model_id in ["tinyllama", "qwen", "stablelm"]:
122
+ start = time.time()
123
+ results[model_id] = fast_generate(prompt_ru, model_id)
124
+ times[model_id] = time.time() - start
125
+ print(f" {MODELS_CONFIG[model_id]['display_name']}: {times[model_id]:.1f}с")
 
 
 
 
 
 
126
 
127
+ # Выбираем лучший для перевода (Qwen как самый креативный)
128
+ best_result = results.get("qwen") or results.get("tinyllama") or results.get("stablelm")
129
 
130
+ # Перевод
131
  try:
132
+ translated = translator(best_result[:300], max_length=400)[0]['translation_text']
133
+ translated += ", photorealistic, high quality, detailed, 8K"
 
 
 
 
 
 
 
 
134
  except:
135
+ translated = best_result + ", photorealistic, high quality, detailed"
 
 
 
136
 
137
+ # Негативный промт
138
+ negative_base = "blurry, ugly, deformed, cartoon, text, watermark, bad quality, worst quality"
 
 
 
 
 
 
139
 
140
+ # Информация
141
+ info = f"""
142
+ 🏁 РЕЗУЛЬТАТЫ ТЕСТА:
143
+ TinyLlama: {times.get('tinyllama', 0):.1f}с
144
+ 🎨 Qwen: {times.get('qwen', 0):.1f}с
145
+ 🔧 StableLM: {times.get('stablelm', 0):.1f}с
146
+
147
+ 📊 ИТОГ: {'Qwen' if results.get('qwen') else 'TinyLlama'} использован для перевода
148
+ 🎯 Длина промта: {len(translated.split())} слов
149
  """
150
 
151
  return [
 
153
  results.get("qwen", ""),
154
  results.get("tinyllama", ""),
155
  translated,
156
+ negative_base,
157
+ info
158
  ]
159
 
160
+ # ================== ПРОСТОЙ ИНТЕРФЕЙС ==================
161
+ def create_interface():
162
+ with gr.Blocks(title="AI Сравнение: 3 модели", theme="soft") as demo:
163
+ gr.Markdown("# 🥊 СРАВНЕНИЕ 3 AI МОДЕЛЕЙ")
164
+ gr.Markdown("### Все модели загружены! Тестируйте:")
165
+
166
+ # Ввод
167
+ input_box = gr.Textbox(
168
+ label="🎯 Ваш промт на русском",
169
+ placeholder="девушка в магическом лесу на закате",
170
+ lines=2
 
 
 
 
 
 
 
 
171
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
 
173
+ test_btn = gr.Button("🚀 Тестировать все модели", variant="primary")
 
 
 
 
 
 
 
174
 
175
+ # Результаты
176
+ gr.Markdown("## 📊 РЕЗУЛЬТАТЫ:")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177
 
178
+ with gr.Row():
179
+ with gr.Column():
180
+ gr.Markdown("### 🔧 StableLM-1.6B")
181
+ out_stable = gr.Textbox(lines=3, show_label=False)
182
+
183
+ with gr.Column():
184
+ gr.Markdown("### 🎨 Qwen2.5-1.5B")
185
+ out_qwen = gr.Textbox(lines=3, show_label=False)
186
+
187
+ with gr.Column():
188
+ gr.Markdown("### ⚡ TinyLlama-1.1B")
189
+ out_tiny = gr.Textbox(lines=3, show_label=False)
190
+
191
+ # Финальные промты
192
+ gr.Markdown("## 🎯 ДЛЯ DREAMLIKE:")
193
+
194
+ with gr.Row():
195
+ with gr.Column():
196
+ gr.Markdown("### 🇬🇧 Английский промт")
197
+ out_eng = gr.Textbox(lines=2, interactive=True)
198
+
199
+ with gr.Column():
200
+ gr.Markdown("### 🚫 Негативный промт")
201
+ out_neg = gr.Textbox(lines=2, interactive=True)
202
+
203
+ # Инфо
204
+ out_info = gr.Textbox(label="📈 Статистика", lines=4)
205
+
206
+ # Примеры
207
+ examples = gr.Examples(
208
+ examples=[
209
+ ["девушка в магическом лесу на закате"],
210
+ ["киберпанк город ночью с неоном"],
211
+ ["космонавт на луне с гитарой"],
212
+ ["кошка в шляпе читает книгу"]
213
+ ],
214
+ inputs=[input_box],
215
+ outputs=[out_stable, out_qwen, out_tiny, out_eng, out_neg, out_info],
216
+ fn=compare_models,
217
+ label="Быстрые примеры:"
218
+ )
219
+
220
+ # Обработчики
221
+ test_btn.click(
222
+ fn=compare_models,
223
+ inputs=[input_box],
224
+ outputs=[out_stable, out_qwen, out_tiny, out_eng, out_neg, out_info]
225
+ )
226
+
227
+ input_box.submit(
228
+ fn=compare_models,
229
+ inputs=[input_box],
230
+ outputs=[out_stable, out_qwen, out_tiny, out_eng, out_neg, out_info]
231
+ )
232
+
233
+ # Стартовое сообщение
234
+ demo.load(
235
+ fn=lambda: "✅ ВСЕ 3 МОДЕЛИ ЗАГРУЖЕНЫ!\n"
236
+ "🔧 StableLM-1.6B: 76с на генерацию\n"
237
+ "🎨 Qwen2.5-1.5B: готова\n"
238
+ "⚡ TinyLlama-1.1B: самая быстрая\n\n"
239
+ "Введите промт и нажмите тестировать!",
240
+ outputs=[out_info]
241
+ )
242
 
243
+ return demo
 
 
 
 
 
 
 
244
 
245
  # ================== ЗАПУСК ==================
246
  if __name__ == "__main__":
247
+ demo = create_interface()
248
  demo.launch(
249
  server_name="0.0.0.0",
250
+ server_port=7860,
251
+ share=False
252
  )