feat: add updateAssistantSettings to useAssistant hook

This commit is contained in:
kangfenmao 2024-07-22 11:15:10 +08:00
parent c1a8198575
commit e9a7735fce
7 changed files with 63 additions and 48 deletions

View File

@ -1,4 +1,4 @@
import { useAppInitEffect } from '@renderer/hooks/useAppInitEffect' import { useAppInit } from '@renderer/hooks/useAppInit'
import { message, Modal } from 'antd' import { message, Modal } from 'antd'
import { findIndex, pullAt } from 'lodash' import { findIndex, pullAt } from 'lodash'
import React, { useEffect, useState } from 'react' import React, { useEffect, useState } from 'react'
@ -29,7 +29,7 @@ const TopViewContainer: React.FC<Props> = ({ children }) => {
const [messageApi, messageContextHolder] = message.useMessage() const [messageApi, messageContextHolder] = message.useMessage()
const [modal, modalContextHolder] = Modal.useModal() const [modal, modalContextHolder] = Modal.useModal()
useAppInitEffect() useAppInit()
onPop = () => { onPop = () => {
const views = [...elements] const views = [...elements]

View File

@ -5,7 +5,7 @@ import { setAvatar } from '@renderer/store/runtime'
import { runAsyncFunction } from '@renderer/utils' import { runAsyncFunction } from '@renderer/utils'
import { useEffect } from 'react' import { useEffect } from 'react'
export function useAppInitEffect() { export function useAppInit() {
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
useEffect(() => { useEffect(() => {

View File

@ -1,20 +1,21 @@
import { getDefaultTopic } from '@renderer/services/assistant' import { getDefaultTopic } from '@renderer/services/assistant'
import { useAppDispatch, useAppSelector } from '@renderer/store' import { useAppDispatch, useAppSelector } from '@renderer/store'
import { import {
addTopic as _addTopic,
removeAllTopics as _removeAllTopics,
removeTopic as _removeTopic,
setModel as _setModel,
updateAssistants as _updateAssistants,
updateDefaultAssistant as _updateDefaultAssistant,
updateTopic as _updateTopic,
updateTopics as _updateTopics,
addAssistant, addAssistant,
addTopic,
removeAllTopics,
removeAssistant, removeAssistant,
updateAssistant removeTopic,
setModel,
updateAssistant,
updateAssistants,
updateAssistantSettings,
updateDefaultAssistant,
updateTopic,
updateTopics
} from '@renderer/store/assistants' } from '@renderer/store/assistants'
import { setDefaultModel as _setDefaultModel, setTopicNamingModel as _setTopicNamingModel } from '@renderer/store/llm' import { setDefaultModel as _setDefaultModel, setTopicNamingModel as _setTopicNamingModel } from '@renderer/store/llm'
import { Assistant, Model, Topic } from '@renderer/types' import { Assistant, AssistantSettings, Model, Topic } from '@renderer/types'
import localforage from 'localforage' import localforage from 'localforage'
export function useAssistants() { export function useAssistants() {
@ -23,9 +24,8 @@ export function useAssistants() {
return { return {
assistants, assistants,
updateAssistants: (assistants: Assistant[]) => dispatch(_updateAssistants(assistants)), updateAssistants: (assistants: Assistant[]) => dispatch(updateAssistants(assistants)),
addAssistant: (assistant: Assistant) => dispatch(addAssistant(assistant)), addAssistant: (assistant: Assistant) => dispatch(addAssistant(assistant)),
updateAssistant: (assistant: Assistant) => dispatch(updateAssistant(assistant)),
removeAssistant: (id: string) => { removeAssistant: (id: string) => {
dispatch(removeAssistant({ id })) dispatch(removeAssistant({ id }))
const assistant = assistants.find((a) => a.id === id) const assistant = assistants.find((a) => a.id === id)
@ -44,17 +44,21 @@ export function useAssistant(id: string) {
return { return {
assistant, assistant,
model: assistant?.model ?? defaultModel, model: assistant?.model ?? defaultModel,
addTopic: (topic: Topic) => dispatch(_addTopic({ assistantId: assistant.id, topic })), addTopic: (topic: Topic) => dispatch(addTopic({ assistantId: assistant.id, topic })),
removeTopic: (topic: Topic) => dispatch(_removeTopic({ assistantId: assistant.id, topic })), removeTopic: (topic: Topic) => dispatch(removeTopic({ assistantId: assistant.id, topic })),
updateTopic: (topic: Topic) => dispatch(_updateTopic({ assistantId: assistant.id, topic })), updateTopic: (topic: Topic) => dispatch(updateTopic({ assistantId: assistant.id, topic })),
updateTopics: (topics: Topic[]) => dispatch(_updateTopics({ assistantId: assistant.id, topics })), updateTopics: (topics: Topic[]) => dispatch(updateTopics({ assistantId: assistant.id, topics })),
removeAllTopics: () => dispatch(_removeAllTopics({ assistantId: assistant.id })), removeAllTopics: () => dispatch(removeAllTopics({ assistantId: assistant.id })),
setModel: (model: Model) => dispatch(_setModel({ assistantId: assistant.id, model })) setModel: (model: Model) => dispatch(setModel({ assistantId: assistant.id, model })),
updateAssistant: (assistant: Assistant) => dispatch(updateAssistant(assistant)),
updateAssistantSettings: (settings: AssistantSettings) => {
dispatch(updateAssistantSettings({ assistantId: assistant.id, settings }))
}
} }
} }
export function useDefaultAssistant() { export function useDefaultAssistant() {
const { defaultAssistant } = useAppSelector((state) => state.assistants) const defaultAssistant = useAppSelector((state) => state.assistants.defaultAssistant)
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
return { return {
@ -62,7 +66,7 @@ export function useDefaultAssistant() {
...defaultAssistant, ...defaultAssistant,
topics: [getDefaultTopic()] topics: [getDefaultTopic()]
}, },
updateDefaultAssistant: (assistant: Assistant) => dispatch(_updateDefaultAssistant({ assistant })) updateDefaultAssistant: (assistant: Assistant) => dispatch(updateDefaultAssistant({ assistant }))
} }
} }

View File

@ -1,11 +1,11 @@
import { useAppDispatch, useAppSelector } from '@renderer/store' import { useAppDispatch, useAppSelector } from '@renderer/store'
import { import {
addModel as _addModel, addModel,
removeModel as _removeModel,
updateProvider as _updateProvider,
updateProviders as _updateProviders,
addProvider, addProvider,
removeProvider removeModel,
removeProvider,
updateProvider,
updateProviders
} from '@renderer/store/llm' } from '@renderer/store/llm'
import { Assistant, Model, Provider } from '@renderer/types' import { Assistant, Model, Provider } from '@renderer/types'
import { useDefaultModel } from './useAssistant' import { useDefaultModel } from './useAssistant'
@ -24,8 +24,8 @@ export function useProviders() {
providers, providers,
addProvider: (provider: Provider) => dispatch(addProvider(provider)), addProvider: (provider: Provider) => dispatch(addProvider(provider)),
removeProvider: (provider: Provider) => dispatch(removeProvider(provider)), removeProvider: (provider: Provider) => dispatch(removeProvider(provider)),
updateProvider: (provider: Provider) => dispatch(_updateProvider(provider)), updateProvider: (provider: Provider) => dispatch(updateProvider(provider)),
updateProviders: (providers: Provider[]) => dispatch(_updateProviders(providers)) updateProviders: (providers: Provider[]) => dispatch(updateProviders(providers))
} }
} }
@ -48,9 +48,9 @@ export function useProvider(id: string) {
return { return {
provider, provider,
models: provider.models, models: provider.models,
updateProvider: (provider: Provider) => dispatch(_updateProvider(provider)), updateProvider: (provider: Provider) => dispatch(updateProvider(provider)),
addModel: (model: Model) => dispatch(_addModel({ providerId: id, model })), addModel: (model: Model) => dispatch(addModel({ providerId: id, model })),
removeModel: (model: Model) => dispatch(_removeModel({ providerId: id, model })) removeModel: (model: Model) => dispatch(removeModel({ providerId: id, model }))
} }
} }

View File

@ -1,6 +1,6 @@
import { QuestionCircleOutlined } from '@ant-design/icons' import { QuestionCircleOutlined } from '@ant-design/icons'
import { DEFAULT_CONEXTCOUNT, DEFAULT_TEMPERATURE } from '@renderer/config/constant' import { DEFAULT_CONEXTCOUNT, DEFAULT_TEMPERATURE } from '@renderer/config/constant'
import { useAssistant, useAssistants } from '@renderer/hooks/useAssistant' import { useAssistant } from '@renderer/hooks/useAssistant'
import { Assistant } from '@renderer/types' import { Assistant } from '@renderer/types'
import { Button, Col, InputNumber, Popover, Row, Slider, Tooltip } from 'antd' import { Button, Col, InputNumber, Popover, Row, Slider, Tooltip } from 'antd'
import { debounce } from 'lodash' import { debounce } from 'lodash'
@ -13,8 +13,7 @@ interface Props {
} }
const PopoverContent: FC<Props> = (props) => { const PopoverContent: FC<Props> = (props) => {
const { assistant } = useAssistant(props.assistant.id) const { assistant, updateAssistantSettings, updateAssistant } = useAssistant(props.assistant.id)
const { updateAssistant } = useAssistants()
const [temperature, setTemperature] = useState(assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE) const [temperature, setTemperature] = useState(assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE)
const [contextCount, setConextCount] = useState(assistant?.settings?.contextCount ?? DEFAULT_CONEXTCOUNT) const [contextCount, setConextCount] = useState(assistant?.settings?.contextCount ?? DEFAULT_CONEXTCOUNT)
const { t } = useTranslation() const { t } = useTranslation()
@ -22,17 +21,17 @@ const PopoverContent: FC<Props> = (props) => {
const onUpdateAssistantSettings = useCallback( const onUpdateAssistantSettings = useCallback(
debounce( debounce(
({ _temperature, _contextCount }: { _temperature?: number; _contextCount?: number }) => { ({ _temperature, _contextCount }: { _temperature?: number; _contextCount?: number }) => {
updateAssistant({ updateAssistantSettings({
...assistant, ...assistant.settings,
settings: { temperature: _temperature ?? temperature,
...assistant.settings, contextCount: _contextCount ?? contextCount
temperature: _temperature ?? temperature,
contextCount: _contextCount ?? contextCount
}
}) })
}, },
1000, 1000,
{ leading: false, trailing: true } {
leading: false,
trailing: true
}
), ),
[] []
) )

View File

@ -1,7 +1,7 @@
import { CopyOutlined, DeleteOutlined, EditOutlined } from '@ant-design/icons' import { CopyOutlined, DeleteOutlined, EditOutlined } from '@ant-design/icons'
import { DragDropContext, Draggable, Droppable, DropResult } from '@hello-pangea/dnd' import { DragDropContext, Draggable, Droppable, DropResult } from '@hello-pangea/dnd'
import AssistantSettingPopup from '@renderer/components/Popups/AssistantSettingPopup' import AssistantSettingPopup from '@renderer/components/Popups/AssistantSettingPopup'
import { useAssistants } from '@renderer/hooks/useAssistant' import { useAssistant, useAssistants } from '@renderer/hooks/useAssistant'
import { getDefaultTopic } from '@renderer/services/assistant' import { getDefaultTopic } from '@renderer/services/assistant'
import { Assistant } from '@renderer/types' import { Assistant } from '@renderer/types'
import { droppableReorder, uuid } from '@renderer/utils' import { droppableReorder, uuid } from '@renderer/utils'
@ -19,7 +19,8 @@ interface Props {
} }
const Assistants: FC<Props> = ({ activeAssistant, setActiveAssistant, onCreateAssistant }) => { const Assistants: FC<Props> = ({ activeAssistant, setActiveAssistant, onCreateAssistant }) => {
const { assistants, removeAssistant, updateAssistant, addAssistant, updateAssistants } = useAssistants() const { assistants, removeAssistant, addAssistant, updateAssistants } = useAssistants()
const { updateAssistant } = useAssistant(activeAssistant.id)
const { t } = useTranslation() const { t } = useTranslation()

View File

@ -1,7 +1,7 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit' import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import { getDefaultAssistant, getDefaultTopic } from '@renderer/services/assistant' import { getDefaultAssistant, getDefaultTopic } from '@renderer/services/assistant'
import LocalStorage from '@renderer/services/storage' import LocalStorage from '@renderer/services/storage'
import { Assistant, Model, Topic } from '@renderer/types' import { Assistant, AssistantSettings, Model, Topic } from '@renderer/types'
import { uniqBy } from 'lodash' import { uniqBy } from 'lodash'
export interface AssistantsState { export interface AssistantsState {
@ -33,6 +33,16 @@ const assistantsSlice = createSlice({
updateAssistant: (state, action: PayloadAction<Assistant>) => { updateAssistant: (state, action: PayloadAction<Assistant>) => {
state.assistants = state.assistants.map((c) => (c.id === action.payload.id ? action.payload : c)) state.assistants = state.assistants.map((c) => (c.id === action.payload.id ? action.payload : c))
}, },
updateAssistantSettings: (state, action: PayloadAction<{ assistantId: string; settings: AssistantSettings }>) => {
state.assistants = state.assistants.map((assistant) =>
assistant.id === action.payload.assistantId
? {
...assistant,
settings: action.payload.settings
}
: assistant
)
},
addTopic: (state, action: PayloadAction<{ assistantId: string; topic: Topic }>) => { addTopic: (state, action: PayloadAction<{ assistantId: string; topic: Topic }>) => {
state.assistants = state.assistants.map((assistant) => state.assistants = state.assistants.map((assistant) =>
assistant.id === action.payload.assistantId assistant.id === action.payload.assistantId
@ -111,7 +121,8 @@ export const {
updateTopic, updateTopic,
updateTopics, updateTopics,
removeAllTopics, removeAllTopics,
setModel setModel,
updateAssistantSettings
} = assistantsSlice.actions } = assistantsSlice.actions
export default assistantsSlice.reducer export default assistantsSlice.reducer