diff --git a/web/src/constants/agent.tsx b/web/src/constants/agent.tsx index 3a8411ce3..0ba1d927c 100644 --- a/web/src/constants/agent.tsx +++ b/web/src/constants/agent.tsx @@ -169,3 +169,13 @@ export const SwitchOperatorOptions = [ icon: , }, ]; + +export const AgentStructuredOutputField = 'structured'; + +export enum JsonSchemaDataType { + String = 'string', + Number = 'number', + Boolean = 'boolean', + Array = 'array', + Object = 'object', +} diff --git a/web/src/pages/agent/constant/index.tsx b/web/src/pages/agent/constant/index.tsx index 27969e643..87217a999 100644 --- a/web/src/pages/agent/constant/index.tsx +++ b/web/src/pages/agent/constant/index.tsx @@ -5,6 +5,7 @@ import { import { AgentGlobals, AgentGlobalsSysQueryWithBrace, + AgentStructuredOutputField, CodeTemplateStrMap, ComparisonOperator, Operator, @@ -12,7 +13,11 @@ import { SwitchOperatorOptions, initialLlmBaseValues, } from '@/constants/agent'; -export { Operator } from '@/constants/agent'; +export { + AgentStructuredOutputField, + JsonSchemaDataType, + Operator, +} from '@/constants/agent'; export * from './pipeline'; @@ -441,8 +446,6 @@ export const initialCodeValues = { export const initialWaitingDialogueValues = {}; -export const AgentStructuredOutputField = 'structured'; - export const initialAgentValues = { ...initialLlmBaseValues, description: '', @@ -839,14 +842,6 @@ export const DROPDOWN_HORIZONTAL_OFFSET = 28; export const DROPDOWN_VERTICAL_OFFSET = 74; export const PREVENT_CLOSE_DELAY = 300; -export enum JsonSchemaDataType { - String = 'string', - Number = 'number', - Boolean = 'boolean', - Array = 'array', - Object = 'object', -} - export enum VariableAssignerLogicalOperator { Overwrite = 'overwrite', Clear = 'clear', diff --git a/web/src/pages/agent/form/variable-assigner-form/dynamic-variables.tsx b/web/src/pages/agent/form/variable-assigner-form/dynamic-variables.tsx index e17aaccbc..8a01a7c07 100644 --- a/web/src/pages/agent/form/variable-assigner-form/dynamic-variables.tsx +++ b/web/src/pages/agent/form/variable-assigner-form/dynamic-variables.tsx @@ -7,7 +7,7 @@ import { Label } from '@/components/ui/label'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Separator } from '@/components/ui/separator'; import { Textarea } from '@/components/ui/textarea'; -import { Editor } from '@monaco-editor/react'; +import Editor, { loader } from '@monaco-editor/react'; import * as RadioGroupPrimitive from '@radix-ui/react-radio-group'; import { X } from 'lucide-react'; import { ReactNode, useCallback } from 'react'; @@ -23,6 +23,8 @@ import { DynamicFormHeader } from '../components/dynamic-fom-header'; import { QueryVariable } from '../components/query-variable'; import { useBuildLogicalOptions } from './use-build-logical-options'; +loader.config({ paths: { vs: '/vs' } }); + type SelectKeysProps = { name: string; label: ReactNode; @@ -70,7 +72,7 @@ const EmptyValueMap = { [JsonSchemaDataType.String]: '', [JsonSchemaDataType.Number]: 0, [JsonSchemaDataType.Boolean]: 'yes', - [JsonSchemaDataType.Object]: {}, + [JsonSchemaDataType.Object]: '{}', [JsonSchemaDataType.Array]: [], }; @@ -86,7 +88,7 @@ export function DynamicVariables({ const { getType } = useGetVariableLabelOrTypeByValue(); const isDarkTheme = useIsDarkTheme(); - const { fields, remove, append, update } = useFieldArray({ + const { fields, remove, append } = useFieldArray({ name: name, control: form.control, }); @@ -102,15 +104,7 @@ export function DynamicVariables({ ); const renderParameter = useCallback( - ( - keyFieldName: string, - operatorFieldName: string, - valueFieldAlias: string, - ) => { - console.log( - '🚀 ~ DynamicVariables ~ valueFieldAlias:', - form.getValues(valueFieldAlias), - ); + (keyFieldName: string, operatorFieldName: string) => { const logicalOperator = form.getValues(operatorFieldName); const type = getVariableType(keyFieldName); @@ -169,10 +163,6 @@ export function DynamicVariables({ const handleVariableChange = useCallback( (operatorFieldAlias: string, valueFieldAlias: string) => { - console.log( - '🚀 ~ DynamicVariables ~ operatorFieldAlias:', - operatorFieldAlias, - ); return () => { form.setValue( operatorFieldAlias, @@ -190,14 +180,8 @@ export function DynamicVariables({ ); const handleOperatorChange = useCallback( - ( - valueFieldAlias: string, - keyFieldAlias: string, - value: string, - index: number, - ) => { + (valueFieldAlias: string, keyFieldAlias: string, value: string) => { const type = getVariableType(keyFieldAlias); - console.log('🚀 ~ DynamicVariables ~ type:', type); let parameter = EmptyValueMap[type as keyof typeof EmptyValueMap]; @@ -210,10 +194,6 @@ export function DynamicVariables({ shouldDirty: true, shouldValidate: true, }); - - // form.trigger(valueFieldAlias); - - // update(index, { [valueField]: parameter }); } }, [form, getVariableType], @@ -258,7 +238,6 @@ export function DynamicVariables({ valueFieldAlias, keyFieldAlias, val, - index, ); onChange(val); }} @@ -270,11 +249,7 @@ export function DynamicVariables({ - {renderParameter( - keyFieldAlias, - operatorFieldAlias, - valueFieldAlias, - )} + {renderParameter(keyFieldAlias, operatorFieldAlias)} diff --git a/web/src/pages/agent/form/variable-assigner-form/index.tsx b/web/src/pages/agent/form/variable-assigner-form/index.tsx index 6821cf97c..6d717ebc7 100644 --- a/web/src/pages/agent/form/variable-assigner-form/index.tsx +++ b/web/src/pages/agent/form/variable-assigner-form/index.tsx @@ -33,7 +33,6 @@ function VariableAssignerForm({ node }: INextOperatorForm) { defaultValues: defaultValues, mode: 'onChange', resolver: zodResolver(FormSchema), - shouldUnregister: true, }); useWatchFormChange(node?.id, form, true); diff --git a/web/src/pages/agent/hooks/use-get-begin-query.tsx b/web/src/pages/agent/hooks/use-get-begin-query.tsx index 372c87a59..d3a0953c8 100644 --- a/web/src/pages/agent/hooks/use-get-begin-query.tsx +++ b/web/src/pages/agent/hooks/use-get-begin-query.tsx @@ -1,7 +1,7 @@ -import { AgentGlobals } from '@/constants/agent'; +import { AgentGlobals, AgentStructuredOutputField } from '@/constants/agent'; import { useFetchAgent } from '@/hooks/use-agent-request'; import { RAGFlowNodeType } from '@/interfaces/database/flow'; -import { buildNodeOutputOptions } from '@/utils/canvas-util'; +import { buildNodeOutputOptions, isAgentStructured } from '@/utils/canvas-util'; import { DefaultOptionType } from 'antd/es/select'; import { t } from 'i18next'; import { isEmpty, toLower } from 'lodash'; @@ -236,7 +236,11 @@ export function useFilterQueryVariableOptionsByTypes( toLower(x).startsWith('array') ? toLower(y.type).includes(toLower(x)) : toLower(y.type) === toLower(x), - ) || y.type === undefined, // agent structured output + ) || + isAgentStructured( + y.value, + y.value.slice(-AgentStructuredOutputField.length), + ), // agent structured output ), }; }) diff --git a/web/src/utils/canvas-util.tsx b/web/src/utils/canvas-util.tsx index bfe6165b1..f59c4c195 100644 --- a/web/src/utils/canvas-util.tsx +++ b/web/src/utils/canvas-util.tsx @@ -1,4 +1,10 @@ +import { + AgentStructuredOutputField, + JsonSchemaDataType, + Operator, +} from '@/constants/agent'; import { BaseNode } from '@/interfaces/database/agent'; + import { Edge } from '@xyflow/react'; import { isEmpty } from 'lodash'; import { ComponentType, ReactNode } from 'react'; @@ -23,6 +29,12 @@ export function filterAllUpstreamNodeIds(edges: Edge[], nodeIds: string[]) { }, []); } +export function isAgentStructured(id?: string, label?: string) { + return ( + label === AgentStructuredOutputField && id?.startsWith(`${Operator.Agent}:`) + ); +} + export function buildOutputOptions( outputs: Record = {}, nodeId?: string, @@ -34,7 +46,9 @@ export function buildOutputOptions( value: `${nodeId}@${x}`, parentLabel, icon, - type: outputs[x]?.type, + type: isAgentStructured(nodeId, x) + ? JsonSchemaDataType.Object + : outputs[x]?.type, })); }