From d388aeecfb518935697f94f297342a03cf6a3454 Mon Sep 17 00:00:00 2001 From: Teo Date: Tue, 14 Jan 2025 16:38:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E6=8F=90=E5=8F=8A=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E6=A8=A1=E5=9E=8B=E4=B8=80=E8=B5=B7=E5=9B=9E?= =?UTF-8?q?=E7=AD=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/home/Inputbar/AttachmentPreview.tsx | 39 ++--- .../src/pages/home/Inputbar/Inputbar.tsx | 36 +++- .../home/Inputbar/MentionModelsButton.tsx | 155 ++++++++++++++++++ .../home/Inputbar/MentionModelsInput.tsx | 26 +++ .../src/pages/home/Messages/Message.tsx | 4 +- .../pages/home/Messages/MessageContent.tsx | 9 +- .../src/pages/home/Messages/Messages.tsx | 16 +- src/renderer/src/types/index.ts | 2 + 8 files changed, 254 insertions(+), 33 deletions(-) create mode 100644 src/renderer/src/pages/home/Inputbar/MentionModelsButton.tsx create mode 100644 src/renderer/src/pages/home/Inputbar/MentionModelsInput.tsx diff --git a/src/renderer/src/pages/home/Inputbar/AttachmentPreview.tsx b/src/renderer/src/pages/home/Inputbar/AttachmentPreview.tsx index ba4868d5..a1e7b005 100644 --- a/src/renderer/src/pages/home/Inputbar/AttachmentPreview.tsx +++ b/src/renderer/src/pages/home/Inputbar/AttachmentPreview.tsx @@ -16,37 +16,26 @@ const AttachmentPreview: FC = ({ files, setFiles }) => { } return ( - - - 20 ? 'text' : 'picture-card'} - fileList={files.map((file) => ({ - uid: file.id, - url: 'file://' + FileManager.getSafePath(file), - status: 'done', - name: file.name - }))} - onRemove={(item) => setFiles(files.filter((file) => item.uid !== file.id))} - /> - - + + 20 ? 'text' : 'picture-card'} + fileList={files.map((file) => ({ + uid: file.id, + url: 'file://' + FileManager.getSafePath(file), + status: 'done', + name: file.name + }))} + onRemove={(item) => setFiles(files.filter((file) => item.uid !== file.id))} + /> + ) } -const Container = styled.div` - display: flex; - flex-direction: row; - gap: 10px; - padding: 10px 0; - background: var(--color-background); - border-top: 1px solid var(--color-border-mute); -` - const ContentContainer = styled.div` max-height: 40vh; - width: 100%; overflow-y: auto; - padding: 0 20px; + width: 100%; + padding: 10px 15px 0; ` export default AttachmentPreview diff --git a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx index 9de9d2a5..0c0e3a9c 100644 --- a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx +++ b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx @@ -24,7 +24,7 @@ import { estimateTextTokens as estimateTxtTokens } from '@renderer/services/Toke import { translateText } from '@renderer/services/TranslateService' import store, { useAppDispatch, useAppSelector } from '@renderer/store' import { setGenerating, setSearching } from '@renderer/store/runtime' -import { Assistant, FileType, KnowledgeBase, Message, Topic } from '@renderer/types' +import { Assistant, FileType, KnowledgeBase, Message, Model, Topic } from '@renderer/types' import { classNames, delay, getFileExtension, uuid } from '@renderer/utils' import { documentExts, imageExts, textExts } from '@shared/config/constant' import { Button, Popconfirm, Tooltip } from 'antd' @@ -39,6 +39,8 @@ import NarrowLayout from '../Messages/NarrowLayout' import AttachmentButton from './AttachmentButton' import AttachmentPreview from './AttachmentPreview' import KnowledgeBaseButton from './KnowledgeBaseButton' +import MentionModelsButton from './MentionModelsButton' +import MentionModelsInput from './MentionModelsInput' import SendMessageButton from './SendMessageButton' import TokenCount from './TokenCount' @@ -82,6 +84,7 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic }) => { const spaceClickTimer = useRef() const [isTranslating, setIsTranslating] = useState(false) const [selectedKnowledgeBase, setSelectedKnowledgeBase] = useState(_base) + const [mentionModels, setMentionModels] = useState([]) const isVision = useMemo(() => isVisionModel(model), [model]) const supportExts = useMemo(() => [...textExts, ...documentExts, ...(isVision ? imageExts : [])], [isVision]) @@ -126,15 +129,20 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic }) => { message.files = await FileManager.uploadFiles(files) } + if (mentionModels.length > 0) { + message.mentions = mentionModels + } + EventEmitter.emit(EVENT_NAMES.SEND_MESSAGE, message) setText('') setFiles([]) + setMentionModels([]) setTimeout(() => setText(''), 500) setTimeout(() => resizeTextArea(), 0) setExpend(false) - }, [inputEmpty, text, assistant.id, assistant.topics, selectedKnowledgeBase, files]) + }, [inputEmpty, text, assistant.id, assistant.topics, selectedKnowledgeBase, files, mentionModels]) const translate = async () => { if (isTranslating) { @@ -386,14 +394,31 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic }) => { setSelectedKnowledgeBase(base) } + const onMentionModel = useCallback( + (model: Model) => { + const isSelected = mentionModels.some((m) => m.id === model.id) + if (isSelected) { + setMentionModels(mentionModels.filter((m) => m.id !== model.id)) + } else { + setMentionModels([...mentionModels, model]) + } + }, + [mentionModels] + ) + + const handleRemoveModel = (model: Model) => { + setMentionModels(mentionModels.filter((m) => m.id !== model.id)) + } + return ( - + +