From 0b8001c0fad640f104b3c90e1d2f2349bb17c867 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Fri, 25 Jul 2025 12:38:25 -0400 Subject: [PATCH] prompt error handling Signed-off-by: Vladimir Mandic --- modules/processing_args.py | 41 +++++++++++++++++------------- modules/prompt_parser_diffusers.py | 4 +-- modules/ui_common.py | 1 + 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/modules/processing_args.py b/modules/processing_args.py index 75b5cd03a..24ea8e6e5 100644 --- a/modules/processing_args.py +++ b/modules/processing_args.py @@ -157,7 +157,7 @@ def set_pipeline_args(p, model, prompts:list, negative_prompts:list, prompts_2:t 'StableCascade' in model.__class__.__name__ or 'Flux' in model.__class__.__name__ or 'Chroma' in model.__class__.__name__ or - 'HiDreamImagePipeline' in model.__class__.__name__ # hidream-e1 has different embeds + 'HiDreamImagePipeline' in model.__class__.__name__ ): try: prompt_parser_diffusers.embedder = prompt_parser_diffusers.PromptEmbedder(prompts, negative_prompts, steps, clip_skip, p) @@ -173,23 +173,28 @@ def set_pipeline_args(p, model, prompts:list, negative_prompts:list, prompts_2:t if 'prompt' in possible: if 'OmniGen' in model.__class__.__name__: prompts = [p.replace('|image|', '<|image_1|>') for p in prompts] - if 'HiDreamImage' in model.__class__.__name__ and prompt_parser_diffusers.embedder is not None: + if ('HiDreamImage' in model.__class__.__name__) and (prompt_parser_diffusers.embedder is not None): args['pooled_prompt_embeds'] = prompt_parser_diffusers.embedder('positive_pooleds') prompt_embeds = prompt_parser_diffusers.embedder('prompt_embeds') args['prompt_embeds_t5'] = prompt_embeds[0] args['prompt_embeds_llama3'] = prompt_embeds[1] - elif hasattr(model, 'text_encoder') and hasattr(model, 'tokenizer') and 'prompt_embeds' in possible and prompt_parser_diffusers.embedder is not None: - args['prompt_embeds'] = prompt_parser_diffusers.embedder('prompt_embeds') - if 'StableCascade' in model.__class__.__name__: - args['prompt_embeds_pooled'] = prompt_parser_diffusers.embedder('positive_pooleds').unsqueeze(0) - elif 'XL' in model.__class__.__name__: - args['pooled_prompt_embeds'] = prompt_parser_diffusers.embedder('positive_pooleds') - elif 'StableDiffusion3' in model.__class__.__name__: - args['pooled_prompt_embeds'] = prompt_parser_diffusers.embedder('positive_pooleds') - elif 'Flux' in model.__class__.__name__: - args['pooled_prompt_embeds'] = prompt_parser_diffusers.embedder('positive_pooleds') - elif 'Chroma' in model.__class__.__name__: - args['prompt_attention_mask'] = prompt_parser_diffusers.embedder('prompt_attention_masks') + elif hasattr(model, 'text_encoder') and hasattr(model, 'tokenizer') and ('prompt_embeds' in possible) and (prompt_parser_diffusers.embedder is not None): + embeds = prompt_parser_diffusers.embedder('prompt_embeds') + if embeds is None: + shared.log.warning('Prompt parser encode: empty prompt embeds') + args['prompt'] = prompts + else: + args['prompt_embeds'] = embeds + if 'StableCascade' in model.__class__.__name__: + args['prompt_embeds_pooled'] = prompt_parser_diffusers.embedder('positive_pooleds').unsqueeze(0) + elif 'XL' in model.__class__.__name__: + args['pooled_prompt_embeds'] = prompt_parser_diffusers.embedder('positive_pooleds') + elif 'StableDiffusion3' in model.__class__.__name__: + args['pooled_prompt_embeds'] = prompt_parser_diffusers.embedder('positive_pooleds') + elif 'Flux' in model.__class__.__name__: + args['pooled_prompt_embeds'] = prompt_parser_diffusers.embedder('positive_pooleds') + elif 'Chroma' in model.__class__.__name__: + args['prompt_attention_mask'] = prompt_parser_diffusers.embedder('prompt_attention_masks') else: args['prompt'] = prompts if 'negative_prompt' in possible: @@ -406,11 +411,13 @@ def set_pipeline_args(p, model, prompts:list, negative_prompts:list, prompts_2:t clean['generator'] = f'{generator[0].device}:{[g.initial_seed() for g in generator]}' clean['parser'] = parser for k, v in clean.copy().items(): - if isinstance(v, torch.Tensor) or isinstance(v, np.ndarray): + if v is None: + clean[k] = None + elif isinstance(v, torch.Tensor) or isinstance(v, np.ndarray): clean[k] = v.shape - if isinstance(v, list) and len(v) > 0 and (isinstance(v[0], torch.Tensor) or isinstance(v[0], np.ndarray)): + elif isinstance(v, list) and len(v) > 0 and (isinstance(v[0], torch.Tensor) or isinstance(v[0], np.ndarray)): clean[k] = [x.shape for x in v] - if not debug_enabled and k.endswith('_embeds'): + elif not debug_enabled and k.endswith('_embeds'): del clean[k] clean['prompt'] = 'embeds' task = str(sd_models.get_diffusers_task(model)).replace('DiffusersTaskType.', '') diff --git a/modules/prompt_parser_diffusers.py b/modules/prompt_parser_diffusers.py index b0c46d71b..acf0b2bf9 100644 --- a/modules/prompt_parser_diffusers.py +++ b/modules/prompt_parser_diffusers.py @@ -249,8 +249,8 @@ class PromptEmbedder: except IndexError: res.append(batch[i][0]) # if not scheduled, return default return torch.cat(res) - except Exception: - pass + except Exception as e: + shared.log.error(f"Prompt encode: {e}") return None diff --git a/modules/ui_common.py b/modules/ui_common.py index 299f8d751..314d9f031 100644 --- a/modules/ui_common.py +++ b/modules/ui_common.py @@ -178,6 +178,7 @@ def save_files(js_data, files, html_info, index): prompt = p.all_prompts[i] fullfn, txt_fullfn, _exif = images.save_image(image, shared.opts.outdir_save, "", seed=seed, prompt=prompt, info=info, extension=shared.opts.samples_format, grid=is_grid, p=p) except Exception as e: + fullfn, txt_fullfn = None, None shared.log.error(f'Save: image={image} i={i} seeds={p.all_seeds} prompts={p.all_prompts}') errors.display(e, 'save') if fullfn is None: