dsfsadfsdfdsf commited on
Commit
461aeae
·
verified ·
1 Parent(s): 58f4530

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +165 -177
app.py CHANGED
@@ -3,35 +3,41 @@ import torch
3
  import time
4
  from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
5
 
6
- print("🚀 ЗАГРУЖАЮ ИСПРАВЛЕННУЮ СИСТЕМУ...")
7
 
8
- # ================== КОНФИГУРАЦИЯ ==================
 
9
  MODEL_NAME = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
10
 
11
- # Глобальные переменные
12
  _tokenizer = None
13
  _model = None
14
  _translator = None
15
 
16
  def load_system():
17
- """Загружаем систему"""
18
  global _tokenizer, _model, _translator
19
 
20
- print("📦 Загружаю TinyLlama...")
21
 
22
  try:
 
23
  _tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
24
  _tokenizer.pad_token = _tokenizer.eos_token
25
 
 
26
  _model = AutoModelForCausalLM.from_pretrained(
27
  MODEL_NAME,
28
- torch_dtype=torch.float32,
29
  device_map="auto",
30
- low_cpu_mem_usage=True
 
31
  )
32
 
33
- print("✅ TinyLlama загружена!")
34
 
 
 
35
  _translator = pipeline(
36
  "translation_ru_to_en",
37
  model="Helsinki-NLP/opus-mt-ru-en",
@@ -42,222 +48,184 @@ def load_system():
42
  return True
43
 
44
  except Exception as e:
45
- print(f"❌ Ошибка: {e}")
46
  return False
47
 
48
- # ================== ИСПРАВЛЕННЫЙ ПРОМТ ДЛЯ УЛУЧШЕНИЯ ==================
49
  def get_enhancement_prompt(user_input: str) -> str:
50
- """Промт, который заставляет модель генерировать детали, а не историю"""
51
  return f"""<|system|>
52
- Ты помощник для создания промтов к AI-генератору изображений.
53
- Задача: взять короткое описание и добавить только визуальные детали.
54
 
55
- Примеры как делать:
56
- "девушка" → "Молодая девушка с рыжими волосами и зелеными глазами, улыбка, мягкие черты лица"
57
- "лес" → "Магический лес с высокими деревьями, густая листва, солнечные лучи пробиваются сквозь ветви"
58
- "ночь" → "Темное ночное небо, яркие звезды, лунный свет, тихая атмосфера"
 
 
59
 
60
- НЕ ПИШИ: что происходит, что делает персонаж, сюжет, историю, действия
61
- ПИШИ ТОЛЬКО: как выглядит, какие детали, какое освещение, какая атмосфера
62
 
63
- Формат ответа: только описание через запятую, заканчивая словами "фотореалистично, высокое качество, детализированно"</s>
 
 
64
  <|user|>
65
- Улучши это описание: "{user_input}"</s>
66
  <|assistant|>
67
- """
68
 
69
- # ================== ИСПРАВЛЕННЫЙ НЕГАТИВНЫЙ ПРОМТ ==================
70
- def generate_smart_negative_prompt(english_prompt: str, russian_prompt: str) -> str:
71
- """Генерирует УМНЫЙ негативный промт на основе контекста"""
72
-
73
- # Базовые всегда исключаем
74
- base_negative = [
75
- "blurry", "ugly", "deformed", "bad anatomy",
76
- "bad proportions", "extra limbs", "mutated hands",
77
- "poorly drawn hands", "text", "watermark", "signature",
78
- "logo", "username", "worst quality", "low quality",
79
- "jpeg artifacts", "out of focus", "grainy", "noisy"
80
- ]
81
-
82
- # Анализируем промты
83
- combined_text = (english_prompt + " " + russian_prompt).lower()
84
-
85
- # Определяем что ИСКЛЮЧАТЬ на основе того что ХОТИМ
86
- if any(word in combined_text for word in ["реалистич", "реалистично", "фото", "photoreal", "realistic"]):
87
- # Если хотим реалистичное - исключаем нереалистичное
88
- base_negative.extend(["cartoon", "anime", "painting", "drawing", "illustration",
89
- "3d render", "digital art", "vector art", "sketch"])
90
-
91
- if any(word in combined_text for word in ["ярк", "свет", "солн", "bright", "light", "sun"]):
92
- # Если хотим яркое - исключаем темное
93
- base_negative.extend(["dark", "dull", "underexposed", "gloomy", "shadowy", "poor lighting"])
94
-
95
- if any(word in combined_text for word in ["детал", "подроб", "detailed", "intricate"]):
96
- # Если хотим детализированное - исключаем простое
97
- base_negative.extend(["simple", "plain", "boring", "empty", "basic"])
98
-
99
- if any(word in combined_text for word in ["красив", "прекрасн", "beautiful", "gorgeous"]):
100
- # Если хотим красивое - исключаем некрасивое
101
- base_negative.extend(["unattractive", "messy", "dirty", "disgusting"])
102
-
103
- if any(word in combined_text for word in ["портрет", "лицо", "человек", "portrait", "face", "person"]):
104
- # Если есть лица - исключаем дефекты лиц
105
- base_negative.extend(["asymmetric eyes", "cloned face", "malformed face", "bad eyes"])
106
-
107
- if any(word in combined_text for word in ["природ", "лес", "дерев", "nature", "forest", "tree"]):
108
- # Если природа - исключаем искусственное
109
- base_negative.extend(["artificial", "plastic", "synthetic", "man-made"])
110
-
111
- if any(word in combined_text for word in ["город", "здан", "архитект", "city", "building", "architecture"]):
112
- # Если архитектура - исключаем разрушенное
113
- base_negative.extend(["ruined", "destroyed", "broken", "crumbling"])
114
-
115
- # Убираем дубликаты и ограничиваем длину
116
- unique_negative = []
117
- for term in base_negative:
118
- if term not in unique_negative:
119
- unique_negative.append(term)
120
-
121
- # Берем первые 25 терминов (чтоб не слишком длинно)
122
- return ", ".join(unique_negative[:25])
123
-
124
- def enhance_prompt_correct(user_input: str) -> str:
125
- """Правильное улучшение промта"""
126
- if _model is None:
127
- return user_input + ", фотореалистично, высокое качество, детализированно"
128
 
129
  try:
 
130
  system_prompt = get_enhancement_prompt(user_input)
131
 
 
132
  inputs = _tokenizer(
133
  system_prompt,
134
  return_tensors="pt",
135
- max_length=300,
136
- truncation=True
 
137
  )
138
 
 
139
  with torch.no_grad():
140
  outputs = _model.generate(
141
  **inputs,
142
- max_new_tokens=100,
143
- temperature=0.7,
144
  do_sample=True,
145
  top_p=0.9,
 
146
  pad_token_id=_tokenizer.eos_token_id,
147
- eos_token_id=_tokenizer.eos_token_id
 
148
  )
149
 
 
150
  response = _tokenizer.decode(outputs[0], skip_special_tokens=True)
151
 
152
- # Извлекаем только ответ ассистента
153
- if "<|assistant|>" in response:
154
- parts = response.split("<|assistant|>")
155
- if len(parts) > 1:
156
- enhanced = parts[1].strip()
157
- else:
158
- enhanced = response.replace(system_prompt, "").strip()
159
  else:
 
160
  enhanced = response.replace(system_prompt, "").strip()
161
 
162
- # Очищаем
163
- for marker in ["<|endoftext|>", "</s>", "<|user|>", "<|system|>"]:
164
  enhanced = enhanced.split(marker)[0].strip()
165
 
166
- # Если модель написала историю - исправляем
167
- if any(word in enhanced.lower() for word in ["который", "которая", "когда", "потом", "затем", "начала", "стал"]):
168
- # Модель написала историю - используем fallback
169
- enhanced = user_input + ", фотореалистично, высокое качество, детализированно, красивое освещение, детализированный фон"
170
 
171
- # Добавляем технические термины если их нет
172
- if "фотореалистично" not in enhanced.lower():
173
- enhanced += ", фотореалистично"
174
- if "высокое качество" not in enhanced.lower():
175
- enhanced += ", высокое качество"
176
- if "детализированно" not in enhanced.lower():
177
- enhanced += ", детализированно"
178
-
179
- return enhanced[:350]
180
 
181
  except Exception as e:
182
  print(f"Ошибка генерации: {e}")
183
- return user_input + ", фотореалистично, высокое качество, детализированно"
184
 
185
- def process_pipeline_full(user_input: str):
186
- """Полный пайплайн с УМНЫМ негативным промтом"""
187
- if not user_input.strip():
188
- return "Введите промт", "", "", " Введите промт"
 
 
 
 
 
 
 
 
 
 
 
 
 
189
 
190
- print(f"🧠 Обработка: {user_input}")
 
191
 
 
 
 
 
 
 
 
 
 
 
192
  start_time = time.time()
193
 
194
- # 1. Улучшаем русский
 
 
 
 
 
195
  gen_start = time.time()
196
- enhanced_ru = enhance_prompt_correct(user_input)
197
  gen_time = time.time() - gen_start
198
 
199
  # 2. Переводим
200
  trans_start = time.time()
201
  try:
202
  if _translator:
203
- translated = _translator(enhanced_ru[:350])[0]['translation_text']
204
  else:
205
  translated = enhanced_ru
206
  except:
207
  translated = enhanced_ru
208
  trans_time = time.time() - trans_start
209
 
210
- # 3. Улучшаем английский
211
- dreamlike_keywords = ", photorealistic, high quality, detailed, 8K, masterpiece"
212
- keywords_to_add = []
213
-
214
  if "photorealistic" not in translated.lower():
215
- keywords_to_add.append("photorealistic")
216
- if "high quality" not in translated.lower():
217
- keywords_to_add.append("high quality")
218
- if "detailed" not in translated.lower():
219
- keywords_to_add.append("detailed")
220
- if "8k" not in translated.lower():
221
- keywords_to_add.append("8K")
222
-
223
- if keywords_to_add:
224
- translated += ", " + ", ".join(keywords_to_add)
225
 
226
- # 4. Генерируем УМНЫЙ негативный промт
227
- neg_start = time.time()
228
- negative_en = generate_smart_negative_prompt(translated, enhanced_ru)
229
- neg_time = time.time() - neg_start
230
 
231
  # 5. Статистика
232
  total_time = time.time() - start_time
233
 
234
  info = f"""
235
- ⚡ СКОРОСТЬ ОБРАБОТКИ:
236
- Улучшение: {gen_time:.1f} сек
237
- • Перевод: {trans_time:.1f} сек
238
- • Негативный промт: {neg_time:.1f} сек
239
  • Всего: {total_time:.1f} сек
240
 
241
- 🎨 КАЧЕСТВО:
242
- Улучшенный промт: {len(enhanced_ru.split())} слов
243
- Английский промт: {len(translated.split())} слов
244
- Негативных терминов: {len(negative_en.split(','))}
245
- • Статус: ✅ Готов для Dreamlike Photoreal 2.0
246
  """
247
 
248
  return enhanced_ru, translated, negative_en, info.strip()
249
 
250
- # ================== ИНТЕРФЕЙС ==================
251
- with gr.Blocks(title="Умный улучшитель промтов", theme=gr.themes.Soft()) as demo:
252
 
 
253
  gr.Markdown("""
254
- # 🧠 УМНЫЙ УЛУЧШИТЕЛЬ ПРОМТОВ
255
- ### AI улучшаетУмный негативный промт • Для Dreamlike Photoreal
256
  """)
257
 
258
- # Статус
259
  status = gr.Textbox(
260
- label="🔄 Статус",
261
  value="Загружаю систему...",
262
  interactive=False
263
  )
@@ -267,70 +235,90 @@ with gr.Blocks(title="Умный улучшитель промтов", theme=gr.
267
  # Ввод
268
  input_prompt = gr.Textbox(
269
  label="🎯 Введите промт на русском",
270
- placeholder="девушка в магическом лесу на закате",
271
  lines=2
272
  )
273
 
274
  # Кнопка
275
- btn = gr.Button("🧠 УЛУЧШИТЬ С AI", variant="primary", size="lg")
276
 
277
  # Результаты
278
- gr.Markdown("### 📝 УЛУЧШЕННЫЙ (AI генерация)")
279
  output_ru = gr.Textbox(
 
280
  lines=3,
281
- show_label=False
282
  )
283
 
284
- gr.Markdown("### 🌐 ДЛЯ DREAMLIKE")
285
  with gr.Row():
286
  output_en = gr.Textbox(
287
  label="🎨 Основной промт",
288
  lines=3,
289
  interactive=True
290
  )
 
291
  output_neg = gr.Textbox(
292
- label="🚫 УМНЫЙ Negative Prompt",
293
  lines=3,
294
  interactive=True
295
  )
296
 
297
- # Инфо
298
  output_info = gr.Textbox(
299
- label="📊 СТАТИСТИКА И ИНФО",
300
- lines=4
 
301
  )
302
 
303
  # Примеры
304
- gr.Markdown("### 🧪 ТЕСТЕЙСЫ")
305
  examples = gr.Examples(
306
  examples=[
307
- ["девушка в лесу"],
308
- ["космонавт на луне"],
309
- ["киберпанк город ночью"],
310
- ["дракон на горе"],
311
- ["старый волшебник"]
312
  ],
313
  inputs=[input_prompt],
314
  outputs=[output_ru, output_en, output_neg, output_info],
315
- fn=process_pipeline_full,
316
  label="Кликните для теста:"
317
  )
318
 
319
  # Обработчики
320
- def process(prompt):
321
- return process_pipeline_full(prompt)
 
 
 
 
 
 
322
 
323
- btn.click(fn=process, inputs=[input_prompt], outputs=[output_ru, output_en, output_neg, output_info])
324
- input_prompt.submit(fn=process, inputs=[input_prompt], outputs=[output_ru, output_en, output_neg, output_info])
 
 
 
325
 
326
- # Инициализация
327
- def init():
328
  if load_system():
329
- return "✅ СИСТЕМА ГОТОВА! Введите промт.", gr.update(visible=True)
330
- return "❌ Ошибка загрузки", gr.update(visible=False)
 
331
 
332
- demo.load(fn=init, outputs=[status, main_ui])
 
 
 
 
333
 
334
- # Запуск
335
  if __name__ == "__main__":
336
- demo.launch(server_name="0.0.0.0", server_port=7860)
 
 
 
 
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",
 
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
  )
 
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
324
+ )