Commit c8608e6d by Finley Ge Committed by GitHub

fix(workflow): preserve tool parameters for built-in nodes (#7413)

parent d5417d45
...@@ -438,7 +438,11 @@ export function form2AppWorkflow( ...@@ -438,7 +438,11 @@ export function form2AppWorkflow(
outputs: AiChatModule.outputs outputs: AiChatModule.outputs
}; };
} }
function datasetNodeTemplate(formData: AppFormEditFormType, question: any): StoreNodeItemType { function datasetNodeTemplate(
formData: AppFormEditFormType,
question: any,
isTool = false
): StoreNodeItemType {
return { return {
nodeId: datasetNodeId, nodeId: datasetNodeId,
name: t(DatasetSearchModule.name), name: t(DatasetSearchModule.name),
...@@ -543,6 +547,7 @@ export function form2AppWorkflow( ...@@ -543,6 +547,7 @@ export function form2AppWorkflow(
key: NodeInputKeyEnum.datasetSearchInput, key: NodeInputKeyEnum.datasetSearchInput,
valueType: WorkflowIOValueTypeEnum.arrayString, valueType: WorkflowIOValueTypeEnum.arrayString,
toolDescription: i18nT('workflow:content_to_search'), toolDescription: i18nT('workflow:content_to_search'),
isToolParam: isTool,
value: question value: question
} }
], ],
...@@ -599,7 +604,7 @@ export function form2AppWorkflow( ...@@ -599,7 +604,7 @@ export function form2AppWorkflow(
const datasetTool: WorkflowType | null = const datasetTool: WorkflowType | null =
selectedDatasets.length > 0 selectedDatasets.length > 0
? { ? {
nodes: [datasetNodeTemplate(formData, '')], nodes: [datasetNodeTemplate(formData, '', true)],
edges: [ edges: [
{ {
source: toolNodeId, source: toolNodeId,
......
...@@ -200,6 +200,7 @@ const NodeCode = ({ data, selected }: NodeProps<FlowNodeItemType>) => { ...@@ -200,6 +200,7 @@ const NodeCode = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
nodeId={nodeId} nodeId={nodeId}
flowInputList={commonInputs} flowInputList={commonInputs}
CustomComponent={CustomComponent} CustomComponent={CustomComponent}
isTool={isTool}
/> />
</Container> </Container>
<Container> <Container>
......
...@@ -173,6 +173,7 @@ const NodeExtract = ({ data, selected }: NodeProps<FlowNodeItemType>) => { ...@@ -173,6 +173,7 @@ const NodeExtract = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
nodeId={nodeId} nodeId={nodeId}
flowInputList={commonInputs} flowInputList={commonInputs}
CustomComponent={CustomComponent} CustomComponent={CustomComponent}
isTool={isTool}
/> />
</Container> </Container>
<Container> <Container>
......
...@@ -850,6 +850,7 @@ const NodeHttp = ({ data, selected }: NodeProps<FlowNodeItemType>) => { ...@@ -850,6 +850,7 @@ const NodeHttp = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
nodeId={nodeId} nodeId={nodeId}
flowInputList={commonInputs} flowInputList={commonInputs}
CustomComponent={CustomComponents} CustomComponent={CustomComponents}
isTool={isTool}
/> />
</Container> </Container>
<Container> <Container>
......
...@@ -12,7 +12,6 @@ import { useContextSelector } from 'use-context-selector'; ...@@ -12,7 +12,6 @@ import { useContextSelector } from 'use-context-selector';
import CatchError from './render/RenderOutput/CatchError'; import CatchError from './render/RenderOutput/CatchError';
import { useMemoEnhance } from '@fastgpt/web/hooks/useMemoEnhance'; import { useMemoEnhance } from '@fastgpt/web/hooks/useMemoEnhance';
import { WorkflowUtilsContext } from '../../context/workflowUtilsContext'; import { WorkflowUtilsContext } from '../../context/workflowUtilsContext';
import { AppNodeFlowNodeTypeMap } from '@fastgpt/global/core/workflow/node/constant';
const NodeSimple = ({ const NodeSimple = ({
data, data,
...@@ -31,9 +30,6 @@ const NodeSimple = ({ ...@@ -31,9 +30,6 @@ const NodeSimple = ({
() => splitOutput(outputs), () => splitOutput(outputs),
[splitOutput, outputs] [splitOutput, outputs]
); );
// 内置节点作为 ToolCall 工具时,保留模型、知识库等节点本地运行配置。
const shouldFilterToolParams = isTool && !!AppNodeFlowNodeTypeMap[data.flowNodeType];
const Render = useMemo(() => { const Render = useMemo(() => {
return ( return (
<NodeCard minW={minW} maxW={maxW} selected={selected} {...data}> <NodeCard minW={minW} maxW={maxW} selected={selected} {...data}>
...@@ -48,11 +44,7 @@ const NodeSimple = ({ ...@@ -48,11 +44,7 @@ const NodeSimple = ({
<> <>
<Container> <Container>
<IOTitle text={t('common:Input')} nodeId={nodeId} inputs={inputs} /> <IOTitle text={t('common:Input')} nodeId={nodeId} inputs={inputs} />
<RenderInput <RenderInput nodeId={nodeId} flowInputList={commonInputs} isTool={isTool} />
nodeId={nodeId}
flowInputList={commonInputs}
isTool={shouldFilterToolParams}
/>
</Container> </Container>
</> </>
)} )}
...@@ -73,7 +65,6 @@ const NodeSimple = ({ ...@@ -73,7 +65,6 @@ const NodeSimple = ({
selected, selected,
data, data,
isTool, isTool,
shouldFilterToolParams,
nodeId, nodeId,
inputs, inputs,
commonInputs, commonInputs,
......
...@@ -16,7 +16,6 @@ import MyTag from '@fastgpt/web/components/common/Tag/index'; ...@@ -16,7 +16,6 @@ import MyTag from '@fastgpt/web/components/common/Tag/index';
import { useTranslation } from 'next-i18next'; import { useTranslation } from 'next-i18next';
import MyIcon from '@fastgpt/web/components/common/Icon'; import MyIcon from '@fastgpt/web/components/common/Icon';
import { getSelectedInputRenderType } from '@fastgpt/global/core/workflow/utils'; import { getSelectedInputRenderType } from '@fastgpt/global/core/workflow/utils';
import { canInputBeConfiguredAsToolParam } from '@fastgpt/global/core/app/formEdit/utils';
const RenderList: Record< const RenderList: Record<
FlowNodeInputTypeEnum, FlowNodeInputTypeEnum,
...@@ -167,11 +166,10 @@ const RenderInput = ({ ...@@ -167,11 +166,10 @@ const RenderInput = ({
const isDynamic = !!input.canEdit; const isDynamic = !!input.canEdit;
if (renderType === FlowNodeInputTypeEnum.hidden || isDynamic) return false; if (renderType === FlowNodeInputTypeEnum.hidden || isDynamic) return false;
if (isTool && !canInputBeConfiguredAsToolParam(input)) return false;
return true; return true;
}); });
}, [filterProInputs, isTool]); }, [filterProInputs]);
return ( return (
<> <>
......
...@@ -196,6 +196,43 @@ describe('form2AppWorkflow', () => { ...@@ -196,6 +196,43 @@ describe('form2AppWorkflow', () => {
expect(restored.dataset.authTmbId).toBe(true); expect(restored.dataset.authTmbId).toBe(true);
}); });
it('should mark dataset search input as agent-generated when used with tools', () => {
const form = getDefaultAppForm();
form.dataset.datasets = [
{
datasetId: 'dataset1',
avatar: '',
name: 'Test Dataset',
vectorModel: { model: 'text-embedding-ada-002' } as any
}
];
form.selectedTools = [
{
id: 'tool-node-1',
pluginId: 'systemTool-weather',
source: 'system',
flowNodeType: FlowNodeTypeEnum.tool,
templateType: 'other',
name: 'Weather Tool',
avatar: '',
intro: '',
inputs: [],
outputs: [],
showStatus: true
} as any
];
const workflow = form2AppWorkflow(form, mockT);
const datasetSearchInput = workflow.nodes
.find((node) => node.flowNodeType === FlowNodeTypeEnum.datasetSearchNode)
?.inputs.find((input) => input.key === NodeInputKeyEnum.datasetSearchInput);
expect(datasetSearchInput).toMatchObject({
value: '',
isToolParam: true
});
});
it('should preserve debug tool source when roundtripping simple app tools', () => { it('should preserve debug tool source when roundtripping simple app tools', () => {
const form = getDefaultAppForm(); const form = getDefaultAppForm();
form.aiSettings = { form.aiSettings = {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment