diff --git a/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts b/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts index a4d16afe080e..12645b328414 100644 --- a/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts @@ -252,11 +252,22 @@ export const runToolWithToolChoice = async ( role: ChatCompletionRequestMessageRoleEnum.Assistant, tool_calls: toolCalls }; + /* + ... + user + assistant: tool data + */ const concatToolMessages = [ ...requestMessages, assistantToolMsgParams ] as ChatCompletionMessageParam[]; const tokens = await countGptMessagesTokens(concatToolMessages, tools); + /* + ... + user + assistant: tool data + tool: tool response + */ const completeMessages = [ ...concatToolMessages, ...toolsRunResponse.map((item) => item?.toolMsgParams) diff --git a/projects/app/src/pages/login/provider.tsx b/projects/app/src/pages/login/provider.tsx index 20871c9c784f..a43039fa46f0 100644 --- a/projects/app/src/pages/login/provider.tsx +++ b/projects/app/src/pages/login/provider.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect } from 'react'; +import React, { useCallback, useEffect, useRef } from 'react'; import { useRouter } from 'next/router'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import type { ResLogin } from '@/global/support/api/userRes.d'; @@ -20,6 +20,7 @@ const provider = () => { const router = useRouter(); const { code, state, error } = router.query as { code: string; state: string; error?: string }; const { toast } = useToast(); + const loading = useRef(false); const loginSuccess = useCallback( (res: ResLogin) => { @@ -41,6 +42,10 @@ const provider = () => { const authCode = useCallback( async (code: string) => { + if (loading.current) return; + + loading.current = true; + if (!loginStore) { router.replace('/login'); return; @@ -73,7 +78,7 @@ const provider = () => { }, 1000); } }, - [loginStore, loginSuccess, router, toast] + [loginStore, loginSuccess, router, t, toast] ); useEffect(() => { @@ -103,7 +108,7 @@ const provider = () => { } else { authCode(code); } - }, []); + }, [authCode, code, error, loginStore, router, state, t, toast]); return ; }; diff --git a/projects/app/src/pages/login/sso.tsx b/projects/app/src/pages/login/sso.tsx index 3107b514dbea..099fa672f962 100644 --- a/projects/app/src/pages/login/sso.tsx +++ b/projects/app/src/pages/login/sso.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useMemo } from 'react'; +import React, { useCallback, useEffect, useMemo, useRef } from 'react'; import { useRouter } from 'next/router'; import type { ResLogin } from '@/global/support/api/userRes.d'; import { useChatStore } from '@/web/core/chat/context/storeChat'; @@ -7,8 +7,9 @@ import { clearToken, setToken } from '@/web/support/user/auth'; import { ssoLogin } from '@/web/support/user/api'; import Loading from '@fastgpt/web/components/common/MyLoading'; import { useTranslation } from 'next-i18next'; -import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { serviceSideProps } from '@/web/common/utils/i18n'; +import { useToast } from '@fastgpt/web/hooks/useToast'; +import { getErrText } from '@fastgpt/global/common/error/utils'; const provider = () => { const { t } = useTranslation(); @@ -16,6 +17,8 @@ const provider = () => { const { setUserInfo } = useUserStore(); const router = useRouter(); const { query } = router; + const loading = useRef(false); + const { toast } = useToast(); const loginSuccess = useCallback( (res: ResLogin) => { @@ -30,17 +33,41 @@ const provider = () => { [setLastChatId, setLastChatAppId, setUserInfo, router] ); - const { run: handleSSO } = useRequest2(() => ssoLogin(query), { - onSuccess: loginSuccess, - errorToast: t('common:support.user.login.error') - }); + const handleSSO = useCallback(async () => { + if (loading.current) return; + loading.current = true; + + try { + const res = await ssoLogin(query); + + if (!res) { + toast({ + status: 'warning', + title: t('common:support.user.login.error') + }); + return setTimeout(() => { + router.replace('/login'); + }, 1000); + } + + loginSuccess(res); + } catch (error) { + toast({ + status: 'warning', + title: getErrText(error, t('common:support.user.login.error')) + }); + setTimeout(() => { + router.replace('/login'); + }, 1000); + } + }, [loginSuccess, query, router, t, toast]); useEffect(() => { if (query && Object.keys(query).length > 0) { clearToken(); handleSSO(); } - }, []); + }, [handleSSO, query]); return ; };