From 192b69b0fbcfeafcf6dd08eeede1bfc7359a1720 Mon Sep 17 00:00:00 2001 From: Typer_Body Date: Tue, 2 Jun 2026 02:29:35 +0800 Subject: [PATCH] fix --- .../controller/groups/workflows/websocket_chat.py | 11 +++++++++-- src/langbot/pkg/api/http/service/workflow.py | 6 +++++- src/langbot/pkg/workflow/nodes/call_workflow.py | 2 +- src/langbot/pkg/workflow/nodes/llm_call.py | 12 ++++++++---- src/langbot/pkg/workflow/nodes/reply_message.py | 14 ++++++++++---- .../dynamic-form/DynamicFormItemComponent.tsx | 1 - .../app/home/workflows/WorkflowDetailContent.tsx | 1 - 7 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/langbot/pkg/api/http/controller/groups/workflows/websocket_chat.py b/src/langbot/pkg/api/http/controller/groups/workflows/websocket_chat.py index 607380ff..029d6949 100644 --- a/src/langbot/pkg/api/http/controller/groups/workflows/websocket_chat.py +++ b/src/langbot/pkg/api/http/controller/groups/workflows/websocket_chat.py @@ -109,8 +109,15 @@ class WorkflowWebSocketChatRouterGroup(group.RouterGroup): ) try: await quart.websocket.send(json.dumps({'type': 'error', 'message': str(e)})) - except: - pass + except Exception as send_error: + logger.debug( + 'Failed to send error message to workflow websocket client', + exc_info=True, + extra={ + 'workflow_uuid': workflow_uuid, + 'send_error': str(send_error), + }, + ) @self.route('/messages/', methods=['GET']) async def get_messages(workflow_uuid: str, session_type: str) -> str: diff --git a/src/langbot/pkg/api/http/service/workflow.py b/src/langbot/pkg/api/http/service/workflow.py index 0d5ed9f0..7ab1f8c2 100644 --- a/src/langbot/pkg/api/http/service/workflow.py +++ b/src/langbot/pkg/api/http/service/workflow.py @@ -340,7 +340,11 @@ class WorkflowService: if bot: bot_name = bot.get('name', 'WebChat') except Exception: - pass + logger.warning( + "Failed to fetch bot info for bot_id=%s; using default bot name.", + bot_id, + exc_info=True, + ) # Create execution context context = ExecutionContext( diff --git a/src/langbot/pkg/workflow/nodes/call_workflow.py b/src/langbot/pkg/workflow/nodes/call_workflow.py index d0569043..6e2ff238 100644 --- a/src/langbot/pkg/workflow/nodes/call_workflow.py +++ b/src/langbot/pkg/workflow/nodes/call_workflow.py @@ -5,7 +5,7 @@ Node metadata is loaded from: ../../templates/metadata/nodes/call_workflow.yaml from __future__ import annotations -from typing import Any, Optional +from typing import Any from langbot_plugin.api.entities.builtin.workflow.entities import ExecutionContext diff --git a/src/langbot/pkg/workflow/nodes/llm_call.py b/src/langbot/pkg/workflow/nodes/llm_call.py index 4f4a0d4a..b07701b1 100644 --- a/src/langbot/pkg/workflow/nodes/llm_call.py +++ b/src/langbot/pkg/workflow/nodes/llm_call.py @@ -106,8 +106,9 @@ class LLMCallNode(WorkflowNode): try: if hasattr(self.ap, 'sensitive_meta') and hasattr(self.ap.sensitive_meta, 'data'): sensitive_words = self.ap.sensitive_meta.data.get('words', []) - except Exception: - pass + except Exception as e: + logger.warning("Failed to load sensitive words from sensitive_meta: %s", e) + sensitive_words = [] if not sensitive_words: return text, False, '' @@ -125,8 +126,11 @@ class LLMCallNode(WorkflowNode): if hasattr(self.ap, 'sensitive_meta') and hasattr(self.ap.sensitive_meta, 'data'): mask_word = self.ap.sensitive_meta.data.get('mask_word', '') mask = self.ap.sensitive_meta.data.get('mask', '*') - except Exception: - pass + except Exception as e: + # Keep default mask settings when sensitive metadata is unavailable or malformed. + logger.debug( + f'LLM call node {self.node_id}: failed to read sensitive mask config, using defaults: {e}' + ) for m in matches: if mask_word: diff --git a/src/langbot/pkg/workflow/nodes/reply_message.py b/src/langbot/pkg/workflow/nodes/reply_message.py index e3f095dc..db279028 100644 --- a/src/langbot/pkg/workflow/nodes/reply_message.py +++ b/src/langbot/pkg/workflow/nodes/reply_message.py @@ -41,13 +41,19 @@ class ReplyMessageNode(WorkflowNode): for key, value in inputs.items(): try: message = message.replace(f'{{{{{key}}}}}', str(value) if value is not None else '') - except Exception: - pass + except Exception as e: + logger.debug( + 'ReplyMessageNode failed to replace input template variable', + extra={'node_id': self.node_id, 'key': str(key), 'error': str(e)}, + ) for key, value in context.variables.items(): try: message = message.replace(f'{{{{variables.{key}}}}}', str(value) if value is not None else '') - except Exception: - pass + except Exception as e: + logger.debug( + 'ReplyMessageNode failed to replace context template variable', + extra={'node_id': self.node_id, 'key': str(key), 'error': str(e)}, + ) message_str = str(message) if message is not None else '' diff --git a/web/src/app/home/components/dynamic-form/DynamicFormItemComponent.tsx b/web/src/app/home/components/dynamic-form/DynamicFormItemComponent.tsx index c0bbd7fb..8e60320b 100644 --- a/web/src/app/home/components/dynamic-form/DynamicFormItemComponent.tsx +++ b/web/src/app/home/components/dynamic-form/DynamicFormItemComponent.tsx @@ -69,7 +69,6 @@ import { DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import ModelsDialog from '@/app/home/components/models-dialog/ModelsDialog'; -import PromptEditorComponent from '@/app/home/components/dynamic-form/PromptEditorComponent'; const resolveOptionLabel = (label: unknown, fallback: string): string => { if (!label || typeof label !== 'object') return fallback; diff --git a/web/src/app/home/workflows/WorkflowDetailContent.tsx b/web/src/app/home/workflows/WorkflowDetailContent.tsx index c30b3136..c438c177 100644 --- a/web/src/app/home/workflows/WorkflowDetailContent.tsx +++ b/web/src/app/home/workflows/WorkflowDetailContent.tsx @@ -50,7 +50,6 @@ export default function WorkflowDetailContent({ id }: { id: string }) { setSaving, setLoading, reset, - nodeTypes, setNodeTypes, } = useWorkflowStore();