From 7e468bf7415831bf8307406af1f42facae3930fd Mon Sep 17 00:00:00 2001
From: zhonggang <54022200+zhonggang666@users.noreply.github.com>
Date: Thu, 9 Jul 2026 17:27:44 +0800
Subject: [PATCH] fix: add generated media download timeouts
---
.../impl/base_image_generate_node.py | 7 ++++++-
.../impl/base_image_to_video_node.py | 7 ++++++-
.../impl/base_text_to_video_node.py | 7 ++++++-
3 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/apps/application/flow/step_node/image_generate_step_node/impl/base_image_generate_node.py b/apps/application/flow/step_node/image_generate_step_node/impl/base_image_generate_node.py
index 281122364be..511237d11b7 100644
--- a/apps/application/flow/step_node/image_generate_step_node/impl/base_image_generate_node.py
+++ b/apps/application/flow/step_node/image_generate_step_node/impl/base_image_generate_node.py
@@ -14,6 +14,9 @@
from oss.serializers.file import FileSerializer
+GENERATED_MEDIA_DOWNLOAD_TIMEOUT = 30
+
+
class BaseImageGenerateNode(IImageGenerateNode):
def save_context(self, details, workflow_manage):
self.context['answer'] = details.get('answer')
@@ -59,7 +62,9 @@ def execute(self, model_id, prompt, negative_prompt, dialogue_number, dialogue_t
if isinstance(image_url, str):
if image_url.startswith('http'):
# HTTP URL 情况
- image_url = requests.get(image_url).content
+ response = requests.get(image_url, timeout=GENERATED_MEDIA_DOWNLOAD_TIMEOUT)
+ response.raise_for_status()
+ image_url = response.content
elif image_url.startswith('data:image'):
# Data URL 格式 (data:image/png;base64,...)
import base64
diff --git a/apps/application/flow/step_node/image_to_video_step_node/impl/base_image_to_video_node.py b/apps/application/flow/step_node/image_to_video_step_node/impl/base_image_to_video_node.py
index b59147323b9..7034fe62d90 100644
--- a/apps/application/flow/step_node/image_to_video_step_node/impl/base_image_to_video_node.py
+++ b/apps/application/flow/step_node/image_to_video_step_node/impl/base_image_to_video_node.py
@@ -16,6 +16,9 @@
from models_provider.tools import get_model_instance_by_model_workspace_id
+GENERATED_MEDIA_DOWNLOAD_TIMEOUT = 30
+
+
class BaseImageToVideoNode(IImageToVideoNode):
def save_context(self, details, workflow_manage):
self.context['answer'] = details.get('answer')
@@ -64,7 +67,9 @@ def execute(self, model_id, prompt, negative_prompt, dialogue_number, dialogue_t
return NodeResult({'answer': gettext('Failed to generate video')}, {})
file_name = 'generated_video.mp4'
if isinstance(video_urls, str) and video_urls.startswith('http'):
- video_urls = requests.get(video_urls).content
+ response = requests.get(video_urls, timeout=GENERATED_MEDIA_DOWNLOAD_TIMEOUT)
+ response.raise_for_status()
+ video_urls = response.content
file = bytes_to_uploaded_file(video_urls, file_name)
file_url = self.upload_file(file)
video_label = f''
diff --git a/apps/application/flow/step_node/text_to_video_step_node/impl/base_text_to_video_node.py b/apps/application/flow/step_node/text_to_video_step_node/impl/base_text_to_video_node.py
index 806aa0116db..b04178c6cbe 100644
--- a/apps/application/flow/step_node/text_to_video_step_node/impl/base_text_to_video_node.py
+++ b/apps/application/flow/step_node/text_to_video_step_node/impl/base_text_to_video_node.py
@@ -15,6 +15,9 @@
from django.utils.translation import gettext_lazy as _, gettext
+GENERATED_MEDIA_DOWNLOAD_TIMEOUT = 30
+
+
class BaseTextToVideoNode(ITextToVideoNode):
def save_context(self, details, workflow_manage):
self.context['answer'] = details.get('answer')
@@ -57,7 +60,9 @@ def execute(self, model_id, prompt, negative_prompt, dialogue_number, dialogue_t
return NodeResult({'answer': gettext('Failed to generate video')}, {})
file_name = 'generated_video.mp4'
if isinstance(video_urls, str) and video_urls.startswith('http'):
- video_urls = requests.get(video_urls).content
+ response = requests.get(video_urls, timeout=GENERATED_MEDIA_DOWNLOAD_TIMEOUT)
+ response.raise_for_status()
+ video_urls = response.content
file = bytes_to_uploaded_file(video_urls, file_name)
file_url = self.upload_file(file)
video_label = f''