From 744da21aced219e122634b2296baa661787c2ab9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com>
Date: Fri, 24 Apr 2026 15:00:52 +0800
Subject: [PATCH 01/12] perf: Handle failed requests
---
.../impl/base_image_generate_node.py | 6 ++++--
.../impl/base_image_to_video_node.py | 12 +++++++-----
.../impl/base_text_to_video_node.py | 12 +++++++-----
apps/application/serializers/application.py | 8 ++++++--
apps/chat/views/chat.py | 1 +
apps/knowledge/serializers/knowledge_workflow.py | 8 ++++++--
.../impl/aliyun_bai_lian_model_provider/model/tts.py | 1 +
apps/tools/serializers/tool.py | 12 +++++++++---
apps/tools/serializers/tool_workflow.py | 4 +++-
9 files changed, 44 insertions(+), 20 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..7ce3a77bace 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
@@ -54,12 +54,14 @@ def execute(self, model_id, prompt, negative_prompt, dialogue_number, dialogue_t
image_urls = tti_model.generate_image(question, negative_prompt)
# 保存图片
file_urls = []
+ file_name = 'generated_image.png'
for image_url in image_urls:
- file_name = 'generated_image.png'
if isinstance(image_url, str):
if image_url.startswith('http'):
# HTTP URL 情况
- image_url = requests.get(image_url).content
+ res = requests.get(image_url)
+ res.raise_for_status()
+ image_url = res.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 97acad76337..ea2645a9252 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
@@ -59,14 +59,16 @@ def execute(self, model_id, prompt, negative_prompt, dialogue_number, dialogue_t
# 判断是不是 url
first_frame_url = self.get_file_base64(first_frame_url)
last_frame_url = self.get_file_base64(last_frame_url)
- video_urls = ttv_model.generate_video(question, negative_prompt, first_frame_url, last_frame_url)
+ video_url = ttv_model.generate_video(question, negative_prompt, first_frame_url, last_frame_url)
# 保存图片
- if video_urls is None or video_urls == '':
+ if video_url is None or video_url == '':
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
- file = bytes_to_uploaded_file(video_urls, file_name)
+ if isinstance(video_url, str) and video_url.startswith('http'):
+ res = requests.get(video_url)
+ res.raise_for_status()
+ video_url = res.content
+ file = bytes_to_uploaded_file(video_url, file_name)
file_url = self.upload_file(file)
video_label = f''
video_list = [{'file_id': file_url.split('/')[-1], 'file_name': file_name, 'url': file_url}]
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 fd4ae5ad2f3..2afc9663f62 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
@@ -53,14 +53,16 @@ def execute(self, model_id, prompt, negative_prompt, dialogue_number, dialogue_t
self.context['message_list'] = message_list
self.context['dialogue_type'] = dialogue_type
self.context['negative_prompt'] = self.generate_prompt_question(negative_prompt)
- video_urls = ttv_model.generate_video(question, negative_prompt)
+ video_url = ttv_model.generate_video(question, negative_prompt)
# 保存图片
- if video_urls is None:
+ if video_url is None:
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
- file = bytes_to_uploaded_file(video_urls, file_name)
+ if isinstance(video_url, str) and video_url.startswith('http'):
+ res = requests.get(video_url)
+ res.raise_for_status()
+ video_url = res.content
+ file = bytes_to_uploaded_file(video_url, file_name)
file_url = self.upload_file(file)
video_label = f''
video_list = [{'file_id': file_url.split('/')[-1], 'file_name': file_name, 'url': file_url}]
diff --git a/apps/application/serializers/application.py b/apps/application/serializers/application.py
index b47df5f8a5d..de0b1a4767c 100644
--- a/apps/application/serializers/application.py
+++ b/apps/application/serializers/application.py
@@ -523,6 +523,7 @@ def insert_template_workflow(self, instance: Dict):
download_url = work_flow_template.get('downloadUrl')
# 查找匹配的版本名称
res = requests.get(download_url, timeout=5)
+ res.raise_for_status()
app = ApplicationSerializer(
data={'user_id': self.data.get('user_id'), 'workspace_id': self.data.get('workspace_id')}
).import_({
@@ -541,7 +542,8 @@ def insert_template_workflow(self, instance: Dict):
work_flow=work_flow
)
try:
- requests.get(work_flow_template.get('downloadCallbackUrl'), timeout=5)
+ res2 = requests.get(work_flow_template.get('downloadCallbackUrl'), timeout=5)
+ res2.raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
return app
@@ -1136,6 +1138,7 @@ def update_template_workflow(self, instance: Dict, app: Application):
download_url = work_flow_template.get('downloadUrl')
# 查找匹配的版本名称
res = requests.get(download_url, timeout=5)
+ res.raise_for_status()
try:
mk_instance = restricted_loads(res.content)
except Exception as e:
@@ -1185,7 +1188,8 @@ def update_template_workflow(self, instance: Dict, app: Application):
'auth_target_type': AuthTargetType.TOOL.value
}).auth_resource_batch([t.id for t in tool_model_list])
try:
- requests.get(work_flow_template.get('downloadCallbackUrl'), timeout=5)
+ res2 = requests.get(work_flow_template.get('downloadCallbackUrl'), timeout=5)
+ res2.raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
diff --git a/apps/chat/views/chat.py b/apps/chat/views/chat.py
index a18a5ad95dc..3a535a0bc3e 100644
--- a/apps/chat/views/chat.py
+++ b/apps/chat/views/chat.py
@@ -54,6 +54,7 @@ def get(self, request: Request):
allow_redirects=True,
timeout=10
)
+ response.raise_for_status()
content_type = response.headers.get('Content-Type', '').split(';')[0]
# 创建Django流式响应
django_response = StreamingHttpResponse(
diff --git a/apps/knowledge/serializers/knowledge_workflow.py b/apps/knowledge/serializers/knowledge_workflow.py
index 7f131b8f488..25bfc11155e 100644
--- a/apps/knowledge/serializers/knowledge_workflow.py
+++ b/apps/knowledge/serializers/knowledge_workflow.py
@@ -297,6 +297,7 @@ def save_workflow(self, instance: Dict):
download_url = template_instance.get('downloadUrl')
# 查找匹配的版本名称
res = requests.get(download_url, timeout=5)
+ res.raise_for_status()
KnowledgeWorkflowSerializer.Import(data={
'user_id': self.data.get('user_id'),
'workspace_id': self.data.get('workspace_id'),
@@ -304,7 +305,8 @@ def save_workflow(self, instance: Dict):
}).import_({'file': bytes_to_uploaded_file(res.content, 'file.kbwf')}, is_import_tool=True)
try:
- requests.get(template_instance.get('downloadCallbackUrl'), timeout=5)
+ res2 = requests.get(template_instance.get('downloadCallbackUrl'), timeout=5)
+ res2.raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
@@ -523,6 +525,7 @@ def edit(self, instance: Dict):
download_url = template_instance.get('downloadUrl')
# 查找匹配的版本名称
res = requests.get(download_url, timeout=5)
+ res.raise_for_status()
KnowledgeWorkflowSerializer.Import(data={
'user_id': self.data.get('user_id'),
'workspace_id': self.data.get('workspace_id'),
@@ -530,7 +533,8 @@ def edit(self, instance: Dict):
}).import_({'file': bytes_to_uploaded_file(res.content, 'file.kbwf')}, is_import_tool=False)
try:
- requests.get(template_instance.get('downloadCallbackUrl'), timeout=5)
+ res2 = requests.get(template_instance.get('downloadCallbackUrl'), timeout=5)
+ res2.raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
diff --git a/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/tts.py b/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/tts.py
index 5fc6a8153ef..23c5c95ae7d 100644
--- a/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/tts.py
+++ b/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/tts.py
@@ -79,6 +79,7 @@ def text_to_speech(self, text):
}
}
response = requests.post(api_url, headers=headers, json=payload)
+ response.raise_for_status()
audio_hex = response.json().get("output", {}).get("data", {}).get("audio")
if audio_hex:
audio = bytes.fromhex(audio_hex)
diff --git a/apps/tools/serializers/tool.py b/apps/tools/serializers/tool.py
index a807022dfdf..70e4b453d80 100644
--- a/apps/tools/serializers/tool.py
+++ b/apps/tools/serializers/tool.py
@@ -422,6 +422,7 @@ def insert(self, instance, with_valid=True):
download_url = template_instance.get('downloadUrl')
# 查找匹配的版本名称
res = requests.get(download_url, timeout=5)
+ res.raise_for_status()
tool = ToolSerializer.Import(data={
'file': bytes_to_uploaded_file(res.content, 'file.tool'),
'user_id': self.data.get('user_id'),
@@ -430,7 +431,8 @@ def insert(self, instance, with_valid=True):
}).import_(name=instance.get('name'), source='template')
try:
- requests.get(template_instance.get('downloadCallbackUrl'), timeout=5)
+ res2 = requests.get(template_instance.get('downloadCallbackUrl'), timeout=5)
+ res2.raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
return tool
@@ -1149,6 +1151,7 @@ def add(self, instance: Dict, with_valid=True):
(version.get('name') for version in versions if version.get('downloadUrl') == download_url),
)
res = requests.get(download_url, timeout=5)
+ res.raise_for_status()
tool_data = RestrictedUnpickler(io.BytesIO(res.content)).load().tool
tool_id = uuid.uuid7()
# 如果是SKILL类型的工具,保存文件内容到file表,并将code替换为file_id
@@ -1190,7 +1193,8 @@ def add(self, instance: Dict, with_valid=True):
'auth_target_type': AuthTargetType.TOOL.value
}).auth_resource(str(tool_id))
try:
- requests.get(instance.get('download_callback_url'), timeout=5)
+ res2 = requests.get(instance.get('download_callback_url'), timeout=5)
+ res2.raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
return ToolModelSerializer(tool).data
@@ -1216,6 +1220,7 @@ def update_tool(self, with_valid=True):
version.get('downloadUrl') == self.data.get('download_url')),
)
res = requests.get(self.data.get('download_url'), timeout=5)
+ res.raise_for_status()
tool_data = RestrictedUnpickler(io.BytesIO(res.content)).load().tool
# 如果是SKILL类型的工具,保存文件内容到file表,并将code替换为file_id
if tool_data.get('tool_type') == ToolType.SKILL:
@@ -1238,7 +1243,8 @@ def update_tool(self, with_valid=True):
# tool.is_active = False
tool.save()
try:
- requests.get(self.data.get('download_callback_url'), timeout=5)
+ res2 = requests.get(self.data.get('download_callback_url'), timeout=5)
+ res2.raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
return ToolModelSerializer(tool).data
diff --git a/apps/tools/serializers/tool_workflow.py b/apps/tools/serializers/tool_workflow.py
index b592c139c1f..167777c6c28 100644
--- a/apps/tools/serializers/tool_workflow.py
+++ b/apps/tools/serializers/tool_workflow.py
@@ -317,6 +317,7 @@ def edit(self, instance: Dict):
download_url = template_instance.get('downloadUrl')
# 查找匹配的版本名称
res = requests.get(download_url, timeout=5)
+ res.raise_for_status()
tool = QuerySet(Tool).filter(id=self.data.get("tool_id")).first()
ToolSerializer.Import(data={
'user_id': self.data.get('user_id'),
@@ -326,7 +327,8 @@ def edit(self, instance: Dict):
}).update_template_workflow(str(self.data.get('tool_id')))
try:
- requests.get(template_instance.get('downloadCallbackUrl'), timeout=5)
+ res2 = requests.get(template_instance.get('downloadCallbackUrl'), timeout=5)
+ res2.raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
From 140ee5b92c89cfe5cd1ffed7b447f1c44184ee09 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com>
Date: Fri, 24 Apr 2026 15:04:46 +0800
Subject: [PATCH 02/12] =?UTF-8?q?=E7=AE=80=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
apps/application/serializers/application.py | 6 ++----
apps/knowledge/serializers/knowledge_workflow.py | 6 ++----
apps/tools/serializers/tool.py | 9 +++------
apps/tools/serializers/tool_workflow.py | 3 +--
4 files changed, 8 insertions(+), 16 deletions(-)
diff --git a/apps/application/serializers/application.py b/apps/application/serializers/application.py
index de0b1a4767c..6673fee252b 100644
--- a/apps/application/serializers/application.py
+++ b/apps/application/serializers/application.py
@@ -542,8 +542,7 @@ def insert_template_workflow(self, instance: Dict):
work_flow=work_flow
)
try:
- res2 = requests.get(work_flow_template.get('downloadCallbackUrl'), timeout=5)
- res2.raise_for_status()
+ requests.get(work_flow_template.get('downloadCallbackUrl'), timeout=5).raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
return app
@@ -1188,8 +1187,7 @@ def update_template_workflow(self, instance: Dict, app: Application):
'auth_target_type': AuthTargetType.TOOL.value
}).auth_resource_batch([t.id for t in tool_model_list])
try:
- res2 = requests.get(work_flow_template.get('downloadCallbackUrl'), timeout=5)
- res2.raise_for_status()
+ requests.get(work_flow_template.get('downloadCallbackUrl'), timeout=5).raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
diff --git a/apps/knowledge/serializers/knowledge_workflow.py b/apps/knowledge/serializers/knowledge_workflow.py
index 25bfc11155e..4bdf8fec720 100644
--- a/apps/knowledge/serializers/knowledge_workflow.py
+++ b/apps/knowledge/serializers/knowledge_workflow.py
@@ -305,8 +305,7 @@ def save_workflow(self, instance: Dict):
}).import_({'file': bytes_to_uploaded_file(res.content, 'file.kbwf')}, is_import_tool=True)
try:
- res2 = requests.get(template_instance.get('downloadCallbackUrl'), timeout=5)
- res2.raise_for_status()
+ requests.get(template_instance.get('downloadCallbackUrl'), timeout=5).raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
@@ -533,8 +532,7 @@ def edit(self, instance: Dict):
}).import_({'file': bytes_to_uploaded_file(res.content, 'file.kbwf')}, is_import_tool=False)
try:
- res2 = requests.get(template_instance.get('downloadCallbackUrl'), timeout=5)
- res2.raise_for_status()
+ requests.get(template_instance.get('downloadCallbackUrl'), timeout=5).raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
diff --git a/apps/tools/serializers/tool.py b/apps/tools/serializers/tool.py
index 70e4b453d80..f3f7a15c800 100644
--- a/apps/tools/serializers/tool.py
+++ b/apps/tools/serializers/tool.py
@@ -431,8 +431,7 @@ def insert(self, instance, with_valid=True):
}).import_(name=instance.get('name'), source='template')
try:
- res2 = requests.get(template_instance.get('downloadCallbackUrl'), timeout=5)
- res2.raise_for_status()
+ requests.get(template_instance.get('downloadCallbackUrl'), timeout=5).raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
return tool
@@ -1193,8 +1192,7 @@ def add(self, instance: Dict, with_valid=True):
'auth_target_type': AuthTargetType.TOOL.value
}).auth_resource(str(tool_id))
try:
- res2 = requests.get(instance.get('download_callback_url'), timeout=5)
- res2.raise_for_status()
+ requests.get(instance.get('download_callback_url'), timeout=5).raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
return ToolModelSerializer(tool).data
@@ -1243,8 +1241,7 @@ def update_tool(self, with_valid=True):
# tool.is_active = False
tool.save()
try:
- res2 = requests.get(self.data.get('download_callback_url'), timeout=5)
- res2.raise_for_status()
+ requests.get(self.data.get('download_callback_url'), timeout=5).raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
return ToolModelSerializer(tool).data
diff --git a/apps/tools/serializers/tool_workflow.py b/apps/tools/serializers/tool_workflow.py
index 167777c6c28..a1616bb5170 100644
--- a/apps/tools/serializers/tool_workflow.py
+++ b/apps/tools/serializers/tool_workflow.py
@@ -327,8 +327,7 @@ def edit(self, instance: Dict):
}).update_template_workflow(str(self.data.get('tool_id')))
try:
- res2 = requests.get(template_instance.get('downloadCallbackUrl'), timeout=5)
- res2.raise_for_status()
+ requests.get(template_instance.get('downloadCallbackUrl'), timeout=5).raise_for_status()
except Exception as e:
maxkb_logger.error(f"callback appstore tool download error: {e}")
From 6cd83fa93455c41164c77abbaf1abb10e42f8755 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com>
Date: Fri, 24 Apr 2026 15:09:28 +0800
Subject: [PATCH 03/12] fix
---
.../ollama_model_provider/ollama_model_provider.py | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/apps/models_provider/impl/ollama_model_provider/ollama_model_provider.py b/apps/models_provider/impl/ollama_model_provider/ollama_model_provider.py
index 5bb8a54049f..d3b731c2e70 100644
--- a/apps/models_provider/impl/ollama_model_provider/ollama_model_provider.py
+++ b/apps/models_provider/impl/ollama_model_provider/ollama_model_provider.py
@@ -263,17 +263,18 @@ def get_model_provide_info(self):
@staticmethod
def get_base_model_list(api_base):
base_url = get_base_url(api_base)
- r = requests.request(method="GET", url=f"{base_url}/api/tags", timeout=5)
- r.raise_for_status()
- return r.json()
+ res = requests.request(method="GET", url=f"{base_url}/api/tags", timeout=5)
+ res.raise_for_status()
+ return res.json()
def down_model(self, model_type: str, model_name, model_credential: Dict[str, object]) -> Iterator[DownModelChunk]:
api_base = model_credential.get('api_base', '')
base_url = get_base_url(api_base)
- r = requests.request(
+ res = requests.request(
method="POST",
url=f"{base_url}/api/pull",
data=json.dumps({"name": model_name}).encode(),
stream=True,
)
- return convert(r)
+ res.raise_for_status()
+ return convert(res)
From b155a19bf4c22f301191b2fc45f5d2e7833929f9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com>
Date: Fri, 24 Apr 2026 19:21:59 +0800
Subject: [PATCH 04/12] fix
---
.../tool_workflow_lib_node/impl/base_tool_workflow_lib_node.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/application/flow/step_node/tool_workflow_lib_node/impl/base_tool_workflow_lib_node.py b/apps/application/flow/step_node/tool_workflow_lib_node/impl/base_tool_workflow_lib_node.py
index ac625bf79ba..d158878454e 100644
--- a/apps/application/flow/step_node/tool_workflow_lib_node/impl/base_tool_workflow_lib_node.py
+++ b/apps/application/flow/step_node/tool_workflow_lib_node/impl/base_tool_workflow_lib_node.py
@@ -162,7 +162,7 @@ def save_context(self, details, workflow_manage):
self.context['child_answer_data'] = details.get('child_answer_data')
self.context['details'] = details.get('details')
self.extra['input_field_list'] = details.get('input_field_list')
- self.extra['output_field_list'] = details.get('input_field_list')
+ self.extra['output_field_list'] = details.get('output_field_list')
self.extra['input'] = details.get('input')
self.extra['output'] = details.get('output')
self.context['result'] = details.get('result')
From 7dbfb533f452771f7c1da474293d1161f9ddc5c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com>
Date: Fri, 24 Apr 2026 20:27:39 +0800
Subject: [PATCH 05/12] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A9=BA=E6=8C=87?=
=?UTF-8?q?=E9=92=88=E5=BC=82=E5=B8=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
apps/application/serializers/common.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/application/serializers/common.py b/apps/application/serializers/common.py
index 33f08f1a67a..b41ce79e470 100644
--- a/apps/application/serializers/common.py
+++ b/apps/application/serializers/common.py
@@ -301,7 +301,7 @@ def get_chat_variable(self):
def append_chat_record(self, chat_record: ChatRecord):
chat_record.problem_text = chat_record.problem_text[0:10240] if chat_record.problem_text is not None else ""
- chat_record.answer_text = chat_record.answer_text[0:40960] if chat_record.problem_text is not None else ""
+ chat_record.answer_text = chat_record.answer_text[0:40960] if chat_record.answer_text is not None else ""
is_save = True
# 存入缓存中
for index in range(len(self.chat_record_list)):
From 2cf3153fea55a9c4a3037ad2a7ab87f114534ba4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com>
Date: Fri, 24 Apr 2026 20:59:53 +0800
Subject: [PATCH 06/12] fix
---
apps/application/flow/workflow_manage.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/application/flow/workflow_manage.py b/apps/application/flow/workflow_manage.py
index a020d7a2dec..bf882eac084 100644
--- a/apps/application/flow/workflow_manage.py
+++ b/apps/application/flow/workflow_manage.py
@@ -497,7 +497,7 @@ def hand_event_node_result(self, current_node, node_result_future):
return None
if not enableException:
chunk = self.base_to_response.to_stream_chunk_response(self.params.get('chat_id'),
- self.params.get('chat_id'),
+ self.params.get('chat_record_id'),
current_node.id,
current_node.up_node_id_list,
'Exception:' + str(e), False, 0, 0,
From 825ae5ce53d3bcf83d15edefd8ba2c9498a6ae02 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com>
Date: Mon, 27 Apr 2026 09:31:51 +0800
Subject: [PATCH 07/12] perf
---
apps/chat/serializers/chat.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/apps/chat/serializers/chat.py b/apps/chat/serializers/chat.py
index 4514dc457bc..57043c90f35 100644
--- a/apps/chat/serializers/chat.py
+++ b/apps/chat/serializers/chat.py
@@ -386,6 +386,7 @@ def get_chat_record(chat_info, chat_record_id):
if chat_record is None:
if not is_valid_uuid(chat_record_id):
raise ChatException(500, _("Conversation record does not exist"))
+ return chat_record
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id).first()
return chat_record
From 93bd0947ca7ab74a5270ad973d81f65c1dd9e660 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com>
Date: Mon, 27 Apr 2026 12:06:14 +0800
Subject: [PATCH 08/12] fix
---
apps/chat/serializers/chat.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/apps/chat/serializers/chat.py b/apps/chat/serializers/chat.py
index 57043c90f35..fd58b3e2d13 100644
--- a/apps/chat/serializers/chat.py
+++ b/apps/chat/serializers/chat.py
@@ -386,7 +386,8 @@ def get_chat_record(chat_info, chat_record_id):
if chat_record is None:
if not is_valid_uuid(chat_record_id):
raise ChatException(500, _("Conversation record does not exist"))
- return chat_record
+ else:
+ return chat_record
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id).first()
return chat_record
From 7adbb7522492447df0e1d89642eebc9f28a84874 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com>
Date: Mon, 27 Apr 2026 13:03:15 +0800
Subject: [PATCH 09/12] fix
---
.../impl/base_image_understand_node.py | 2 +-
.../impl/base_parameter_extraction_node.py | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/apps/application/flow/step_node/image_understand_step_node/impl/base_image_understand_node.py b/apps/application/flow/step_node/image_understand_step_node/impl/base_image_understand_node.py
index 2ae04fb9893..4c7b670069f 100644
--- a/apps/application/flow/step_node/image_understand_step_node/impl/base_image_understand_node.py
+++ b/apps/application/flow/step_node/image_understand_step_node/impl/base_image_understand_node.py
@@ -256,7 +256,7 @@ def generate_history_human_message(self, chat_record):
*[{'type': 'image_url',
'image_url': {'url': f'data:image/{base64_image[1]};base64,{base64_image[0]}'}} for
base64_image in image_base64_list],
- *[{'type': 'image_url', 'image_url': url} for url in url_list]
+ *[{'type': 'image_url', 'image_url': {'url': url}} for url in url_list]
])
return HumanMessage(content=chat_record.problem_text)
diff --git a/apps/application/flow/step_node/parameter_extraction_node/impl/base_parameter_extraction_node.py b/apps/application/flow/step_node/parameter_extraction_node/impl/base_parameter_extraction_node.py
index ae13f7c6c77..ed0c2e684cc 100644
--- a/apps/application/flow/step_node/parameter_extraction_node/impl/base_parameter_extraction_node.py
+++ b/apps/application/flow/step_node/parameter_extraction_node/impl/base_parameter_extraction_node.py
@@ -62,9 +62,9 @@ def generate_content(input_variable, variable_list):
return value
-def json_loads(response, expected_fields):
+def json_loads(response, variable_list):
if not response or not isinstance(response, str):
- return {field: None for field in expected_fields}
+ return generate_example(variable_list)
cleaned = response.strip()
@@ -79,7 +79,7 @@ def json_loads(response, expected_fields):
return result
except:
continue
- return generate_example(expected_fields)
+ return generate_example(variable_list)
class BaseParameterExtractionNode(IParameterExtractionNode):
From 6fca17739c00551570499211014506fa38655656 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com>
Date: Mon, 27 Apr 2026 17:01:53 +0800
Subject: [PATCH 10/12] fix
---
apps/common/utils/common.py | 2 +-
apps/common/utils/split_model.py | 5 ++---
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/apps/common/utils/common.py b/apps/common/utils/common.py
index f234ebeaf8c..04fe576ec12 100644
--- a/apps/common/utils/common.py
+++ b/apps/common/utils/common.py
@@ -85,7 +85,7 @@ def encryption(message: str):
range(0, max_pre_len if pre_len > max_pre_len else 1 if pre_len <= 0 else int(pre_len))])
end_str = "".join(
[message[index] for index in
- range(message_len - (int(post_len) if pre_len < max_post_len else max_post_len), message_len)])
+ range(message_len - (int(post_len) if post_len < max_post_len else max_post_len), message_len)])
content = "***************"
return pre_str + content + end_str
diff --git a/apps/common/utils/split_model.py b/apps/common/utils/split_model.py
index 95217b9f512..d9c85a96a81 100644
--- a/apps/common/utils/split_model.py
+++ b/apps/common/utils/split_model.py
@@ -485,9 +485,8 @@ def get_split_model(filename: str, with_filter: bool = False, limit: int = 10000
"""
if filename.endswith(".md"):
pattern_list = default_split_pattern.get('md')
- return SplitModel(pattern_list, with_filter=with_filter, limit=limit)
-
- pattern_list = default_split_pattern.get('md')
+ else:
+ pattern_list = default_split_pattern.get('default')
return SplitModel(pattern_list, with_filter=with_filter, limit=limit)
From 8c86015f6da6e76abf598743a5fb6cc74a155342 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com>
Date: Mon, 27 Apr 2026 17:18:30 +0800
Subject: [PATCH 11/12] revert
---
.../impl/base_image_understand_node.py | 2 +-
.../impl/base_parameter_extraction_node.py | 6 +++---
.../impl/base_tool_workflow_lib_node.py | 2 +-
apps/application/flow/workflow_manage.py | 2 +-
apps/application/serializers/common.py | 2 +-
apps/chat/serializers/chat.py | 2 --
apps/common/utils/common.py | 2 +-
apps/common/utils/split_model.py | 5 +++--
8 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/apps/application/flow/step_node/image_understand_step_node/impl/base_image_understand_node.py b/apps/application/flow/step_node/image_understand_step_node/impl/base_image_understand_node.py
index 4c7b670069f..2ae04fb9893 100644
--- a/apps/application/flow/step_node/image_understand_step_node/impl/base_image_understand_node.py
+++ b/apps/application/flow/step_node/image_understand_step_node/impl/base_image_understand_node.py
@@ -256,7 +256,7 @@ def generate_history_human_message(self, chat_record):
*[{'type': 'image_url',
'image_url': {'url': f'data:image/{base64_image[1]};base64,{base64_image[0]}'}} for
base64_image in image_base64_list],
- *[{'type': 'image_url', 'image_url': {'url': url}} for url in url_list]
+ *[{'type': 'image_url', 'image_url': url} for url in url_list]
])
return HumanMessage(content=chat_record.problem_text)
diff --git a/apps/application/flow/step_node/parameter_extraction_node/impl/base_parameter_extraction_node.py b/apps/application/flow/step_node/parameter_extraction_node/impl/base_parameter_extraction_node.py
index ed0c2e684cc..ae13f7c6c77 100644
--- a/apps/application/flow/step_node/parameter_extraction_node/impl/base_parameter_extraction_node.py
+++ b/apps/application/flow/step_node/parameter_extraction_node/impl/base_parameter_extraction_node.py
@@ -62,9 +62,9 @@ def generate_content(input_variable, variable_list):
return value
-def json_loads(response, variable_list):
+def json_loads(response, expected_fields):
if not response or not isinstance(response, str):
- return generate_example(variable_list)
+ return {field: None for field in expected_fields}
cleaned = response.strip()
@@ -79,7 +79,7 @@ def json_loads(response, variable_list):
return result
except:
continue
- return generate_example(variable_list)
+ return generate_example(expected_fields)
class BaseParameterExtractionNode(IParameterExtractionNode):
diff --git a/apps/application/flow/step_node/tool_workflow_lib_node/impl/base_tool_workflow_lib_node.py b/apps/application/flow/step_node/tool_workflow_lib_node/impl/base_tool_workflow_lib_node.py
index d158878454e..ac625bf79ba 100644
--- a/apps/application/flow/step_node/tool_workflow_lib_node/impl/base_tool_workflow_lib_node.py
+++ b/apps/application/flow/step_node/tool_workflow_lib_node/impl/base_tool_workflow_lib_node.py
@@ -162,7 +162,7 @@ def save_context(self, details, workflow_manage):
self.context['child_answer_data'] = details.get('child_answer_data')
self.context['details'] = details.get('details')
self.extra['input_field_list'] = details.get('input_field_list')
- self.extra['output_field_list'] = details.get('output_field_list')
+ self.extra['output_field_list'] = details.get('input_field_list')
self.extra['input'] = details.get('input')
self.extra['output'] = details.get('output')
self.context['result'] = details.get('result')
diff --git a/apps/application/flow/workflow_manage.py b/apps/application/flow/workflow_manage.py
index bf882eac084..a020d7a2dec 100644
--- a/apps/application/flow/workflow_manage.py
+++ b/apps/application/flow/workflow_manage.py
@@ -497,7 +497,7 @@ def hand_event_node_result(self, current_node, node_result_future):
return None
if not enableException:
chunk = self.base_to_response.to_stream_chunk_response(self.params.get('chat_id'),
- self.params.get('chat_record_id'),
+ self.params.get('chat_id'),
current_node.id,
current_node.up_node_id_list,
'Exception:' + str(e), False, 0, 0,
diff --git a/apps/application/serializers/common.py b/apps/application/serializers/common.py
index b41ce79e470..33f08f1a67a 100644
--- a/apps/application/serializers/common.py
+++ b/apps/application/serializers/common.py
@@ -301,7 +301,7 @@ def get_chat_variable(self):
def append_chat_record(self, chat_record: ChatRecord):
chat_record.problem_text = chat_record.problem_text[0:10240] if chat_record.problem_text is not None else ""
- chat_record.answer_text = chat_record.answer_text[0:40960] if chat_record.answer_text is not None else ""
+ chat_record.answer_text = chat_record.answer_text[0:40960] if chat_record.problem_text is not None else ""
is_save = True
# 存入缓存中
for index in range(len(self.chat_record_list)):
diff --git a/apps/chat/serializers/chat.py b/apps/chat/serializers/chat.py
index fd58b3e2d13..4514dc457bc 100644
--- a/apps/chat/serializers/chat.py
+++ b/apps/chat/serializers/chat.py
@@ -386,8 +386,6 @@ def get_chat_record(chat_info, chat_record_id):
if chat_record is None:
if not is_valid_uuid(chat_record_id):
raise ChatException(500, _("Conversation record does not exist"))
- else:
- return chat_record
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id).first()
return chat_record
diff --git a/apps/common/utils/common.py b/apps/common/utils/common.py
index 04fe576ec12..f234ebeaf8c 100644
--- a/apps/common/utils/common.py
+++ b/apps/common/utils/common.py
@@ -85,7 +85,7 @@ def encryption(message: str):
range(0, max_pre_len if pre_len > max_pre_len else 1 if pre_len <= 0 else int(pre_len))])
end_str = "".join(
[message[index] for index in
- range(message_len - (int(post_len) if post_len < max_post_len else max_post_len), message_len)])
+ range(message_len - (int(post_len) if pre_len < max_post_len else max_post_len), message_len)])
content = "***************"
return pre_str + content + end_str
diff --git a/apps/common/utils/split_model.py b/apps/common/utils/split_model.py
index d9c85a96a81..95217b9f512 100644
--- a/apps/common/utils/split_model.py
+++ b/apps/common/utils/split_model.py
@@ -485,8 +485,9 @@ def get_split_model(filename: str, with_filter: bool = False, limit: int = 10000
"""
if filename.endswith(".md"):
pattern_list = default_split_pattern.get('md')
- else:
- pattern_list = default_split_pattern.get('default')
+ return SplitModel(pattern_list, with_filter=with_filter, limit=limit)
+
+ pattern_list = default_split_pattern.get('md')
return SplitModel(pattern_list, with_filter=with_filter, limit=limit)
From f8998e194b1eb121ac849e645c73ac6ae1e06535 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com>
Date: Tue, 28 Apr 2026 09:41:32 +0800
Subject: [PATCH 12/12] revert
---
.../image_generate_step_node/impl/base_image_generate_node.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 7ce3a77bace..e9908d926fb 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
@@ -54,8 +54,8 @@ def execute(self, model_id, prompt, negative_prompt, dialogue_number, dialogue_t
image_urls = tti_model.generate_image(question, negative_prompt)
# 保存图片
file_urls = []
- file_name = 'generated_image.png'
for image_url in image_urls:
+ file_name = 'generated_image.png'
if isinstance(image_url, str):
if image_url.startswith('http'):
# HTTP URL 情况