dsfsadfsdfdsf commited on
Commit
4d02c23
·
verified ·
1 Parent(s): 84b5f6c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +248 -247
app.py CHANGED
@@ -1,322 +1,323 @@
1
  import gradio as gr
2
  import torch
3
  import time
4
- import os
5
- from typing import Dict, List
6
 
7
- print("🚀 ЗАГРУЖАЮ СИСТЕМУ...")
8
 
9
- # ================== ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ ДЛЯ КЭШИРОВАНИЯ ==================
10
- GLOBAL_MODELS = {}
11
- GLOBAL_TOKENIZERS = {}
12
 
13
- # ================== ЗАГРУЗКА МОДЕЛЕЙ ОДИН РАЗ ==================
14
- def load_models_once():
15
- """Загружает модели только один раз при старте"""
16
- if GLOBAL_MODELS:
17
- print("✅ Модели уже загружены (используем кэш)")
18
- return True
 
 
19
 
20
- print("📦 Загружаю модели...")
21
 
22
  try:
23
- from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
 
 
24
 
25
- # Конфигурация моделей
26
- models_to_load = {
27
- "stablelm": ("stabilityai/stablelm-2-1_6b", "🔧 StableLM-2-1.6B"),
28
- "qwen": ("Qwen/Qwen2.5-1.5B-Instruct", "🎨 Qwen2.5-1.5B"),
29
- "tinyllama": ("TinyLlama/TinyLlama-1.1B-Chat-v1.0", "⚡ TinyLlama-1.1B")
30
- }
 
 
31
 
32
- # Загружаем каждую модель
33
- for key, (model_name, display_name) in models_to_load.items():
34
- try:
35
- print(f" Загрузка {display_name}...")
36
-
37
- # Токенизатор
38
- tokenizer = AutoTokenizer.from_pretrained(
39
- model_name,
40
- trust_remote_code=True
41
- )
42
-
43
- # Модель (используем float32 для CPU)
44
- model = AutoModelForCausalLM.from_pretrained(
45
- model_name,
46
- torch_dtype=torch.float32,
47
- device_map="auto",
48
- trust_remote_code=True,
49
- low_cpu_mem_usage=True
50
- )
51
-
52
- # Кэшируем
53
- GLOBAL_TOKENIZERS[key] = tokenizer
54
- GLOBAL_MODELS[key] = model
55
-
56
- print(f" ✅ {display_name} загружена")
57
-
58
- except Exception as e:
59
- print(f" ❌ Ошибка загрузки {display_name}: {str(e)[:100]}")
60
- GLOBAL_MODELS[key] = None
61
- GLOBAL_TOKENIZERS[key] = None
62
 
63
- # Загружаем переводчик
64
  print("🌐 Загружаю переводчик...")
65
- GLOBAL_MODELS["translator"] = pipeline(
66
  "translation_ru_to_en",
67
- model="Helsinki-NLP/opus-mt-ru-en"
 
68
  )
69
- print("✅ Переводчик загружен")
70
 
71
  return True
72
 
73
  except Exception as e:
74
- print(f"❌ Критическая ошибка загрузки: {e}")
75
  return False
76
 
77
- # ================== ФУНКЦИИ ГЕНЕРАЦИИ ==================
78
- def generate_with_model_fast(prompt: str, model_key: str) -> str:
79
- """Быстрая генерация с кэшированной моделью"""
80
- if model_key not in GLOBAL_MODELS or GLOBAL_MODELS[model_key] is None:
81
- return f"[Модель {model_key} не загружена]"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
 
83
  try:
84
- model = GLOBAL_MODELS[model_key]
85
- tokenizer = GLOBAL_TOKENIZERS[model_key]
86
 
