diff --git a/CHANGELOG.md b/CHANGELOG.md
index 286cf5776..3fade3459 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
# Change Log for SD.Next
+## Update for 2026-01-21
+
+- add `SD_DEVICE_DEBUG` env variable to trace rocm/xpu/directml init failures
+- fix `all_seeds`
+- improve `wrap_gradio` error handling
+
## Update for 2026-01-20
### Highlights for 2026-01-20
diff --git a/modules/call_queue.py b/modules/call_queue.py
index 7ed03e5b9..ebfe58f0f 100644
--- a/modules/call_queue.py
+++ b/modules/call_queue.py
@@ -37,7 +37,6 @@ def wrap_gradio_gpu_call(func, extra_outputs=None, name=None):
id_task = None
with get_lock():
progress.start_task(id_task)
- res = [None, '', '', '']
try:
res = func(*args, **kwargs)
progress.record_results(id_task, res)
@@ -45,7 +44,8 @@ def wrap_gradio_gpu_call(func, extra_outputs=None, name=None):
shared.log.error(f"Exception: {e}")
shared.log.error(f"Arguments: args={str(args)[:10240]} kwargs={str(kwargs)[:10240]}")
errors.display(e, 'gradio call')
- res[-1] = f"
{html.escape(str(e))}
"
+ res = extra_outputs or []
+ res.append(f"{html.escape(str(e))}
")
finally:
progress.finish_task(id_task)
return res
@@ -70,7 +70,8 @@ def wrap_gradio_call(func, extra_outputs=None, add_stats=False, name=None):
if res is None:
msg = "No result returned from function"
shared.log.warning(msg)
- res = [None, '', '', f"{html.escape(msg)}
"]
+ res = extra_outputs_array or []
+ res.append(f"{html.escape(msg)}
")
else:
res = list(res)
if shared.cmd_opts.profile:
@@ -78,9 +79,8 @@ def wrap_gradio_call(func, extra_outputs=None, add_stats=False, name=None):
errors.profile(pr, 'Wrap')
except Exception as e:
errors.display(e, 'gradio call')
- if extra_outputs_array is None:
- extra_outputs_array = [None, '']
- res = extra_outputs_array + [f"{html.escape(type(e).__name__+': '+str(e))}
"]
+ res = extra_outputs_array or []
+ res.append(f"{html.escape(type(e).__name__+': '+str(e))}
")
shared.state.end(jobid)
if not add_stats:
return tuple(res)
diff --git a/modules/video_models/video_run.py b/modules/video_models/video_run.py
index 8f478fa15..a8603679a 100644
--- a/modules/video_models/video_run.py
+++ b/modules/video_models/video_run.py
@@ -11,6 +11,7 @@ debug = shared.log.trace if os.environ.get('SD_VIDEO_DEBUG', None) is not None e
def generate(*args, **kwargs):
task_id, ui_state, engine, model, prompt, negative, styles, width, height, frames, steps, sampler_index, sampler_shift, dynamic_shift, seed, guidance_scale, guidance_true, init_image, init_strength, last_image, vae_type, vae_tile_frames, mp4_fps, mp4_interpolate, mp4_codec, mp4_ext, mp4_opt, mp4_video, mp4_frames, mp4_sf, vlm_enhance, vlm_model, vlm_system_prompt, override_settings = args
+
if engine is None or model is None or engine == 'None' or model == 'None':
return video_utils.queue_err('model not selected')
# videojob = shared.state.begin('Video')
diff --git a/modules/video_models/video_ui.py b/modules/video_models/video_ui.py
index de0511d64..fdcefec46 100644
--- a/modules/video_models/video_ui.py
+++ b/modules/video_models/video_ui.py
@@ -190,7 +190,7 @@ def create_ui(prompt, negative, styles, overrides, init_image, init_strength, la
]
video_dict = dict(
- fn=call_queue.wrap_gradio_gpu_call(video_run.generate, extra_outputs=[None, '', ''], name='Video'),
+ fn=call_queue.wrap_gradio_gpu_call(video_run.generate, extra_outputs=[gr.update(), gr.update(), gr.update(), gr.update()], name='Video'),
_js="submit_video",
inputs=state_inputs + video_inputs,
outputs=video_outputs,