JustinRocks commited on
Commit
b3b2444
·
verified ·
1 Parent(s): aa76f48

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +19 -232
app.py CHANGED
@@ -1,12 +1,10 @@
1
  import spaces
2
- from dataclasses import dataclass
3
- import json
4
- import logging
5
  import os
6
  import random
7
  import re
8
  import sys
9
  import warnings
 
10
 
11
  from PIL import Image
12
  from diffusers import AutoencoderKL, FlowMatchEulerDiscreteScheduler
@@ -14,27 +12,19 @@ import gradio as gr
14
  import torch
15
  from transformers import AutoModelForCausalLM, AutoTokenizer
16
 
17
- from prompt_check import is_unsafe_prompt
18
-
19
  sys.path.append(os.path.dirname(os.path.abspath(__file__)))
20
 
21
  from diffusers import ZImagePipeline
22
  from diffusers.models.transformers.transformer_z_image import ZImageTransformer2DModel
23
 
24
- from pe import prompt_template
25
-
26
  # ==================== Environment Variables ==================================
27
  MODEL_PATH = os.environ.get("MODEL_PATH", "Tongyi-MAI/Z-Image-Turbo")
28
  ENABLE_COMPILE = os.environ.get("ENABLE_COMPILE", "true").lower() == "true"
29
  ENABLE_WARMUP = os.environ.get("ENABLE_WARMUP", "true").lower() == "true"
30
  ATTENTION_BACKEND = os.environ.get("ATTENTION_BACKEND", "flash_3")
31
- UNSAFE_MAX_NEW_TOKEN = int(os.environ.get("UNSAFE_MAX_NEW_TOKEN", "10"))
32
- DASHSCOPE_API_KEY = os.environ.get("DASHSCOPE_API_KEY")
33
- HF_TOKEN = os.environ.get("HF_TOKEN")
34
- UNSAFE_PROMPT_CHECK = os.environ.get("UNSAFE_PROMPT_CHECK")
35
  # =============================================================================
36
 
37
-
38
  os.environ["TOKENIZERS_PARALLELISM"] = "false"
39
  warnings.filterwarnings("ignore")
40
  logging.getLogger("transformers").setLevel(logging.ERROR)
@@ -96,15 +86,6 @@ EXAMPLE_PROMPTS = [
96
  [
97
  "Young Chinese woman in red Hanfu, intricate embroidery. Impeccable makeup, red floral forehead pattern. Elaborate high bun, golden phoenix headdress, red flowers, beads. Holds round folding fan with lady, trees, bird. Neon lightning-bolt lamp (⚡️), bright yellow glow, above extended left palm. Soft-lit outdoor night background, silhouetted tiered pagoda (西安大雁塔), blurred colorful distant lights."
98
  ],
99
- [
100
- '''A vertical digital illustration depicting a serene and majestic Chinese landscape, rendered in a style reminiscent of traditional Shanshui painting but with a modern, clean aesthetic. The scene is dominated by towering, steep cliffs in various shades of blue and teal, which frame a central valley. In the distance, layers of mountains fade into a light blue and white mist, creating a strong sense of atmospheric perspective and depth. A calm, turquoise river flows through the center of the composition, with a small, traditional Chinese boat, possibly a sampan, navigating its waters. The boat has a bright yellow canopy and a red hull, and it leaves a gentle wake behind it. It carries several indistinct figures of people. Sparse vegetation, including green trees and some bare-branched trees, clings to the rocky ledges and peaks. The overall lighting is soft and diffused, casting a tranquil glow over the entire scene. Centered in the image is overlaid text. At the top of the text block is a small, red, circular seal-like logo containing stylized characters. Below it, in a smaller, black, sans-serif font, are the words 'Zao-Xiang * East Beauty & West Fashion * Z-Image'. Directly beneath this, in a larger, elegant black serif font, is the word 'SHOW & SHARE CREATIVITY WITH THE WORLD'. Among them, there are "SHOW & SHARE", "CREATIVITY", and "WITH THE WORLD"'''
101
- ],
102
- [
103
- """一张虚构的英语电影《回忆之味》(The Taste of Memory)的电影海报。场景设置在一个质朴的19世纪风格厨房里。画面中央,一位红棕色头发、留着小胡子的中年男子(演员阿瑟·彭哈利根饰)站在一张木桌后,他身穿白色衬衫、黑色马甲和米色围裙,正看着一位女士,手中拿着一大块生红肉,下方是一个木制切菜板。在他的右边,一位梳着高髻的黑发女子(演员埃莉诺·万斯饰)倚靠在桌子上,温柔地对他微笑。她穿着浅色衬衫和一条上白下蓝的长裙。桌上除了放有切碎的葱和卷心菜丝的切菜板外,还有一个白色陶瓷盘、新鲜香草,左侧一个木箱上放着一串深色葡萄。背景是一面粗糙的灰白色抹灰墙,墙上挂着一幅风景画。最右边的一个台面上放着一盏复古油灯。海报上有大量的文字信息。左上角是白色的无衬线字体"ARTISAN FILMS PRESENTS",其下方是"ELEANOR VANCE"和"ACADEMY AWARD® WINNER"。右上角写着"ARTHUR PENHALIGON"和"GOLDEN GLOBE® AWARD WINNER"。顶部中央是圣丹斯电影节的桂冠标志,下方写着"SUNDANCE FILM FESTIVAL GRAND JURY PRIZE 2024"。主标题"THE TASTE OF MEMORY"以白色的大号衬线字体醒目地显示在下半部分。标题下方注明了"A FILM BY Tongyi Interaction Lab"。底部区域用白色小字列出了完整的演职员名单,包括"SCREENPLAY BY ANNA REID"、"CULINARY DIRECTION BY JAMES CARTER"以及Artisan Films、Riverstone Pictures和Heritage Media等众多出品公司标志。整体风格是写实主义,采用温暖柔和的灯光方案,营造出一种亲密的氛围���色调以棕色、米色和柔和的绿色等大地色系为主。两位演员的身体都在腰部被截断。"""
104
- ],
105
- [
106
- """一张方形构图的特写照片,主体是一片巨大的、鲜绿色的植物叶片,并叠加了文字,使其具有海报或杂志封面的外观。主要拍摄对象是一片厚实、有蜡质感的叶子,从左下角到右上角呈对角线弯曲穿过画面。其表面反光性很强,捕捉到一个明亮的直射光源,形成了一道突出的高光,亮面下显露出平行的精细叶脉。背景由其他深绿色的叶子组成,这些叶子轻微失焦,营造出浅景深效果,突出了前景的主叶片。整体风格是写实摄影,明亮的叶片与黑暗的阴影背景之间形成高对比度。图像上有多处渲染文字。左上角是白色的衬线字体文字"PIXEL-PEEPERS GUILD Presents"。右上角同样是白色衬线字体的文字"[Instant Noodle] 泡面调料包"。左侧垂直排列着标题"Render Distance: Max",为白色衬线字体。左下角是五个硕大的白色宋体汉字"显卡在...燃烧"。右下角是较小的白色衬线字体文字"Leica Glow™ Unobtanium X-1",其正上方是用白色宋体字书写的名字"蔡几"。识别出的核心实体包括品牌像素偷窥者协会、其产品线泡面调料包、相机型号买不到™ X-1以及摄影师名字造相。"""
107
- ],
108
  ]
109
 
110
 
@@ -186,15 +167,6 @@ def load_models(model_path, enable_compile=False, attention_backend="native"):
186
 
187
  pipe.to("cuda", torch.bfloat16)
188
 
189
- from diffusers.pipelines.stable_diffusion import StableDiffusionSafetyChecker
190
- from transformers import CLIPImageProcessor
191
-
192
- safety_model_id = "CompVis/stable-diffusion-safety-checker"
193
- safety_feature_extractor = CLIPImageProcessor.from_pretrained(safety_model_id)
194
- safety_checker = StableDiffusionSafetyChecker.from_pretrained(safety_model_id, torch_dtype=torch.float16).to("cuda")
195
-
196
- pipe.safety_feature_extractor = safety_feature_extractor
197
- pipe.safety_checker = safety_checker
198
  return pipe
199
 
200
 
@@ -252,104 +224,11 @@ def warmup_model(pipe, resolutions):
252
  print("Warmup completed.")
253
 
254
 
