From 9f37e561730cffc850102fcb8baaa64dd49a15a7 Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Sat, 3 Aug 2024 10:44:31 +0800 Subject: [PATCH] Chat perf test (#2252) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * perf: optimize chat init api (#2233) * perf: optimize the chat/init api * perf: 添加团队和分享api的优化 * perf: api写法优化 * perf: api写法优化 * perf: 完善细节 * perf: 添加auth字段 * perf: 优雅的写法🥳 * fix: Fix the bug in debugging Tag (#2250) * fix: 修复调试tag不显示bug * perf * perf: 优化代码 * fix: 返回新对象 * fix: show tag error --------- Co-authored-by: papapatrick <109422393+Patrickill@users.noreply.github.com> --- packages/global/core/chat/type.d.ts | 12 +- .../chat/ChatContainer/ChatBox/Provider.tsx | 33 ++++- .../ChatBox/components/ContextModal.tsx | 43 +++++-- .../ChatBox/components/ResponseTags.tsx | 113 +++++++----------- .../core/chat/ChatContainer/ChatBox/index.tsx | 7 +- .../core/chat/ChatContainer/useChat.ts | 1 - .../chat/components/WholeResponseModal.tsx | 23 +++- projects/app/src/global/core/chat/utils.ts | 43 +++++++ .../app/src/pages/api/core/chat/getResData.ts | 46 +++++++ projects/app/src/pages/api/core/chat/init.ts | 5 +- .../src/pages/api/core/chat/outLink/init.ts | 4 +- .../app/src/pages/api/core/chat/team/init.ts | 3 +- projects/app/src/pages/chat/index.tsx | 1 - projects/app/src/pages/chat/share.tsx | 1 - projects/app/src/pages/chat/team.tsx | 1 - projects/app/src/web/core/chat/api.ts | 12 +- 16 files changed, 235 insertions(+), 113 deletions(-) create mode 100644 projects/app/src/global/core/chat/utils.ts create mode 100644 projects/app/src/pages/api/core/chat/getResData.ts diff --git a/packages/global/core/chat/type.d.ts b/packages/global/core/chat/type.d.ts index 50e0f5a96..570486a6a 100644 --- a/packages/global/core/chat/type.d.ts +++ b/packages/global/core/chat/type.d.ts @@ -106,9 +106,16 @@ export type AdminFbkType = { }; /* --------- chat item ---------- */ +export type ResponseTagItemType = { + totalRunningTime?: number; + totalQuoteList?: SearchDataResponseItemType[]; + llmModuleAccount?: number; + historyPreviewLength?: number; +}; + export type ChatItemType = (UserChatItemType | SystemChatItemType | AIChatItemType) & { dataId?: string; -}; +} & ResponseTagItemType; export type ChatSiteItemType = (UserChatItemType | SystemChatItemType | AIChatItemType) & { dataId: string; @@ -116,7 +123,8 @@ export type ChatSiteItemType = (UserChatItemType | SystemChatItemType | AIChatIt moduleName?: string; ttsBuffer?: Uint8Array; responseData?: ChatHistoryItemResType[]; -} & ChatBoxInputType; +} & ChatBoxInputType & + ResponseTagItemType; /* --------- team chat --------- */ export type ChatAppListSchema = { diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/Provider.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/Provider.tsx index 2c5ee40d0..e9dc272c8 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/Provider.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/Provider.tsx @@ -1,4 +1,4 @@ -import React, { useState, useMemo } from 'react'; +import React, { useState, useMemo, useCallback } from 'react'; import { useAudioPlay } from '@/web/common/utils/voice'; import { OutLinkChatAuthProps } from '@fastgpt/global/support/permission/chat'; import { @@ -8,7 +8,7 @@ import { ChatInputGuideConfigType, VariableItemType } from '@fastgpt/global/core/app/type'; -import { ChatSiteItemType } from '@fastgpt/global/core/chat/type'; +import { ChatHistoryItemResType, ChatSiteItemType } from '@fastgpt/global/core/chat/type'; import { defaultChatInputGuideConfig, defaultTTSConfig, @@ -17,14 +17,16 @@ import { import { createContext } from 'use-context-selector'; import { FieldValues, UseFormReturn } from 'react-hook-form'; import { VariableInputEnum } from '@fastgpt/global/core/workflow/constants'; +import { getChatResData } from '@/web/core/chat/api'; export type ChatProviderProps = OutLinkChatAuthProps & { appAvatar?: string; - + appId: string; chatConfig?: AppChatConfigType; chatHistories: ChatSiteItemType[]; setChatHistories: React.Dispatch>; + variablesForm: UseFormReturn; // not chat test params @@ -61,6 +63,7 @@ type useChatStoreType = OutLinkChatAuthProps & isChatting: boolean; chatInputGuide: ChatInputGuideConfigType; outLinkAuthData: OutLinkChatAuthProps; + getHistoryResponseData: ({ dataId }: { dataId: string }) => Promise; }; export const ChatBoxContext = createContext({ @@ -181,7 +184,26 @@ const Provider = ({ chatHistories[chatHistories.length - 1]?.status !== 'finish', [chatHistories] ); - + const getHistoryResponseData = useCallback( + async ({ dataId }: { dataId: string }) => { + const aimItem = chatHistories.find((item) => item.dataId === dataId)!; + if (!!aimItem?.responseData || !props.chatId) { + return aimItem.responseData || []; + } else { + let resData = await getChatResData({ + appId: props.appId, + chatId: props.chatId, + dataId, + ...outLinkAuthData + }); + setChatHistories((state) => + state.map((item) => (item.dataId === dataId ? { ...item, responseData: resData } : item)) + ); + return resData; + } + }, + [chatHistories, outLinkAuthData, props.appId, props.chatId, setChatHistories] + ); const value: useChatStoreType = { ...props, shareId, @@ -210,7 +232,8 @@ const Provider = ({ isChatting, chatInputGuide, outLinkAuthData, - variablesForm + variablesForm, + getHistoryResponseData }; return {children}; diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ContextModal.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ContextModal.tsx index 59f3c8608..4c1503f5c 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ContextModal.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ContextModal.tsx @@ -1,23 +1,40 @@ import React from 'react'; -import { ModalBody, Box, useTheme } from '@chakra-ui/react'; +import { ModalBody, Box } from '@chakra-ui/react'; import MyModal from '@fastgpt/web/components/common/MyModal'; -import { DispatchNodeResponseType } from '@fastgpt/global/core/workflow/runtime/type.d'; +import { useContextSelector } from 'use-context-selector'; +import { ChatBoxContext } from '../Provider'; +import { ChatHistoryItemResType } from '@fastgpt/global/core/chat/type'; +import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; +import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; +const isLLMNode = (item: ChatHistoryItemResType) => + item.moduleType === FlowNodeTypeEnum.chatNode || item.moduleType === FlowNodeTypeEnum.tools; -const ContextModal = ({ - context = [], - onClose -}: { - context: DispatchNodeResponseType['historyPreview']; - onClose: () => void; -}) => { - const theme = useTheme(); +const ContextModal = ({ onClose, dataId }: { onClose: () => void; dataId: string }) => { + const { getHistoryResponseData } = useContextSelector(ChatBoxContext, (v) => v); + const { loading: isLoading, data: contextModalData } = useRequest2( + () => + getHistoryResponseData({ dataId }).then((res) => { + const flatResData: ChatHistoryItemResType[] = + res + ?.map((item) => { + if (item.pluginDetail || item.toolDetail) { + return [item, ...(item.pluginDetail || []), ...(item.toolDetail || [])]; + } + return item; + }) + .flat() || []; + return flatResData.find(isLLMNode)?.historyPreview || []; + }), + { manual: false } + ); return ( - {context.map((item, i) => ( + {contextModalData?.map((item, i) => ( diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ResponseTags.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ResponseTags.tsx index 135842a99..2f5a66fe9 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ResponseTags.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ResponseTags.tsx @@ -1,37 +1,41 @@ -import React, { useEffect, useMemo, useState } from 'react'; -import { type ChatHistoryItemResType } from '@fastgpt/global/core/chat/type.d'; -import { DispatchNodeResponseType } from '@fastgpt/global/core/workflow/runtime/type.d'; -import { Flex, useDisclosure, Box, Collapse } from '@chakra-ui/react'; +import React, { useMemo, useState } from 'react'; +import { Flex, useDisclosure, Box } from '@chakra-ui/react'; import { useTranslation } from 'next-i18next'; import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type'; import dynamic from 'next/dynamic'; import MyTag from '@fastgpt/web/components/common/Tag/index'; import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; -import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; import { getSourceNameIcon } from '@fastgpt/global/core/dataset/utils'; import ChatBoxDivider from '@/components/core/chat/Divider'; import { strIsLink } from '@fastgpt/global/common/string/tools'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; -import { useSize } from 'ahooks'; +import { ChatSiteItemType } from '@fastgpt/global/core/chat/type'; +import { addStatisticalDataToHistoryItem } from '@/global/core/chat/utils'; const QuoteModal = dynamic(() => import('./QuoteModal')); const ContextModal = dynamic(() => import('./ContextModal')); const WholeResponseModal = dynamic(() => import('../../../components/WholeResponseModal')); -const isLLMNode = (item: ChatHistoryItemResType) => - item.moduleType === FlowNodeTypeEnum.chatNode || item.moduleType === FlowNodeTypeEnum.tools; - const ResponseTags = ({ - flowResponses = [], - showDetail + showTags, + showDetail, + historyItem }: { - flowResponses?: ChatHistoryItemResType[]; + showTags: boolean; showDetail: boolean; + historyItem: ChatSiteItemType; }) => { const { isPc } = useSystem(); const { t } = useTranslation(); const quoteListRef = React.useRef(null); + const dataId = historyItem.dataId; + const { + totalQuoteList: quoteList = [], + llmModuleAccount = 0, + totalRunningTime: runningTime = 0, + historyPreviewLength = 0 + } = useMemo(() => addStatisticalDataToHistoryItem(historyItem), [historyItem]); const [quoteModalData, setQuoteModalData] = useState<{ rawSearch: SearchDataResponseItemType[]; metadata?: { @@ -41,69 +45,40 @@ const ResponseTags = ({ }; }>(); const [quoteFolded, setQuoteFolded] = useState(true); - const [contextModalData, setContextModalData] = - useState(); const { isOpen: isOpenWholeModal, onOpen: onOpenWholeModal, onClose: onCloseWholeModal } = useDisclosure(); - - const quoteListSize = useSize(quoteListRef); + const { + isOpen: isOpenContextModal, + onOpen: onOpenContextModal, + onClose: onCloseContextModal + } = useDisclosure(); const quoteIsOverflow = quoteListRef.current ? quoteListRef.current.scrollHeight > (isPc ? 50 : 55) : true; - const { - llmModuleAccount, - quoteList = [], - sourceList = [], - historyPreview = [], - runningTime = 0 - } = useMemo(() => { - const flatResponse = flowResponses - .map((item) => { - if (item.pluginDetail || item.toolDetail) { - return [item, ...(item.pluginDetail || []), ...(item.toolDetail || [])]; - } - return item; - }) - .flat(); - - const chatData = flatResponse.find(isLLMNode); - const quoteList = flatResponse - .filter((item) => item.moduleType === FlowNodeTypeEnum.datasetSearchNode) - .map((item) => item.quoteList) - .flat() - .filter(Boolean) as SearchDataResponseItemType[]; - - const sourceList = quoteList.reduce( - (acc: Record, cur) => { + const sourceList = useMemo(() => { + return Object.values( + quoteList.reduce((acc: Record, cur) => { if (!acc[cur.collectionId]) { acc[cur.collectionId] = [cur]; } return acc; - }, - {} - ); - return { - llmModuleAccount: flatResponse.filter(isLLMNode).length, - quoteList, - sourceList: Object.values(sourceList) - .flat() - .map((item) => ({ - sourceName: item.sourceName, - sourceId: item.sourceId, - icon: getSourceNameIcon({ sourceId: item.sourceId, sourceName: item.sourceName }), - canReadQuote: showDetail || strIsLink(item.sourceId), - collectionId: item.collectionId - })), - historyPreview: chatData?.historyPreview, - runningTime: +flowResponses.reduce((sum, item) => sum + (item.runningTime || 0), 0).toFixed(2) - }; - }, [showDetail, flowResponses]); + }, {}) + ) + .flat() + .map((item) => ({ + sourceName: item.sourceName, + sourceId: item.sourceId, + icon: getSourceNameIcon({ sourceId: item.sourceId, sourceName: item.sourceName }), + canReadQuote: showDetail || strIsLink(item.sourceId), + collectionId: item.collectionId + })); + }, [quoteList, showDetail]); - return flowResponses.length === 0 ? null : ( + return !showTags ? null : ( <> {sourceList.length > 0 && ( <> @@ -213,15 +188,15 @@ const ResponseTags = ({ )} {llmModuleAccount === 1 && ( <> - {historyPreview.length > 0 && ( + {historyPreviewLength > 0 && ( setContextModalData(historyPreview)} + onClick={onOpenContextModal} > - {historyPreview.length}条上下文 + {historyPreviewLength}条上下文 )} @@ -259,15 +234,9 @@ const ResponseTags = ({ onClose={() => setQuoteModalData(undefined)} /> )} - {!!contextModalData && ( - setContextModalData(undefined)} /> - )} + {isOpenContextModal && } {isOpenWholeModal && ( - + )} ); diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx index bb8866ce4..1837b23b2 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx @@ -11,6 +11,7 @@ import React, { import Script from 'next/script'; import type { AIChatItemValueItemType, + ChatHistoryItemResType, ChatSiteItemType, UserChatItemValueItemType } from '@fastgpt/global/core/chat/type.d'; @@ -543,6 +544,7 @@ const ChatBox = ( }, [ abortRequest, + allVariableList, chatHistories, createQuestionGuide, finishSegmentedAudio, @@ -559,7 +561,6 @@ const ChatBox = ( startSegmentedAudio, t, toast, - variableList, variablesForm ] ); @@ -874,7 +875,6 @@ const ChatBox = ( }); } })); - return ( @@ -927,8 +927,9 @@ const ChatBox = ( })} > {/* custom feedback */} diff --git a/projects/app/src/components/core/chat/ChatContainer/useChat.ts b/projects/app/src/components/core/chat/ChatContainer/useChat.ts index 124aebc56..a76319373 100644 --- a/projects/app/src/components/core/chat/ChatContainer/useChat.ts +++ b/projects/app/src/components/core/chat/ChatContainer/useChat.ts @@ -49,7 +49,6 @@ export const useChat = () => { ChatBoxRef.current?.restartChat?.(); }, [variablesForm]); - return { ChatBoxRef, chatRecords, diff --git a/projects/app/src/components/core/chat/components/WholeResponseModal.tsx b/projects/app/src/components/core/chat/components/WholeResponseModal.tsx index 31f11f713..5f844ab3c 100644 --- a/projects/app/src/components/core/chat/components/WholeResponseModal.tsx +++ b/projects/app/src/components/core/chat/components/WholeResponseModal.tsx @@ -13,6 +13,9 @@ import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; import Avatar from '@fastgpt/web/components/common/Avatar'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; import MyIcon from '@fastgpt/web/components/common/Icon'; +import { useContextSelector } from 'use-context-selector'; +import { ChatBoxContext } from '../ChatContainer/ChatBox/Provider'; +import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; type sideTabItemType = { moduleLogo?: string; @@ -85,33 +88,42 @@ function Row({ } const WholeResponseModal = ({ - response, showDetail, - onClose + onClose, + dataId }: { - response: ChatHistoryItemResType[]; showDetail: boolean; onClose: () => void; + dataId: string; }) => { const { t } = useTranslation(); + const { appId, chatId, getHistoryResponseData } = useContextSelector(ChatBoxContext, (v) => v); + const { loading: isLoading, data: response } = useRequest2( + () => getHistoryResponseData({ dataId }), + { + manual: false + } + ); + return ( {t('common:core.chat.response.Complete Response')} - + } > - + {response?.length && } ); }; @@ -135,6 +147,7 @@ export const ResponseBox = React.memo(function ResponseBox({ const [currentNodeId, setCurrentNodeId] = useState( flattedResponse[0]?.nodeId ? flattedResponse[0].nodeId : '' ); + const activeModule = useMemo( () => flattedResponse.find((item) => item.nodeId === currentNodeId) as ChatHistoryItemResType, [currentNodeId, flattedResponse] diff --git a/projects/app/src/global/core/chat/utils.ts b/projects/app/src/global/core/chat/utils.ts new file mode 100644 index 000000000..0ce46ca9d --- /dev/null +++ b/projects/app/src/global/core/chat/utils.ts @@ -0,0 +1,43 @@ +import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants'; +import { ChatHistoryItemResType, ChatItemType } from '@fastgpt/global/core/chat/type'; +import { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type'; +import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; + +const isLLMNode = (item: ChatHistoryItemResType) => + item.moduleType === FlowNodeTypeEnum.chatNode || item.moduleType === FlowNodeTypeEnum.tools; + +export function transformPreviewHistories(histories: ChatItemType[]) { + return histories.map((item) => { + return { + ...addStatisticalDataToHistoryItem(item), + responseData: undefined + }; + }); +} + +export function addStatisticalDataToHistoryItem(historyItem: ChatItemType) { + if (historyItem.obj !== ChatRoleEnum.AI) return historyItem; + if (historyItem.totalQuoteList !== undefined) return historyItem; + const flatResData: ChatHistoryItemResType[] = + historyItem.responseData + ?.map((item) => { + if (item.pluginDetail || item.toolDetail) { + return [item, ...(item.pluginDetail || []), ...(item.toolDetail || [])]; + } + return item; + }) + .flat() || []; + return { + ...historyItem, + llmModuleAccount: flatResData.filter(isLLMNode).length, + totalQuoteList: flatResData + .filter((item) => item.moduleType === FlowNodeTypeEnum.datasetSearchNode) + .map((item) => item.quoteList) + .flat() + .filter(Boolean) as SearchDataResponseItemType[], + totalRunningTime: Number( + flatResData.reduce((sum, item) => sum + (item.runningTime || 0), 0).toFixed(2) + ), + historyPreviewLength: flatResData.find(isLLMNode)?.historyPreview?.length + }; +} diff --git a/projects/app/src/pages/api/core/chat/getResData.ts b/projects/app/src/pages/api/core/chat/getResData.ts new file mode 100644 index 000000000..fc38a5bca --- /dev/null +++ b/projects/app/src/pages/api/core/chat/getResData.ts @@ -0,0 +1,46 @@ +import { authChatCrud } from '@/service/support/permission/auth/chat'; +import { ReadPermissionVal } from '@fastgpt/global/support/permission/constant'; +import { MongoChatItem } from '@fastgpt/service/core/chat/chatItemSchema'; +import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants'; +import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next'; +import { NextAPI } from '@/service/middleware/entry'; +import { ChatHistoryItemResType } from '@fastgpt/global/core/chat/type'; +import { OutLinkChatAuthProps } from '@fastgpt/global/support/permission/chat'; + +export type getResDataQuery = OutLinkChatAuthProps & { + chatId?: string; + dataId: string; + appId: string; +}; + +export type getResDataBody = {}; + +export type getResDataResponse = ChatHistoryItemResType[] | {}; + +async function handler( + req: ApiRequestProps, + res: ApiResponseType +): Promise { + const { appId, chatId, dataId } = req.query; + if (!appId || !chatId || !dataId) { + return {}; + } + await authChatCrud({ + req, + authToken: true, + ...req.query, + per: ReadPermissionVal + }); + + const chatData = await MongoChatItem.findOne({ + appId, + chatId, + dataId + }); + + if (chatData?.obj === ChatRoleEnum.AI) { + return chatData.responseData || {}; + } else return {}; +} + +export default NextAPI(handler); diff --git a/projects/app/src/pages/api/core/chat/init.ts b/projects/app/src/pages/api/core/chat/init.ts index 82c1e9a38..a8a26f48c 100644 --- a/projects/app/src/pages/api/core/chat/init.ts +++ b/projects/app/src/pages/api/core/chat/init.ts @@ -12,7 +12,8 @@ import { getAppLatestVersion } from '@fastgpt/service/core/app/controller'; import { NextAPI } from '@/service/middleware/entry'; import { ReadPermissionVal } from '@fastgpt/global/support/permission/constant'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; - +import { transformPreviewHistories } from '@/global/core/chat/utils'; +import { AppTypeEnum } from '@fastgpt/global/core/app/constants'; async function handler( req: NextApiRequest, res: NextApiResponse @@ -63,7 +64,7 @@ async function handler( title: chat?.title || '新对话', userAvatar: undefined, variables: chat?.variables || {}, - history: histories, + history: app.type === AppTypeEnum.plugin ? histories : transformPreviewHistories(histories), app: { chatConfig: getAppChatConfig({ chatConfig: app.chatConfig, diff --git a/projects/app/src/pages/api/core/chat/outLink/init.ts b/projects/app/src/pages/api/core/chat/outLink/init.ts index 48e826650..eec0b25ed 100644 --- a/projects/app/src/pages/api/core/chat/outLink/init.ts +++ b/projects/app/src/pages/api/core/chat/outLink/init.ts @@ -17,7 +17,7 @@ import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants'; import { getAppLatestVersion } from '@fastgpt/service/core/app/controller'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; import { AppTypeEnum } from '@fastgpt/global/core/app/constants'; - +import { transformPreviewHistories } from '@/global/core/chat/utils'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { await connectToDatabase(); @@ -73,7 +73,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) //@ts-ignore userAvatar: tmb?.userId?.avatar, variables: chat?.variables || {}, - history: histories, + history: app.type === AppTypeEnum.plugin ? histories : transformPreviewHistories(histories), app: { chatConfig: getAppChatConfig({ chatConfig: app.chatConfig, diff --git a/projects/app/src/pages/api/core/chat/team/init.ts b/projects/app/src/pages/api/core/chat/team/init.ts index a64dcbe1c..e93d631e7 100644 --- a/projects/app/src/pages/api/core/chat/team/init.ts +++ b/projects/app/src/pages/api/core/chat/team/init.ts @@ -17,6 +17,7 @@ import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants'; import { getAppLatestVersion } from '@fastgpt/service/core/app/controller'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; import { AppTypeEnum } from '@fastgpt/global/core/app/constants'; +import { transformPreviewHistories } from '@/global/core/chat/utils'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { @@ -74,7 +75,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) title: chat?.title || '新对话', userAvatar: team?.avatar, variables: chat?.variables || {}, - history: histories, + history: app.type === AppTypeEnum.plugin ? histories : transformPreviewHistories(histories), app: { chatConfig: getAppChatConfig({ chatConfig: app.chatConfig, diff --git a/projects/app/src/pages/chat/index.tsx b/projects/app/src/pages/chat/index.tsx index 417cdca24..32a1ed700 100644 --- a/projects/app/src/pages/chat/index.tsx +++ b/projects/app/src/pages/chat/index.tsx @@ -3,7 +3,6 @@ import NextHead from '@/components/common/NextHead'; import { useRouter } from 'next/router'; import { delChatRecordById, getChatHistories, getInitChatInfo } from '@/web/core/chat/api'; import { Box, Flex, Drawer, DrawerOverlay, DrawerContent, useTheme } from '@chakra-ui/react'; -import { useSystemStore } from '@/web/common/system/useSystemStore'; import { streamFetch } from '@/web/common/api/fetch'; import { useChatStore } from '@/web/core/chat/context/storeChat'; import { useToast } from '@fastgpt/web/hooks/useToast'; diff --git a/projects/app/src/pages/chat/share.tsx b/projects/app/src/pages/chat/share.tsx index a6cedb853..559d2362b 100644 --- a/projects/app/src/pages/chat/share.tsx +++ b/projects/app/src/pages/chat/share.tsx @@ -1,7 +1,6 @@ import React, { useCallback, useRef, useState } from 'react'; import { useRouter } from 'next/router'; import { Box, Flex, Drawer, DrawerOverlay, DrawerContent } from '@chakra-ui/react'; -import { useSystemStore } from '@/web/common/system/useSystemStore'; import { streamFetch } from '@/web/common/api/fetch'; import { useShareChatStore } from '@/web/core/chat/storeShareChat'; import SideBar from '@/components/SideBar'; diff --git a/projects/app/src/pages/chat/team.tsx b/projects/app/src/pages/chat/team.tsx index 3c5dba3c1..b8eab200b 100644 --- a/projects/app/src/pages/chat/team.tsx +++ b/projects/app/src/pages/chat/team.tsx @@ -4,7 +4,6 @@ import { delChatRecordById, getChatHistories, getTeamChatInfo } from '@/web/core import { useRouter } from 'next/router'; import { Box, Flex, Drawer, DrawerOverlay, DrawerContent, useTheme } from '@chakra-ui/react'; import { useToast } from '@fastgpt/web/hooks/useToast'; -import { useSystemStore } from '@/web/common/system/useSystemStore'; import SideBar from '@/components/SideBar'; import PageContainer from '@/components/PageContainer'; import { getMyTokensApps } from '@/web/core/chat/api'; diff --git a/projects/app/src/web/core/chat/api.ts b/projects/app/src/web/core/chat/api.ts index 46e8ba826..953e29097 100644 --- a/projects/app/src/web/core/chat/api.ts +++ b/projects/app/src/web/core/chat/api.ts @@ -1,6 +1,6 @@ import { GET, POST, DELETE, PUT } from '@/web/common/api/request'; -import type { ChatHistoryItemType, ChatAppListSchema } from '@fastgpt/global/core/chat/type.d'; - +import type { ChatHistoryItemType, ChatHistoryItemResType } from '@fastgpt/global/core/chat/type.d'; +import { getResDataQuery } from '@/pages/api/core/chat/getResData'; import type { CloseCustomFeedbackParams, InitChatProps, @@ -9,6 +9,7 @@ import type { GetHistoriesProps, InitTeamChatProps } from '@/global/core/chat/api.d'; + import type { AdminUpdateFeedbackParams, ClearHistoriesProps, @@ -29,13 +30,16 @@ export const getInitOutLinkChatInfo = (data: InitOutLinkChatProps) => GET(`/core/chat/outLink/init`, data); export const getTeamChatInfo = (data: InitTeamChatProps) => GET(`/core/chat/team/init`, data); - /** * get current window history(appid or shareId) */ export const getChatHistories = (data: GetHistoriesProps) => POST('/core/chat/getHistories', data); - +/** + * get detail responseData by dataId appId chatId + */ +export const getChatResData = (data: getResDataQuery) => + GET(`/core/chat/getResData`, data); /** * delete one history */