From fe9bc16842b45e8578d9cef298bf8613a852dc26 Mon Sep 17 00:00:00 2001 From: Arvin Xu Date: Mon, 17 Feb 2025 17:24:20 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix:=20fix=20agent=20config=20no?= =?UTF-8?q?t=20load=20correctly=20(#6252)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix agent config issue * improve loading for agent * revert chat change --- .../features/ChatInput/Mobile/index.tsx | 2 +- .../features/SystemRole/SystemRoleContent.tsx | 11 +++++---- .../_layout/Desktop/ChatHeader/Main.tsx | 2 +- .../_layout/Desktop/ChatHeader/Tags.tsx | 6 ++++- .../features/AgentSettings/index.tsx | 24 ++++++++++--------- .../[variants]/(main)/chat/settings/page.tsx | 10 ++++---- .../AgentSetting/AgentPrompt/index.tsx | 20 ++++++++++++++++ .../AgentSetting/store/initialState.ts | 1 + .../_layout => hooks}/useInitAgentConfig.ts | 8 ++++++- src/services/message/client.test.ts | 4 +--- src/services/session/server.ts | 6 ----- src/store/agent/slices/chat/action.test.ts | 4 ++-- src/store/agent/slices/chat/action.ts | 16 +++++++++---- src/store/agent/slices/chat/initialState.ts | 2 ++ src/store/agent/slices/chat/selectors.ts | 3 +++ 15 files changed, 80 insertions(+), 39 deletions(-) rename src/{app/[variants]/(main)/chat/(workspace)/_layout => hooks}/useInitAgentConfig.ts (50%) diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/index.tsx index 51162e82de6d5..eb9d1790a4bc9 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/index.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/index.tsx @@ -11,10 +11,10 @@ import { ActionKeys } from '@/features/ChatInput/ActionBar/config'; import STT from '@/features/ChatInput/STT'; import SaveTopic from '@/features/ChatInput/Topic'; import { useSendMessage } from '@/features/ChatInput/useSend'; +import { useInitAgentConfig } from '@/hooks/useInitAgentConfig'; import { useChatStore } from '@/store/chat'; import { chatSelectors } from '@/store/chat/selectors'; -import { useInitAgentConfig } from '../../../../_layout/useInitAgentConfig'; import Files from './Files'; import InputArea from './InputArea'; import SendButton from './Send'; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/SystemRoleContent.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/SystemRoleContent.tsx index 471993bd9c2b6..22b0a0bc196a7 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/SystemRoleContent.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/SystemRoleContent.tsx @@ -31,7 +31,8 @@ const SystemRole = memo(() => { sessionMetaSelectors.currentAgentMeta(s), ]); - const [systemRole, updateAgentConfig] = useAgentStore((s) => [ + const [isAgentConfigLoading, systemRole, updateAgentConfig] = useAgentStore((s) => [ + agentSelectors.isAgentConfigLoading(s), agentSelectors.currentAgentSystemRole(s), s.updateAgentConfig, ]); @@ -49,14 +50,16 @@ const SystemRole = memo(() => { const { t } = useTranslation('common'); + const isLoading = !init || isAgentConfigLoading; + const handleOpenWithEdit = () => { - if (!init) return; + if (isLoading) return; setEditing(true); setOpen(true); }; const handleOpen = () => { - if (!init) return; + if (isLoading) return; setOpen(true); }; @@ -77,7 +80,7 @@ const SystemRole = memo(() => { if (e.altKey) handleOpenWithEdit(); }} > - {!init ? ( + {isLoading ? ( { diff --git a/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags.tsx b/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags.tsx index 05de7c062cee6..d17e0291f725f 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags.tsx @@ -1,4 +1,5 @@ import { ModelTag } from '@lobehub/icons'; +import { Skeleton } from 'antd'; import isEqual from 'fast-deep-equal'; import { memo } from 'react'; import { Flexbox } from 'react-layout-kit'; @@ -21,8 +22,11 @@ const TitleTags = memo(() => { const enabledKnowledge = useAgentStore(agentSelectors.currentEnabledKnowledge, isEqual); const showPlugin = useModelSupportToolUse(model, provider); + const isLoading = useAgentStore(agentSelectors.isAgentConfigLoading); - return ( + return isLoading ? ( + + ) : ( diff --git a/src/app/[variants]/(main)/chat/(workspace)/features/AgentSettings/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/features/AgentSettings/index.tsx index c9dc9a43ccd74..947d7c1ff042f 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/features/AgentSettings/index.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/features/AgentSettings/index.tsx @@ -14,10 +14,10 @@ import AgentMeta from '@/features/AgentSetting/AgentMeta'; import AgentModal from '@/features/AgentSetting/AgentModal'; import AgentPlugin from '@/features/AgentSetting/AgentPlugin'; import AgentPrompt from '@/features/AgentSetting/AgentPrompt'; +import { AgentSettingsProvider } from '@/features/AgentSetting/AgentSettingsProvider'; import AgentTTS from '@/features/AgentSetting/AgentTTS'; -import StoreUpdater from '@/features/AgentSetting/StoreUpdater'; -import { Provider, createStore } from '@/features/AgentSetting/store'; import Footer from '@/features/Setting/Footer'; +import { useInitAgentConfig } from '@/hooks/useInitAgentConfig'; import { useAgentStore } from '@/store/agent'; import { agentSelectors } from '@/store/agent/slices/chat'; import { ChatSettingsTabs } from '@/store/global/initialState'; @@ -31,6 +31,8 @@ const AgentSettings = memo(() => { const id = useSessionStore((s) => s.activeId); const config = useAgentStore(agentSelectors.currentAgentConfig, isEqual); const meta = useSessionStore(sessionMetaSelectors.currentAgentMeta, isEqual); + + const { isLoading } = useInitAgentConfig(); const [showAgentSetting, updateAgentConfig] = useAgentStore((s) => [ s.showAgentSetting, s.updateAgentConfig, @@ -49,14 +51,14 @@ const AgentSettings = memo(() => { const category = ; return ( - - + { @@ -109,7 +111,7 @@ const AgentSettings = memo(() => { - + ); }); diff --git a/src/app/[variants]/(main)/chat/settings/page.tsx b/src/app/[variants]/(main)/chat/settings/page.tsx index 737e8013f9242..9ca13d250737b 100644 --- a/src/app/[variants]/(main)/chat/settings/page.tsx +++ b/src/app/[variants]/(main)/chat/settings/page.tsx @@ -14,6 +14,7 @@ import AgentModal from '@/features/AgentSetting/AgentModal'; import AgentPlugin from '@/features/AgentSetting/AgentPlugin'; import AgentPrompt from '@/features/AgentSetting/AgentPrompt'; import AgentTTS from '@/features/AgentSetting/AgentTTS'; +import { useInitAgentConfig } from '@/hooks/useInitAgentConfig'; import { useAgentStore } from '@/store/agent'; import { agentSelectors } from '@/store/agent/selectors'; import { ChatSettingsTabs } from '@/store/global/initialState'; @@ -30,15 +31,14 @@ const EditPage = memo(() => { s.updateSessionMeta, sessionMetaSelectors.currentAgentTitle(s), ]); - const [useFetchAgentConfig, updateAgentConfig] = useAgentStore((s) => [ - s.useFetchAgentConfig, - s.updateAgentConfig, - ]); + + const [updateAgentConfig] = useAgentStore((s) => [s.updateAgentConfig]); const config = useAgentStore(agentSelectors.currentAgentConfig, isEqual); const meta = useSessionStore(sessionMetaSelectors.currentAgentMeta, isEqual); - const { isLoading } = useFetchAgentConfig(id); + const { isLoading } = useInitAgentConfig(); + const { enablePlugins } = useServerConfigStore(featureFlagsSelectors); return ( diff --git a/src/features/AgentSetting/AgentPrompt/index.tsx b/src/features/AgentSetting/AgentPrompt/index.tsx index 6beb87da6807b..4dbaf47ef5366 100644 --- a/src/features/AgentSetting/AgentPrompt/index.tsx +++ b/src/features/AgentSetting/AgentPrompt/index.tsx @@ -47,6 +47,26 @@ const AgentPrompt = memo<{ modal?: boolean }>(({ modal }) => { ]); if (loading) { + if (modal) + return ( +
+
+ + + ), + title: t('settingAgent.prompt.title'), + }, + ]} + itemsType={'group'} + variant={'pure'} + {...FORM_STYLE} + /> + ); + return (
diff --git a/src/features/AgentSetting/store/initialState.ts b/src/features/AgentSetting/store/initialState.ts index a3c4f11af1bcc..3eebf78cc6b09 100644 --- a/src/features/AgentSetting/store/initialState.ts +++ b/src/features/AgentSetting/store/initialState.ts @@ -25,5 +25,6 @@ export const initialState: State = { title: false, }, config: DEFAULT_AGENT_CONFIG, + loading: true, meta: DEFAULT_AGENT_META, }; diff --git a/src/app/[variants]/(main)/chat/(workspace)/_layout/useInitAgentConfig.ts b/src/hooks/useInitAgentConfig.ts similarity index 50% rename from src/app/[variants]/(main)/chat/(workspace)/_layout/useInitAgentConfig.ts rename to src/hooks/useInitAgentConfig.ts index 82b09953e3ae7..84d21aaa15849 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/_layout/useInitAgentConfig.ts +++ b/src/hooks/useInitAgentConfig.ts @@ -1,10 +1,16 @@ import { useAgentStore } from '@/store/agent'; import { useSessionStore } from '@/store/session'; +import { useUserStore } from '@/store/user'; +import { authSelectors } from '@/store/user/selectors'; export const useInitAgentConfig = () => { const [useFetchAgentConfig] = useAgentStore((s) => [s.useFetchAgentConfig]); + const isLogin = useUserStore(authSelectors.isLogin); + const [sessionId] = useSessionStore((s) => [s.activeId]); - return useFetchAgentConfig(sessionId); + const data = useFetchAgentConfig(isLogin, sessionId); + + return { ...data, isLoading: data.isLoading && isLogin }; }; diff --git a/src/services/message/client.test.ts b/src/services/message/client.test.ts index 21a66dcdfce18..773b3df7dd41c 100644 --- a/src/services/message/client.test.ts +++ b/src/services/message/client.test.ts @@ -1,8 +1,6 @@ -import dayjs from 'dayjs'; import { and, eq } from 'drizzle-orm'; -import { Mock, afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { MessageModel } from '@/database/_deprecated/models/message'; import { clientDB, initializeDB } from '@/database/client/db'; import { files, diff --git a/src/services/session/server.ts b/src/services/session/server.ts index cf69765ef3ee0..82659369e42fd 100644 --- a/src/services/session/server.ts +++ b/src/services/session/server.ts @@ -1,8 +1,5 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { DEFAULT_AGENT_CONFIG } from '@/const/settings'; import { lambdaClient } from '@/libs/trpc/client'; -import { useUserStore } from '@/store/user'; -import { authSelectors } from '@/store/user/selectors'; import { ISessionService } from './type'; @@ -55,9 +52,6 @@ export class ServerService implements ISessionService { // TODO: Need to be fixed // @ts-ignore getSessionConfig: ISessionService['getSessionConfig'] = async (id) => { - const isLogin = authSelectors.isLogin(useUserStore.getState()); - if (!isLogin) return DEFAULT_AGENT_CONFIG; - return lambdaClient.agent.getAgentConfig.query({ sessionId: id }); }; diff --git a/src/store/agent/slices/chat/action.test.ts b/src/store/agent/slices/chat/action.test.ts index 3e3b8259ac477..a7700bee292c5 100644 --- a/src/store/agent/slices/chat/action.test.ts +++ b/src/store/agent/slices/chat/action.test.ts @@ -175,7 +175,7 @@ describe('AgentSlice', () => { vi.spyOn(sessionService, 'getSessionConfig').mockResolvedValueOnce({ model: 'gpt-4' } as any); - renderHook(() => result.current.useFetchAgentConfig('test-session-id')); + renderHook(() => result.current.useFetchAgentConfig(true, 'test-session-id')); await waitFor(() => { expect(result.current.agentMap['test-session-id']).toEqual({ model: 'gpt-4' }); @@ -199,7 +199,7 @@ describe('AgentSlice', () => { model: 'gpt-3.5-turbo', } as any); - renderHook(() => result.current.useFetchAgentConfig('test-session-id')); + renderHook(() => result.current.useFetchAgentConfig(true, 'test-session-id')); await waitFor(() => { expect(result.current.agentMap['test-session-id']).toEqual({ model: 'gpt-3.5-turbo' }); diff --git a/src/store/agent/slices/chat/action.ts b/src/store/agent/slices/chat/action.ts index 1a4a5b2f48ff1..d11e220c77522 100644 --- a/src/store/agent/slices/chat/action.ts +++ b/src/store/agent/slices/chat/action.ts @@ -48,7 +48,7 @@ export interface AgentChatAction { togglePlugin: (id: string, open?: boolean) => Promise; updateAgentChatConfig: (config: Partial) => Promise; updateAgentConfig: (config: DeepPartial) => Promise; - useFetchAgentConfig: (id: string) => SWRResponse; + useFetchAgentConfig: (isLogin: boolean | undefined, id: string) => SWRResponse; useFetchFilesAndKnowledgeBases: () => SWRResponse; useInitInboxAgentStore: ( isLogin: boolean | undefined, @@ -158,14 +158,22 @@ export const createChatSlice: StateCreator< await get().internal_updateAgentConfig(activeId, config, controller.signal); }, - useFetchAgentConfig: (sessionId) => + useFetchAgentConfig: (isLogin, sessionId) => useClientDataSWR( - [FETCH_AGENT_CONFIG_KEY, sessionId], + isLogin ? [FETCH_AGENT_CONFIG_KEY, sessionId] : null, ([, id]: string[]) => sessionService.getSessionConfig(id), { onSuccess: (data) => { get().internal_dispatchAgentMap(sessionId, data, 'fetch'); - set({ activeAgentId: data.id }, false, 'updateActiveAgentId'); + + set( + { + activeAgentId: data.id, + agentConfigInitMap: { ...get().agentConfigInitMap, [sessionId]: true }, + }, + false, + 'fetchAgentConfig', + ); }, }, ), diff --git a/src/store/agent/slices/chat/initialState.ts b/src/store/agent/slices/chat/initialState.ts index ed1591782135c..419b513cc963f 100644 --- a/src/store/agent/slices/chat/initialState.ts +++ b/src/store/agent/slices/chat/initialState.ts @@ -7,6 +7,7 @@ import { LobeAgentConfig } from '@/types/agent'; export interface AgentState { activeAgentId?: string; activeId: string; + agentConfigInitMap: Record; agentMap: Record>; agentSettingInstance?: AgentSettingsInstance | null; defaultAgentConfig: LobeAgentConfig; @@ -18,6 +19,7 @@ export interface AgentState { export const initialAgentChatState: AgentState = { activeId: 'inbox', + agentConfigInitMap: {}, agentMap: {}, defaultAgentConfig: DEFAULT_AGENT_CONFIG, isInboxAgentConfigInit: false, diff --git a/src/store/agent/slices/chat/selectors.ts b/src/store/agent/slices/chat/selectors.ts index df657e66bfe31..49d33c4bb3b95 100644 --- a/src/store/agent/slices/chat/selectors.ts +++ b/src/store/agent/slices/chat/selectors.ts @@ -138,6 +138,8 @@ const currentKnowledgeIds = (s: AgentStore) => { }; }; +const isAgentConfigLoading = (s: AgentStore) => !s.agentConfigInitMap[s.activeId]; + export const agentSelectors = { currentAgentChatConfig, currentAgentConfig, @@ -157,5 +159,6 @@ export const agentSelectors = { hasSystemRole, inboxAgentConfig, inboxAgentModel, + isAgentConfigLoading, isInboxSession, };