This commit is contained in:
Typer_Body
2026-06-02 02:29:35 +08:00
parent 543fbd8ca0
commit 192b69b0fb
7 changed files with 33 additions and 14 deletions

View File

@@ -109,8 +109,15 @@ class WorkflowWebSocketChatRouterGroup(group.RouterGroup):
) )
try: try:
await quart.websocket.send(json.dumps({'type': 'error', 'message': str(e)})) await quart.websocket.send(json.dumps({'type': 'error', 'message': str(e)}))
except: except Exception as send_error:
pass 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/<session_type>', methods=['GET']) @self.route('/messages/<session_type>', methods=['GET'])
async def get_messages(workflow_uuid: str, session_type: str) -> str: async def get_messages(workflow_uuid: str, session_type: str) -> str:

View File

@@ -340,7 +340,11 @@ class WorkflowService:
if bot: if bot:
bot_name = bot.get('name', 'WebChat') bot_name = bot.get('name', 'WebChat')
except Exception: 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 # Create execution context
context = ExecutionContext( context = ExecutionContext(

View File

@@ -5,7 +5,7 @@ Node metadata is loaded from: ../../templates/metadata/nodes/call_workflow.yaml
from __future__ import annotations from __future__ import annotations
from typing import Any, Optional from typing import Any
from langbot_plugin.api.entities.builtin.workflow.entities import ExecutionContext from langbot_plugin.api.entities.builtin.workflow.entities import ExecutionContext

View File

@@ -106,8 +106,9 @@ class LLMCallNode(WorkflowNode):
try: try:
if hasattr(self.ap, 'sensitive_meta') and hasattr(self.ap.sensitive_meta, 'data'): if hasattr(self.ap, 'sensitive_meta') and hasattr(self.ap.sensitive_meta, 'data'):
sensitive_words = self.ap.sensitive_meta.data.get('words', []) sensitive_words = self.ap.sensitive_meta.data.get('words', [])
except Exception: except Exception as e:
pass logger.warning("Failed to load sensitive words from sensitive_meta: %s", e)
sensitive_words = []
if not sensitive_words: if not sensitive_words:
return text, False, '' return text, False, ''
@@ -125,8 +126,11 @@ class LLMCallNode(WorkflowNode):
if hasattr(self.ap, 'sensitive_meta') and hasattr(self.ap.sensitive_meta, 'data'): if hasattr(self.ap, 'sensitive_meta') and hasattr(self.ap.sensitive_meta, 'data'):
mask_word = self.ap.sensitive_meta.data.get('mask_word', '') mask_word = self.ap.sensitive_meta.data.get('mask_word', '')
mask = self.ap.sensitive_meta.data.get('mask', '*') mask = self.ap.sensitive_meta.data.get('mask', '*')
except Exception: except Exception as e:
pass # 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: for m in matches:
if mask_word: if mask_word:

View File

@@ -41,13 +41,19 @@ class ReplyMessageNode(WorkflowNode):
for key, value in inputs.items(): for key, value in inputs.items():
try: try:
message = message.replace(f'{{{{{key}}}}}', str(value) if value is not None else '') message = message.replace(f'{{{{{key}}}}}', str(value) if value is not None else '')
except Exception: except Exception as e:
pass 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(): for key, value in context.variables.items():
try: try:
message = message.replace(f'{{{{variables.{key}}}}}', str(value) if value is not None else '') message = message.replace(f'{{{{variables.{key}}}}}', str(value) if value is not None else '')
except Exception: except Exception as e:
pass 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 '' message_str = str(message) if message is not None else ''

View File

@@ -69,7 +69,6 @@ import {
DropdownMenuTrigger, DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'; } from '@/components/ui/dropdown-menu';
import ModelsDialog from '@/app/home/components/models-dialog/ModelsDialog'; 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 => { const resolveOptionLabel = (label: unknown, fallback: string): string => {
if (!label || typeof label !== 'object') return fallback; if (!label || typeof label !== 'object') return fallback;

View File

@@ -50,7 +50,6 @@ export default function WorkflowDetailContent({ id }: { id: string }) {
setSaving, setSaving,
setLoading, setLoading,
reset, reset,
nodeTypes,
setNodeTypes, setNodeTypes,
} = useWorkflowStore(); } = useWorkflowStore();