From 1abaa164f5a50daa297815549232bb736ecc960e Mon Sep 17 00:00:00 2001 From: jialin Date: Fri, 13 Sep 2024 10:16:21 +0800 Subject: [PATCH] refactor: playground chat --- .../playground/components/ground-left.tsx | 33 +++- .../playground/components/message-input.tsx | 66 ++++--- .../multiple-chat/active-models.tsx | 12 +- .../components/multiple-chat/index.tsx | 185 ++++++++++++++---- .../components/multiple-chat/model-item.tsx | 107 +++++++--- .../playground/components/prompt-modal.tsx | 83 ++++---- .../playground/config/compare-context.ts | 4 +- src/pages/playground/config/types.ts | 5 + src/pages/playground/index.tsx | 15 +- src/pages/playground/style/chat-footer.less | 4 +- src/pages/playground/style/ground-left.less | 4 +- src/pages/playground/style/message-input.less | 17 +- src/pages/playground/style/model-item.less | 36 ++++ src/pages/playground/style/play-ground.less | 6 +- src/pages/playground/style/prompt-modal.less | 2 + 15 files changed, 406 insertions(+), 173 deletions(-) create mode 100644 src/pages/playground/config/types.ts diff --git a/src/pages/playground/components/ground-left.tsx b/src/pages/playground/components/ground-left.tsx index d3babc9d..6c60d008 100644 --- a/src/pages/playground/components/ground-left.tsx +++ b/src/pages/playground/components/ground-left.tsx @@ -19,13 +19,13 @@ import { CHAT_API } from '../apis'; import { Roles } from '../config'; import '../style/ground-left.less'; import '../style/system-message-wrap.less'; -import ChatFooter from './chat-footer'; +import MessageInput from './message-input'; import MessageItem from './message-item'; -import ReferenceParams from './reference-params'; import ViewCodeModal from './view-code-modal'; interface MessageProps { parameters: any; + modelList: Global.BaseOption[]; ref?: any; } @@ -36,7 +36,7 @@ interface MessageItemProps { } const MessageList: React.FC = forwardRef((props, ref) => { - const { parameters } = props; + const { parameters, modelList } = props; const messageId = useRef(0); const [messageList, setMessageList] = useState([ { @@ -81,11 +81,14 @@ const MessageList: React.FC = forwardRef((props, ref) => { const setMessageId = () => { messageId.current = messageId.current + 1; }; - const handleNewMessage = (role?: any) => { - messageList.push({ + const handleNewMessage = (message?: { role: string; content: string }) => { + const newMessage = message || { role: _.last(messageList)?.role === Roles.User ? Roles.Assistant : Roles.User, - content: '', + content: '' + }; + messageList.push({ + ...newMessage, uid: messageId.current + 1 }); setMessageId(); @@ -234,6 +237,10 @@ const MessageList: React.FC = forwardRef((props, ref) => { setCurrentIsFocus(false); }; + const handleSelectModel = () => {}; + + const handlePresetPrompt = () => {}; + useHotkeys( HotKeys.SUBMIT, () => { @@ -324,7 +331,17 @@ const MessageList: React.FC = forwardRef((props, ref) => {
- + {/* = forwardRef((props, ref) => { selectedModel={parameters.model} hasTokenResult={!!tokenResult} feedback={} - > + > */}
[]; handleSubmit: (params: { role: string; content: string }) => void; handleAbortFetch: () => void; - setSpans: (value: { span: number; count: number }) => void; + updateLayout?: (value: { span: number; count: number }) => void; clearAll: () => void; - setModelSelections: (modelList: Global.BaseOption[]) => void; + setModelSelections: ( + modelList: (Global.BaseOption & { + instanceId: symbol; + })[] + ) => void; presetPrompt: (list: { role: string; content: string }[]) => void; + addMessage: (message: { role: string; content: string }) => void; loading: boolean; } @@ -74,7 +78,8 @@ const MessageInput: React.FC = ({ loading, modelList, clearAll, - setSpans + updateLayout, + addMessage }) => { const { TextArea } = Input; const intl = useIntl(); @@ -105,7 +110,7 @@ const MessageInput: React.FC = ({ }; const handleLayoutChange = (value: { span: number; count: number }) => { console.log('layout change:', value); - setSpans(value); + updateLayout?.(value); }; const handleToggleRole = () => { @@ -125,7 +130,8 @@ const MessageInput: React.FC = ({ const list = value?.map?.((val) => { return { value: val, - label: val + label: val, + instanceId: Symbol(val) }; }); setModelSelections(list); @@ -134,6 +140,16 @@ const MessageInput: React.FC = ({ const handleOpenPrompt = () => { setOpen(true); }; + + const handleAddMessage = () => { + console.log('add message'); + addMessage({ ...message }); + setMessage({ + ...message, + content: '' + }); + }; + useHotkeys( HotKeys.SUBMIT.join(','), () => { @@ -167,21 +183,25 @@ const MessageInput: React.FC = ({ size="middle" onClick={handleOpenPrompt} > - - {layoutOptions.map((option) => ( - - ))} + {updateLayout && ( + <> + + {layoutOptions.map((option) => ( + + ))} + + )}
+ {!loading ? ( - ) : (
-
- setSystemMessage(e.target.value)} - > - +
+ { +
+ setSystemMessage(e.target.value)} + > + +
+ } + {!autoSize.focus && ( +
+
+ {systemMessage || ( + + Type system message here + + )} +
+ {systemMessage && ( + + )} +
+ )}
= (props) => { keyboard={false} width={660} styles={{ - body: { - maxHeight: '550px', - overflow: 'auto' + content: { + padding: '0' + }, + header: { + padding: 'var(--ant-modal-content-padding)', + marginBottom: '0' } }} footer={null} > -
- {promptList.map((item, index) => { - return ( -
-

- {item.title} - -

- {item.data.map((data, i) => { - return ( -
- {data.role} - - - {data.content} - - -
- ); - })} -
- ); - })} -
+ +
+ {promptList.map((item, index) => { + return ( +
+

+ {item.title} + +

+ {item.data.map((data, i) => { + return ( +
+ {data.role} + + + {data.content} + + +
+ ); + })} +
+ ); + })} +
+
); }; diff --git a/src/pages/playground/config/compare-context.ts b/src/pages/playground/config/compare-context.ts index 190f4a89..2dd6df9c 100644 --- a/src/pages/playground/config/compare-context.ts +++ b/src/pages/playground/config/compare-context.ts @@ -8,10 +8,10 @@ interface CompareContextProps { systemMessage?: string; globalParams: Record; loadingStatus: Record; - handleDeleteModel: (modelname: string) => void; + handleDeleteModel: (instanceId: symbol) => void; setSystemMessage?: (message: string) => void; setGlobalParams: (value: Record) => void; - setLoadingStatus: (modeName: string, status: boolean) => void; + setLoadingStatus: (instanceId: symbol, status: boolean) => void; } const CompareContext = React.createContext( {} as CompareContextProps diff --git a/src/pages/playground/config/types.ts b/src/pages/playground/config/types.ts new file mode 100644 index 00000000..04730869 --- /dev/null +++ b/src/pages/playground/config/types.ts @@ -0,0 +1,5 @@ +export interface ModelSelectionItem extends Global.BaseOption { + uid: number; + instanceId: symbol; + type?: string; +} diff --git a/src/pages/playground/index.tsx b/src/pages/playground/index.tsx index 1753163d..d790d90c 100644 --- a/src/pages/playground/index.tsx +++ b/src/pages/playground/index.tsx @@ -3,7 +3,7 @@ import HotKeys from '@/config/hotkeys'; import { MessageOutlined, OneToOneOutlined } from '@ant-design/icons'; import { PageContainer } from '@ant-design/pro-components'; import { useIntl, useSearchParams } from '@umijs/max'; -import { Button, Divider, Segmented, Space, Tabs, TabsProps } from 'antd'; +import { Button, Segmented, Space, Tabs, TabsProps } from 'antd'; import classNames from 'classnames'; import _ from 'lodash'; import { useCallback, useEffect, useRef, useState } from 'react'; @@ -45,7 +45,11 @@ const Playground: React.FC = () => { key: 'chat', label: 'Chat', children: ( - + ) }, { @@ -146,13 +150,6 @@ const Playground: React.FC = () => { collapse: collapse })} > -
- -