From 0e3676579deae86db3ed8787f164ffab5e61550c Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Tue, 16 Dec 2025 13:02:00 +0800 Subject: [PATCH] refresh plugins (#6099) * doc * refresh plugins * perf: loading in install * background index --- document/content/docs/upgrading/4-14/4144.mdx | 3 ++- document/data/doc-last-modified.json | 12 +++++------ .../src/pages/api/admin/initFeedbackFlags.ts | 8 ++++--- projects/app/src/pages/api/admin/initv4144.ts | 2 +- .../app/src/pages/config/tool/marketplace.tsx | 21 +++++++++++-------- 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/document/content/docs/upgrading/4-14/4144.mdx b/document/content/docs/upgrading/4-14/4144.mdx index 6cf014a0a..2b54baf11 100644 --- a/document/content/docs/upgrading/4-14/4144.mdx +++ b/document/content/docs/upgrading/4-14/4144.mdx @@ -20,7 +20,8 @@ curl --location --request POST 'https://{{host}}/api/admin/initv4144' \ --header 'Content-Type: application/json' ``` -将 4.14.3 中,遗留的 Dataset/local 接口上传的文件,也迁移到 S3 中。 +1. 将 4.14.3 中,遗留的 Dataset/local 接口上传的文件,也迁移到 S3 中。 +2. 全量计算旧的 chat 中的反馈,增加 flags 值便于筛选。该函数执行较慢,所以放到异步执行,接口不会返回结果,请关注日志中是否打印:Migration feedback completed! ## 🚀 新增内容 diff --git a/document/data/doc-last-modified.json b/document/data/doc-last-modified.json index e2dc23886..c48fd7d0b 100644 --- a/document/data/doc-last-modified.json +++ b/document/data/doc-last-modified.json @@ -97,10 +97,10 @@ "document/content/docs/protocol/index.mdx": "2025-07-30T15:38:30+08:00", "document/content/docs/protocol/open-source.en.mdx": "2025-08-05T23:20:39+08:00", "document/content/docs/protocol/open-source.mdx": "2025-08-05T23:20:39+08:00", - "document/content/docs/protocol/privacy.en.mdx": "2025-12-12T21:30:11+08:00", - "document/content/docs/protocol/privacy.mdx": "2025-12-12T21:30:11+08:00", - "document/content/docs/protocol/terms.en.mdx": "2025-12-12T21:30:11+08:00", - "document/content/docs/protocol/terms.mdx": "2025-12-12T21:30:11+08:00", + "document/content/docs/protocol/privacy.en.mdx": "2025-12-15T23:36:54+08:00", + "document/content/docs/protocol/privacy.mdx": "2025-12-15T23:36:54+08:00", + "document/content/docs/protocol/terms.en.mdx": "2025-12-15T23:36:54+08:00", + "document/content/docs/protocol/terms.mdx": "2025-12-15T23:36:54+08:00", "document/content/docs/toc.en.mdx": "2025-08-04T13:42:36+08:00", "document/content/docs/toc.mdx": "2025-12-09T23:33:32+08:00", "document/content/docs/upgrading/4-10/4100.mdx": "2025-08-02T19:38:37+08:00", @@ -114,12 +114,12 @@ "document/content/docs/upgrading/4-12/4124.mdx": "2025-09-17T22:29:56+08:00", "document/content/docs/upgrading/4-13/4130.mdx": "2025-11-04T15:06:39+08:00", "document/content/docs/upgrading/4-13/4131.mdx": "2025-09-30T15:47:06+08:00", - "document/content/docs/upgrading/4-13/4132.mdx": "2025-10-21T11:46:53+08:00", + "document/content/docs/upgrading/4-13/4132.mdx": "2025-12-15T11:50:00+08:00", "document/content/docs/upgrading/4-14/4140.mdx": "2025-11-06T15:43:00+08:00", "document/content/docs/upgrading/4-14/4141.mdx": "2025-11-19T10:15:27+08:00", "document/content/docs/upgrading/4-14/4142.mdx": "2025-11-18T19:27:14+08:00", "document/content/docs/upgrading/4-14/4143.mdx": "2025-11-26T20:52:05+08:00", - "document/content/docs/upgrading/4-14/4144.mdx": "2025-12-15T15:09:13+08:00", + "document/content/docs/upgrading/4-14/4144.mdx": "2025-12-15T23:36:54+08:00", "document/content/docs/upgrading/4-8/40.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/upgrading/4-8/41.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/upgrading/4-8/42.mdx": "2025-08-02T19:38:37+08:00", diff --git a/projects/app/src/pages/api/admin/initFeedbackFlags.ts b/projects/app/src/pages/api/admin/initFeedbackFlags.ts index 6e3d513c2..f51da4792 100644 --- a/projects/app/src/pages/api/admin/initFeedbackFlags.ts +++ b/projects/app/src/pages/api/admin/initFeedbackFlags.ts @@ -36,12 +36,14 @@ async function createTemporaryIndexes(): Promise { { userGoodFeedback: 1, teamId: 1, appId: 1, chatId: 1 }, { name: 'temp_feedback_migration_good', - partialFilterExpression: { userGoodFeedback: { $exists: true } } + partialFilterExpression: { userGoodFeedback: { $exists: true } }, + background: true } as any ), MongoChatItem.collection.createIndex({ userBadFeedback: 1, teamId: 1, appId: 1, chatId: 1 }, { name: 'temp_feedback_migration_bad', - partialFilterExpression: { userBadFeedback: { $exists: true } } + partialFilterExpression: { userBadFeedback: { $exists: true } }, + background: true } as any) ]); @@ -203,7 +205,7 @@ export async function migrateFeedbackFlags() { const durationMinutes = (duration / 1000 / 60).toFixed(2); addLog.info('========================================'); - addLog.info('Migration completed!'); + addLog.info('Migration feedback completed!'); addLog.info(`Total: ${chats.length.toLocaleString()}`); addLog.info(`Succeeded: ${succeeded.toLocaleString()}`); addLog.info(`Failed: ${failed.toLocaleString()}`); diff --git a/projects/app/src/pages/api/admin/initv4144.ts b/projects/app/src/pages/api/admin/initv4144.ts index 455e8e0d1..3080be4ce 100644 --- a/projects/app/src/pages/api/admin/initv4144.ts +++ b/projects/app/src/pages/api/admin/initv4144.ts @@ -979,7 +979,7 @@ async function handler(req: NextApiRequest, _res: NextApiResponse) { addLog.info(`[Migration ${batchId}] =======================================`); // 重新统计每一个 chat 的反馈情况 - await migrateFeedbackFlags(); + migrateFeedbackFlags(); return { batchId, diff --git a/projects/app/src/pages/config/tool/marketplace.tsx b/projects/app/src/pages/config/tool/marketplace.tsx index 70829b491..df6c285d5 100644 --- a/projects/app/src/pages/config/tool/marketplace.tsx +++ b/projects/app/src/pages/config/tool/marketplace.tsx @@ -8,7 +8,7 @@ import MyIcon from '@fastgpt/web/components/common/Icon'; import MyBox from '@fastgpt/web/components/common/MyBox'; import MyIconButton from '@fastgpt/web/components/common/Icon/button'; import MyMenu from '@fastgpt/web/components/common/MyMenu'; -import { useState, useMemo, useRef, useEffect, useCallback, useReducer } from 'react'; +import { useState, useMemo, useRef, useEffect, useCallback } from 'react'; import { useDebounce, useMount, useSet } from 'ahooks'; import ToolCard, { type ToolCardItemType } from '@fastgpt/web/components/core/plugin/tool/ToolCard'; import ToolTagFilterBox from '@fastgpt/web/components/core/plugin/tool/TagFilterBox'; @@ -153,18 +153,20 @@ const ToolkitMarketplace = ({ marketplaceUrl }: { marketplaceUrl: string }) => { // Controler const { runAsync: handleInstallTool } = useRequest2( async (tool: ToolCardItemType) => { - const downloadUrl = await getMarketplaceDownloadURL(tool.id); - if (!downloadUrl) return; - const existingPromise = operatingPromisesRef.current.get(tool.id); if (existingPromise) { await existingPromise; return; } - const operationPromise = (async () => { - installingOrDeletingToolIdsDispatch.add(tool.id); + installingOrDeletingToolIdsDispatch.add(tool.id); + const downloadUrl = await getMarketplaceDownloadURL(tool.id); + if (!downloadUrl) { + installingOrDeletingToolIdsDispatch.remove(tool.id); + return; + } + const operationPromise = (async () => { try { await intallPluginWithUrl({ downloadUrls: [downloadUrl] @@ -173,10 +175,10 @@ const ToolkitMarketplace = ({ marketplaceUrl }: { marketplaceUrl: string }) => { if (selectedTool?.id === tool.id) { setSelectedTool((prev) => (prev ? { ...prev, status: 3 } : null)); } + await refreshInstalledPlugins(); } finally { installingOrDeletingToolIdsDispatch.remove(tool.id); operatingPromisesRef.current.delete(tool.id); - await refreshInstalledPlugins(); } })(); operatingPromisesRef.current.set(tool.id, operationPromise); @@ -213,10 +215,10 @@ const ToolkitMarketplace = ({ marketplaceUrl }: { marketplaceUrl: string }) => { if (selectedTool?.id === tool.id) { setSelectedTool((prev) => (prev ? { ...prev, status: 3 } : null)); } + await refreshInstalledPlugins(); } finally { updatingToolIdsDispatch.remove(tool.id); operatingPromisesRef.current.delete(tool.id); - await refreshInstalledPlugins(); } })(); @@ -243,10 +245,10 @@ const ToolkitMarketplace = ({ marketplaceUrl }: { marketplaceUrl: string }) => { if (selectedTool?.id === tool.id) { setSelectedTool((prev) => (prev ? { ...prev, status: 1 } : null)); } + await refreshInstalledPlugins(); } finally { installingOrDeletingToolIdsDispatch.remove(tool.id); operatingPromisesRef.current.delete(tool.id); - await refreshInstalledPlugins(); } })(); operatingPromisesRef.current.set(tool.id, operationPromise); @@ -374,6 +376,7 @@ const ToolkitMarketplace = ({ marketplaceUrl }: { marketplaceUrl: string }) => { onClick={() => router.push('/config/tool')} position={'absolute'} top={4} + zIndex={1000} {...(showCompactSearch ? { right: 4 } : { left: 4 })} /> {!showCompactSearch && (