From e9a7735fceb686dd15ffd2acd5d813eb82e92232 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Mon, 22 Jul 2024 11:15:10 +0800 Subject: [PATCH] feat: add updateAssistantSettings to useAssistant hook --- src/renderer/src/components/TopView/index.tsx | 4 +- .../{useAppInitEffect.ts => useAppInit.ts} | 2 +- src/renderer/src/hooks/useAssistant.ts | 44 ++++++++++--------- src/renderer/src/hooks/useProvider.ts | 20 ++++----- .../home/components/AssistantSettings.tsx | 21 +++++---- .../src/pages/home/components/Assistants.tsx | 5 ++- src/renderer/src/store/assistants.ts | 15 ++++++- 7 files changed, 63 insertions(+), 48 deletions(-) rename src/renderer/src/hooks/{useAppInitEffect.ts => useAppInit.ts} (95%) diff --git a/src/renderer/src/components/TopView/index.tsx b/src/renderer/src/components/TopView/index.tsx index ee938dc9..33bdae0d 100644 --- a/src/renderer/src/components/TopView/index.tsx +++ b/src/renderer/src/components/TopView/index.tsx @@ -1,4 +1,4 @@ -import { useAppInitEffect } from '@renderer/hooks/useAppInitEffect' +import { useAppInit } from '@renderer/hooks/useAppInit' import { message, Modal } from 'antd' import { findIndex, pullAt } from 'lodash' import React, { useEffect, useState } from 'react' @@ -29,7 +29,7 @@ const TopViewContainer: React.FC = ({ children }) => { const [messageApi, messageContextHolder] = message.useMessage() const [modal, modalContextHolder] = Modal.useModal() - useAppInitEffect() + useAppInit() onPop = () => { const views = [...elements] diff --git a/src/renderer/src/hooks/useAppInitEffect.ts b/src/renderer/src/hooks/useAppInit.ts similarity index 95% rename from src/renderer/src/hooks/useAppInitEffect.ts rename to src/renderer/src/hooks/useAppInit.ts index fd889691..efdd7efb 100644 --- a/src/renderer/src/hooks/useAppInitEffect.ts +++ b/src/renderer/src/hooks/useAppInit.ts @@ -5,7 +5,7 @@ import { setAvatar } from '@renderer/store/runtime' import { runAsyncFunction } from '@renderer/utils' import { useEffect } from 'react' -export function useAppInitEffect() { +export function useAppInit() { const dispatch = useAppDispatch() useEffect(() => { diff --git a/src/renderer/src/hooks/useAssistant.ts b/src/renderer/src/hooks/useAssistant.ts index 9a6ddc36..f923910d 100644 --- a/src/renderer/src/hooks/useAssistant.ts +++ b/src/renderer/src/hooks/useAssistant.ts @@ -1,20 +1,21 @@ import { getDefaultTopic } from '@renderer/services/assistant' import { useAppDispatch, useAppSelector } from '@renderer/store' 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, + addTopic, + removeAllTopics, removeAssistant, - updateAssistant + removeTopic, + setModel, + updateAssistant, + updateAssistants, + updateAssistantSettings, + updateDefaultAssistant, + updateTopic, + updateTopics } from '@renderer/store/assistants' 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' export function useAssistants() { @@ -23,9 +24,8 @@ export function useAssistants() { return { assistants, - updateAssistants: (assistants: Assistant[]) => dispatch(_updateAssistants(assistants)), + updateAssistants: (assistants: Assistant[]) => dispatch(updateAssistants(assistants)), addAssistant: (assistant: Assistant) => dispatch(addAssistant(assistant)), - updateAssistant: (assistant: Assistant) => dispatch(updateAssistant(assistant)), removeAssistant: (id: string) => { dispatch(removeAssistant({ id })) const assistant = assistants.find((a) => a.id === id) @@ -44,17 +44,21 @@ export function useAssistant(id: string) { return { assistant, model: assistant?.model ?? defaultModel, - addTopic: (topic: Topic) => dispatch(_addTopic({ assistantId: assistant.id, topic })), - removeTopic: (topic: Topic) => dispatch(_removeTopic({ assistantId: assistant.id, topic })), - 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 })) + addTopic: (topic: Topic) => dispatch(addTopic({ assistantId: assistant.id, topic })), + removeTopic: (topic: Topic) => dispatch(removeTopic({ assistantId: assistant.id, topic })), + 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: AssistantSettings) => { + dispatch(updateAssistantSettings({ assistantId: assistant.id, settings })) + } } } export function useDefaultAssistant() { - const { defaultAssistant } = useAppSelector((state) => state.assistants) + const defaultAssistant = useAppSelector((state) => state.assistants.defaultAssistant) const dispatch = useAppDispatch() return { @@ -62,7 +66,7 @@ export function useDefaultAssistant() { ...defaultAssistant, topics: [getDefaultTopic()] }, - updateDefaultAssistant: (assistant: Assistant) => dispatch(_updateDefaultAssistant({ assistant })) + updateDefaultAssistant: (assistant: Assistant) => dispatch(updateDefaultAssistant({ assistant })) } } diff --git a/src/renderer/src/hooks/useProvider.ts b/src/renderer/src/hooks/useProvider.ts index 62c6760f..9fac27da 100644 --- a/src/renderer/src/hooks/useProvider.ts +++ b/src/renderer/src/hooks/useProvider.ts @@ -1,11 +1,11 @@ import { useAppDispatch, useAppSelector } from '@renderer/store' import { - addModel as _addModel, - removeModel as _removeModel, - updateProvider as _updateProvider, - updateProviders as _updateProviders, + addModel, addProvider, - removeProvider + removeModel, + removeProvider, + updateProvider, + updateProviders } from '@renderer/store/llm' import { Assistant, Model, Provider } from '@renderer/types' import { useDefaultModel } from './useAssistant' @@ -24,8 +24,8 @@ export function useProviders() { providers, addProvider: (provider: Provider) => dispatch(addProvider(provider)), removeProvider: (provider: Provider) => dispatch(removeProvider(provider)), - updateProvider: (provider: Provider) => dispatch(_updateProvider(provider)), - updateProviders: (providers: Provider[]) => dispatch(_updateProviders(providers)) + updateProvider: (provider: Provider) => dispatch(updateProvider(provider)), + updateProviders: (providers: Provider[]) => dispatch(updateProviders(providers)) } } @@ -48,9 +48,9 @@ export function useProvider(id: string) { return { provider, models: provider.models, - updateProvider: (provider: Provider) => dispatch(_updateProvider(provider)), - addModel: (model: Model) => dispatch(_addModel({ providerId: id, model })), - removeModel: (model: Model) => dispatch(_removeModel({ providerId: id, model })) + updateProvider: (provider: Provider) => dispatch(updateProvider(provider)), + addModel: (model: Model) => dispatch(addModel({ providerId: id, model })), + removeModel: (model: Model) => dispatch(removeModel({ providerId: id, model })) } } diff --git a/src/renderer/src/pages/home/components/AssistantSettings.tsx b/src/renderer/src/pages/home/components/AssistantSettings.tsx index e100fc19..e899bfb7 100644 --- a/src/renderer/src/pages/home/components/AssistantSettings.tsx +++ b/src/renderer/src/pages/home/components/AssistantSettings.tsx @@ -1,6 +1,6 @@ import { QuestionCircleOutlined } from '@ant-design/icons' 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 { Button, Col, InputNumber, Popover, Row, Slider, Tooltip } from 'antd' import { debounce } from 'lodash' @@ -13,8 +13,7 @@ interface Props { } const PopoverContent: FC = (props) => { - const { assistant } = useAssistant(props.assistant.id) - const { updateAssistant } = useAssistants() + const { assistant, updateAssistantSettings, updateAssistant } = useAssistant(props.assistant.id) const [temperature, setTemperature] = useState(assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE) const [contextCount, setConextCount] = useState(assistant?.settings?.contextCount ?? DEFAULT_CONEXTCOUNT) const { t } = useTranslation() @@ -22,17 +21,17 @@ const PopoverContent: FC = (props) => { const onUpdateAssistantSettings = useCallback( debounce( ({ _temperature, _contextCount }: { _temperature?: number; _contextCount?: number }) => { - updateAssistant({ - ...assistant, - settings: { - ...assistant.settings, - temperature: _temperature ?? temperature, - contextCount: _contextCount ?? contextCount - } + updateAssistantSettings({ + ...assistant.settings, + temperature: _temperature ?? temperature, + contextCount: _contextCount ?? contextCount }) }, 1000, - { leading: false, trailing: true } + { + leading: false, + trailing: true + } ), [] ) diff --git a/src/renderer/src/pages/home/components/Assistants.tsx b/src/renderer/src/pages/home/components/Assistants.tsx index 35af3bdd..b0a44816 100644 --- a/src/renderer/src/pages/home/components/Assistants.tsx +++ b/src/renderer/src/pages/home/components/Assistants.tsx @@ -1,7 +1,7 @@ import { CopyOutlined, DeleteOutlined, EditOutlined } from '@ant-design/icons' import { DragDropContext, Draggable, Droppable, DropResult } from '@hello-pangea/dnd' 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 { Assistant } from '@renderer/types' import { droppableReorder, uuid } from '@renderer/utils' @@ -19,7 +19,8 @@ interface Props { } const Assistants: FC = ({ activeAssistant, setActiveAssistant, onCreateAssistant }) => { - const { assistants, removeAssistant, updateAssistant, addAssistant, updateAssistants } = useAssistants() + const { assistants, removeAssistant, addAssistant, updateAssistants } = useAssistants() + const { updateAssistant } = useAssistant(activeAssistant.id) const { t } = useTranslation() diff --git a/src/renderer/src/store/assistants.ts b/src/renderer/src/store/assistants.ts index c7d38850..229174cc 100644 --- a/src/renderer/src/store/assistants.ts +++ b/src/renderer/src/store/assistants.ts @@ -1,7 +1,7 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit' import { getDefaultAssistant, getDefaultTopic } from '@renderer/services/assistant' 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' export interface AssistantsState { @@ -33,6 +33,16 @@ const assistantsSlice = createSlice({ updateAssistant: (state, action: PayloadAction) => { 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 }>) => { state.assistants = state.assistants.map((assistant) => assistant.id === action.payload.assistantId @@ -111,7 +121,8 @@ export const { updateTopic, updateTopics, removeAllTopics, - setModel + setModel, + updateAssistantSettings } = assistantsSlice.actions export default assistantsSlice.reducer