diff --git a/ai-flow-front/packages/flow-content/workflow/lib/components/editors/agent-selector/src/composition/use-modal.tsx b/ai-flow-front/packages/flow-content/workflow/lib/components/editors/agent-selector/src/composition/use-modal.tsx index b4d3daae90e8c5d78bd20d89edce7c4adf996b21..eec4a7cf77566216ee97b0905a0080a71ebb7a12 100644 --- a/ai-flow-front/packages/flow-content/workflow/lib/components/editors/agent-selector/src/composition/use-modal.tsx +++ b/ai-flow-front/packages/flow-content/workflow/lib/components/editors/agent-selector/src/composition/use-modal.tsx @@ -42,6 +42,7 @@ export function useModal( const treeGridComponentInstance = ref(); const dataGridRef = ref(); const agentFilterValue = ref(''); + let agentDataTotal = 0; function closeModal(): void { if (modalInstance.value) { @@ -75,19 +76,21 @@ export function useModal( * 智能体名称筛选处理 */ const onAgentFilterChange = (value: string) => { + agentFilterValue.value = value; + if (!value || value.trim() === '') { - filteredAgentData.value = [...agentData.value]; + fetchAgentList(currentTagId.value, ''); } else { const filterValue = value.toLowerCase().trim(); - filteredAgentData.value = agentData.value.filter((item: any) => - item.agentName && item.agentName.toLowerCase().includes(filterValue) - ); + pagination.value = { + ...pagination.value, + index: 1 + }; + fetchAgentList(currentTagId.value, filterValue); } - // 更新表格数据源并清除选中状态 if (dataGridRef.value) { - dataGridRef.value.updateDataSource(filteredAgentData.value); dataGridRef.value.clearSelection?.(); // 清除表格的选中状态 } @@ -202,6 +205,11 @@ export function useModal( // 清空筛选框和选中状态 agentFilterValue.value = ''; selectedData.value = []; + // 更新分页配置 + pagination.value = { + ...pagination.value, + index: 1 + }; // 获取该分类下的智能体列表 fetchAgentList(tagId); @@ -210,28 +218,64 @@ export function useModal( // 当前选中的tagId const currentTagId = ref(null); + /** + * 获取当前语言 + */ + const getCurrentLang = () => { + const langKey = localStorage.getItem('languageCode'); + if(langKey === 'zh-CHS') return 'cafMlcchs'; + if(langKey === 'en') return 'cafMlcen'; + if(langKey === 'zh-CHT') return 'cafMlccht'; + return 'cafMlcchs'; + } + /** * 获取智能体列表 */ - const fetchAgentList = async (tagId: string | null) => { + const fetchAgentList = async (tagId: string | null, agentName: string | null = null) => { try { const requestData: any = { startDateTime: "", endDateTime: "", orderCondition: "createdOn", orderType: "desc", - tagId: tagId + tagId: tagId, + agentName: agentName, + page: pagination.value.index - 1, + pageSize: pagination.value.size }; const res = await post('/runtime/sys/v1.0/aiAgentBuilder/authFilter/agent', requestData); - - if (!res || !Array.isArray(res)) { + if (!res) { agentData.value = []; return; } + // 更新分页配置 + pagination.value = { + ...pagination.value, + total: res.pagination.totalCount + }; + + agentDataTotal = res.pagination.totalCount; + + // 只展示canEdit为false的智能体 - agentData.value = res.filter((agent: any) => agent.canEdit === false); + // agentData.value = res.resultList.filter((agent: any) => agent.canEdit === false).map((agent: any) => { + // const currentLang = getCurrentLang(); + // return { + // ...agent, + // agentName: agent.agentNameI18n?.[currentLang] || '' + // }; + // }); + agentData.value = res.resultList.map((agent: any) => { + const currentLang = getCurrentLang(); + return { + ...agent, + agentName: agent.agentNameI18n?.[currentLang] || '', + disabled: agent.canEdit + }; + }); // 应用筛选 if (!agentFilterValue.value || agentFilterValue.value.trim() === '') { diff --git a/ai-flow-front/packages/flow-content/workflow/lib/index.ts b/ai-flow-front/packages/flow-content/workflow/lib/index.ts index 025725b94ac68c2f8b8f73adf10f25441be24fa7..2d0c606c677598650f421f496e73ab7ce62ab560 100644 --- a/ai-flow-front/packages/flow-content/workflow/lib/index.ts +++ b/ai-flow-front/packages/flow-content/workflow/lib/index.ts @@ -118,6 +118,7 @@ export const FLOW_REGISTRY: FlowRegistry = { BuiltinNodeType.Loop, BuiltinNodeType.VariableDef, BuiltinNodeType.VariableAssign, + BuiltinNodeType.MethodInvoke, BuiltinNodeType.End, ], }], diff --git a/ai-flow-front/packages/flow-content/workflow/src/mock-data.ts b/ai-flow-front/packages/flow-content/workflow/src/mock-data.ts index 2a97d3e2116327e3eb7f5639a9443ff975cad268..dbec913ad96e4bb0e14119d658bb7298f3c03e4e 100644 --- a/ai-flow-front/packages/flow-content/workflow/src/mock-data.ts +++ b/ai-flow-front/packages/flow-content/workflow/src/mock-data.ts @@ -34,42 +34,7 @@ export const MOCK_FLOW_METADATA: FlowMetadata = { inputPorts: [], outputPorts: [], graphMeta: { - position: { x: 80, y: 150 }, - }, - extension: {}, - }, { - id: 'llm', - kind: 'LLMClient', - code: 'llm', - name: '大模型', - description: '', - inputParams: [{ - code: 'question', - type: { - source: 'default', - typeId: 'string', - typeCode: 'String', - typeName: 'String', - }, - valueExpr: { - kind: 'nodeVariable', - nodeCode: 'start', - variable: 'keyword', - }, - }], - outputParams: [{ - code: 'result', - type: { - source: 'default', - typeId: 'string', - typeCode: 'String', - typeName: 'String', - }, - }], - inputPorts: [], - outputPorts: [], - graphMeta: { - position: { x: 450, y: 150 }, + position: { x: 0, y: 0 }, }, extension: {}, }, { @@ -79,34 +44,16 @@ export const MOCK_FLOW_METADATA: FlowMetadata = { name: '结束', description: '', inputParams: [], - outputParams: [{ - code: 'outline', - type: { - source: 'default', - typeId: 'string', - typeCode: 'String', - typeName: 'String', - }, - valueExpr: { - kind: 'nodeVariable', - nodeCode: 'llm', - variable: 'result', - }, - }], + outputParams: [], inputPorts: [], outputPorts: [], graphMeta: { - position: { x: 850, y: 150 }, + position: { x: 1000, y: 0 }, }, extension: {}, }], edges: [{ sourceNodeId: 'start', - targetNodeId: 'llm', - sourcePort: 'output', - targetPort: 'input', - }, { - sourceNodeId: 'llm', targetNodeId: 'end', sourcePort: 'output', targetPort: 'input', diff --git a/ai-flow-front/packages/flow-designer/package.json b/ai-flow-front/packages/flow-designer/package.json index d9e004d5c52ec9a6e207270fe709e98d9d723fc8..0f42dcb215092aec21eb42af78e94de2852a16b7 100644 --- a/ai-flow-front/packages/flow-designer/package.json +++ b/ai-flow-front/packages/flow-designer/package.json @@ -1,6 +1,6 @@ { "name": "@farris/flow-designer", - "version": "0.0.5", + "version": "0.0.6", "license": "Apache-2.0", "private": true, "type": "module", diff --git a/ai-flow-front/packages/flow-designer/src/assets/images/index.ts b/ai-flow-front/packages/flow-designer/src/assets/images/index.ts index 578e0935caf3a5fd1ba7fd780e8947a205c78ddf..6fd7f542414d32291fc0cc850e3e2d179ae41689 100644 --- a/ai-flow-front/packages/flow-designer/src/assets/images/index.ts +++ b/ai-flow-front/packages/flow-designer/src/assets/images/index.ts @@ -4,3 +4,4 @@ export { default as selectorIcon } from './icon-selector.jpg'; export { default as loopIcon } from './icon-loop.jpg'; export { default as variableDefIcon } from './icon-variable-def.jpg'; export { default as variableAssignIcon } from './icon-variable-assign.jpg'; +export { default as methodInvokeIcon } from './method-invoke.jpg'; diff --git a/ai-flow-front/packages/flow-designer/src/assets/images/method-invoke.jpg b/ai-flow-front/packages/flow-designer/src/assets/images/method-invoke.jpg new file mode 100644 index 0000000000000000000000000000000000000000..782339fad366fd7268668c0df4bd5cbc79f8cd64 Binary files /dev/null and b/ai-flow-front/packages/flow-designer/src/assets/images/method-invoke.jpg differ diff --git a/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/index.ts b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/index.ts index a9828cc2fa967957fec32ea461b0d096ebdfc5f2..e2441d84b9ec3285709d8657a32e83a333b8ef2d 100644 --- a/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/index.ts +++ b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/index.ts @@ -4,6 +4,7 @@ import { SELECTOR_NODE } from './selector'; import { LOOP_NODE } from './loop'; import { VARIABLE_DEF_NODE } from './variable-def'; import { VARIABLE_ASSIGN_NODE } from './variable-assign'; +import { METHOD_INVOKE_NODE } from './method-invoke'; export const BUILTIN_NODES = [ START_NODE, @@ -12,4 +13,5 @@ export const BUILTIN_NODES = [ LOOP_NODE, VARIABLE_DEF_NODE, VARIABLE_ASSIGN_NODE, + METHOD_INVOKE_NODE, ]; diff --git a/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/loop/node-definition.ts b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/loop/node-definition.ts index fa53239120597a1233dea3057365699becc41474..9482ff0c14e0290b297aa44a5b11152fc670cc4a 100644 --- a/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/loop/node-definition.ts +++ b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/loop/node-definition.ts @@ -1,6 +1,6 @@ import { markRaw } from 'vue'; -import type { NodeDefinition, Parameter, TypeRefer } from '@farris/flow-devkit'; -import { BasicTypeRefer, BuiltinNodeType, ValidateUtils } from '@farris/flow-devkit'; +import type { NodeDefinition, Parameter, TypeRefer, JsonSchema } from '@farris/flow-devkit'; +import { BasicTypeRefer, BuiltinNodeType, ValidateUtils, ValueExpressUtils } from '@farris/flow-devkit'; import { loopIcon } from '@flow-designer/assets/images'; import SubFlowNode from './node.component.vue'; import { NodeProperty } from './property-config'; @@ -12,7 +12,7 @@ export const LOOP_NODE: NodeDefinition = { description: '根据循环数组,循环执行一段逻辑', icon: loopIcon, isSubFlowContainer: true, - debuggable: false, // @todo 单节点调试功能暂不支持识别`inputParams`之外的输入参数,后续需要支持通过回调方法自定义输入参数 + debuggable: false, ports: [ { id: 'input', @@ -46,12 +46,25 @@ export const LOOP_NODE: NodeDefinition = { writable: false, }; const itemCode = nodeData.iterableVariable || 'item'; - const itemType = (nodeData.iterableExprType as TypeRefer)?.genericTypes?.[0]; + let itemType: TypeRefer | undefined = undefined; + let itemSchema: JsonSchema | undefined = undefined; + if (ValueExpressUtils.isNodeVariableExpr(nodeData.iterableExpr)) { + const valueExpressType = ValueExpressUtils.unwrapValueExpressType( + ValueExpressUtils.getValueExpressType(nodeData.iterableExpr, nodeData) + ); + if (valueExpressType) { + itemType = valueExpressType.type; + itemSchema = valueExpressType.schema; + } + } else { + itemType = (nodeData.iterableExprType as TypeRefer)?.genericTypes?.[0]; + } const item = { id: `${nodeData.id}_item`, code: itemCode, name: `${itemCode} (in items)`, type: itemType, + schema: itemSchema, writable: false, } as Parameter; return [item, index, ...nodeData.outputParams]; diff --git a/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/method-invoke/index.ts b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/method-invoke/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..218a7bd52ceafb7471837587507af9136e862351 --- /dev/null +++ b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/method-invoke/index.ts @@ -0,0 +1 @@ +export * from './node-definition'; diff --git a/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/method-invoke/node-definition.ts b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/method-invoke/node-definition.ts new file mode 100644 index 0000000000000000000000000000000000000000..20239c47377dd855529b7264d6a5f7677bbfe434 --- /dev/null +++ b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/method-invoke/node-definition.ts @@ -0,0 +1,59 @@ +import { markRaw } from 'vue'; +import type { NodeDefinition, MethodInvokeExpr } from '@farris/flow-devkit'; +import { BuiltinNodeType, ValueExpressUtils, ParameterUtils, useTypeDetails } from '@farris/flow-devkit'; +import { methodInvokeIcon } from '@flow-designer/assets/images'; +import MethodInvokeComponent from './node.component.vue'; +import { NodeProperty } from './property-config'; + +export const METHOD_INVOKE_NODE: NodeDefinition = { + metadata: { + type: BuiltinNodeType.MethodInvoke, + label: '函数调用', + description: '用于调用一个函数', + icon: methodInvokeIcon, + debuggable: true, + ports: [ + { + id: 'input', + position: 'left', + type: 'target', + }, + { + id: 'output', + position: 'right', + type: 'source', + } + ] + }, + component: markRaw(MethodInvokeComponent), + getPropertyPanelConfig: (nodeData) => { + const config = new NodeProperty(); + return config.getPropertyConfig(nodeData); + }, + validator: (nodeData) => { + if (!ValueExpressUtils.isMethodInvokeExpr(nodeData.express)) { + return { errors: [{ message: "函数名不可为空" }] }; + } + }, + getOutputParams: (nodeData) => { + const express = nodeData.express as MethodInvokeExpr; + const returnType = ValueExpressUtils.getReturnTypeByMethodInvokeExpr(express); + if (!returnType || ParameterUtils.isVoid(returnType)) { + return []; + } + const { loadType } = useTypeDetails(); + loadType(returnType); + return [{ + id: `${nodeData.id}_returnValue`, + code: `returnValue`, + type: returnType, + description: `函数的返回值`, + readOnly: true, + }]; + }, + getDebugParams: (nodeData) => { + const express = nodeData.express as MethodInvokeExpr; + const method = ValueExpressUtils.getMethodTypeByMethodInvokeExpr(express); + return method?.parameters || []; + }, +}; diff --git a/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/method-invoke/node.component.vue b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/method-invoke/node.component.vue new file mode 100644 index 0000000000000000000000000000000000000000..7362c49c1b4613e8cff29174e4cef8193ded84d3 --- /dev/null +++ b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/method-invoke/node.component.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/method-invoke/property-config.ts b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/method-invoke/property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..0169a18d24069811ad99c517b9f4735fdd14a1b9 --- /dev/null +++ b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/method-invoke/property-config.ts @@ -0,0 +1,33 @@ +import { BaseControlProperty, type NodeData } from '@farris/flow-devkit'; + +export class NodeProperty extends BaseControlProperty { + + public getPropertyConfig(nodeData: NodeData) { + this.propertyConfig.categories['basic'] = { + hideTitle: true, + title: "基本信息", + description: "Basic Information", + properties: { + name: { + type: "object", + editor: { + type: 'fvf-node-header', + nodeData, + }, + } + } + }; + this.propertyConfig.categories['express'] = { + title: "调用配置", + properties: { + express: { + type: "object", + editor: { + type: 'fvf-method-invoke-express', + } + } + } + }; + return this.propertyConfig; + } +} diff --git a/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/start/property-config.ts b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/start/property-config.ts index 1e223b60dd13c14a4cbb846bd204578df4f10224..57886ca60fe9f6f8076cdcbdd0ecfa48eff59cd0 100644 --- a/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/start/property-config.ts +++ b/ai-flow-front/packages/flow-designer/src/components/builtin-nodes/start/property-config.ts @@ -24,6 +24,8 @@ export class NodeProperty extends BaseControlProperty { type: "array", editor: { type: 'fvf-json-schema-editor', + canEditName: true, + canEditInputHelp: true, } } } diff --git a/ai-flow-front/packages/flow-designer/src/components/flow-view/composition/use-flow-property-panel.tsx b/ai-flow-front/packages/flow-designer/src/components/flow-view/composition/use-flow-property-panel.tsx index 2aa0d7365da82957ab3a6cd54034cd9b2d4a6a5e..9bd92693046ee778e6b61276eba4ddda1a77e45d 100644 --- a/ai-flow-front/packages/flow-designer/src/components/flow-view/composition/use-flow-property-panel.tsx +++ b/ai-flow-front/packages/flow-designer/src/components/flow-view/composition/use-flow-property-panel.tsx @@ -5,6 +5,8 @@ import type { PropertyCategory, PropertyPanelConfig } from '@farris/flow-devkit' import css from '../flow-view.module.scss'; +const PROPERTY_PANEL_DEFAULT_WIDTH = 300; + export function useFlowPropertyPanel() { const flowRegistry = inject(FLOW_REGISTRY_KEY); @@ -67,7 +69,7 @@ export function useFlowPropertyPanel() { return panelShowMode.value === 'panel'; }); - const leftPanelWidth = ref(300); + const leftPanelWidth = ref(PROPERTY_PANEL_DEFAULT_WIDTH); const leftPanelStyle = computed(() => ({ display: shouldShowPropertyPanel.value ? undefined : 'none', @@ -79,7 +81,21 @@ export function useFlowPropertyPanel() { categories: {}, }; + function setPanelWidth(newValue: number): void { + leftPanelWidth.value = newValue; + } + + function updatePanelWidth(): void { + const defaultWidth = flowRegistry?.value?.flowPropertyPanelDefaultWidth; + if (typeof defaultWidth === 'number' && defaultWidth > 0) { + setPanelWidth(defaultWidth); + return; + } + setPanelWidth(PROPERTY_PANEL_DEFAULT_WIDTH); + } + function updatePropertyPanel(forceUpdate = true): void { + updatePanelWidth(); const propertyConfig = getPropertyPanelConfig.value?.(propertyData.value) || defaultPropertyPanelConfig; propertyConfig.type = 'object'; propertyConfig.categories = Object.assign({ _basic_: defaultPropertyCategory }, propertyConfig.categories); diff --git a/ai-flow-front/packages/flow-designer/src/components/flow-view/composition/use-node-property-panel.tsx b/ai-flow-front/packages/flow-designer/src/components/flow-view/composition/use-node-property-panel.tsx index e3df2911daa2a804740562214b5630925cbcf43b..6aeb2c2211326645351c97eec0e9a686cf6e6fae 100644 --- a/ai-flow-front/packages/flow-designer/src/components/flow-view/composition/use-node-property-panel.tsx +++ b/ai-flow-front/packages/flow-designer/src/components/flow-view/composition/use-node-property-panel.tsx @@ -1,11 +1,11 @@ -import { computed, ref, watch, provide, type CSSProperties, defineComponent, type PropType, type Ref } from 'vue'; +import { computed, ref, watch, provide, inject, type CSSProperties, defineComponent, type PropType, type Ref } from 'vue'; import { FlowPropertyPanel, type PanelShowMode } from '@flow-designer/components/property-panel'; import { useVueFlow, type GraphNode } from '@vue-flow/core'; import { nodeRegistry, PROPERTY_PANEL_KEY, provideNodeVariables } from '@farris/flow-devkit'; import type { NodeDefinition, NodeMetadata, FlowNodeInstance, NodeData } from '@farris/flow-devkit'; import { NODE_RENDER_SCENE_KEY, USE_NODE_ID_KEY, USE_NODE_DATA_KEY } from '@farris/flow-devkit'; import type { UseNodePropertyPanel } from './types'; -import { useFloatPanelLayout } from '@flow-designer/hooks'; +import { useFloatPanelLayout, FLOW_REGISTRY_KEY } from '@flow-designer/hooks'; import styles from '../flow-view.module.scss'; @@ -38,6 +38,8 @@ const NodeContextProvider = defineComponent({ }, }); +const PROPERTY_PANEL_DEFAULT_WIDTH = 450; + export function useNodePropertyPanel(): UseNodePropertyPanel { const { @@ -45,6 +47,7 @@ export function useNodePropertyPanel(): UseNodePropertyPanel { nodes: allNodes, onNodeClick, } = useVueFlow(); + const flowRegistry = inject(FLOW_REGISTRY_KEY); const isShow = ref(true); const propertyPanelInstance = ref(); @@ -94,7 +97,28 @@ export function useNodePropertyPanel(): UseNodePropertyPanel { return typeof getPropertyPanelConfig === 'function'; }); + const rightPanelWidth = ref(PROPERTY_PANEL_DEFAULT_WIDTH); + + function setPanelWidth(newValue: number): void { + rightPanelWidth.value = newValue; + } + + function updatePanelWidth(): void { + const nodeLevelDefaultWidth = selectedNodeDefinition.value?.propertyPanelDefaultWidth; + if (typeof nodeLevelDefaultWidth === 'number' && nodeLevelDefaultWidth > 0) { + setPanelWidth(nodeLevelDefaultWidth); + return; + } + const flowLevelDefaultWidth = flowRegistry?.value?.nodePropertyPanelDefaultWidth; + if (typeof flowLevelDefaultWidth === 'number' && flowLevelDefaultWidth > 0) { + setPanelWidth(flowLevelDefaultWidth); + return; + } + setPanelWidth(PROPERTY_PANEL_DEFAULT_WIDTH); + } + function updatePropertyPanel(forceUpdate = true): void { + updatePanelWidth(); const nodeId = selectedNode.value?.id; const nodeData = selectedNode.value?.data; const getPropertyPanelConfig = selectedNodeDefinition.value?.getPropertyPanelConfig; @@ -138,8 +162,6 @@ export function useNodePropertyPanel(): UseNodePropertyPanel { return panelShowMode.value === 'panel'; }); - const rightPanelWidth = ref(450); - const PANEL_ID = 'NodePropertyPanel'; const { currentRightFloatPanelId } = useFloatPanelLayout(); function renderCurrentPanel() { diff --git a/ai-flow-front/packages/flow-designer/src/components/node-debug-drawer/node-debug-drawer.component.vue b/ai-flow-front/packages/flow-designer/src/components/node-debug-drawer/node-debug-drawer.component.vue index 44195e472f3d8b563e5e00a787af7da3e3134b90..c514b3ec618357b7686c2004c7274386fb8166dd 100644 --- a/ai-flow-front/packages/flow-designer/src/components/node-debug-drawer/node-debug-drawer.component.vue +++ b/ai-flow-front/packages/flow-designer/src/components/node-debug-drawer/node-debug-drawer.component.vue @@ -334,7 +334,7 @@ onUnmounted(() => { .tab-item { flex: 1; text-align: center; - padding: 0 14px 7px 14px; + padding: 4px 14px 3px 14px; cursor: pointer; font-size: 14px; font-weight: 400; diff --git a/ai-flow-front/packages/flow-designer/src/components/toolbar/components/trial-run/chat-debug.vue b/ai-flow-front/packages/flow-designer/src/components/toolbar/components/trial-run/chat-debug.vue index 6bac96802f293edf5c1592e772e4d21acaf7b7f5..2d0d193e64e91364b5032fd8c4e26af4434b8b6c 100644 --- a/ai-flow-front/packages/flow-designer/src/components/toolbar/components/trial-run/chat-debug.vue +++ b/ai-flow-front/packages/flow-designer/src/components/toolbar/components/trial-run/chat-debug.vue @@ -111,7 +111,7 @@