From 8cd488259642603eaf5d773dcae26640fc872206 Mon Sep 17 00:00:00 2001 From: balibabu Date: Tue, 18 Nov 2025 20:07:04 +0800 Subject: [PATCH] Feat: Display variables in the variable assignment node. #10427 (#11349) ### What problem does this PR solve? Feat: Display variables in the variable assignment node. #10427 ### Type of change - [x] New Feature (non-breaking change which adds functionality) --- web/src/locales/en.ts | 13 +++++ web/src/locales/zh.ts | 13 +++++ .../canvas/node/variable-assigner-node.tsx | 26 +++++++-- web/src/pages/agent/constant/index.tsx | 7 +++ .../use-build-logical-options.ts | 53 +++++++++++++++---- 5 files changed, 98 insertions(+), 14 deletions(-) diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts index 47a8b8351..8d2f196d7 100644 --- a/web/src/locales/en.ts +++ b/web/src/locales/en.ts @@ -1852,6 +1852,19 @@ Important structured information may include: names, dates, locations, events, k asc: 'Ascending', desc: 'Descending', }, + variableAssignerLogicalOperatorOptions: { + overwrite: 'Overwrite', + clear: 'Clear', + set: 'Set', + '+=': 'Add', + '-=': 'Subtract', + '*=': 'Multiply', + '/=': 'Divide', + append: 'Append', + extend: 'Extend', + removeFirst: 'Remove first', + removeLast: 'Remove last', + }, }, llmTools: { bad_calculator: { diff --git a/web/src/locales/zh.ts b/web/src/locales/zh.ts index b6d25dc1f..4919dfa8a 100644 --- a/web/src/locales/zh.ts +++ b/web/src/locales/zh.ts @@ -1713,6 +1713,19 @@ Tokenizer 会根据所选方式将内容存储为对应的数据结构。`, asc: '升序', desc: '降序', }, + variableAssignerLogicalOperatorOptions: { + overwrite: '覆盖', + clear: '清除', + set: '设置', + add: '加', + subtract: '减', + multiply: '乘', + divide: '除', + append: '追加', + extend: '扩展', + removeFirst: '移除第一个', + removeLast: '移除最后一个', + }, }, footer: { profile: 'All rights reserved @ React', diff --git a/web/src/pages/agent/canvas/node/variable-assigner-node.tsx b/web/src/pages/agent/canvas/node/variable-assigner-node.tsx index c6f8beaf8..0f6c79a62 100644 --- a/web/src/pages/agent/canvas/node/variable-assigner-node.tsx +++ b/web/src/pages/agent/canvas/node/variable-assigner-node.tsx @@ -1,11 +1,31 @@ -import { IRagNode } from '@/interfaces/database/agent'; +import { NodeCollapsible } from '@/components/collapse'; +import { BaseNode } from '@/interfaces/database/agent'; import { NodeProps } from '@xyflow/react'; import { RagNode } from '.'; +import { VariableAssignerFormSchemaType } from '../../form/variable-assigner-form'; +import { useGetVariableLabelOrTypeByValue } from '../../hooks/use-get-begin-query'; +import { LabelCard } from './card'; + +export function VariableAssignerNode({ + ...props +}: NodeProps>) { + const { data } = props; + const { getLabel } = useGetVariableLabelOrTypeByValue(); -export function VariableAssignerNode({ ...props }: NodeProps) { return ( -
select
+ + {(x, idx) => ( +
+ + + {getLabel(x.variable)} + + {x.operator} + +
+ )} +
); } diff --git a/web/src/pages/agent/constant/index.tsx b/web/src/pages/agent/constant/index.tsx index bdd5a0763..76da5541b 100644 --- a/web/src/pages/agent/constant/index.tsx +++ b/web/src/pages/agent/constant/index.tsx @@ -851,6 +851,13 @@ export enum VariableAssignerLogicalNumberOperator { Divide = '/=', } +export const VariableAssignerLogicalNumberOperatorLabelMap = { + [VariableAssignerLogicalNumberOperator.Add]: 'add', + [VariableAssignerLogicalNumberOperator.Subtract]: 'subtract', + [VariableAssignerLogicalNumberOperator.Multiply]: 'multiply', + [VariableAssignerLogicalNumberOperator.Divide]: 'divide', +}; + export enum VariableAssignerLogicalArrayOperator { Overwrite = VariableAssignerLogicalOperator.Overwrite, Clear = VariableAssignerLogicalOperator.Clear, diff --git a/web/src/pages/agent/form/variable-assigner-form/use-build-logical-options.ts b/web/src/pages/agent/form/variable-assigner-form/use-build-logical-options.ts index a27ea20d5..a7f960e98 100644 --- a/web/src/pages/agent/form/variable-assigner-form/use-build-logical-options.ts +++ b/web/src/pages/agent/form/variable-assigner-form/use-build-logical-options.ts @@ -1,26 +1,57 @@ import { buildOptions } from '@/utils/form'; +import { camelCase } from 'lodash'; import { useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; import { JsonSchemaDataType, VariableAssignerLogicalArrayOperator, VariableAssignerLogicalNumberOperator, + VariableAssignerLogicalNumberOperatorLabelMap, VariableAssignerLogicalOperator, } from '../../constant'; export function useBuildLogicalOptions() { - const buildLogicalOptions = useCallback((type: string) => { - if ( - type?.toLowerCase().startsWith(JsonSchemaDataType.Array.toLowerCase()) - ) { - return buildOptions(VariableAssignerLogicalArrayOperator); - } + const { t } = useTranslation(); - if (type === JsonSchemaDataType.Number) { - return buildOptions(VariableAssignerLogicalNumberOperator); - } + const buildVariableAssignerLogicalOptions = useCallback( + (record: Record) => { + return buildOptions( + record, + t, + 'flow.variableAssignerLogicalOperatorOptions', + true, + ); + }, + [t], + ); - return buildOptions(VariableAssignerLogicalOperator); - }, []); + const buildLogicalOptions = useCallback( + (type: string) => { + if ( + type?.toLowerCase().startsWith(JsonSchemaDataType.Array.toLowerCase()) + ) { + return buildVariableAssignerLogicalOptions( + VariableAssignerLogicalArrayOperator, + ); + } + + if (type === JsonSchemaDataType.Number) { + return Object.values(VariableAssignerLogicalNumberOperator).map( + (val) => ({ + label: t( + `flow.variableAssignerLogicalOperatorOptions.${camelCase(VariableAssignerLogicalNumberOperatorLabelMap[val as keyof typeof VariableAssignerLogicalNumberOperatorLabelMap] || val)}`, + ), + value: val, + }), + ); + } + + return buildVariableAssignerLogicalOptions( + VariableAssignerLogicalOperator, + ); + }, + [buildVariableAssignerLogicalOptions, t], + ); return { buildLogicalOptions,