mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-23 05:12:39 +00:00
Perf ui detail (#2775)
* perf: tool response tip * perf: image extract * perf: user question tool desc * fix: simple mode load app module * perf: simple mode plugin version * perf: share page reload * refresh simple mode data
This commit is contained in:
@@ -97,7 +97,10 @@ export const appWorkflow2Form = ({
|
|||||||
node.inputs,
|
node.inputs,
|
||||||
NodeInputKeyEnum.datasetSearchExtensionBg
|
NodeInputKeyEnum.datasetSearchExtensionBg
|
||||||
);
|
);
|
||||||
} else if (node.flowNodeType === FlowNodeTypeEnum.pluginModule) {
|
} else if (
|
||||||
|
node.flowNodeType === FlowNodeTypeEnum.pluginModule ||
|
||||||
|
node.flowNodeType === FlowNodeTypeEnum.appModule
|
||||||
|
) {
|
||||||
if (!node.pluginId) return;
|
if (!node.pluginId) return;
|
||||||
|
|
||||||
defaultAppForm.selectedTools.push({
|
defaultAppForm.selectedTools.push({
|
||||||
@@ -108,7 +111,7 @@ export const appWorkflow2Form = ({
|
|||||||
intro: node.intro || '',
|
intro: node.intro || '',
|
||||||
flowNodeType: node.flowNodeType,
|
flowNodeType: node.flowNodeType,
|
||||||
showStatus: node.showStatus,
|
showStatus: node.showStatus,
|
||||||
version: '481',
|
version: node.version,
|
||||||
inputs: node.inputs,
|
inputs: node.inputs,
|
||||||
outputs: node.outputs,
|
outputs: node.outputs,
|
||||||
templateType: FlowNodeTemplateTypeEnum.other
|
templateType: FlowNodeTemplateTypeEnum.other
|
||||||
|
@@ -27,7 +27,7 @@ import { VariableUpdateNode } from './system/variableUpdate';
|
|||||||
import { CodeNode } from './system/sandbox';
|
import { CodeNode } from './system/sandbox';
|
||||||
import { TextEditorNode } from './system/textEditor';
|
import { TextEditorNode } from './system/textEditor';
|
||||||
import { CustomFeedbackNode } from './system/customFeedback';
|
import { CustomFeedbackNode } from './system/customFeedback';
|
||||||
import { ReadFilesNodes } from './system/readFiles';
|
import { ReadFilesNode } from './system/readFiles';
|
||||||
import { UserSelectNode } from './system/userSelect/index';
|
import { UserSelectNode } from './system/userSelect/index';
|
||||||
import { LoopNode } from './system/loop/loop';
|
import { LoopNode } from './system/loop/loop';
|
||||||
import { LoopStartNode } from './system/loop/loopStart';
|
import { LoopStartNode } from './system/loop/loopStart';
|
||||||
@@ -43,7 +43,7 @@ const systemNodes: FlowNodeTemplateType[] = [
|
|||||||
StopToolNode,
|
StopToolNode,
|
||||||
ClassifyQuestionModule,
|
ClassifyQuestionModule,
|
||||||
ContextExtractModule,
|
ContextExtractModule,
|
||||||
ReadFilesNodes,
|
ReadFilesNode,
|
||||||
HttpNode468,
|
HttpNode468,
|
||||||
AiQueryExtension,
|
AiQueryExtension,
|
||||||
LafModule,
|
LafModule,
|
||||||
|
@@ -23,7 +23,7 @@ export const Input_Template_UserChatInput: FlowNodeInputItemType = {
|
|||||||
renderTypeList: [FlowNodeInputTypeEnum.reference, FlowNodeInputTypeEnum.textarea],
|
renderTypeList: [FlowNodeInputTypeEnum.reference, FlowNodeInputTypeEnum.textarea],
|
||||||
valueType: WorkflowIOValueTypeEnum.string,
|
valueType: WorkflowIOValueTypeEnum.string,
|
||||||
label: i18nT('workflow:user_question'),
|
label: i18nT('workflow:user_question'),
|
||||||
toolDescription: i18nT('workflow:user_question'),
|
toolDescription: i18nT('workflow:user_question_tool_desc'),
|
||||||
required: true
|
required: true
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -13,7 +13,7 @@ import {
|
|||||||
import { FlowNodeTemplateType } from '../../../type/node';
|
import { FlowNodeTemplateType } from '../../../type/node';
|
||||||
import { getHandleConfig } from '../../utils';
|
import { getHandleConfig } from '../../utils';
|
||||||
|
|
||||||
export const ReadFilesNodes: FlowNodeTemplateType = {
|
export const ReadFilesNode: FlowNodeTemplateType = {
|
||||||
id: FlowNodeTypeEnum.readFiles,
|
id: FlowNodeTypeEnum.readFiles,
|
||||||
templateType: FlowNodeTemplateTypeEnum.tools,
|
templateType: FlowNodeTemplateTypeEnum.tools,
|
||||||
flowNodeType: FlowNodeTypeEnum.readFiles,
|
flowNodeType: FlowNodeTypeEnum.readFiles,
|
||||||
|
@@ -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作为文本
|
// 添加原始input作为文本
|
||||||
result.push({ type: 'text', text: input });
|
result.push({ type: 'text', text: input });
|
||||||
return result;
|
return result;
|
||||||
|
@@ -255,17 +255,6 @@ export const runToolWithFunctionCall = async (
|
|||||||
];
|
];
|
||||||
// console.log(tokens, 'tool');
|
// console.log(tokens, 'tool');
|
||||||
|
|
||||||
// Run tool status
|
|
||||||
if (node.showStatus) {
|
|
||||||
workflowStreamResponse?.({
|
|
||||||
event: SseResponseEventEnum.flowNodeStatus,
|
|
||||||
data: {
|
|
||||||
status: 'running',
|
|
||||||
name: node.name
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// tool assistant
|
// tool assistant
|
||||||
const toolAssistants = toolsRunResponse
|
const toolAssistants = toolsRunResponse
|
||||||
.map((item) => {
|
.map((item) => {
|
||||||
|
@@ -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 格式存储。
|
// 合并工具调用的结果,使用 functionCall 格式存储。
|
||||||
const assistantToolMsgParams: ChatCompletionAssistantMessageParam = {
|
const assistantToolMsgParams: ChatCompletionAssistantMessageParam = {
|
||||||
role: ChatCompletionRequestMessageRoleEnum.Assistant,
|
role: ChatCompletionRequestMessageRoleEnum.Assistant,
|
||||||
|
@@ -311,17 +311,6 @@ export const runToolWithToolChoice = async (
|
|||||||
|
|
||||||
// console.log(tokens, 'tool');
|
// console.log(tokens, 'tool');
|
||||||
|
|
||||||
// Run tool status
|
|
||||||
if (node.showStatus) {
|
|
||||||
workflowStreamResponse?.({
|
|
||||||
event: SseResponseEventEnum.flowNodeStatus,
|
|
||||||
data: {
|
|
||||||
status: 'running',
|
|
||||||
name: node.name
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// tool assistant
|
// tool assistant
|
||||||
const toolAssistants = toolsRunResponse
|
const toolAssistants = toolsRunResponse
|
||||||
.map((item) => {
|
.map((item) => {
|
||||||
|
@@ -497,7 +497,7 @@ export async function dispatchWorkFlow(data: Props): Promise<DispatchFlowRespons
|
|||||||
result: Record<string, any>;
|
result: Record<string, any>;
|
||||||
}> {
|
}> {
|
||||||
// push run status messages
|
// push run status messages
|
||||||
if (node.showStatus) {
|
if (node.showStatus && !props.isToolCall) {
|
||||||
props.workflowStreamResponse?.({
|
props.workflowStreamResponse?.({
|
||||||
event: SseResponseEventEnum.flowNodeStatus,
|
event: SseResponseEventEnum.flowNodeStatus,
|
||||||
data: {
|
data: {
|
||||||
|
@@ -149,6 +149,7 @@
|
|||||||
"update_specified_node_output_or_global_variable": "Can update the output value of a specified node or update global variables",
|
"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",
|
"use_user_id": "User ID",
|
||||||
"user_question": "User Question",
|
"user_question": "User Question",
|
||||||
|
"user_question_tool_desc": "User input questions (questions need to be improved)",
|
||||||
"value_type": "Value type",
|
"value_type": "Value type",
|
||||||
"variable_picker_tips": "Type node name or variable name to search",
|
"variable_picker_tips": "Type node name or variable name to search",
|
||||||
"variable_update": "Variable Update",
|
"variable_update": "Variable Update",
|
||||||
|
@@ -155,6 +155,7 @@
|
|||||||
"update_specified_node_output_or_global_variable": "可以更新指定节点的输出值或更新全局变量",
|
"update_specified_node_output_or_global_variable": "可以更新指定节点的输出值或更新全局变量",
|
||||||
"use_user_id": "使用者 ID",
|
"use_user_id": "使用者 ID",
|
||||||
"user_question": "用户问题",
|
"user_question": "用户问题",
|
||||||
|
"user_question_tool_desc": "用户输入的问题(问题需要完善)",
|
||||||
"value_type": "数据类型",
|
"value_type": "数据类型",
|
||||||
"variable_picker_tips": "可输入节点名或变量名搜索",
|
"variable_picker_tips": "可输入节点名或变量名搜索",
|
||||||
"variable_update": "变量更新",
|
"variable_update": "变量更新",
|
||||||
|
@@ -24,6 +24,7 @@ import { useSystem } from '@fastgpt/web/hooks/useSystem';
|
|||||||
import { useToast } from '@fastgpt/web/hooks/useToast';
|
import { useToast } from '@fastgpt/web/hooks/useToast';
|
||||||
import { formatTime2YMDHMS } from '@fastgpt/global/common/string/time';
|
import { formatTime2YMDHMS } from '@fastgpt/global/common/string/time';
|
||||||
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
||||||
|
import { useDatasetStore } from '@/web/core/dataset/store/dataset';
|
||||||
|
|
||||||
const Header = ({
|
const Header = ({
|
||||||
appForm,
|
appForm,
|
||||||
@@ -38,6 +39,7 @@ const Header = ({
|
|||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
const { appId, appDetail, onSaveApp, currentTab } = useContextSelector(AppContext, (v) => v);
|
const { appId, appDetail, onSaveApp, currentTab } = useContextSelector(AppContext, (v) => v);
|
||||||
const { lastAppListRouteType } = useSystemStore();
|
const { lastAppListRouteType } = useSystemStore();
|
||||||
|
const { allDatasets } = useDatasetStore();
|
||||||
|
|
||||||
const { data: paths = [] } = useRequest2(() => getAppFolderPath(appId), {
|
const { data: paths = [] } = useRequest2(() => getAppFolderPath(appId), {
|
||||||
manual: false,
|
manual: false,
|
||||||
@@ -70,7 +72,7 @@ const Header = ({
|
|||||||
chatConfig: data.chatConfig
|
chatConfig: data.chatConfig
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}, [appDetail.chatConfig, appDetail.modules, appForm, t]);
|
}, [appDetail.chatConfig, appDetail.modules, appForm, allDatasets, t]);
|
||||||
|
|
||||||
const onSubmitPublish = useCallback(
|
const onSubmitPublish = useCallback(
|
||||||
async (data: AppSimpleEditFormType) => {
|
async (data: AppSimpleEditFormType) => {
|
||||||
|
@@ -49,10 +49,7 @@ type Props = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const OutLink = ({
|
const OutLink = ({
|
||||||
outLinkUid,
|
outLinkUid
|
||||||
appName,
|
|
||||||
appIntro,
|
|
||||||
appAvatar
|
|
||||||
}: Props & {
|
}: Props & {
|
||||||
outLinkUid: string;
|
outLinkUid: string;
|
||||||
}) => {
|
}) => {
|
||||||
@@ -240,8 +237,6 @@ const OutLink = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<NextHead title={appName} desc={appIntro} icon={appAvatar} />
|
|
||||||
|
|
||||||
<PageContainer
|
<PageContainer
|
||||||
isLoading={loading}
|
isLoading={loading}
|
||||||
{...(isEmbed
|
{...(isEmbed
|
||||||
@@ -367,17 +362,26 @@ const OutLink = ({
|
|||||||
const Render = (props: Props) => {
|
const Render = (props: Props) => {
|
||||||
const { shareId, authToken } = props;
|
const { shareId, authToken } = props;
|
||||||
const { localUId, loaded } = useShareChatStore();
|
const { localUId, loaded } = useShareChatStore();
|
||||||
|
const [isLoaded, setIsLoaded] = useState(false);
|
||||||
|
|
||||||
const contextParams = useMemo(() => {
|
const contextParams = useMemo(() => {
|
||||||
return { shareId, outLinkUid: authToken || localUId };
|
return { shareId, outLinkUid: authToken || localUId };
|
||||||
}, [authToken, localUId, shareId]);
|
}, [authToken, localUId, shareId]);
|
||||||
|
|
||||||
if (!loaded || !contextParams.outLinkUid) return <></>;
|
useMount(() => {
|
||||||
|
setIsLoaded(true);
|
||||||
|
});
|
||||||
|
const systemLoaded = isLoaded && loaded && contextParams.outLinkUid;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ChatContextProvider params={contextParams}>
|
<>
|
||||||
<OutLink {...props} outLinkUid={contextParams.outLinkUid} />;
|
<NextHead title={props.appName} desc={props.appIntro} icon={props.appAvatar} />
|
||||||
</ChatContextProvider>
|
{systemLoaded && (
|
||||||
|
<ChatContextProvider params={contextParams}>
|
||||||
|
<OutLink {...props} outLinkUid={contextParams.outLinkUid} />;
|
||||||
|
</ChatContextProvider>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -29,7 +29,7 @@ import {
|
|||||||
AiChatQuoteTemplate
|
AiChatQuoteTemplate
|
||||||
} from '@fastgpt/global/core/workflow/template/system/aiChat/index';
|
} from '@fastgpt/global/core/workflow/template/system/aiChat/index';
|
||||||
import { DatasetSearchModule } from '@fastgpt/global/core/workflow/template/system/datasetSearch';
|
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 { i18nT } from '@fastgpt/web/i18n/utils';
|
||||||
import { Input_Template_UserChatInput } from '@fastgpt/global/core/workflow/template/input';
|
import { Input_Template_UserChatInput } from '@fastgpt/global/core/workflow/template/input';
|
||||||
|
|
||||||
@@ -325,17 +325,17 @@ export function form2AppWorkflow(
|
|||||||
? {
|
? {
|
||||||
nodes: [
|
nodes: [
|
||||||
{
|
{
|
||||||
nodeId: ReadFilesNodes.id,
|
nodeId: ReadFilesNode.id,
|
||||||
name: t(ReadFilesNodes.name),
|
name: t(ReadFilesNode.name),
|
||||||
intro: t(ReadFilesNodes.intro),
|
intro: t(ReadFilesNode.intro),
|
||||||
avatar: ReadFilesNodes.avatar,
|
avatar: ReadFilesNode.avatar,
|
||||||
flowNodeType: ReadFilesNodes.flowNodeType,
|
flowNodeType: ReadFilesNode.flowNodeType,
|
||||||
showStatus: true,
|
showStatus: true,
|
||||||
position: {
|
position: {
|
||||||
x: 974.6209854328943,
|
x: 974.6209854328943,
|
||||||
y: 587.6378828744465
|
y: 587.6378828744465
|
||||||
},
|
},
|
||||||
version: '489',
|
version: ReadFilesNode.version,
|
||||||
inputs: [
|
inputs: [
|
||||||
{
|
{
|
||||||
key: NodeInputKeyEnum.fileUrlList,
|
key: NodeInputKeyEnum.fileUrlList,
|
||||||
@@ -345,13 +345,13 @@ export function form2AppWorkflow(
|
|||||||
value: [workflowStartNodeId, 'userFiles']
|
value: [workflowStartNodeId, 'userFiles']
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
outputs: ReadFilesNodes.outputs
|
outputs: ReadFilesNode.outputs
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
edges: [
|
edges: [
|
||||||
{
|
{
|
||||||
source: toolNodeId,
|
source: toolNodeId,
|
||||||
target: ReadFilesNodes.id,
|
target: ReadFilesNode.id,
|
||||||
sourceHandle: 'selectedTools',
|
sourceHandle: 'selectedTools',
|
||||||
targetHandle: 'selectedTools'
|
targetHandle: 'selectedTools'
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user