mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-25 03:10:08 +08:00
106 lines
3.8 KiB
TypeScript
106 lines
3.8 KiB
TypeScript
import { db } from '@renderer/databases'
|
|
import { getDefaultTopic } from '@renderer/services/AssistantService'
|
|
import { useAppDispatch, useAppSelector } from '@renderer/store'
|
|
import {
|
|
addAssistant,
|
|
addTopic,
|
|
removeAllTopics,
|
|
removeAssistant,
|
|
removeTopic,
|
|
setModel,
|
|
updateAssistant,
|
|
updateAssistants,
|
|
updateAssistantSettings,
|
|
updateDefaultAssistant,
|
|
updateTopic,
|
|
updateTopics
|
|
} from '@renderer/store/assistants'
|
|
import { setDefaultModel, setTopicNamingModel, setTranslateModel } from '@renderer/store/llm'
|
|
import { Assistant, AssistantSettings, Model, Topic } from '@renderer/types'
|
|
|
|
import { TopicManager } from './useTopic'
|
|
|
|
export function useAssistants() {
|
|
const { assistants } = useAppSelector((state) => state.assistants)
|
|
const dispatch = useAppDispatch()
|
|
|
|
return {
|
|
assistants,
|
|
updateAssistants: (assistants: Assistant[]) => dispatch(updateAssistants(assistants)),
|
|
addAssistant: (assistant: Assistant) => dispatch(addAssistant(assistant)),
|
|
removeAssistant: (id: string) => {
|
|
dispatch(removeAssistant({ id }))
|
|
const assistant = assistants.find((a) => a.id === id)
|
|
const topics = assistant?.topics || []
|
|
topics.forEach(({ id }) => TopicManager.removeTopic(id))
|
|
}
|
|
}
|
|
}
|
|
|
|
export function useAssistant(id: string) {
|
|
const assistant = useAppSelector((state) => state.assistants.assistants.find((a) => a.id === id) as Assistant)
|
|
const dispatch = useAppDispatch()
|
|
const { defaultModel } = useDefaultModel()
|
|
|
|
return {
|
|
assistant,
|
|
model: assistant?.model ?? assistant?.defaultModel ?? defaultModel,
|
|
addTopic: (topic: Topic) => dispatch(addTopic({ assistantId: assistant.id, topic })),
|
|
removeTopic: (topic: Topic) => {
|
|
TopicManager.removeTopic(topic.id)
|
|
dispatch(removeTopic({ assistantId: assistant.id, topic }))
|
|
},
|
|
moveTopic: (topic: Topic, toAssistant: Assistant) => {
|
|
dispatch(addTopic({ assistantId: toAssistant.id, topic: { ...topic, assistantId: toAssistant.id } }))
|
|
dispatch(removeTopic({ assistantId: assistant.id, topic }))
|
|
// update topic messages in database
|
|
db.topics
|
|
.where('id')
|
|
.equals(topic.id)
|
|
.modify((dbTopic) => {
|
|
if (dbTopic.messages) {
|
|
dbTopic.messages = dbTopic.messages.map((message) => ({
|
|
...message,
|
|
assistantId: toAssistant.id
|
|
}))
|
|
}
|
|
})
|
|
},
|
|
updateTopic: (topic: Topic) => dispatch(updateTopic({ assistantId: assistant.id, topic })),
|
|
updateTopics: (topics: Topic[]) => dispatch(updateTopics({ assistantId: assistant.id, topics })),
|
|
removeAllTopics: () => dispatch(removeAllTopics({ assistantId: assistant.id })),
|
|
setModel: (model: Model) => dispatch(setModel({ assistantId: assistant.id, model })),
|
|
updateAssistant: (assistant: Assistant) => dispatch(updateAssistant(assistant)),
|
|
updateAssistantSettings: (settings: Partial<AssistantSettings>) => {
|
|
dispatch(updateAssistantSettings({ assistantId: assistant.id, settings }))
|
|
}
|
|
}
|
|
}
|
|
|
|
export function useDefaultAssistant() {
|
|
const defaultAssistant = useAppSelector((state) => state.assistants.defaultAssistant)
|
|
const dispatch = useAppDispatch()
|
|
|
|
return {
|
|
defaultAssistant: {
|
|
...defaultAssistant,
|
|
topics: [getDefaultTopic(defaultAssistant.id)]
|
|
},
|
|
updateDefaultAssistant: (assistant: Assistant) => dispatch(updateDefaultAssistant({ assistant }))
|
|
}
|
|
}
|
|
|
|
export function useDefaultModel() {
|
|
const { defaultModel, topicNamingModel, translateModel } = useAppSelector((state) => state.llm)
|
|
const dispatch = useAppDispatch()
|
|
|
|
return {
|
|
defaultModel,
|
|
topicNamingModel,
|
|
translateModel,
|
|
setDefaultModel: (model: Model) => dispatch(setDefaultModel({ model })),
|
|
setTopicNamingModel: (model: Model) => dispatch(setTopicNamingModel({ model })),
|
|
setTranslateModel: (model: Model) => dispatch(setTranslateModel({ model }))
|
|
}
|
|
}
|