diff --git a/web/app/components/workflow/nodes/_base/hooks/use-node-crud.ts b/web/app/components/workflow/nodes/_base/hooks/use-node-crud.ts index 51d2fdb80ca..6a8e5051c8e 100644 --- a/web/app/components/workflow/nodes/_base/hooks/use-node-crud.ts +++ b/web/app/components/workflow/nodes/_base/hooks/use-node-crud.ts @@ -4,6 +4,7 @@ const useNodeCrud = (id: string, data: CommonNodeType) => { const { handleNodeDataUpdateWithSyncDraft } = useNodeDataUpdate() const setInputs = (newInputs: CommonNodeType) => { + console.log(newInputs, 'xx') handleNodeDataUpdateWithSyncDraft({ id, data: newInputs, diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/add-condition.tsx b/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/add-condition.tsx index eb88c82edcb..600c2781baf 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/add-condition.tsx +++ b/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/add-condition.tsx @@ -1,10 +1,12 @@ import { + useCallback, useMemo, useState, } from 'react' import { RiAddLine, } from '@remixicon/react' +import MetadataIcon from './metadata-icon' import { PortalToFollowElem, PortalToFollowElemContent, @@ -13,6 +15,7 @@ import { import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' import type { MetadataShape } from '@/app/components/workflow/nodes/knowledge-retrieval/types' +import type { MetadataInDoc } from '@/models/datasets' const AddCondition = ({ metadataList, @@ -25,6 +28,11 @@ const AddCondition = ({ return metadataList?.filter(metadata => metadata.name.includes(searchText)) }, [metadataList, searchText]) + const handleAddConditionWrapped = useCallback((item: MetadataInDoc) => { + handleAddCondition?.(item) + setOpen(false) + }, [handleAddCondition]) + return ( +
+ +
handleAddCondition?.(metadata.name)} + onClick={() => handleAddConditionWrapped(metadata)} > {metadata.name}
diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-item.tsx b/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-item.tsx index cb3109aa5e8..fd2018556d5 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-item.tsx +++ b/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-item.tsx @@ -3,7 +3,10 @@ import { useMemo, useState, } from 'react' -import { RiDeleteBinLine } from '@remixicon/react' +import { + RiDeleteBinLine, +} from '@remixicon/react' +import MetadataIcon from '../metadata-icon' import { VARIABLE_REGEX, comparisonOperatorNotRequireValue, @@ -12,7 +15,6 @@ import ConditionOperator from './condition-operator' import ConditionString from './condition-string' import ConditionNumber from './condition-number' import ConditionDate from './condition-date' -import { useCondition } from './hooks' import type { ComparisonOperator, HandleRemoveCondition, @@ -21,11 +23,6 @@ import type { MetadataShape, } from '@/app/components/workflow/nodes/knowledge-retrieval/types' import { MetadataFilteringVariableType } from '@/app/components/workflow/nodes/knowledge-retrieval/types' - -import type { - Node, - NodeOutPutVar, -} from '@/app/components/workflow/types' import cn from '@/utils/classnames' type ConditionItemProps = { @@ -34,9 +31,7 @@ type ConditionItemProps = { condition: MetadataFilteringCondition // condition may the condition of case or condition of sub variable onRemoveCondition?: HandleRemoveCondition onUpdateCondition?: HandleUpdateCondition - nodesOutputVars: NodeOutPutVar[] - availableNodes: Node[] -} & Pick +} & Pick const ConditionItem = ({ className, disabled, @@ -44,11 +39,12 @@ const ConditionItem = ({ onRemoveCondition, onUpdateCondition, metadataList = [], - nodesOutputVars, - availableNodes, + availableStringVars = [], + availableStringNodesWithParent = [], + availableNumberVars = [], + availableNumberNodesWithParent = [], }: ConditionItemProps) => { const [isHovered, setIsHovered] = useState(false) - const { getConditionVariableType } = useCondition() const canChooseOperator = useMemo(() => { if (disabled) @@ -66,7 +62,13 @@ const ConditionItem = ({ }, [metadataList, condition.name]) const handleConditionOperatorChange = useCallback((operator: ComparisonOperator) => { - onUpdateCondition?.(condition.name, { ...condition, comparison_operator: operator }) + onUpdateCondition?.( + condition.name, + { + ...condition, + value: comparisonOperatorNotRequireValue(condition.comparison_operator) ? undefined : condition.value, + comparison_operator: operator, + }) }, [onUpdateCondition, condition]) const valueAndValueMethod = useMemo(() => { @@ -95,7 +97,7 @@ const ConditionItem = ({ valueMethod: 'constant', } }, [currentMetadata, condition.value]) - const [localValueMethod, setLocalValueMethod] = useState(valueAndValueMethod.value) + const [localValueMethod, setLocalValueMethod] = useState(valueAndValueMethod.valueMethod) const handleValueMethodChange = useCallback((v: string) => { setLocalValueMethod(v) @@ -114,9 +116,12 @@ const ConditionItem = ({ )}>
-
-
Language
-
string
+
+
+ +
+
{currentMetadata?.name}
+
{currentMetadata?.type}
@@ -127,38 +132,40 @@ const ConditionItem = ({ onSelect={handleConditionOperatorChange} />
- { - !comparisonOperatorNotRequireValue(condition.comparison_operator) && getConditionVariableType(condition.name) === MetadataFilteringVariableType.string && ( - - ) - } - { - !comparisonOperatorNotRequireValue(condition.comparison_operator) && getConditionVariableType(condition.name) === MetadataFilteringVariableType.number && ( - - ) - } - { - !comparisonOperatorNotRequireValue(condition.comparison_operator) && getConditionVariableType(condition.name) === MetadataFilteringVariableType.date && ( - - ) - } +
+ { + !comparisonOperatorNotRequireValue(condition.comparison_operator) && currentMetadata?.type === MetadataFilteringVariableType.string && ( + + ) + } + { + !comparisonOperatorNotRequireValue(condition.comparison_operator) && currentMetadata?.type === MetadataFilteringVariableType.number && ( + + ) + } + { + !comparisonOperatorNotRequireValue(condition.comparison_operator) && currentMetadata?.type === MetadataFilteringVariableType.time && ( + + ) + } +
onChange(e.target.value)} + placeholder='Enter value' + type='number' /> ) } diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-string.tsx b/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-string.tsx index 2d7f31c72bc..c7760555d1c 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-string.tsx +++ b/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-string.tsx @@ -7,6 +7,7 @@ import type { NodeOutPutVar, ValueSelector, } from '@/app/components/workflow/types' +import Input from '@/app/components/base/input' type ConditionStringProps = { value?: string @@ -17,7 +18,7 @@ type ConditionStringProps = { const ConditionString = ({ value, onChange, - valueMethod, + valueMethod = 'constant', onValueMethodChange, nodesOutputVars, availableNodes, @@ -36,7 +37,7 @@ const ConditionString = ({ { valueMethod === 'variable' && ( onChange(e.target.value)} + placeholder='Enter value' /> ) } diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-value-method.tsx b/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-value-method.tsx index 2f1d604e408..f51db698c41 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-value-method.tsx +++ b/web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-value-method.tsx @@ -30,7 +30,7 @@ const ConditionValueMethod = ({ placement='bottom-start' offset={{ mainAxis: 4, crossAxis: 0 }} > - setOpen(v => !v)}> + setOpen(v => !v)}>
- +
+ +
Conditions
- {metadataFilteringConditions?.conditions.length} + {metadataFilteringConditions?.conditions.length || 0}
diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/panel.tsx b/web/app/components/workflow/nodes/knowledge-retrieval/panel.tsx index ce127a169bb..f6fb426cac9 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/panel.tsx +++ b/web/app/components/workflow/nodes/knowledge-retrieval/panel.tsx @@ -55,6 +55,10 @@ const Panel: FC> = ({ handleUpdateCondition, handleMetadataModelChange, handleMetadataCompletionParamsChange, + availableStringVars, + availableStringNodesWithParent, + availableNumberVars, + availableNumberNodesWithParent, } = useConfig(id, data) const handleOpenFromPropsChange = useCallback((openFromProps: boolean) => { @@ -71,7 +75,7 @@ const Panel: FC> = ({ return (
-
+
{/* {JSON.stringify(inputs, null, 2)} */} > = ({ />
-
+
> = ({ metadataModelConfig={inputs.metadata_model_config} handleMetadataModelChange={handleMetadataModelChange} handleMetadataCompletionParamsChange={handleMetadataCompletionParamsChange} + availableStringVars={availableStringVars} + availableStringNodesWithParent={availableStringNodesWithParent} + availableNumberVars={availableNumberVars} + availableNumberNodesWithParent={availableNumberNodesWithParent} />
diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/types.ts b/web/app/components/workflow/nodes/knowledge-retrieval/types.ts index 3b7b340de36..981b2e09ad2 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/types.ts +++ b/web/app/components/workflow/nodes/knowledge-retrieval/types.ts @@ -1,4 +1,10 @@ -import type { CommonNodeType, ModelConfig, ValueSelector } from '@/app/components/workflow/types' +import type { + CommonNodeType, + ModelConfig, + Node, + NodeOutPutVar, + ValueSelector, +} from '@/app/components/workflow/types' import type { RETRIEVE_TYPE } from '@/types/app' import type { DataSet, @@ -58,6 +64,8 @@ export enum ComparisonOperator { allOf = 'all of', exists = 'exists', notExists = 'not exists', + before = 'before', + after = 'after', } export enum MetadataFilteringModeEnum { @@ -69,7 +77,7 @@ export enum MetadataFilteringModeEnum { export enum MetadataFilteringVariableType { string = 'string', number = 'number', - date = 'date', + time = 'time', } export type MetadataFilteringCondition = { @@ -95,7 +103,7 @@ export type KnowledgeRetrievalNodeType = CommonNodeType & { metadata_model_config?: ModelConfig } -export type HandleAddCondition = (name: string) => void +export type HandleAddCondition = (metadataItem: MetadataInDoc) => void export type HandleRemoveCondition = (name: string) => void export type HandleUpdateCondition = (name: string, newCondition: MetadataFilteringCondition) => void export type HandleToggleConditionLogicalOperator = () => void @@ -110,4 +118,8 @@ export type MetadataShape = { metadataModelConfig?: ModelConfig handleMetadataModelChange?: (model: { modelId: string; provider: string; mode?: string; features?: string[] }) => void handleMetadataCompletionParamsChange?: (params: Record) => void + availableStringVars?: NodeOutPutVar[] + availableStringNodesWithParent?: Node[] + availableNumberVars?: NodeOutPutVar[] + availableNumberNodesWithParent?: Node[] } diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts b/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts index 3f120492589..c0454e1bbac 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts +++ b/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts @@ -22,7 +22,11 @@ import type { MetadataFilteringModeEnum, MultipleRetrievalConfig, } from './types' -import { ComparisonOperator, LogicalOperator } from './types' +import { + ComparisonOperator, + LogicalOperator, + MetadataFilteringVariableType, +} from './types' import { getMultipleRetrievalConfig, getSelectedDatasetsMode, @@ -35,6 +39,7 @@ import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-cr import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run' import { useCurrentProviderAndModel, useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks' import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' +import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list' const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => { const { nodesReadOnly: readOnly } = useNodesReadOnly() @@ -303,18 +308,34 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => { })) }, [setInputs]) - const handleAddCondition = useCallback((name) => { + const handleAddCondition = useCallback(({ name, type }) => { + let operator: ComparisonOperator = ComparisonOperator.is + + if (type === MetadataFilteringVariableType.number) + operator = ComparisonOperator.equal + + const newCondition = { + name, + comparison_operator: operator, + } + const newInputs = produce(inputRef.current, (draft) => { - draft.metadata_filtering_conditions?.conditions.push({ - name, - comparison_operator: ComparisonOperator.is, - }) + if (draft.metadata_filtering_conditions) { + draft.metadata_filtering_conditions.conditions.push(newCondition) + } + else { + draft.metadata_filtering_conditions = { + logical_operator: LogicalOperator.and, + conditions: [newCondition], + } + } }) setInputs(newInputs) }, [setInputs]) const handleRemoveCondition = useCallback((name) => { - const index = inputRef.current.metadata_filtering_conditions?.conditions.findIndex(c => c.name === name) || -1 + const conditions = inputRef.current.metadata_filtering_conditions?.conditions || [] + const index = conditions.findIndex(c => c.name === name) const newInputs = produce(inputRef.current, (draft) => { if (index > -1) draft.metadata_filtering_conditions?.conditions.splice(index, 1) @@ -323,7 +344,8 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => { }, [setInputs]) const handleUpdateCondition = useCallback((name, newCondition) => { - const index = inputRef.current.metadata_filtering_conditions?.conditions.findIndex(c => c.name === name) || -1 + const conditions = inputRef.current.metadata_filtering_conditions?.conditions || [] + const index = conditions.findIndex(c => c.name === name) const newInputs = produce(inputRef.current, (draft) => { if (index > -1) draft.metadata_filtering_conditions!.conditions[index] = newCondition @@ -362,6 +384,30 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => { setInputs(newInputs) }, [setInputs]) + const filterStringVar = useCallback((varPayload: Var) => { + return [VarType.string].includes(varPayload.type) + }, []) + + const { + availableVars: availableStringVars, + availableNodesWithParent: availableStringNodesWithParent, + } = useAvailableVarList(id, { + onlyLeafNodeVar: false, + filterVar: filterStringVar, + }) + + const filterNumberVar = useCallback((varPayload: Var) => { + return [VarType.number].includes(varPayload.type) + }, []) + + const { + availableVars: availableNumberVars, + availableNodesWithParent: availableNumberNodesWithParent, + } = useAvailableVarList(id, { + onlyLeafNodeVar: false, + filterVar: filterNumberVar, + }) + return { readOnly, inputs, @@ -390,6 +436,10 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => { handleToggleConditionLogicalOperator, handleMetadataModelChange, handleMetadataCompletionParamsChange, + availableStringVars, + availableStringNodesWithParent, + availableNumberVars, + availableNumberNodesWithParent, } }