ljleb / prompt-fusion-extension

auto1111 webui extension for all sorts of prompt interpolations!
MIT License
259 stars 16 forks source link

AttributeError: 'list' object has no attribute 'end_at_step' #67

Closed pmcculler closed 10 months ago

pmcculler commented 10 months ago

Haven't isolated the cause yet.

Traceback (most recent call last):
  File "D:\Users\pmccu\stable-diffusion-webui\modules\call_queue.py", line 57, in f
    res = list(func(*args, **kwargs))
  File "D:\Users\pmccu\stable-diffusion-webui\modules\call_queue.py", line 36, in f
    res = func(*args, **kwargs)
  File "D:\Users\pmccu\stable-diffusion-webui\modules\txt2img.py", line 55, in txt2img
    processed = processing.process_images(p)
  File "D:\Users\pmccu\stable-diffusion-webui\modules\processing.py", line 732, in process_images
    res = process_images_inner(p)
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-webui-controlnet\scripts\batch_hijack.py", line 42, in processing_process_images_hijack
    return getattr(processing, '__controlnet_original_process_images_inner')(p, *args, **kwargs)
  File "D:\Users\pmccu\stable-diffusion-webui\modules\processing.py", line 856, in process_images_inner
    p.setup_conds()
  File "D:\Users\pmccu\stable-diffusion-webui\modules\processing.py", line 1309, in setup_conds
    super().setup_conds()
  File "D:\Users\pmccu\stable-diffusion-webui\modules\processing.py", line 470, in setup_conds
    self.c = self.get_conds_with_caching(prompt_parser.get_multicond_learned_conditioning, prompts, total_steps, [self.cached_c], self.extra_network_data)
  File "D:\Users\pmccu\stable-diffusion-webui\modules\processing.py", line 455, in get_conds_with_caching
    cache[1] = function(shared.sd_model, required_prompts, steps, hires_steps, shared.opts.use_old_scheduling)
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-prompt-fusion-extension\lib_prompt_fusion\hijacker.py", line 12, in wrapper
    return function(*args, **kwargs, original_function=self.__original_functions[attribute])
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-prompt-fusion-extension\scripts\promptlang.py", line 91, in _hijacked_get_multicond_learned_conditioning
    res = original_function(*args, **kwargs)
  File "D:\Users\pmccu\stable-diffusion-webui\modules\prompt_parser.py", line 262, in get_multicond_learned_conditioning
    learned_conditioning = get_learned_conditioning(model, prompt_flat_list, steps, hires_steps, use_old_scheduling)
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-prompt-fusion-extension\lib_prompt_fusion\hijacker.py", line 12, in wrapper
    return function(*args, **kwargs, original_function=self.__original_functions[attribute])
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-prompt-fusion-extension\scripts\promptlang.py", line 69, in _hijacked_get_learned_conditioning
    schedules = [_sample_tensor_schedules(cond_tensor, real_total_steps, is_hires=hires_steps is not None)
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-prompt-fusion-extension\scripts\promptlang.py", line 69, in <listcomp>
    schedules = [_sample_tensor_schedules(cond_tensor, real_total_steps, is_hires=hires_steps is not None)
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-prompt-fusion-extension\scripts\promptlang.py", line 126, in _sample_tensor_schedules
    schedule_cond = tensor.interpolate(params, origin_cond)
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-prompt-fusion-extension\lib_prompt_fusion\interpolation_tensor.py", line 22, in interpolate
    cond = self.interpolate_rec(params, 0, origin_cond)
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-prompt-fusion-extension\lib_prompt_fusion\interpolation_tensor.py", line 42, in interpolate_rec
    control_points = [
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-prompt-fusion-extension\lib_prompt_fusion\interpolation_tensor.py", line 43, in <listcomp>
    InterpolationTensor(sub_tensor, self.__interpolation_functions, self.__empty_cond).interpolate_rec(params, axis + 1, origin_cond)
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-prompt-fusion-extension\lib_prompt_fusion\interpolation_tensor.py", line 42, in interpolate_rec
    control_points = [
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-prompt-fusion-extension\lib_prompt_fusion\interpolation_tensor.py", line 43, in <listcomp>
    InterpolationTensor(sub_tensor, self.__interpolation_functions, self.__empty_cond).interpolate_rec(params, axis + 1, origin_cond)
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-prompt-fusion-extension\lib_prompt_fusion\interpolation_tensor.py", line 48, in interpolate_rec
    control_points[i] = InterpolationTensor(control_points[i], nested_functions, self.__empty_cond).interpolate_rec(params, 0, origin_cond)
  File "D:\Users\pmccu\stable-diffusion-webui\extensions\sd-prompt-fusion-extension\lib_prompt_fusion\interpolation_tensor.py", line 33, in interpolate_rec
    if schedule.end_at_step >= params.step:
AttributeError: 'list' object has no attribute 'end_at_step'
pmcculler commented 10 months ago

Have a repro.

[👨‍👨‍👧‍👦:Persimmon:➰: , .1, 0.4:catmull],

Either line independently works fine. Together, error every time.

ljleb commented 10 months ago

I can reproduce, I'll try to find the cause. I guess one way to fix this would be to introduce classes to make the interpolation tensor builder more reliable.

ljleb commented 10 months ago

This works:

[[a : b : , 0.3] : c : , 0.4],
[a : b : c : , .1, 0.4]

But this does not:

[a : b : c : , .1, 0.4],
[[a : b : , 0.3] : c : , 0.4]

Basically, nested interpolations seem to only work when they appear in the first interpolation. I think the code is missing one case. I tested on earlier versions, this bug has been there for a while.

ljleb commented 10 months ago

Tested using this prompt:

$e = 0.5

[magnificent strangescape : [vast space : dark forest : , $e] : , $e]
[[beautiful sunflower : [shy turnip : angry rose : , $e] : , $e] [sunshine : moonlight : , $e] : shining light : , $e]

It should work with any nesting level now.