87
- # Простые промты для каждой модели
88
- if model_key == "stablelm":
89
- input_text = f"Детализируй: {prompt}\nДетали:"
90
- elif model_key == "qwen":
91
- input_text = f"<|im_start|>system\nДетализируй описание<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant\n"
92
- else: # tinyllama
93
- input_text = f"<|system|>\nДетализируй<|end|>\n<|user|>\n{prompt}<|end|>\n<|assistant|>\n"
94
-
95
- # Генерация
96
- inputs = tokenizer(input_text, return_tensors="pt", max_length=150, truncation=True)
97
 
 
98
  with torch.no_grad():
99
- outputs = model.generate(
100
  **inputs,
101
- max_new_tokens=80,
 
102
  do_sample=True,
103
- temperature=0.7,
104
- pad_token_id=tokenizer.eos_token_id
 
 
 
105
  )
106
 
107
  # Декодируем
108
- response = tokenizer.decode(outputs[0], skip_special_tokens=True)
109
- result = response.replace(input_text, "").strip()
 
 
 
 
 
 
110
 
111
- # Очищаем
112
- for marker in ["<|endoftext|>", "</s>", "<|im_end|>"]:
113
- result = result.split(marker)[0].strip()
114
 
115
- return result if result else prompt
 
 
 
 
116
 
117
  except Exception as e:
118
- return f"{prompt} [ошибка: {str(e)[:30]}]"
 
119
 
120
- def process_all_models(user_input: str):
121
- """Обрабатывает промт всеми моделями"""
122
- if not user_input.strip():
123
- empty = "Введите промт"
124
- return [empty]*3, "", "", " Введите промт..."
 
 
 
125
 
126
- start_time = time.time()
127
 
128
- print(f"\n🧪 Обработка: '{user_input[:40]}...'")
 
 
129
 
130
- # Генерируем всеми моделями
131
- results = {}
132
 
133
- # TinyLlama (самая быстрая)
134
- t1 = time.time()
135
- results["tinyllama"] = generate_with_model_fast(user_input, "tinyllama")
136
- time_tiny = time.time() - t1
137
 
138
- # Qwen
139
- t2 = time.time()
140
- results["qwen"] = generate_with_model_fast(user_input, "qwen")
141
- time_qwen = time.time() - t2
 
142
 
143
- # StableLM (самая медленная)
144
- t3 = time.time()
145
- results["stablelm"] = generate_with_model_fast(user_input, "stablelm")
146
- time_stable = time.time() - t3
 
147
 
148
- # Выбираем лучший результат для перевода (Qwen приоритет)
149
- best_ru = results.get("qwen") or results.get("tinyllama") or results.get("stablelm")
150
 
151
- # Переводим
 
 
 
 
 
 
 
 
152
  try:
153
- translator = GLOBAL_MODELS.get("translator")
154
- if translator:
155
- translated = translator(best_ru[:250])[0]['translation_text']
156
  else:
157
- translated = best_ru
158
  except:
159
- translated = best_ru
 
160
 
161
- # Добавляем ключевые слова
162
- translated += ", photorealistic, high quality, detailed, 8K"
 
 
163
 
164
- # Негативный промт
165
- negative = "blurry, ugly, deformed, cartoon, text, watermark, bad quality, worst quality"
 
 
166
 
167
- # Информация
168
  total_time = time.time() - start_time
 
169
  info = f"""
170
- ⏱️ ВРЕМЯ ОБРАБОТКИ:
171
- TinyLlama: {time_tiny:.1f} сек
172
- 🎨 Qwen: {time_qwen:.1f} сек
173
- 🔧 StableLM: {time_stable:.1f} сек
174
  • Всего: {total_time:.1f} сек
175
 
176
  📊 СТАТИСТИКА:
177
- Использован: {'Qwen' if results.get('qwen') else 'TinyLlama'}
178
- • Длина английского: {len(translated.split())} слов
179
- • Статус: ✅ Готово
180
  """
181
 
182
- return [
183
- results.get("stablelm", ""),
184
- results.get("qwen", ""),
185
- results.get("tinyllama", ""),
186
- translated,
187
- negative,
188
- info.strip()
189
- ]
190
 
191
- # ================== ИНТЕРФЕЙС GRADIO ==================
192
- def create_simple_interface():
193
- with gr.Blocks(title="AI Баттл: 3 Модели") as demo:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
194
 
195
- # Заголовок
196
- gr.Markdown("""
197
- # 🥊 БАТТЛ AI МОДЕЛЕЙ
198
- ### StableLM-1.6B vs Qwen2.5-1.5B vs TinyLlama-1.1B
199
- """)
200
 
201
- # Статус загрузки
202
- load_status = gr.Textbox(
203
- label="🔄 Статус системы",
204
- value="Загружаю модели... (это займет ~2 минуты)",
205
- interactive=False
 
206
  )
207
 
208
- # Основной интерфейс появится после загрузки
209
- def build_interface_after_load():
210
- # Проверяем загрузку
211
- success = load_models_once()
212
-
213
- if not success:
214
- return "❌ Ошибка загрузки моделей", gr.update(visible=False), gr.update(visible=False)
215
-
216
- # Считаем загруженные модели
217
- loaded_count = sum(1 for m in ["stablelm", "qwen", "tinyllama"] if GLOBAL_MODELS.get(m) is not None)
218
 
219
- return f"✅ Загружено моделей: {loaded_count}/3 + Переводчик", gr.update(visible=True), gr.update(visible=True)
 
 
 
 
220
 
221
- # Создаем скрытые элементы
222
- main_interface = gr.Column(visible=False)
223
- examples_section = gr.Column(visible=False)
 
 
 
224
 
225
- # После загрузки показываем основной интерфейс
226
- demo.load(
227
- fn=build_interface_after_load,
228
- outputs=[load_status, main_interface, examples_section]
 
 
 
 
 
 
 
 
 
 
229
  )
230
 
231
- # ОСНОВНОЙ ИНТЕРФЕЙС (показывается после загрузки)
232
- with main_interface:
233
- # Ввод
234
- input_prompt = gr.Textbox(
235
- label="🎯 Введите промт на русском",
236
- placeholder="Пример: девушка в магическом лесу на закате",
237
- lines=2
238
- )
239
-
240
- # Кнопка
241
- test_btn = gr.Button("🚀 Тестировать все 3 модели", variant="primary", size="lg")
242
-
243
- # Результаты
244
- gr.Markdown("### 📊 РЕЗУЛЬТАТЫ МОДЕЛЕЙ")
245
-
246
- with gr.Row():
247
- with gr.Column():
248
- gr.Markdown("**🔧 StableLM-1.6B**")
249
- out_stable = gr.Textbox(lines=3, show_label=False)
250
-
251
- with gr.Column():
252
- gr.Markdown("**🎨 Qwen2.5-1.5B**")
253
- out_qwen = gr.Textbox(lines=3, show_label=False)
254
-
255
- with gr.Column():
256
- gr.Markdown("**⚡ TinyLlama-1.1B**")
257
- out_tiny = gr.Textbox(lines=3, show_label=False)
258
-
259
- # Финальные промты
260
- gr.Markdown("### 🎯 ФИНАЛЬНЫЕ ПРОМТЫ ДЛЯ DREAMLIKE")
261
-
262
- with gr.Row():
263
- with gr.Column():
264
- gr.Markdown("**🇬🇧 Английский промт**")
265
- out_english = gr.Textbox(lines=2, interactive=True)
266
-
267
- with gr.Column():
268
- gr.Markdown("**🚫 Негативный промт**")
269
- out_negative = gr.Textbox(lines=2, interactive=True)
270
-
271
- # Информация
272
- out_info = gr.Textbox(
273
- label="📈 СТАТИСТИКА И ИНФОРМАЦИЯ",
274
- lines=5,
275
- interactive=False
276
- )
277
-
278
- # Обработчики
279
- def process_input(prompt):
280
- return process_all_models(prompt)
281
-
282
- test_btn.click(
283
- fn=process_input,
284
- inputs=[input_prompt],
285
- outputs=[out_stable, out_qwen, out_tiny, out_english, out_negative, out_info]
286
- )
287
-
288
- input_prompt.submit(
289
- fn=process_input,
290
- inputs=[input_prompt],
291
- outputs=[out_stable, out_qwen, out_tiny, out_english, out_negative, out_info]
292
- )
293
 
