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(
outputs: AiChatModule.outputs
};
}
function datasetNodeTemplate(formData: AppFormEditFormType, question: any): StoreNodeItemType {
function datasetNodeTemplate(
formData: AppFormEditFormType,
question: any,
isTool = false
): StoreNodeItemType {
return {
nodeId: datasetNodeId,
name: t(DatasetSearchModule.name),
......@@ -543,6 +547,7 @@ export function form2AppWorkflow(
key: NodeInputKeyEnum.datasetSearchInput,
valueType: WorkflowIOValueTypeEnum.arrayString,
toolDescription: i18nT('workflow:content_to_search'),
isToolParam: isTool,
value: question
}
],
......@@ -599,7 +604,7 @@ export function form2AppWorkflow(
const datasetTool: WorkflowType | null =
selectedDatasets.length > 0
? {
nodes: [datasetNodeTemplate(formData, '')],
nodes: [datasetNodeTemplate(formData, '', true)],
edges: [
{
source: toolNodeId,
......
......@@ -200,6 +200,7 @@ const NodeCode = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
nodeId={nodeId}
flowInputList={commonInputs}
CustomComponent={CustomComponent}
isTool={isTool}
/>
</Container>
<Container>
......
......@@ -173,6 +173,7 @@ const NodeExtract = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
nodeId={nodeId}
flowInputList={commonInputs}
CustomComponent={CustomComponent}
isTool={isTool}
/>
</Container>
<Container>
......
......@@ -850,6 +850,7 @@ const NodeHttp = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
nodeId={nodeId}
flowInputList={commonInputs}
CustomComponent={CustomComponents}
isTool={isTool}
/>
</Container>
<Container>
......
......@@ -12,7 +12,6 @@ import { useContextSelector } from 'use-context-selector';
import CatchError from './render/RenderOutput/CatchError';
import { useMemoEnhance } from '@fastgpt/web/hooks/useMemoEnhance';
import { WorkflowUtilsContext } from '../../context/workflowUtilsContext';
import { AppNodeFlowNodeTypeMap } from '@fastgpt/global/core/workflow/node/constant';
const NodeSimple = ({
data,
......@@ -31,9 +30,6 @@ const NodeSimple = ({
() => splitOutput(outputs),
[splitOutput, outputs]
);
// 内置节点作为 ToolCall 工具时,保留模型、知识库等节点本地运行配置。
const shouldFilterToolParams = isTool && !!AppNodeFlowNodeTypeMap[data.flowNodeType];
const Render = useMemo(() => {
return (
<NodeCard minW={minW} maxW={maxW} selected={selected} {...data}>
......@@ -48,11 +44,7 @@ const NodeSimple = ({
<>
<Container>
<IOTitle text={t('common:Input')} nodeId={nodeId} inputs={inputs} />
<RenderInput
nodeId={nodeId}
flowInputList={commonInputs}
isTool={shouldFilterToolParams}
/>
<RenderInput nodeId={nodeId} flowInputList={commonInputs} isTool={isTool} />
</Container>
</>
)}
......@@ -73,7 +65,6 @@ const NodeSimple = ({
selected,
data,
isTool,
shouldFilterToolParams,
nodeId,
inputs,
commonInputs,
......
......@@ -16,7 +16,6 @@ import MyTag from '@fastgpt/web/components/common/Tag/index';
import { useTranslation } from 'next-i18next';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { getSelectedInputRenderType } from '@fastgpt/global/core/workflow/utils';
import { canInputBeConfiguredAsToolParam } from '@fastgpt/global/core/app/formEdit/utils';
const RenderList: Record<
FlowNodeInputTypeEnum,
......@@ -167,11 +166,10 @@ const RenderInput = ({
const isDynamic = !!input.canEdit;
if (renderType === FlowNodeInputTypeEnum.hidden || isDynamic) return false;
if (isTool && !canInputBeConfiguredAsToolParam(input)) return false;
return true;
});
}, [filterProInputs, isTool]);
}, [filterProInputs]);
return (
<>
......
......@@ -196,6 +196,43 @@ describe('form2AppWorkflow', () => {
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', () => {
const form = getDefaultAppForm();
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