From 1210c07217ab4509d54b3eb57067dd94ff8b0da6 Mon Sep 17 00:00:00 2001 From: heheer Date: Tue, 9 Dec 2025 17:52:55 +0800 Subject: [PATCH] api entry qpm --- packages/service/common/api/frequencyLimit.ts | 2 +- .../common/middle/reqFrequencyLimit.ts | 33 +++++++++++++++++++ .../app/src/pages/api/core/chat/chatTest.ts | 10 ------ .../app/src/pages/api/v1/chat/completions.ts | 10 ------ .../app/src/pages/api/v2/chat/completions.ts | 10 ------ projects/app/src/service/middleware/entry.ts | 5 ++- 6 files changed, 38 insertions(+), 32 deletions(-) diff --git a/packages/service/common/api/frequencyLimit.ts b/packages/service/common/api/frequencyLimit.ts index 60fdb1528..2ecfa2799 100644 --- a/packages/service/common/api/frequencyLimit.ts +++ b/packages/service/common/api/frequencyLimit.ts @@ -46,7 +46,7 @@ export const getTeamQPMLimit = async (teamId: string): Promise => { export const teamFrequencyLimit = async ({ teamId, type, res }: FrequencyLimitOption) => { const limit = await getTeamQPMLimit(teamId); - const seconds = limitSecondsMap[type]; + const seconds = limitSecondsMap[type] ?? 60; const redis = getGlobalRedisConnection(); const key = `frequency:${type}:${teamId}`; diff --git a/packages/service/common/middle/reqFrequencyLimit.ts b/packages/service/common/middle/reqFrequencyLimit.ts index 7912825bc..a078d686a 100644 --- a/packages/service/common/middle/reqFrequencyLimit.ts +++ b/packages/service/common/middle/reqFrequencyLimit.ts @@ -4,6 +4,8 @@ import { authFrequencyLimit } from '../system/frequencyLimit/utils'; import { addSeconds } from 'date-fns'; import { type NextApiResponse } from 'next'; import { jsonRes } from '../response'; +import { authCert } from '../../support/permission/auth/common'; +import { teamFrequencyLimit } from '../api/frequencyLimit'; // unit: times/s // how to use? @@ -38,3 +40,34 @@ export function useIPFrequencyLimit({ } }; } + +export function useTeamFrequencyLimit({ + paths = ['/api/v', '/api/core/', '/api/support/'] +}: { + paths?: string[]; +} = {}) { + return async (req: ApiRequestProps, res: NextApiResponse) => { + const isTargetPath = paths.some((path) => req.url?.startsWith(path)); + if (!isTargetPath) { + return; + } + + try { + const { teamId } = await authCert({ + req, + authToken: true, + authApiKey: true + }); + + if (teamId) { + await teamFrequencyLimit({ + teamId, + type: req.url as any, + res + }); + } + } catch (error) { + return; + } + }; +} diff --git a/projects/app/src/pages/api/core/chat/chatTest.ts b/projects/app/src/pages/api/core/chat/chatTest.ts index 4d992f2ad..1ba395786 100644 --- a/projects/app/src/pages/api/core/chat/chatTest.ts +++ b/projects/app/src/pages/api/core/chat/chatTest.ts @@ -98,16 +98,6 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { per: ReadPermissionVal }); - if ( - !(await teamFrequencyLimit({ - teamId, - type: LimitTypeEnum.chat, - res - })) - ) { - return; - } - pushTrack.teamChatQPM({ teamId }); const isPlugin = app.type === AppTypeEnum.workflowTool; diff --git a/projects/app/src/pages/api/v1/chat/completions.ts b/projects/app/src/pages/api/v1/chat/completions.ts index ce9cbc0e8..5a0407f44 100644 --- a/projects/app/src/pages/api/v1/chat/completions.ts +++ b/projects/app/src/pages/api/v1/chat/completions.ts @@ -189,16 +189,6 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { }); })(); - if ( - !(await teamFrequencyLimit({ - teamId, - type: LimitTypeEnum.chat, - res - })) - ) { - return; - } - pushTrack.teamChatQPM({ teamId }); retainDatasetCite = retainDatasetCite && !!responseDetail; diff --git a/projects/app/src/pages/api/v2/chat/completions.ts b/projects/app/src/pages/api/v2/chat/completions.ts index 155fe4f29..d3bcdf9b5 100644 --- a/projects/app/src/pages/api/v2/chat/completions.ts +++ b/projects/app/src/pages/api/v2/chat/completions.ts @@ -190,16 +190,6 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { }); })(); - if ( - !(await teamFrequencyLimit({ - teamId, - type: LimitTypeEnum.chat, - res - })) - ) { - return; - } - pushTrack.teamChatQPM({ teamId }); retainDatasetCite = retainDatasetCite && !!responseDetail; diff --git a/projects/app/src/service/middleware/entry.ts b/projects/app/src/service/middleware/entry.ts index d15af6561..9fd29604d 100644 --- a/projects/app/src/service/middleware/entry.ts +++ b/projects/app/src/service/middleware/entry.ts @@ -1,3 +1,6 @@ import { NextEntry } from '@fastgpt/service/common/middle/entry'; +import { useTeamFrequencyLimit } from '@fastgpt/service/common/middle/reqFrequencyLimit'; -export const NextAPI = NextEntry({ beforeCallback: [] }); +export const NextAPI = NextEntry({ + beforeCallback: [useTeamFrequencyLimit()] +});