294
- # ПРИМЕРЫ (показываются после загрузки)
295
- with examples_section:
296
- gr.Markdown("### 🧪 БЫСТРЫЕ ПРИМЕРЫ ДЛЯ ТЕСТА")
297
-
298
- examples = gr.Examples(
299
- examples=[
300
- ["девушка в магическом лесу на закате"],
301
- ["киберпанк город ночью с неоновыми вывесками"],
302
- ["космонавт на луне играет на гитаре"],
303
- ["старый волшебник в древней библиотеке"],
304
- ["кошка в шляпе читает книгу в кафе"]
305
- ],
306
- inputs=[input_prompt],
307
- outputs=[out_stable, out_qwen, out_tiny, out_english, out_negative, out_info],
308
- fn=process_input,
309
- label="Кликните на пример:"
310
- )
311
 
312
- return demo
 
 
 
 
 
 
 
 
 
 
 
313
 
314
  # ================== ЗАПУСК ==================
315
  if __name__ == "__main__":
316
- print("🚀 Создаю интерфейс...")
317
- demo = create_simple_interface()
318
-
319
- # Убираем лишние параметры из launch
320
  demo.launch(
321
  server_name="0.0.0.0",
322
  server_port=7860
 
1
  import gradio as gr
2
  import torch
3
  import time
4
+ from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
 
5
 
6
+ print("🚀 ЗАГРУЖАЮ ОПТИМИЗИРОВАННУЮ СИСТЕМУ...")
7
 
8
+ # ================== ИСПОЛЬЗУЕМ ТОЛЬКО TINYLLAMA ==================
9
+ # Она быстрая, уже работает, занимает мало памяти
10
+ MODEL_NAME = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
11
 
12
+ # Глобальные переменные для кэша
13
+ _tokenizer = None
14
+ _model = None
15
+ _translator = None
16
+
17
+ def load_system():
18
+ """Загружаем только одну модель - TinyLlama"""
19
+ global _tokenizer, _model, _translator
20
 
21
+ print("📦 Загружаю TinyLlama (самая быстрая для CPU)...")
22
 
23
  try:
24
+ # Токенизатор
25
+ _tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
26
+ _tokenizer.pad_token = _tokenizer.eos_token
27
 
28
+ # Модель с оптимизациями для CPU
29
+ _model = AutoModelForCausalLM.from_pretrained(
30
+ MODEL_NAME,
31
+ torch_dtype=torch.float32, # Используем float32 для CPU
32
+ device_map="auto",
33
+ low_cpu_mem_usage=True,
34
+ offload_folder="./offload" # Выгружаем на диск если не хватает RAM
35
+ )
36
 
37
+ print("✅ TinyLlama загружена и оптимизирована для CPU!")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
+ # Переводчик
40
  print("🌐 Загружаю переводчик...")
41
+ _translator = pipeline(
42
  "translation_ru_to_en",
43
+ model="Helsinki-NLP/opus-mt-ru-en",
44
+ device="cpu"
45
  )
46
+ print("✅ Переводчик готов!")
47
 
48
  return True
49
 
50
  except Exception as e:
51
+ print(f"❌ Ошибка загрузки: {e}")
52
  return False
53
 
54
+ # ================== ПРАВИЛЬНЫЕ ПРОМТ-ШАБЛОНЫ ==================
55
+ def get_enhancement_prompt(user_input: str) -> str:
56
+ """Создаем ПРАВИЛЬНЫЙ промт для улучшения, а не для рассказа"""
57
+ return f"""<|system|>
58
+ Ты помощник для создания промтов к AI-генератору изображений Dreamlike Photoreal 2.0.
59
+ ТВОЯ ЗАДАЧА: Взять короткое описание и добавить КОНКРЕТНЫЕ детали для фотореалистичной генерации.
60
+
61
+ ДОБАВЬ:
62
+ 1. Описание внешности (если есть персонаж)
63
+ 2. Детали окружения
64
+ 3. Освещение и время суток
65
+ 4. Атмосферу и настроение
66
+ 5. Стиль изображения
67
+
68
+ НЕ пиши рассказ, НЕ добавляй сюжет. Только описание для генератора изображений.
69
+
70
+ Примеры правильных улучшений:
71
+ • "девушка в лесу" → "Молодая девушка с рыжими волосами в белом платье стоит в магическом лесу на закате, золотые лучи солнца пробиваются сквозь листву, атмосферное освещение, фотореалистично, детализированно"
72
+ • "город ночью" → "Футуристический город ночью с неоновыми вывесками, мокрые улицы отражают свет, киберпанк стиль, детализированная архитектура, фотореалистично"</s>
73
+ <|user|>
74
+ Улучши это описание для генерации фотореалистичного изображения: "{user_input}"</s>
75
+ <|assistant|>
76
+ Улучшенное описание:"""
77
+
78
+ # ================== БЫСТРАЯ ГЕНЕРАЦИЯ ==================
79
+ def enhance_prompt_fast(user_input: str) -> str:
80
+ """Быстро улучшаем промт с TinyLlama"""
81
+ if _model is None or _tokenizer is None:
82
+ return user_input + " [система не загружена]"
83
 
84
  try:
85
+ # Создаем правильный промт
86
+ system_prompt = get_enhancement_prompt(user_input)
87
 
88
+ # Токенизация (ограничиваем длину)
89
+ inputs = _tokenizer(
90
+ system_prompt,
91
+ return_tensors="pt",
92
+ max_length=256,
93
+ truncation=True,
94
+ padding=True
95
+ )
 
 
96
 
97
+ # Быстрая генерация с оптимизированными параметрами
98
  with torch.no_grad():
99
+ outputs = _model.generate(
100
  **inputs,
101
+ max_new_tokens=120, # Не больше 120 новых токенов
102
+ temperature=0.8,
103
  do_sample=True,
104
+ top_p=0.9,
105
+ repetition_penalty=1.1,
106
+ pad_token_id=_tokenizer.eos_token_id,
107
+ eos_token_id=_tokenizer.eos_token_id,
108
+ no_repeat_ngram_size=3 # Избегаем повторений
109
  )
110
 
111
  # Декодируем
112
+ response = _tokenizer.decode(outputs[0], skip_special_tokens=True)
113
+
114
+ # Извлекаем только улучшенную часть
115
+ if "Улучшенное описание:" in response:
116
+ enhanced = response.split("Улучшенное описание:")[-1].strip()
117
+ else:
118
+ # Fallback: удаляем системный промт
119
+ enhanced = response.replace(system_prompt, "").strip()
120
 
121
+ # Очищаем от метаданных
122
+ for marker in ["<|endoftext|>", "</s>", "<|assistant|>", "<|user|>", "<|system|>"]:
123
+ enhanced = enhanced.split(marker)[0].strip()
124
 
125
+ # Если результат слишком короткий, добавляем базовые улучшения
126
+ if len(enhanced.split()) < 5:
127
+ enhanced = f"{user_input}, фотореалистично, высокое качество, детализированно, красивое освещение"
128
+
129
+ return enhanced[:400] # Ограничиваем длину
130
 
131
  except Exception as e:
132
+ print(f"Ошибка генерации: {e}")
133
+ return f"{user_input}, фотореалистично, высокое качество, детализированно"
134
 
135
+ def generate_negative_prompt_smart(english_prompt: str) -> str:
136
+ """Умный негативный промт"""
137
+ base = [
138
+ "blurry", "ugly", "deformed", "bad anatomy",
139
+ "bad proportions", "extra limbs", "mutated hands",
140
+ "poorly drawn hands", "text", "watermark", "signature",
141
+ "worst quality", "low quality", "jpeg artifacts"
142
+ ]
143
 
144
+ prompt_lower = english_prompt.lower()
145
 
146
+ # Добавляем контекстные исключения
147
+ if any(word in prompt_lower for word in ["realistic", "photoreal", "photo"]):
148
+ base.extend(["cartoon", "anime", "painting", "drawing", "illustration", "3d render"])
149
 
150
+ if any(word in prompt_lower for word in ["bright", "light", "sun"]):
151
+ base.extend(["dark", "dull", "underexposed", "gloomy"])
152
 
153
+ if any(word in prompt_lower for word in ["portrait", "face", "person"]):
154
+ base.extend(["asymmetric eyes", "cloned face", "malformed limbs"])
 
 
155
 
156
+ # Убираем дубликаты
157
+ unique = []
158
+ for term in base:
159
+ if term not in unique:
160
+ unique.append(term)
161
 
162
+ return ", ".join(unique)
163
+
164
+ def process_pipeline(user_input: str):
165
+ """Полный пайплайн обработки"""
166
+ start_time = time.time()
167
 
168
+ if not user_input.strip():
169
+ return "Введите промт", "", "", "⏳ Введите промт"
170
 
171
+ print(f"⚡ Обработка: {user_input}")
172
+
173
+ # 1. Улучшаем промт (максимум 5 секунд)
174
+ gen_start = time.time()
175
+ enhanced_ru = enhance_prompt_fast(user_input)
176
+ gen_time = time.time() - gen_start
177
+
178
+ # 2. Переводим
179
+ trans_start = time.time()
180
  try:
181
+ if _translator:
182
+ translated = _translator(enhanced_ru[:300])[0]['translation_text']
 
183
  else:
184
+ translated = enhanced_ru
185
  except:
186
+ translated = enhanced_ru
187
+ trans_time = time.time() - trans_start
188
 
189
+ # 3. Улучшаем английский для Dreamlike
190
+ dreamlike_keywords = ", photorealistic, high quality, detailed, 8K, professional photography"
191
+ if "photorealistic" not in translated.lower():
192
+ translated += dreamlike_keywords
193
 
194
+ # 4. Негативный промт
195
+ negative_start = time.time()
196
+ negative_en = generate_negative_prompt_smart(translated)
197
+ negative_time = time.time() - negative_start
198
 
199
+ # 5. Статистика
200
  total_time = time.time() - start_time
201
+
202
  info = f"""
203
+ БЫСТРАЯ ОБРАБОТКА:
204
+ Генерация: {gen_time:.1f} сек
205
+ Перевод: {trans_time:.1f} сек
206
+ Негативный промт: {negative_time:.1f} сек
207
  • Всего: {total_time:.1f} сек
208
 
209
  📊 СТАТИСТИКА:
210
+ Модель: TinyLlama-1.1B (оптимизирована для CPU)
211
+ • Длина промта: {len(translated.split())} слов
212
+ • Статус: ✅ Готово к использованию в Dreamlike
213
  """
214
 
215
+ return enhanced_ru, translated, negative_en, info.strip()
 
 
 
 
 
 
 
216
 
217
+ # ================== ПРОСТОЙ ИНТЕРФЕЙС ==================
218
+ with gr.Blocks(title="AI Улучшитель промтов для Dreamlike", theme=gr.themes.Soft()) as demo:
219
+
220
+ # Заголовок
221
+ gr.Markdown("""
222
+ # 🚀 УЛЬТРА-БЫСТРЫЙ AI УЛУЧШИТЕЛЬ ПРОМТОВ
223
+ ### Оптимизирован для CPU • TinyLlama • Мгновенная обработка
224
+ """)
225
+
226
+ # Статус загрузки
227
+ status = gr.Textbox(
228
+ label="🔄 Статус системы",
229
+ value="Загружаю систему...",
230
+ interactive=False
231
+ )
232
+
233
+ # Основной интерфейс
234
+ with gr.Column(visible=False) as main_ui:
235
+ # Ввод
236
+ input_prompt = gr.Textbox(
237
+ label="🎯 Введите промт на русском",
238
+ placeholder="Пример: девушка в магическом лесу на закате",
239
+ lines=2
240
+ )
241
 
242
+ # Кнопка
243
+ process_btn = gr.Button("⚡ УЛУЧШИТЬ ПРОМТ", variant="primary", size="lg")
 
 
 
244
 
245
+ # Результаты
246
+ gr.Markdown("### 📝 УЛУЧШЕННЫЙ ПРОМТ (русский)")
247
+ output_ru = gr.Textbox(
248
+ label="",
249
+ lines=3,
250
+ interactive=True
251
  )
252
 
253
+ gr.Markdown("### 🌐 ДЛЯ DREAMLIKE (английский)")
254
+ with gr.Row():
255
+ output_en = gr.Textbox(
256
+ label="🎨 Основной промт",
257
+ lines=3,
258
+ interactive=True
259
+ )
 
 
 
260
 
261
+ output_neg = gr.Textbox(
262
+ label="🚫 Negative Prompt",
263
+ lines=3,
264
+ interactive=True
265
+ )
266
 
267
+ # Информация
268
+ output_info = gr.Textbox(
269
+ label="📊 СТАТИСТИКА",
270
+ lines=4,
271
+ interactive=False
272
+ )
273
 
274
+ # Примеры
275
+ gr.Markdown("### 🧪 БЫСТРЫЕ ПРИМЕРЫ")
276
+ examples = gr.Examples(
277
+ examples=[
278
+ ["девушка в магическом лесу на закате"],
279
+ ["киберпанк улица ночью с неоновыми вывесками"],
280
+ ["космонавт играет на гитаре на луне"],
281
+ ["кошка в шляпе читает газету в кафе"],
282
+ ["дракон на вершине горы"]
283
+ ],
284
+ inputs=[input_prompt],
285
+ outputs=[output_ru, output_en, output_neg, output_info],
286
+ fn=process_pipeline,
287
+ label="Кликните для теста:"
288
  )
289
 
290
+ # Обработчики
291
+ def process_and_update(prompt):
292
+ return process_pipeline(prompt)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
293
 
294
+ process_btn.click(
295
+ fn=process_and_update,
296
+ inputs=[input_prompt],
297
+ outputs=[output_ru, output_en, output_neg, output_info]
298
+ )
299
+
300
+ input_prompt.submit(
301
+ fn=process_and_update,
302
+ inputs=[input_prompt],
303
+ outputs=[output_ru, output_en, output_neg, output_info]
304
+ )
 
 
 
 
 
 
305
 
306
+ # Функция инициализации
307
+ def initialize_system():
308
+ if load_system():
309
+ return "✅ СИСТЕМА ГОТОВА! TinyLlama загружена и оптимизирована.\n⚡ Введите промт и нажмите кнопку.", gr.update(visible=True)
310
+ else:
311
+ return "❌ Ошибка загрузки. П��пробуйте перезапустить Space.", gr.update(visible=False)
312
+
313
+ # Загружаем при старте
314
+ demo.load(
315
+ fn=initialize_system,
316
+ outputs=[status, main_ui]
317
+ )
318
 
319
  # ================== ЗАПУСК ==================
320
  if __name__ == "__main__":
 
 
 
 
321
  demo.launch(
322
  server_name="0.0.0.0",
323
  server_port=7860