mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-02 03:55:55 +00:00
fix
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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 ''
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ export default function WorkflowDetailContent({ id }: { id: string }) {
|
|||||||
setSaving,
|
setSaving,
|
||||||
setLoading,
|
setLoading,
|
||||||
reset,
|
reset,
|
||||||
nodeTypes,
|
|
||||||
setNodeTypes,
|
setNodeTypes,
|
||||||
} = useWorkflowStore();
|
} = useWorkflowStore();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user