import type { AIChatItemType, UserChatItemType } from '@fastgpt/global/core/chat/type.d'; import { MongoApp } from '../app/schema'; import { ChatSourceEnum } from '@fastgpt/global/core/chat/constants'; import { MongoChatItem } from './chatItemSchema'; import { MongoChat } from './chatSchema'; import { addLog } from '../../common/system/log'; import { mongoSessionRun } from '../../common/mongo/sessionRun'; import { StoreNodeItemType } from '@fastgpt/global/core/workflow/type/node'; import { getAppChatConfig, getGuideModule } from '@fastgpt/global/core/workflow/utils'; import { AppChatConfigType } from '@fastgpt/global/core/app/type'; type Props = { chatId: string; appId: string; teamId: string; tmbId: string; nodes: StoreNodeItemType[]; appChatConfig?: AppChatConfigType; variables?: Record; isUpdateUseTime: boolean; newTitle: string; source: `${ChatSourceEnum}`; shareId?: string; outLinkUid?: string; content: [UserChatItemType & { dataId?: string }, AIChatItemType & { dataId?: string }]; metadata?: Record; }; export async function saveChat({ chatId, appId, teamId, tmbId, nodes, appChatConfig, variables, isUpdateUseTime, newTitle, source, shareId, outLinkUid, content, metadata = {} }: Props) { try { const chat = await MongoChat.findOne( { appId, chatId }, '_id metadata' ); const metadataUpdate = { ...chat?.metadata, ...metadata }; const { welcomeText, variables: variableList } = getAppChatConfig({ chatConfig: appChatConfig, systemConfigNode: getGuideModule(nodes), isPublicFetch: false }); await mongoSessionRun(async (session) => { await MongoChatItem.insertMany( content.map((item) => ({ chatId, teamId, tmbId, appId, ...item })), { session } ); await MongoChat.updateOne( { appId, chatId }, { $set: { teamId, tmbId, appId, chatId, variableList, welcomeText, variables: variables || {}, title: newTitle, source, shareId, outLinkUid, metadata: metadataUpdate, updateTime: new Date() } }, { session, upsert: true } ); }); if (isUpdateUseTime) { await MongoApp.findByIdAndUpdate(appId, { updateTime: new Date() }); } } catch (error) { addLog.error(`update chat history error`, error); } }