diff --git a/packages/global/core/app/utils.ts b/packages/global/core/app/utils.ts index 9821d5480..c574cac5f 100644 --- a/packages/global/core/app/utils.ts +++ b/packages/global/core/app/utils.ts @@ -97,7 +97,10 @@ export const appWorkflow2Form = ({ node.inputs, NodeInputKeyEnum.datasetSearchExtensionBg ); - } else if (node.flowNodeType === FlowNodeTypeEnum.pluginModule) { + } else if ( + node.flowNodeType === FlowNodeTypeEnum.pluginModule || + node.flowNodeType === FlowNodeTypeEnum.appModule + ) { if (!node.pluginId) return; defaultAppForm.selectedTools.push({ @@ -108,7 +111,7 @@ export const appWorkflow2Form = ({ intro: node.intro || '', flowNodeType: node.flowNodeType, showStatus: node.showStatus, - version: '481', + version: node.version, inputs: node.inputs, outputs: node.outputs, templateType: FlowNodeTemplateTypeEnum.other diff --git a/packages/global/core/workflow/template/constants.ts b/packages/global/core/workflow/template/constants.ts index 76439e3b3..f4da162f1 100644 --- a/packages/global/core/workflow/template/constants.ts +++ b/packages/global/core/workflow/template/constants.ts @@ -27,7 +27,7 @@ import { VariableUpdateNode } from './system/variableUpdate'; import { CodeNode } from './system/sandbox'; import { TextEditorNode } from './system/textEditor'; import { CustomFeedbackNode } from './system/customFeedback'; -import { ReadFilesNodes } from './system/readFiles'; +import { ReadFilesNode } from './system/readFiles'; import { UserSelectNode } from './system/userSelect/index'; import { LoopNode } from './system/loop/loop'; import { LoopStartNode } from './system/loop/loopStart'; @@ -43,7 +43,7 @@ const systemNodes: FlowNodeTemplateType[] = [ StopToolNode, ClassifyQuestionModule, ContextExtractModule, - ReadFilesNodes, + ReadFilesNode, HttpNode468, AiQueryExtension, LafModule, diff --git a/packages/global/core/workflow/template/input.ts b/packages/global/core/workflow/template/input.ts index 766a7881d..5d70d6391 100644 --- a/packages/global/core/workflow/template/input.ts +++ b/packages/global/core/workflow/template/input.ts @@ -23,7 +23,7 @@ export const Input_Template_UserChatInput: FlowNodeInputItemType = { renderTypeList: [FlowNodeInputTypeEnum.reference, FlowNodeInputTypeEnum.textarea], valueType: WorkflowIOValueTypeEnum.string, label: i18nT('workflow:user_question'), - toolDescription: i18nT('workflow:user_question'), + toolDescription: i18nT('workflow:user_question_tool_desc'), required: true }; diff --git a/packages/global/core/workflow/template/system/readFiles/index.tsx b/packages/global/core/workflow/template/system/readFiles/index.tsx index cbff1d219..8018eda74 100644 --- a/packages/global/core/workflow/template/system/readFiles/index.tsx +++ b/packages/global/core/workflow/template/system/readFiles/index.tsx @@ -13,7 +13,7 @@ import { import { FlowNodeTemplateType } from '../../../type/node'; import { getHandleConfig } from '../../utils'; -export const ReadFilesNodes: FlowNodeTemplateType = { +export const ReadFilesNode: FlowNodeTemplateType = { id: FlowNodeTypeEnum.readFiles, templateType: FlowNodeTemplateTypeEnum.tools, flowNodeType: FlowNodeTypeEnum.readFiles, diff --git a/packages/service/core/chat/utils.ts b/packages/service/core/chat/utils.ts index e6492bcb0..2c11231d3 100644 --- a/packages/service/core/chat/utils.ts +++ b/packages/service/core/chat/utils.ts @@ -178,6 +178,11 @@ export const loadRequestMessages = async ({ }); }); + // Too many images or too long text, return text + if (httpsImages.length > 4 || input.length > 1000) { + return [{ type: 'text', text: input || '' }]; + } + // 添加原始input作为文本 result.push({ type: 'text', text: input }); return result; diff --git a/packages/service/core/workflow/dispatch/agent/runTool/functionCall.ts b/packages/service/core/workflow/dispatch/agent/runTool/functionCall.ts index 09bb1f9dd..3cbbffb13 100644 --- a/packages/service/core/workflow/dispatch/agent/runTool/functionCall.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/functionCall.ts @@ -255,17 +255,6 @@ export const runToolWithFunctionCall = async ( ]; // console.log(tokens, 'tool'); - // Run tool status - if (node.showStatus) { - workflowStreamResponse?.({ - event: SseResponseEventEnum.flowNodeStatus, - data: { - status: 'running', - name: node.name - } - }); - } - // tool assistant const toolAssistants = toolsRunResponse .map((item) => { diff --git a/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts b/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts index 73717ee6e..48b09033b 100644 --- a/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts @@ -275,17 +275,6 @@ export const runToolWithPromptCall = async ( }; })(); - // Run tool status - if (node.showStatus) { - workflowStreamResponse?.({ - event: SseResponseEventEnum.flowNodeStatus, - data: { - status: 'running', - name: node.name - } - }); - } - // 合并工具调用的结果,使用 functionCall 格式存储。 const assistantToolMsgParams: ChatCompletionAssistantMessageParam = { role: ChatCompletionRequestMessageRoleEnum.Assistant, diff --git a/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts b/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts index 558ebb38e..c42330419 100644 --- a/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts @@ -311,17 +311,6 @@ export const runToolWithToolChoice = async ( // console.log(tokens, 'tool'); - // Run tool status - if (node.showStatus) { - workflowStreamResponse?.({ - event: SseResponseEventEnum.flowNodeStatus, - data: { - status: 'running', - name: node.name - } - }); - } - // tool assistant const toolAssistants = toolsRunResponse .map((item) => { diff --git a/packages/service/core/workflow/dispatch/index.ts b/packages/service/core/workflow/dispatch/index.ts index 8120bfaf5..6f92e49a1 100644 --- a/packages/service/core/workflow/dispatch/index.ts +++ b/packages/service/core/workflow/dispatch/index.ts @@ -497,7 +497,7 @@ export async function dispatchWorkFlow(data: Props): Promise; }> { // push run status messages - if (node.showStatus) { + if (node.showStatus && !props.isToolCall) { props.workflowStreamResponse?.({ event: SseResponseEventEnum.flowNodeStatus, data: { diff --git a/packages/web/i18n/en/workflow.json b/packages/web/i18n/en/workflow.json index c3825b284..fea83cc4b 100644 --- a/packages/web/i18n/en/workflow.json +++ b/packages/web/i18n/en/workflow.json @@ -149,6 +149,7 @@ "update_specified_node_output_or_global_variable": "Can update the output value of a specified node or update global variables", "use_user_id": "User ID", "user_question": "User Question", + "user_question_tool_desc": "User input questions (questions need to be improved)", "value_type": "Value type", "variable_picker_tips": "Type node name or variable name to search", "variable_update": "Variable Update", diff --git a/packages/web/i18n/zh/workflow.json b/packages/web/i18n/zh/workflow.json index 91e596e43..6382079d8 100644 --- a/packages/web/i18n/zh/workflow.json +++ b/packages/web/i18n/zh/workflow.json @@ -155,6 +155,7 @@ "update_specified_node_output_or_global_variable": "可以更新指定节点的输出值或更新全局变量", "use_user_id": "使用者 ID", "user_question": "用户问题", + "user_question_tool_desc": "用户输入的问题(问题需要完善)", "value_type": "数据类型", "variable_picker_tips": "可输入节点名或变量名搜索", "variable_update": "变量更新", diff --git a/projects/app/src/pages/app/detail/components/SimpleApp/Header.tsx b/projects/app/src/pages/app/detail/components/SimpleApp/Header.tsx index 0e44ca505..407947577 100644 --- a/projects/app/src/pages/app/detail/components/SimpleApp/Header.tsx +++ b/projects/app/src/pages/app/detail/components/SimpleApp/Header.tsx @@ -24,6 +24,7 @@ import { useSystem } from '@fastgpt/web/hooks/useSystem'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { formatTime2YMDHMS } from '@fastgpt/global/common/string/time'; import { useSystemStore } from '@/web/common/system/useSystemStore'; +import { useDatasetStore } from '@/web/core/dataset/store/dataset'; const Header = ({ appForm, @@ -38,6 +39,7 @@ const Header = ({ const { toast } = useToast(); const { appId, appDetail, onSaveApp, currentTab } = useContextSelector(AppContext, (v) => v); const { lastAppListRouteType } = useSystemStore(); + const { allDatasets } = useDatasetStore(); const { data: paths = [] } = useRequest2(() => getAppFolderPath(appId), { manual: false, @@ -70,7 +72,7 @@ const Header = ({ chatConfig: data.chatConfig } ); - }, [appDetail.chatConfig, appDetail.modules, appForm, t]); + }, [appDetail.chatConfig, appDetail.modules, appForm, allDatasets, t]); const onSubmitPublish = useCallback( async (data: AppSimpleEditFormType) => { diff --git a/projects/app/src/pages/chat/share.tsx b/projects/app/src/pages/chat/share.tsx index 40cfcee6c..3f4a4eac4 100644 --- a/projects/app/src/pages/chat/share.tsx +++ b/projects/app/src/pages/chat/share.tsx @@ -49,10 +49,7 @@ type Props = { }; const OutLink = ({ - outLinkUid, - appName, - appIntro, - appAvatar + outLinkUid }: Props & { outLinkUid: string; }) => { @@ -240,8 +237,6 @@ const OutLink = ({ return ( <> - - { const { shareId, authToken } = props; const { localUId, loaded } = useShareChatStore(); + const [isLoaded, setIsLoaded] = useState(false); const contextParams = useMemo(() => { return { shareId, outLinkUid: authToken || localUId }; }, [authToken, localUId, shareId]); - if (!loaded || !contextParams.outLinkUid) return <>; + useMount(() => { + setIsLoaded(true); + }); + const systemLoaded = isLoaded && loaded && contextParams.outLinkUid; return ( - - ; - + <> + + {systemLoaded && ( + + ; + + )} + ); }; diff --git a/projects/app/src/web/core/app/utils.ts b/projects/app/src/web/core/app/utils.ts index 35c7f01ff..69c09b977 100644 --- a/projects/app/src/web/core/app/utils.ts +++ b/projects/app/src/web/core/app/utils.ts @@ -29,7 +29,7 @@ import { AiChatQuoteTemplate } from '@fastgpt/global/core/workflow/template/system/aiChat/index'; import { DatasetSearchModule } from '@fastgpt/global/core/workflow/template/system/datasetSearch'; -import { ReadFilesNodes } from '@fastgpt/global/core/workflow/template/system/readFiles'; +import { ReadFilesNode } from '@fastgpt/global/core/workflow/template/system/readFiles'; import { i18nT } from '@fastgpt/web/i18n/utils'; import { Input_Template_UserChatInput } from '@fastgpt/global/core/workflow/template/input'; @@ -325,17 +325,17 @@ export function form2AppWorkflow( ? { nodes: [ { - nodeId: ReadFilesNodes.id, - name: t(ReadFilesNodes.name), - intro: t(ReadFilesNodes.intro), - avatar: ReadFilesNodes.avatar, - flowNodeType: ReadFilesNodes.flowNodeType, + nodeId: ReadFilesNode.id, + name: t(ReadFilesNode.name), + intro: t(ReadFilesNode.intro), + avatar: ReadFilesNode.avatar, + flowNodeType: ReadFilesNode.flowNodeType, showStatus: true, position: { x: 974.6209854328943, y: 587.6378828744465 }, - version: '489', + version: ReadFilesNode.version, inputs: [ { key: NodeInputKeyEnum.fileUrlList, @@ -345,13 +345,13 @@ export function form2AppWorkflow( value: [workflowStartNodeId, 'userFiles'] } ], - outputs: ReadFilesNodes.outputs + outputs: ReadFilesNode.outputs } ], edges: [ { source: toolNodeId, - target: ReadFilesNodes.id, + target: ReadFilesNode.id, sourceHandle: 'selectedTools', targetHandle: 'selectedTools' }