diff --git a/api/app/controllers/public_share_controller.py b/api/app/controllers/public_share_controller.py index 02c73718..354a58ef 100644 --- a/api/app/controllers/public_share_controller.py +++ b/api/app/controllers/public_share_controller.py @@ -583,7 +583,7 @@ async def chat( event_data = event.get("data", {}) # 转换为标准 SSE 格式(字符串) - sse_message = f"event: {event_type}\ndata: {json.dumps(event_data)}\n\n" + sse_message = f"event: {event_type}\ndata: {json.dumps(event_data, default=str, ensure_ascii=False)}\n\n" yield sse_message return StreamingResponse( diff --git a/api/app/core/workflow/nodes/llm/node.py b/api/app/core/workflow/nodes/llm/node.py index 6395d3b8..bfa1b99f 100644 --- a/api/app/core/workflow/nodes/llm/node.py +++ b/api/app/core/workflow/nodes/llm/node.py @@ -226,6 +226,7 @@ class LLMNode(BaseNode): Yields: 文本片段(chunk)或完成标记 """ + self.typed_config = LLMNodeConfig(**self.config) from langgraph.config import get_stream_writer llm, prompt_or_messages = self._prepare_llm(state, True) diff --git a/api/app/services/user_memory_service.py b/api/app/services/user_memory_service.py index eb9b2c34..59bbc211 100644 --- a/api/app/services/user_memory_service.py +++ b/api/app/services/user_memory_service.py @@ -1416,11 +1416,10 @@ async def analytics_graph_data( elementId(n) as id, labels(n)[0] as label, properties(n) as properties - LIMIT $limit """ node_params = { "group_id": end_user_id, - "limit": limit + # "limit": limit } # 执行节点查询 diff --git a/web/src/views/Workflow/constant.ts b/web/src/views/Workflow/constant.ts index 593639ce..323f5649 100644 --- a/web/src/views/Workflow/constant.ts +++ b/web/src/views/Workflow/constant.ts @@ -502,16 +502,44 @@ interface NodeConfig { ports?: PortsConfig; } -const portAttrs = { - circle: { - r: 4, magnet: true, stroke: '#155EEF', strokeWidth: 2, fill: '#155EEF', position: { top: 22 } +// 统一的端口 markup 配置 +export const portMarkup = [ + { + tagName: 'circle', + selector: 'body', }, + { + tagName: 'text', + selector: 'label', + }, +]; + +// 统一的端口属性配置 +export const portAttrs = { + body: { + r: 6, + magnet: true, + stroke: '#155EEF', + strokeWidth: 2, + fill: '#155EEF', + }, + label: { + text: '+', + fontSize: 12, + fontWeight: 'bold', + fill: '#FFFFFF', + textAnchor: 'middle', + textVerticalAnchor: 'middle', + pointerEvents: 'none', + } } + +// 统一的端口组配置 const defaultPortGroups = { - // top: { position: 'top', attrs: portAttrs }, - right: { position: 'right', attrs: portAttrs }, - // bottom: { position: 'bottom', attrs: portAttrs }, - left: { position: 'left', attrs: portAttrs }, + // top: { position: 'top', markup: portMarkup, attrs: portAttrs }, + right: { position: 'right', markup: portMarkup, attrs: portAttrs }, + // bottom: { position: 'bottom', markup: portMarkup, attrs: portAttrs }, + left: { position: 'left', markup: portMarkup, attrs: portAttrs }, } const defaultPortItems = [ // { group: 'top' }, @@ -569,7 +597,7 @@ export const graphNodeLibrary: Record = { height: 64, shape: 'normal-node', ports: { - groups: {right: { position: 'right', attrs: portAttrs }}, + groups: {right: { position: 'right', markup: portMarkup, attrs: portAttrs }}, items: [{ group: 'right' }], }, }, @@ -578,7 +606,7 @@ export const graphNodeLibrary: Record = { height: 64, shape: 'normal-node', ports: { - groups: {left: { position: 'left', attrs: portAttrs }}, + groups: {left: { position: 'left', markup: portMarkup, attrs: portAttrs }}, items: [{ group: 'left' }], }, }, @@ -587,7 +615,7 @@ export const graphNodeLibrary: Record = { height: 44, shape: 'cycle-start', ports: { - groups: {right: { position: 'right', attrs: portAttrs }}, + groups: {right: { position: 'right', markup: portMarkup, attrs: portAttrs }}, items: [{ group: 'right' }], }, }, @@ -596,7 +624,7 @@ export const graphNodeLibrary: Record = { height: 44, shape: 'add-node', ports: { - groups: {left: { position: 'left', attrs: portAttrs }}, + groups: {left: { position: 'left', markup: portMarkup, attrs: portAttrs }}, items: [{ group: 'left' }], }, }, @@ -614,7 +642,7 @@ export const graphNodeLibrary: Record = { height: 44, shape: 'cycle-start', ports: { - groups: {right: { position: 'right', attrs: portAttrs }}, + groups: {right: { position: 'right', markup: portMarkup, attrs: portAttrs }}, items: [{ group: 'right' }], }, }, @@ -623,7 +651,7 @@ export const graphNodeLibrary: Record = { height: 44, shape: 'add-node', ports: { - groups: {left: { position: 'left', attrs: portAttrs }}, + groups: {left: { position: 'left', markup: portMarkup, attrs: portAttrs }}, items: [{ group: 'left' }], }, } diff --git a/web/src/views/Workflow/hooks/useWorkflowGraph.ts b/web/src/views/Workflow/hooks/useWorkflowGraph.ts index dc7001e5..ce01d103 100644 --- a/web/src/views/Workflow/hooks/useWorkflowGraph.ts +++ b/web/src/views/Workflow/hooks/useWorkflowGraph.ts @@ -5,7 +5,7 @@ import { App } from 'antd' import { Graph, Node, MiniMap, Snapline, Clipboard, Keyboard, type Edge } from '@antv/x6'; import { register } from '@antv/x6-react-shape'; -import { nodeRegisterLibrary, graphNodeLibrary, nodeLibrary } from '../constant'; +import { nodeRegisterLibrary, graphNodeLibrary, nodeLibrary, portMarkup, portAttrs } from '../constant'; import type { WorkflowConfig, NodeProperties } from '../types'; import { getWorkflowConfig, saveWorkflowConfig } from '@/api/application' import type { PortMetadata } from '@antv/x6/lib/model/port'; @@ -39,7 +39,6 @@ export interface UseWorkflowGraphReturn { export const edge_color = '#155EEF'; const edge_selected_color = '#4DA8FF' - export const useWorkflowGraph = ({ containerRef, miniMapRef, @@ -128,12 +127,6 @@ export const useWorkflowGraph = ({ const baseHeight = 88; const newHeight = baseHeight + (totalPorts - 2) * 30; - const portAttrs = { - circle: { - r: 4, magnet: true, stroke: '#155EEF', strokeWidth: 2, fill: '#155EEF', position: { top: 22 } - }, - }; - const portItems: PortMetadata[] = [ { group: 'left' }, { group: 'right', id: 'CASE1', args: { dy: 24 }, attrs: { text: { text: 'IF', fontSize: 12, fill: '#5B6167' }} } @@ -157,8 +150,8 @@ export const useWorkflowGraph = ({ nodeConfig.ports = { groups: { - right: { position: 'right', attrs: portAttrs }, - left: { position: 'left', attrs: portAttrs }, + right: { position: 'right', markup: portMarkup, attrs: portAttrs }, + left: { position: 'left', markup: portMarkup, attrs: portAttrs }, }, items: portItems }; @@ -172,12 +165,6 @@ export const useWorkflowGraph = ({ const baseHeight = 88; const newHeight = baseHeight + (categoryCount - 1) * 30; - const portAttrs = { - circle: { - r: 4, magnet: true, stroke: '#155EEF', strokeWidth: 2, fill: '#155EEF', position: { top: 22 } - }, - }; - const portItems: PortMetadata[] = [ { group: 'left' } ]; @@ -194,8 +181,8 @@ export const useWorkflowGraph = ({ nodeConfig.ports = { groups: { - right: { position: 'right', attrs: portAttrs }, - left: { position: 'left', attrs: portAttrs }, + right: { position: 'right', markup: portMarkup, attrs: portAttrs }, + left: { position: 'left', markup: portMarkup, attrs: portAttrs }, }, items: portItems }; @@ -205,16 +192,10 @@ export const useWorkflowGraph = ({ // 如果是http-request节点,检查error_handle.method配置 if (type === 'http-request' && (config as any).error_handle?.method === 'branch') { - const portAttrs = { - circle: { - r: 4, magnet: true, stroke: '#155EEF', strokeWidth: 2, fill: '#155EEF', position: { top: 22 } - }, - }; - nodeConfig.ports = { groups: { - right: { position: 'right', attrs: portAttrs }, - left: { position: 'left', attrs: portAttrs }, + right: { position: 'right', markup: portMarkup, attrs: portAttrs }, + left: { position: 'left', markup: portMarkup, attrs: portAttrs }, }, items: [ { group: 'left' }, @@ -344,13 +325,15 @@ export const useWorkflowGraph = ({ cell: targetCell.id, port: targetPorts.find((port: any) => port.group === 'left')?.id || 'left' }, + connector: { name: 'smooth' }, attrs: { line: { stroke: edge_color, strokeWidth: 1, targetMarker: { - name: 'block', - size: 8, + name: 'diamond', + width: 4, + height: 4, }, }, }, @@ -703,7 +686,7 @@ export const useWorkflowGraph = ({ // router: 'orth', // router: 'manhattan', connector: { - name: 'rounded', + name: 'smooth', args: { radius: 8, }, @@ -723,6 +706,11 @@ export const useWorkflowGraph = ({ line: { stroke: edge_color, strokeWidth: 1, + targetMarker: { + name: 'diamond', + width: 4, + height: 4, + }, }, }, zIndex: 0,