diff --git a/client/public/docs/versionIntro.md b/client/public/docs/versionIntro.md index 971b918f8..5d8f6bf47 100644 --- a/client/public/docs/versionIntro.md +++ b/client/public/docs/versionIntro.md @@ -1,5 +1,10 @@ -### Fast GPT V4.0-preview +### Fast GPT V4.1-preview -1. 全新交互,采用模块组合的方式构建知识库。 +preview 版本尚未稳定,请以测试为主。正式版上线前可能会初始化或删除部分对话/应用数据。 + +1. 全新交互,增加采用模块组合的方式构建知识库,同时保留表单的简易模式。 2. 问题分类 - 可以对用户的问题进行分类,再执行不同的操作。 -3. beta 版本尚未稳定,请以测试为主。详细使用文档后续会补上。 +3. 对话引导 - 增加开场引导和变量,提高对话可玩性。 +4. 新增 - 每轮对话均可展示完整的上下文状态。 +5. 优化 - OpenAPI 接口可直接传入 chatId 作为上下文标记。 +6. 优化 - 模块调度方案。 diff --git a/client/src/components/ChatBox/ContextModal.tsx b/client/src/components/ChatBox/ContextModal.tsx new file mode 100644 index 000000000..2dbffd0f6 --- /dev/null +++ b/client/src/components/ChatBox/ContextModal.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { + Modal, + ModalOverlay, + ModalContent, + ModalBody, + ModalCloseButton, + ModalHeader, + Box, + useTheme +} from '@chakra-ui/react'; +import { ChatItemType } from '@/types/chat'; + +const ContextModal = ({ + context = [], + onClose +}: { + context: ChatItemType[]; + onClose: () => void; +}) => { + const theme = useTheme(); + + return ( + <> + + + + 完整对话记录({context.length}条) + + + {context.map((item, i) => ( + + {item.obj} + {item.value} + + ))} + + + + + ); +}; + +export default ContextModal; diff --git a/client/src/components/ChatBox/ResponseDetailModal.tsx b/client/src/components/ChatBox/ResponseDetailModal.tsx index 74fb91a40..62483b6f0 100644 --- a/client/src/components/ChatBox/ResponseDetailModal.tsx +++ b/client/src/components/ChatBox/ResponseDetailModal.tsx @@ -1,12 +1,13 @@ import React, { useCallback, useMemo, useState } from 'react'; import { ChatModuleEnum } from '@/constants/chat'; -import { ChatHistoryItemResType, QuoteItemType } from '@/types/chat'; +import { ChatHistoryItemResType, ChatItemType, QuoteItemType } from '@/types/chat'; import { Flex, BoxProps } from '@chakra-ui/react'; import { updateHistoryQuote } from '@/api/chat'; import dynamic from 'next/dynamic'; import Tag from '../Tag'; import MyTooltip from '../MyTooltip'; const QuoteModal = dynamic(() => import('./QuoteModal'), { ssr: false }); +const ContextModal = dynamic(() => import('./ContextModal'), { ssr: false }); const ResponseDetailModal = ({ chatId, @@ -18,6 +19,7 @@ const ResponseDetailModal = ({ responseData?: ChatHistoryItemResType[]; }) => { const [quoteModalData, setQuoteModalData] = useState(); + const [contextModalData, setContextModalData] = useState(); const { tokens = 0, @@ -60,8 +62,13 @@ const ResponseDetailModal = ({ )} {completeMessages.length > 0 && ( - - + + setContextModalData(completeMessages)} + > {completeMessages.length}条上下文 @@ -71,17 +78,6 @@ const ResponseDetailModal = ({ {tokens}tokens )} - {/* */} {!!quoteModalData && ( setQuoteModalData(undefined)} /> )} + {!!contextModalData && ( + setContextModalData(undefined)} /> + )} ); }; diff --git a/client/src/pages/api/admin/initChat.ts b/client/src/pages/api/admin/initChat.ts index 9d3e53687..1b8143487 100644 --- a/client/src/pages/api/admin/initChat.ts +++ b/client/src/pages/api/admin/initChat.ts @@ -2,8 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next'; import { jsonRes } from '@/service/response'; import { authUser } from '@/service/utils/auth'; -import { connectToDatabase, TrainingData, User, promotionRecord, Chat } from '@/service/mongo'; -import { PRICE_SCALE } from '@/constants/common'; +import { connectToDatabase, Chat } from '@/service/mongo'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { diff --git a/client/src/pages/app/detail/components/Edit/components/TemplateList.tsx b/client/src/pages/app/detail/components/Edit/components/TemplateList.tsx index 84c9bae8e..22502cc07 100644 --- a/client/src/pages/app/detail/components/Edit/components/TemplateList.tsx +++ b/client/src/pages/app/detail/components/Edit/components/TemplateList.tsx @@ -1,18 +1,18 @@ -import React, { useRef } from 'react'; -import { Box, Flex, useOutsideClick } from '@chakra-ui/react'; +import React from 'react'; +import { Box, Flex } from '@chakra-ui/react'; import { ModuleTemplates } from '@/constants/flow/ModuleTemplate'; -import type { FlowModuleItemType } from '@/types/app'; +import { FlowModuleTemplateType } from '@/types/flow'; import type { XYPosition } from 'reactflow'; import { useGlobalStore } from '@/store/global'; import Avatar from '@/components/Avatar'; -const ModuleStoreList = ({ +const ModuleTemplateList = ({ isOpen, onAddNode, onClose }: { isOpen: boolean; - onAddNode: (e: { template: FlowModuleItemType; position: XYPosition }) => void; + onAddNode: (e: { template: FlowModuleTemplateType; position: XYPosition }) => void; onClose: () => void; }) => { const { isPc } = useGlobalStore(); @@ -92,4 +92,4 @@ const ModuleStoreList = ({ ); }; -export default ModuleStoreList; +export default ModuleTemplateList; diff --git a/client/src/pages/app/detail/components/Edit/index.tsx b/client/src/pages/app/detail/components/Edit/index.tsx index 646a21d00..381fe1c49 100644 --- a/client/src/pages/app/detail/components/Edit/index.tsx +++ b/client/src/pages/app/detail/components/Edit/index.tsx @@ -154,7 +154,7 @@ const AppEdit = ({ app, fullScreen, onFullScreen }: Props) => { [setEdges, setNodes] ); const onAddNode = useCallback( - ({ template, position }: { template: FlowModuleItemType; position: XYPosition }) => { + ({ template, position }: { template: FlowModuleTemplateType; position: XYPosition }) => { if (!reactFlowWrapper.current) return; const reactFlowBounds = reactFlowWrapper.current.getBoundingClientRect(); const mouseX = (position.x - reactFlowBounds.left - x) / zoom - 100; diff --git a/client/src/pages/app/detail/components/Share.tsx b/client/src/pages/app/detail/components/Share.tsx index a4de99d4d..3b3042137 100644 --- a/client/src/pages/app/detail/components/Share.tsx +++ b/client/src/pages/app/detail/components/Share.tsx @@ -115,7 +115,6 @@ const Share = ({ appId }: { appId: string }) => { 名称 - 最大上下文 金额消耗 最后使用时间 操作 @@ -125,7 +124,6 @@ const Share = ({ appId }: { appId: string }) => { {shareChatList.map((item) => ( {item.name} - {item.maxContext} {formatPrice(item.total)}元 {item.lastTime ? formatTimeToChatTime(item.lastTime) : '未使用'} @@ -197,42 +195,6 @@ const Share = ({ appId }: { appId: string }) => { /> - - - - 最长上下文(组) - - { - setShareChatValues('maxContext', e); - setRefresh(!refresh); - }} - > - - {getShareChatValues('maxContext')} - - - - - - - - diff --git a/client/src/pages/chat/components/ChatHistorySlider.tsx b/client/src/pages/chat/components/ChatHistorySlider.tsx index 40997e85e..24c963e68 100644 --- a/client/src/pages/chat/components/ChatHistorySlider.tsx +++ b/client/src/pages/chat/components/ChatHistorySlider.tsx @@ -110,10 +110,10 @@ const ChatHistorySlider = ({ {/* chat history */} - {concatHistory.map((item) => ( + {concatHistory.map((item, i) => ( { appName={chatData.app.name} appAvatar={chatData.app.avatar} activeChatId={chatId} - history={history.map((item) => ({ + history={history.map((item, i) => ({ id: item.chatId, title: item.title, customTitle: item.customTitle,