255
- # ==================== Prompt Expander ====================
256
- @dataclass
257
- class PromptOutput:
258
- status: bool
259
- prompt: str
260
- seed: int
261
- system_prompt: str
262
- message: str
263
-
264
-
265
- class PromptExpander:
266
- def __init__(self, backend="api", **kwargs):
267
- self.backend = backend
268
-
269
- def decide_system_prompt(self, template_name=None):
270
- return prompt_template
271
-
272
-
273
- class APIPromptExpander(PromptExpander):
274
- def __init__(self, api_config=None, **kwargs):
275
- super().__init__(backend="api", **kwargs)
276
- self.api_config = api_config or {}
277
- self.client = self._init_api_client()
278
-
279
- def _init_api_client(self):
280
- try:
281
- from openai import OpenAI
282
-
283
- api_key = self.api_config.get("api_key") or DASHSCOPE_API_KEY
284
- base_url = self.api_config.get("base_url", "https://dashscope.aliyuncs.com/compatible-mode/v1")
285
-
286
- if not api_key:
287
- print("Warning: DASHSCOPE_API_KEY not found.")
288
- return None
289
-
290
- return OpenAI(api_key=api_key, base_url=base_url)
291
- except ImportError:
292
- print("Please install openai: pip install openai")
293
- return None
294
- except Exception as e:
295
- print(f"Failed to initialize API client: {e}")
296
- return None
297
-
298
- def __call__(self, prompt, system_prompt=None, seed=-1, **kwargs):
299
- return self.extend(prompt, system_prompt, seed, **kwargs)
300
-
301
- def extend(self, prompt, system_prompt=None, seed=-1, **kwargs):
302
- if self.client is None:
303
- return PromptOutput(False, "", seed, system_prompt, "API client not initialized")
304
-
305
- if system_prompt is None:
306
- system_prompt = self.decide_system_prompt()
307
-
308
- if "{prompt}" in system_prompt:
309
- system_prompt = system_prompt.format(prompt=prompt)
310
- prompt = " "
311
-
312
- try:
313
- model = self.api_config.get("model", "qwen3-max-preview")
314
- response = self.client.chat.completions.create(
315
- model=model,
316
- messages=[{"role": "system", "content": system_prompt}, {"role": "user", "content": prompt}],
317
- temperature=0.7,
318
- top_p=0.8,
319
- )
320
-
321
- content = response.choices[0].message.content
322
- json_start = content.find("```json")
323
- if json_start != -1:
324
- json_end = content.find("```", json_start + 7)
325
- try:
326
- json_str = content[json_start + 7 : json_end].strip()
327
- data = json.loads(json_str)
328
- expanded_prompt = data.get("revised_prompt", content)
329
- except:
330
- expanded_prompt = content
331
- else:
332
- expanded_prompt = content
333
-
334
- return PromptOutput(
335
- status=True, prompt=expanded_prompt, seed=seed, system_prompt=system_prompt, message=content
336
- )
337
- except Exception as e:
338
- return PromptOutput(False, "", seed, system_prompt, str(e))
339
-
340
-
341
- def create_prompt_expander(backend="api", **kwargs):
342
- if backend == "api":
343
- return APIPromptExpander(**kwargs)
344
- raise ValueError("Only 'api' backend is supported.")
345
-
346
-
347
  pipe = None
348
- prompt_expander = None
349
 
350
 
351
  def init_app():
352
- global pipe, prompt_expander
353
 
354
  try:
355
  pipe = load_models(MODEL_PATH, enable_compile=ENABLE_COMPILE, attention_backend=ATTENTION_BACKEND)
@@ -365,30 +244,6 @@ def init_app():
365
  print(f"Error loading model: {e}")
366
  pipe = None
367
 
368
- try:
369
- prompt_expander = create_prompt_expander(backend="api", api_config={"model": "qwen3-max-preview"})
370
- print("Prompt expander initialized.")
371
- except Exception as e:
372
- print(f"Error initializing prompt expander: {e}")
373
- prompt_expander = None
374
-
375
-
376
- def prompt_enhance(prompt, enable_enhance):
377
- if not enable_enhance or not prompt_expander:
378
- return prompt, "Enhancement disabled or not available."
379
-
380
- if not prompt.strip():
381
- return "", "Please enter a prompt."
382
-
383
- try:
384
- result = prompt_expander(prompt)
385
- if result.status:
386
- return result.prompt, result.message
387
- else:
388
- return prompt, f"Enhancement failed: {result.message}"
389
- except Exception as e:
390
- return prompt, f"Error: {str(e)}"
391
-
392
 
