From 52ac4455577edbab8cff87fb6f4ed14280a8029e Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Sat, 7 Sep 2024 18:24:38 +0800 Subject: [PATCH] fix: mobild sso login (#2636) * fix: mobild sso login * feat: max call tool times --- .../workflow/dispatch/agent/runTool/index.ts | 1 + .../dispatch/agent/runTool/toolChoice.ts | 26 +++++++++--- projects/app/src/pages/login/provider.tsx | 11 +++-- projects/app/src/pages/login/sso.tsx | 41 +++++++++++++++---- 4 files changed, 64 insertions(+), 15 deletions(-) diff --git a/packages/service/core/workflow/dispatch/agent/runTool/index.ts b/packages/service/core/workflow/dispatch/agent/runTool/index.ts index c7fea6411f9a..9e809601b242 100644 --- a/packages/service/core/workflow/dispatch/agent/runTool/index.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/index.ts @@ -134,6 +134,7 @@ export const dispatchRunTools = async (props: DispatchToolModuleProps): Promise< ...props, toolNodes, toolModel, + maxRunToolTimes: 30, messages: adaptMessages }); } diff --git a/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts b/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts index a4d16afe080e..e294dff4db73 100644 --- a/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts @@ -45,13 +45,12 @@ export const runToolWithToolChoice = async ( messages: ChatCompletionMessageParam[]; toolNodes: ToolNodeItemType[]; toolModel: LLMModelItemType; + maxRunToolTimes: number; }, response?: RunToolResponse ): Promise => { + const { messages, toolNodes, toolModel, maxRunToolTimes, ...workflowProps } = props; const { - toolModel, - toolNodes, - messages, res, requestOrigin, runtimeNodes, @@ -59,7 +58,12 @@ export const runToolWithToolChoice = async ( stream, workflowStreamResponse, params: { temperature = 0, maxToken = 4000, aiChatVision } - } = props; + } = workflowProps; + + if (maxRunToolTimes <= 0 && response) { + return response; + } + const assistantResponses = response?.assistantResponses || []; const tools: ChatCompletionTool[] = toolNodes.map((item) => { @@ -196,7 +200,7 @@ export const runToolWithToolChoice = async ( })(); const toolRunResponse = await dispatchWorkFlow({ - ...props, + ...workflowProps, isToolCall: true, runtimeNodes: runtimeNodes.map((item) => item.nodeId === toolNode.nodeId @@ -252,11 +256,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) @@ -314,6 +329,7 @@ export const runToolWithToolChoice = async ( return runToolWithToolChoice( { ...props, + maxRunToolTimes: maxRunToolTimes - 1, messages: completeMessages }, { 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 ; };