refactor: improve model generation and handling functionality
This commit is contained in:
parent
a782b2b4aa
commit
1bf147fa6a
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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()
|
||||||
|
}
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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: '',
|
||||||
|
|||||||
@ -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 (
|
||||||
|
|||||||
@ -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(() => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user