393
  @spaces.GPU
394
  def generate(
@@ -399,32 +254,10 @@ def generate(
399
  shift=3.0,
400
  random_seed=True,
401
  gallery_images=None,
402
- enhance=False,
403
  progress=gr.Progress(track_tqdm=True),
404
  ):
405
  """
406
  Generate an image using the Z-Image model based on the provided prompt and settings.
407
-
408
- This function is triggered when the user clicks the "Generate" button. It processes
409
- the input prompt (optionally enhancing it), configures generation parameters, and
410
- produces an image using the Z-Image diffusion transformer pipeline.
411
-
412
- Args:
413
- prompt (str): Text prompt describing the desired image content
414
- resolution (str): Output resolution in format "WIDTHxHEIGHT ( RATIO )" (e.g., "1024x1024 ( 1:1 )")
415
- seed (int): Seed for reproducible generation
416
- steps (int): Number of inference steps for the diffusion process
417
- shift (float): Time shift parameter for the flow matching scheduler
418
- random_seed (bool): Whether to generate a new random seed, if True will ignore the seed input
419
- gallery_images (list): List of previously generated images to append to (only needed for the Gradio UI)
420
- enhance (bool): This was Whether to enhance the prompt (DISABLED! Do not use)
421
- progress (gr.Progress): Gradio progress tracker for displaying generation progress (only needed for the Gradio UI)
422
-
423
- Returns:
424
- tuple: (gallery_images, seed_str, seed_int)
425
- - gallery_images: Updated list of generated images including the new image
426
- - seed_str: String representation of the seed used for generation
427
- - seed_int: Integer representation of the seed used for generation
428
  """
429
 
430
  if random_seed:
@@ -432,57 +265,27 @@ def generate(
432
  else:
433
  new_seed = seed if seed != -1 else random.randint(1, 1000000)
434
 
435
- class UnsafeContentError(Exception):
436
- pass
437
 
438
  try:
439
- if pipe is None:
440
- raise gr.Error("Model not loaded.")
441
-
442
- has_unsafe_concept = is_unsafe_prompt(
443
- pipe.text_encoder,
444
- pipe.tokenizer,
445
- system_prompt=UNSAFE_PROMPT_CHECK,
446
- user_prompt=prompt,
447
- max_new_token=UNSAFE_MAX_NEW_TOKEN,
448
- )
449
- if has_unsafe_concept:
450
- raise UnsafeContentError("Input unsafe")
451
-
452
- final_prompt = prompt
453
-
454
- if enhance:
455
- final_prompt, _ = prompt_enhance(prompt, True)
456
- print(f"Enhanced prompt: {final_prompt}")
457
-
458
- try:
459
- resolution_str = resolution.split(" ")[0]
460
- except:
461
- resolution_str = "1024x1024"
462
-
463
- image = generate_image(
464
- pipe=pipe,
465
- prompt=final_prompt,
466
- resolution=resolution_str,
467
- seed=new_seed,
468
- guidance_scale=0.0,
469
- num_inference_steps=int(steps + 1),
470
- shift=shift,
471
- )
472
 
473
- safety_checker_input = pipe.safety_feature_extractor([image], return_tensors="pt").pixel_values.cuda()
474
- _, has_nsfw_concept = pipe.safety_checker(images=[torch.zeros(1)], clip_input=safety_checker_input)
475
- has_nsfw_concept = has_nsfw_concept[0]
476
- if has_nsfw_concept:
477
- raise UnsafeContentError("input unsafe")
478
-
479
- except UnsafeContentError:
480
- image = Image.open("nsfw.png")
 
481
 
482
  if gallery_images is None:
483
  gallery_images = []
484
- # gallery_images.append(image)
485
- gallery_images = [image] + gallery_images # latest output to be at the top of the list
486
 
487
  return gallery_images, str(new_seed), int(new_seed)
488
 
@@ -490,30 +293,21 @@ def generate(
490
  init_app()
491
 
492
  # ==================== AoTI (Ahead of Time Inductor compilation) ====================
493
-
494
  pipe.transformer.layers._repeated_blocks = ["ZImageTransformerBlock"]
495
  spaces.aoti_blocks_load(pipe.transformer.layers, "zerogpu-aoti/Z-Image", variant="fa3")
496
 
497
  with gr.Blocks(title="Z-Image Demo") as demo:
498
  gr.Markdown(
499
  """<div align="center">
500
-
501
  # Z-Image Generation Demo
502
-
503
  [![GitHub](https://img.shields.io/badge/GitHub-Z--Image-181717?logo=github&logoColor=white)](https://github.com/Tongyi-MAI/Z-Image)
504
-
505
  *An Efficient Image Generation Foundation Model with Single-Stream Diffusion Transformer*
506
-
507
  </div>"""
508
  )
509
 
510
  with gr.Row():
511
  with gr.Column(scale=1):
512
  prompt_input = gr.Textbox(label="Prompt", lines=3, placeholder="Enter your prompt here...")
513
- # PE components (Temporarily disabled)
514
- # with gr.Row():
515
- # enable_enhance = gr.Checkbox(label="Enhance Prompt (DashScope)", value=False)
516
- # enhance_btn = gr.Button("Enhance Only")
517
 
518
  with gr.Row():
519
  choices = [int(k) for k in RES_CHOICES.keys()]
@@ -534,7 +328,6 @@ with gr.Blocks(title="Z-Image Demo") as demo:
534
 
535
  generate_btn = gr.Button("Generate", variant="primary")
536
 
537
- # Example prompts
538
  gr.Markdown("### 📝 Example Prompts")
539
  gr.Examples(examples=EXAMPLE_PROMPTS, inputs=prompt_input, label=None)
540
 
@@ -559,13 +352,6 @@ with gr.Blocks(title="Z-Image Demo") as demo:
559
 
560
  res_cat.change(update_res_choices, inputs=res_cat, outputs=resolution, api_visibility="private")
561
 
562
- # PE enhancement button (Temporarily disabled)
563
- # enhance_btn.click(
564
- # prompt_enhance,
565
- # inputs=[prompt_input, enable_enhance],
566
- # outputs=[prompt_input, final_prompt_output]
567
- # )
568
-
569
  generate_btn.click(
570
  generate,
571
  inputs=[prompt_input, resolution, seed, steps, shift, random_seed, output_gallery],
@@ -576,5 +362,6 @@ with gr.Blocks(title="Z-Image Demo") as demo:
576
  css = """
577
  .fillable{max-width: 1230px !important}
578
  """
 
579
  if __name__ == "__main__":
580
  demo.launch(css=css, mcp_server=True)
 
1
  import spaces
 
 
 
2
  import os
3
  import random
4
  import re
5
  import sys
6
  import warnings
7
+ import logging
8
 
9
  from PIL import Image
10
  from diffusers import AutoencoderKL, FlowMatchEulerDiscreteScheduler
 
12
  import torch
13
  from transformers import AutoModelForCausalLM, AutoTokenizer
14
 
 
 
15
  sys.path.append(os.path.dirname(os.path.abspath(__file__)))
16
 
17
  from diffusers import ZImagePipeline
18
  from diffusers.models.transformers.transformer_z_image import ZImageTransformer2DModel
19
 
 
 
20
  # ==================== Environment Variables ==================================
21
  MODEL_PATH = os.environ.get("MODEL_PATH", "Tongyi-MAI/Z-Image-Turbo")
22
  ENABLE_COMPILE = os.environ.get("ENABLE_COMPILE", "true").lower() == "true"
23
  ENABLE_WARMUP = os.environ.get("ENABLE_WARMUP", "true").lower() == "true"
24
  ATTENTION_BACKEND = os.environ.get("ATTENTION_BACKEND", "flash_3")
25
+ # HF_TOKEN = os.environ.get("HF_TOKEN")
 
 
 
26
  # =============================================================================
27
 
 
28
  os.environ["TOKENIZERS_PARALLELISM"] = "false"
29
  warnings.filterwarnings("ignore")
30
  logging.getLogger("transformers").setLevel(logging.ERROR)
 
86
  [
87
  "Young Chinese woman in red Hanfu, intricate embroidery. Impeccable makeup, red floral forehead pattern. Elaborate high bun, golden phoenix headdress, red flowers, beads. Holds round folding fan with lady, trees, bird. Neon lightning-bolt lamp (⚡️), bright yellow glow, above extended left palm. Soft-lit outdoor night background, silhouetted tiered pagoda (西安大雁塔), blurred colorful distant lights."
88
  ],
 
 
 
 
 
 
 
 
 
89
  ]
90
 
91
 
 
167
 
168
  pipe.to("cuda", torch.bfloat16)
169
 
 
 
 
 
 
 
 
 
 
170
  return pipe
171
 
172
 
 
224
  print("Warmup completed.")
225
 
226
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227
  pipe = None
 
228
 
229
 
230
  def init_app():
231
+ global pipe
232
 
233
  try:
234
  pipe = load_models(MODEL_PATH, enable_compile=ENABLE_COMPILE, attention_backend=ATTENTION_BACKEND)
 
244
  print(f"Error loading model: {e}")
245
  pipe = None
246
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
 
248
  @spaces.GPU
249
  def generate(
 
254
  shift=3.0,
255
  random_seed=True,
256
  gallery_images=None,
 
257
  progress=gr.Progress(track_tqdm=True),
258
  ):
259
  """
260
  Generate an image using the Z-Image model based on the provided prompt and settings.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
261
  """
262
 
263
  if random_seed:
 
265
  else:
266
  new_seed = seed if seed != -1 else random.randint(1, 1000000)
267
 
268
+ if pipe is None:
269
+ raise gr.Error("Model not loaded.")
270
 
271
  try:
272
+ resolution_str = resolution.split(" ")[0]
273
+ except:
274
+ resolution_str = "1024x1024"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
275
 
276
+ image = generate_image(
277
+ pipe=pipe,
278
+ prompt=prompt,
279
+ resolution=resolution_str,
280
+ seed=new_seed,
281
+ guidance_scale=0.0,
282
+ num_inference_steps=int(steps + 1),
283
+ shift=shift,
284
+ )
285
 
286
  if gallery_images is None:
287
  gallery_images = []
288
+ gallery_images = [image] + gallery_images
 
289
 
290
  return gallery_images, str(new_seed), int(new_seed)
291
 
 
293
  init_app()
294
 
295
  # ==================== AoTI (Ahead of Time Inductor compilation) ====================
 
296
  pipe.transformer.layers._repeated_blocks = ["ZImageTransformerBlock"]
297
  spaces.aoti_blocks_load(pipe.transformer.layers, "zerogpu-aoti/Z-Image", variant="fa3")
298
 
299
  with gr.Blocks(title="Z-Image Demo") as demo:
300
  gr.Markdown(
301
  """<div align="center">
 
302
  # Z-Image Generation Demo
 
303
  [![GitHub](https://img.shields.io/badge/GitHub-Z--Image-181717?logo=github&logoColor=white)](https://github.com/Tongyi-MAI/Z-Image)
 
304
  *An Efficient Image Generation Foundation Model with Single-Stream Diffusion Transformer*
 
305
  </div>"""
306
  )
307
 
308
  with gr.Row():
309
  with gr.Column(scale=1):
310
  prompt_input = gr.Textbox(label="Prompt", lines=3, placeholder="Enter your prompt here...")
 
 
 
 
311
 
312
  with gr.Row():
313
  choices = [int(k) for k in RES_CHOICES.keys()]
 
328
 
329
  generate_btn = gr.Button("Generate", variant="primary")
330
 
 
331
  gr.Markdown("### 📝 Example Prompts")
332
  gr.Examples(examples=EXAMPLE_PROMPTS, inputs=prompt_input, label=None)
333
 
 
352
 
353
  res_cat.change(update_res_choices, inputs=res_cat, outputs=resolution, api_visibility="private")
354
 
 
 
 
 
 
 
 
355
  generate_btn.click(
356
  generate,
357
  inputs=[prompt_input, resolution, seed, steps, shift, random_seed, output_gallery],
 
362
  css = """
363
  .fillable{max-width: 1230px !important}
364
  """
365
+
366
  if __name__ == "__main__":
367
  demo.launch(css=css, mcp_server=True)