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,
}));
}