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 情况