refactor: improve model generation and handling functionality

This commit is contained in:
kangfenmao 2025-01-02 16:39:30 +08:00
parent a782b2b4aa
commit 1bf147fa6a
6 changed files with 43 additions and 48 deletions

View File

@ -3,7 +3,7 @@ import { isMac } from '@renderer/config/constant'
import { isLocalAi, UserAvatar } from '@renderer/config/env' import { isLocalAi, UserAvatar } from '@renderer/config/env'
import { useTheme } from '@renderer/context/ThemeProvider' import { useTheme } from '@renderer/context/ThemeProvider'
import useAvatar from '@renderer/hooks/useAvatar' import useAvatar from '@renderer/hooks/useAvatar'
import { useRuntime } from '@renderer/hooks/useRuntime' import { modelGenerating, useRuntime } from '@renderer/hooks/useRuntime'
import { useSettings } from '@renderer/hooks/useSettings' import { useSettings } from '@renderer/hooks/useSettings'
import { Tooltip } from 'antd' import { Tooltip } from 'antd'
import { Avatar } from 'antd' import { Avatar } from 'antd'
@ -19,7 +19,6 @@ const Sidebar: FC = () => {
const { pathname } = useLocation() const { pathname } = useLocation()
const avatar = useAvatar() const avatar = useAvatar()
const { minappShow } = useRuntime() const { minappShow } = useRuntime()
const { generating } = useRuntime()
const { t } = useTranslation() const { t } = useTranslation()
const navigate = useNavigate() const navigate = useNavigate()
const { windowStyle, showMinappIcon, showFilesIcon } = useSettings() const { windowStyle, showMinappIcon, showFilesIcon } = useSettings()
@ -33,11 +32,8 @@ const Sidebar: FC = () => {
const macTransparentWindow = isMac && windowStyle === 'transparent' const macTransparentWindow = isMac && windowStyle === 'transparent'
const sidebarBgColor = macTransparentWindow ? 'transparent' : 'var(--navbar-background)' const sidebarBgColor = macTransparentWindow ? 'transparent' : 'var(--navbar-background)'
const to = (path: string) => { const to = async (path: string) => {
if (generating) { await modelGenerating()
window.message.warning({ content: t('message.switch.disabled'), key: 'switch-assistant' })
return
}
navigate(path) navigate(path)
} }

View File

@ -1,5 +1,17 @@
import { useAppSelector } from '@renderer/store' import i18n from '@renderer/i18n'
import store, { useAppSelector } from '@renderer/store'
export function useRuntime() { export function useRuntime() {
return useAppSelector((state) => state.runtime) return useAppSelector((state) => state.runtime)
} }
export function modelGenerating() {
const generating = store.getState().runtime.generating
if (generating) {
window.message.warning({ content: i18n.t('message.switch.disabled'), key: 'model-generating' })
return Promise.reject()
}
return Promise.resolve()
}

View File

@ -13,7 +13,7 @@ import TranslateButton from '@renderer/components/TranslateButton'
import { isVisionModel, isWebSearchModel } from '@renderer/config/models' import { isVisionModel, isWebSearchModel } from '@renderer/config/models'
import db from '@renderer/databases' import db from '@renderer/databases'
import { useAssistant } from '@renderer/hooks/useAssistant' import { useAssistant } from '@renderer/hooks/useAssistant'
import { useRuntime } from '@renderer/hooks/useRuntime' import { modelGenerating, useRuntime } from '@renderer/hooks/useRuntime'
import { useMessageStyle, useSettings } from '@renderer/hooks/useSettings' import { useMessageStyle, useSettings } from '@renderer/hooks/useSettings'
import { useShortcut, useShortcutDisplay } from '@renderer/hooks/useShortcuts' import { useShortcut, useShortcutDisplay } from '@renderer/hooks/useShortcuts'
import { useShowTopics } from '@renderer/hooks/useStore' import { useShowTopics } from '@renderer/hooks/useStore'
@ -97,9 +97,7 @@ const Inputbar: FC<Props> = ({ assistant: _assistant, setActiveTopic }) => {
_base = selectedKnowledgeBase _base = selectedKnowledgeBase
const sendMessage = useCallback(async () => { const sendMessage = useCallback(async () => {
if (generating) { await modelGenerating()
return
}
if (inputEmpty) { if (inputEmpty) {
return return
@ -207,10 +205,7 @@ const Inputbar: FC<Props> = ({ assistant: _assistant, setActiveTopic }) => {
} }
const addNewTopic = useCallback(async () => { const addNewTopic = useCallback(async () => {
if (generating) { await modelGenerating()
window.message.warning({ content: t('message.switch.disabled'), key: 'generating' })
return
}
const topic = getDefaultTopic(assistant.id) const topic = getDefaultTopic(assistant.id)
@ -226,7 +221,7 @@ const Inputbar: FC<Props> = ({ assistant: _assistant, setActiveTopic }) => {
setActiveTopic(topic) setActiveTopic(topic)
clickAssistantToShowTopic && setTimeout(() => EventEmitter.emit(EVENT_NAMES.SHOW_TOPIC_SIDEBAR), 0) clickAssistantToShowTopic && setTimeout(() => EventEmitter.emit(EVENT_NAMES.SHOW_TOPIC_SIDEBAR), 0)
}, [addTopic, assistant, clickAssistantToShowTopic, generating, setActiveTopic, setModel, t]) }, [addTopic, assistant, clickAssistantToShowTopic, setActiveTopic, setModel])
const clearTopic = async () => { const clearTopic = async () => {
if (generating) { if (generating) {

View File

@ -11,6 +11,7 @@ import {
} from '@ant-design/icons' } from '@ant-design/icons'
import SelectModelPopup from '@renderer/components/Popups/SelectModelPopup' import SelectModelPopup from '@renderer/components/Popups/SelectModelPopup'
import TextEditPopup from '@renderer/components/Popups/TextEditPopup' import TextEditPopup from '@renderer/components/Popups/TextEditPopup'
import { modelGenerating } from '@renderer/hooks/useRuntime'
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
import { translateText } from '@renderer/services/TranslateService' import { translateText } from '@renderer/services/TranslateService'
import { Message, Model } from '@renderer/types' import { Message, Model } from '@renderer/types'
@ -69,7 +70,8 @@ const MessageMenubar: FC<Props> = (props) => {
[setModel] [setModel]
) )
const onNewBranch = useCallback(() => { const onNewBranch = useCallback(async () => {
await modelGenerating()
EventEmitter.emit(EVENT_NAMES.NEW_BRANCH, index) EventEmitter.emit(EVENT_NAMES.NEW_BRANCH, index)
window.message.success({ window.message.success({
content: t('chat.message.new.branch.created'), content: t('chat.message.new.branch.created'),
@ -77,7 +79,8 @@ const MessageMenubar: FC<Props> = (props) => {
}) })
}, [index, t]) }, [index, t])
const onResend = useCallback(() => { const onResend = useCallback(async () => {
await modelGenerating()
const _messages = onGetMessages?.() || [] const _messages = onGetMessages?.() || []
const index = _messages.findIndex((m) => m.id === message.id) const index = _messages.findIndex((m) => m.id === message.id)
const nextIndex = index + 1 const nextIndex = index + 1
@ -173,11 +176,13 @@ const MessageMenubar: FC<Props> = (props) => {
) )
const onAtModelRegenerate = async () => { const onAtModelRegenerate = async () => {
await modelGenerating()
const selectedModel = await SelectModelPopup.show({ model }) const selectedModel = await SelectModelPopup.show({ model })
selectedModel && onRegenerate(selectedModel) selectedModel && onRegenerate(selectedModel)
} }
const onDeleteAndRegenerate = () => { const onDeleteAndRegenerate = async () => {
await modelGenerating()
onEditMessage?.({ onEditMessage?.({
...message, ...message,
content: '', content: '',

View File

@ -4,6 +4,7 @@ import CopyIcon from '@renderer/components/Icons/CopyIcon'
import Scrollbar from '@renderer/components/Scrollbar' import Scrollbar from '@renderer/components/Scrollbar'
import { useAgents } from '@renderer/hooks/useAgents' import { useAgents } from '@renderer/hooks/useAgents'
import { useAssistant, useAssistants } from '@renderer/hooks/useAssistant' import { useAssistant, useAssistants } from '@renderer/hooks/useAssistant'
import { modelGenerating } from '@renderer/hooks/useRuntime'
import { useSettings } from '@renderer/hooks/useSettings' import { useSettings } from '@renderer/hooks/useSettings'
import AssistantSettingsPopup from '@renderer/pages/settings/AssistantSettings' import AssistantSettingsPopup from '@renderer/pages/settings/AssistantSettings'
import { getDefaultTopic } from '@renderer/services/AssistantService' import { getDefaultTopic } from '@renderer/services/AssistantService'
@ -117,13 +118,8 @@ const Assistants: FC<Props> = ({
) )
const onSwitchAssistant = useCallback( const onSwitchAssistant = useCallback(
(assistant: Assistant): any => { async (assistant: Assistant) => {
if (generating) { await modelGenerating()
return window.message.warning({
content: t('message.switch.disabled'),
key: 'switch-assistant'
})
}
if (topicPosition === 'left' && clickAssistantToShowTopic) { if (topicPosition === 'left' && clickAssistantToShowTopic) {
EventEmitter.emit(EVENT_NAMES.SWITCH_TOPIC_SIDEBAR) EventEmitter.emit(EVENT_NAMES.SWITCH_TOPIC_SIDEBAR)
@ -131,7 +127,7 @@ const Assistants: FC<Props> = ({
setActiveAssistant(assistant) setActiveAssistant(assistant)
}, },
[clickAssistantToShowTopic, generating, setActiveAssistant, t, topicPosition] [clickAssistantToShowTopic, setActiveAssistant, topicPosition]
) )
return ( return (

View File

@ -10,11 +10,12 @@ import DragableList from '@renderer/components/DragableList'
import PromptPopup from '@renderer/components/Popups/PromptPopup' import PromptPopup from '@renderer/components/Popups/PromptPopup'
import Scrollbar from '@renderer/components/Scrollbar' import Scrollbar from '@renderer/components/Scrollbar'
import { useAssistant, useAssistants } from '@renderer/hooks/useAssistant' import { useAssistant, useAssistants } from '@renderer/hooks/useAssistant'
import { modelGenerating } from '@renderer/hooks/useRuntime'
import { useSettings } from '@renderer/hooks/useSettings' import { useSettings } from '@renderer/hooks/useSettings'
import { TopicManager } from '@renderer/hooks/useTopic' import { TopicManager } from '@renderer/hooks/useTopic'
import { fetchMessagesSummary } from '@renderer/services/ApiService' import { fetchMessagesSummary } from '@renderer/services/ApiService'
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
import store, { useAppSelector } from '@renderer/store' import store from '@renderer/store'
import { setGenerating } from '@renderer/store/runtime' import { setGenerating } from '@renderer/store/runtime'
import { Assistant, Topic } from '@renderer/types' import { Assistant, Topic } from '@renderer/types'
import { exportTopicAsMarkdown, topicToMarkdown } from '@renderer/utils/export' import { exportTopicAsMarkdown, topicToMarkdown } from '@renderer/utils/export'
@ -35,46 +36,36 @@ const Topics: FC<Props> = ({ assistant: _assistant, activeTopic, setActiveTopic
const { assistants } = useAssistants() const { assistants } = useAssistants()
const { assistant, removeTopic, moveTopic, updateTopic, updateTopics } = useAssistant(_assistant.id) const { assistant, removeTopic, moveTopic, updateTopic, updateTopics } = useAssistant(_assistant.id)
const { t } = useTranslation() const { t } = useTranslation()
const generating = useAppSelector((state) => state.runtime.generating)
const { showTopicTime, topicPosition } = useSettings() const { showTopicTime, topicPosition } = useSettings()
const borderRadius = showTopicTime ? 12 : 17 const borderRadius = showTopicTime ? 12 : 17
const onDeleteTopic = useCallback( const onDeleteTopic = useCallback(
(topic: Topic) => { async (topic: Topic) => {
if (generating) { await modelGenerating()
window.message.warning({ content: t('message.switch.disabled'), key: 'generating' })
return
}
const index = findIndex(assistant.topics, (t) => t.id === topic.id) const index = findIndex(assistant.topics, (t) => t.id === topic.id)
setActiveTopic(assistant.topics[index + 1 === assistant.topics.length ? 0 : index + 1]) setActiveTopic(assistant.topics[index + 1 === assistant.topics.length ? 0 : index + 1])
removeTopic(topic) removeTopic(topic)
}, },
[assistant.topics, generating, removeTopic, setActiveTopic, t] [assistant.topics, removeTopic, setActiveTopic]
) )
const onMoveTopic = useCallback( const onMoveTopic = useCallback(
(topic: Topic, toAssistant: Assistant) => { async (topic: Topic, toAssistant: Assistant) => {
if (generating) { await modelGenerating()
window.message.warning({ content: t('message.switch.disabled'), key: 'generating' })
return
}
const index = findIndex(assistant.topics, (t) => t.id === topic.id) const index = findIndex(assistant.topics, (t) => t.id === topic.id)
setActiveTopic(assistant.topics[index + 1 === assistant.topics.length ? 0 : index + 1]) setActiveTopic(assistant.topics[index + 1 === assistant.topics.length ? 0 : index + 1])
moveTopic(topic, toAssistant) moveTopic(topic, toAssistant)
}, },
[assistant.topics, generating, moveTopic, setActiveTopic, t] [assistant.topics, moveTopic, setActiveTopic]
) )
const onSwitchTopic = useCallback( const onSwitchTopic = useCallback(
(topic: Topic) => { async (topic: Topic) => {
if (generating) { await modelGenerating()
window.message.warning({ content: t('message.switch.disabled'), key: 'generating' })
return
}
setActiveTopic(topic) setActiveTopic(topic)
}, },
[generating, setActiveTopic, t] [setActiveTopic]
) )
const onClearMessages = useCallback(() => { const onClearMessages = useCallback(() => {