From 76dc23c2e4795b8134453e1f63362bc613eca8b6 Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Fri, 15 Aug 2025 15:01:20 +0800 Subject: [PATCH] perF: getInitData api cache;perf: tool description field;signoz store level (#5465) * perf: auto focus * perF: getInitData api cache * perf: tool description field * signoz store level * perF: chat logs index --- .../design/service/common/cache/version.md | 23 +++++++++++++++++++ document/components/docs/not-found.tsx | 2 +- document/content/docs/upgrading/4-12/4121.mdx | 3 +++ document/data/doc-last-modified.json | 2 +- packages/service/common/system/log.ts | 8 ++++--- packages/service/core/ai/config/utils.ts | 11 +++++++++ packages/service/core/ai/type.d.ts | 1 + .../service/core/app/plugin/controller.ts | 23 +------------------ packages/service/core/app/utils.ts | 1 + packages/web/i18n/en/app.json | 2 +- packages/web/i18n/zh-CN/app.json | 2 +- packages/web/i18n/zh-Hant/app.json | 2 +- projects/app/.env.template | 1 + .../PromptEditor/OptimizerPopover/index.tsx | 16 +++++++++---- .../WorkflowComponents/Flow/ChatTest.tsx | 2 +- .../app/detail/WorkflowComponents/utils.ts | 1 + .../pages/api/common/system/getInitData.ts | 17 ++------------ .../src/pages/api/core/app/exportChatLogs.ts | 21 ++++++++++++++++- .../app/src/pages/api/core/app/getChatLogs.ts | 23 ++++--------------- projects/app/src/web/core/app/utils.ts | 1 + 20 files changed, 91 insertions(+), 71 deletions(-) create mode 100644 .claude/design/service/common/cache/version.md diff --git a/.claude/design/service/common/cache/version.md b/.claude/design/service/common/cache/version.md new file mode 100644 index 000000000..2aa142dc0 --- /dev/null +++ b/.claude/design/service/common/cache/version.md @@ -0,0 +1,23 @@ +# 服务端资源版本 ID 缓存方案 + +## 背景 + +FastGPT 会采用多节点部署方式,有部分数据缓存会存储在内存里。当需要使用这部分数据时(不管是通过 API 获取,还是后端服务自己获取),都是直接拉取内存数据,这可能会导致数据不一致问题,尤其是用户通过 API 更新数据后再获取,就容易获取未修改数据的节点。 + +## 解决方案 + +1. 给每一个缓存数据加上一个版本 ID。 +2. 获取该数据时候,不直接引用该数据,而是通过一个 function 获取,该 function 可选的传入一个 versionId。 +3. 获取数据时,先检查该 versionId 与 redis 中,资源版本id 与传入的 versionId 是否一致。 +4. 如果数据一致,则直接返回数据。 +5. 如果数据不一致,则重新获取数据,并返回最新的 versionId。调用方则需要更新其缓存的 versionId。 + +## 代码方案 + +* 获取和更新缓存的代码,直接复用 FastGPT/packages/service/common/redis/cache.ts +* 每个资源,自己维护一个 cacheKey +* 每次更新资源/触发拉取最新资源时,都需要更新 cacheKey 的值。 + +## 涉及的业务 + +* [ ] FastGPT/projects/app/src/pages/api/common/system/getInitData.ts,获取初始数据 \ No newline at end of file diff --git a/document/components/docs/not-found.tsx b/document/components/docs/not-found.tsx index 517d1acdb..fbf8f1a3c 100644 --- a/document/components/docs/not-found.tsx +++ b/document/components/docs/not-found.tsx @@ -10,7 +10,7 @@ const exactMap: Record = { '/docs/guide/admin/sso_dingtalk': '/docs/introduction/guide/admin/sso#/docs/introduction/guide/admin/sso#钉钉', '/docs/guide/knowledge_base/rag': '/docs/introduction/guide/knowledge_base/RAG', - '/docs/commercial/intro/': '/docs/introduction', + '/docs/commercial/intro/': '/docs/introduction/commercial', '/docs/upgrading/intro/': '/docs/upgrading', '/docs/introduction/shopping_cart/intro/': '/docs/introduction/commercial' }; diff --git a/document/content/docs/upgrading/4-12/4121.mdx b/document/content/docs/upgrading/4-12/4121.mdx index b18e619f3..4c91818be 100644 --- a/document/content/docs/upgrading/4-12/4121.mdx +++ b/document/content/docs/upgrading/4-12/4121.mdx @@ -7,6 +7,7 @@ description: 'FastGPT V4.12.1 更新说明' ## 🚀 新增内容 1. Prompt 自动生成和优化。 +2. 增加`SIGNOZ_STORE_LEVEL`参数,可以控制 Signoz 日志存储级别。 ## ⚙️ 优化 @@ -21,3 +22,5 @@ description: 'FastGPT V4.12.1 更新说明' 3. 对话日志看板数据表索引不正确。 ## 🔨 工具更新 + +1. 支持对系统工具单独配置 Tool description,更利于模型理解。 diff --git a/document/data/doc-last-modified.json b/document/data/doc-last-modified.json index 97a4c0d9a..5d895f6f2 100644 --- a/document/data/doc-last-modified.json +++ b/document/data/doc-last-modified.json @@ -103,7 +103,7 @@ "document/content/docs/upgrading/4-11/4110.mdx": "2025-08-05T23:20:39+08:00", "document/content/docs/upgrading/4-11/4111.mdx": "2025-08-07T22:49:09+08:00", "document/content/docs/upgrading/4-12/4120.mdx": "2025-08-12T22:45:19+08:00", - "document/content/docs/upgrading/4-12/4121.mdx": "2025-08-14T22:01:36+08:00", + "document/content/docs/upgrading/4-12/4121.mdx": "2025-08-15T14:27:32+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/packages/service/common/system/log.ts b/packages/service/common/system/log.ts index fe5e9ee7f..be70882b8 100644 --- a/packages/service/common/system/log.ts +++ b/packages/service/common/system/log.ts @@ -34,13 +34,15 @@ const envLogLevelMap: Record = { error: LogLevelEnum.error }; -const { LOG_LEVEL, STORE_LOG_LEVEL } = (() => { +const { LOG_LEVEL, STORE_LOG_LEVEL, SIGNOZ_STORE_LEVEL } = (() => { const LOG_LEVEL = (process.env.LOG_LEVEL || 'info').toLocaleLowerCase(); const STORE_LOG_LEVEL = (process.env.STORE_LOG_LEVEL || '').toLocaleLowerCase(); + const SIGNOZ_STORE_LEVEL = (process.env.SIGNOZ_STORE_LEVEL || 'warn').toLocaleLowerCase(); return { LOG_LEVEL: envLogLevelMap[LOG_LEVEL] ?? LogLevelEnum.info, - STORE_LOG_LEVEL: envLogLevelMap[STORE_LOG_LEVEL] ?? 99 + STORE_LOG_LEVEL: envLogLevelMap[STORE_LOG_LEVEL] ?? 99, + SIGNOZ_STORE_LEVEL: envLogLevelMap[SIGNOZ_STORE_LEVEL] ?? LogLevelEnum.warn }; })(); @@ -60,7 +62,7 @@ export const addLog = { level === LogLevelEnum.error && console.error(obj); - if (logger) { + if (logger && level >= SIGNOZ_STORE_LEVEL) { logger.emit({ severityNumber: level.valueOf(), severityText: ['debug', 'info', 'warn', 'error'][level], diff --git a/packages/service/core/ai/config/utils.ts b/packages/service/core/ai/config/utils.ts index af38fc1b4..5636727ea 100644 --- a/packages/service/core/ai/config/utils.ts +++ b/packages/service/core/ai/config/utils.ts @@ -173,6 +173,17 @@ export const loadSystemModels = async (init = false) => { const providerB = getModelProvider(b.provider); return providerA.order - providerB.order; }); + global.systemActiveDesensitizedModels = global.systemActiveModelList.map((model) => ({ + ...model, + defaultSystemChatPrompt: undefined, + fieldMap: undefined, + defaultConfig: undefined, + weight: undefined, + dbConfig: undefined, + queryConfig: undefined, + requestUrl: undefined, + requestAuth: undefined + })) as SystemModelItemType[]; console.log( `Load models success, total: ${global.systemModelList.length}, active: ${global.systemActiveModelList.length}`, diff --git a/packages/service/core/ai/type.d.ts b/packages/service/core/ai/type.d.ts index 38e26d644..395bddc04 100644 --- a/packages/service/core/ai/type.d.ts +++ b/packages/service/core/ai/type.d.ts @@ -41,5 +41,6 @@ declare global { var reRankModelMap: Map; var systemActiveModelList: SystemModelItemType[]; + var systemActiveDesensitizedModels: SystemModelItemType[]; var systemDefaultModel: SystemDefaultModelType; } diff --git a/packages/service/core/app/plugin/controller.ts b/packages/service/core/app/plugin/controller.ts index 0a8f62aa8..621ac4e34 100644 --- a/packages/service/core/app/plugin/controller.ts +++ b/packages/service/core/app/plugin/controller.ts @@ -314,11 +314,7 @@ export async function getChildAppPreviewNode({ })) } } - : { - systemTool: { - toolId: app.id - } - }) + : { systemTool: { toolId: app.id } }) }, showSourceHandle: app.isFolder ? false : true, showTargetHandle: app.isFolder ? false : true @@ -541,23 +537,6 @@ export const getSystemTools = async (): Promise const systemToolsArray = await MongoSystemPlugin.find({}).lean(); const systemTools = new Map(systemToolsArray.map((plugin) => [plugin.pluginId, plugin])); - // tools.forEach((tool) => { - // // 如果有插件的配置信息,则需要进行替换 - // const dbPluginConfig = systemTools.get(tool.id); - - // if (dbPluginConfig) { - // const children = tools.filter((item) => item.parentId === tool.id); - // const list = [tool, ...children]; - // list.forEach((item) => { - // item.isActive = dbPluginConfig.isActive ?? item.isActive ?? true; - // item.originCost = dbPluginConfig.originCost ?? 0; - // item.currentCost = dbPluginConfig.currentCost ?? 0; - // item.hasTokenFee = dbPluginConfig.hasTokenFee ?? false; - // item.pluginOrder = dbPluginConfig.pluginOrder ?? 0; - // }); - // } - // }); - const formatTools = tools.map((item) => { const dbPluginConfig = systemTools.get(item.id); const isFolder = tools.some((tool) => tool.parentId === item.id); diff --git a/packages/service/core/app/utils.ts b/packages/service/core/app/utils.ts index 391f04f40..70ffaea5c 100644 --- a/packages/service/core/app/utils.ts +++ b/packages/service/core/app/utils.ts @@ -88,6 +88,7 @@ export async function rewriteAppWorkflowToDetail({ node.isFolder = preview.isFolder; node.toolConfig = preview.toolConfig; + node.toolDescription = preview.toolDescription; // Latest version if (!node.version) { diff --git a/packages/web/i18n/en/app.json b/packages/web/i18n/en/app.json index eaf792ff3..44ebbdddb 100644 --- a/packages/web/i18n/en/app.json +++ b/packages/web/i18n/en/app.json @@ -21,7 +21,7 @@ "Optimizer_Placeholder_loading": "Generating...please wait", "Optimizer_Reoptimize": "Re-optimize", "Optimizer_Replace": "replace", - "Optimizer_Tooltip": "AI Optimization", + "Optimizer_Tooltip": "AI optimization prompt words", "Role_setting": "Permission", "Run": "Execute", "Search_dataset": "Search dataset", diff --git a/packages/web/i18n/zh-CN/app.json b/packages/web/i18n/zh-CN/app.json index 9049b7128..6f5402a89 100644 --- a/packages/web/i18n/zh-CN/app.json +++ b/packages/web/i18n/zh-CN/app.json @@ -21,7 +21,7 @@ "Optimizer_Placeholder_loading": "正在生成...请稍候", "Optimizer_Reoptimize": "重新优化", "Optimizer_Replace": "替换", - "Optimizer_Tooltip": "AI 优化", + "Optimizer_Tooltip": "AI 优化提示词", "Role_setting": "权限设置", "Run": "运行", "Search_dataset": "搜索知识库", diff --git a/packages/web/i18n/zh-Hant/app.json b/packages/web/i18n/zh-Hant/app.json index 80a4a3b3b..57e267dbc 100644 --- a/packages/web/i18n/zh-Hant/app.json +++ b/packages/web/i18n/zh-Hant/app.json @@ -21,7 +21,7 @@ "Optimizer_Placeholder_loading": "正在生成...請稍候", "Optimizer_Reoptimize": "重新優化", "Optimizer_Replace": "替換", - "Optimizer_Tooltip": "AI 優化", + "Optimizer_Tooltip": "AI 優化提示詞", "Role_setting": "權限設定", "Run": "執行", "Search_dataset": "搜尋知識庫", diff --git a/projects/app/.env.template b/projects/app/.env.template index dfde8f44e..186d06512 100644 --- a/projects/app/.env.template +++ b/projects/app/.env.template @@ -95,3 +95,4 @@ CONFIG_JSON_PATH= # Signoz SIGNOZ_BASE_URL= SIGNOZ_SERVICE_NAME= +SIGNOZ_STORE_LEVEL=warn diff --git a/projects/app/src/components/common/PromptEditor/OptimizerPopover/index.tsx b/projects/app/src/components/common/PromptEditor/OptimizerPopover/index.tsx index 18b273343..65e71f96d 100644 --- a/projects/app/src/components/common/PromptEditor/OptimizerPopover/index.tsx +++ b/projects/app/src/components/common/PromptEditor/OptimizerPopover/index.tsx @@ -37,6 +37,8 @@ const OptimizerPopover = ({ const { t } = useTranslation(); const { llmModelList, defaultModels } = useSystemStore(); + const InputRef = useRef(null); + const [optimizerInput, setOptimizerInput] = useState(''); const [optimizedResult, setOptimizedResult] = useState(''); const [selectedModel = '', setSelectedModel] = useLocalStorageState( @@ -122,7 +124,7 @@ const OptimizerPopover = ({ Trigger={ - + } @@ -136,6 +138,11 @@ const OptimizerPopover = ({ closePopoverRef.current?.(); } }} + onOpenFunc={() => { + setTimeout(() => { + InputRef.current?.focus(); + }, 50); + }} > {({ onClose }) => { closePopoverRef.current = onClose; @@ -234,11 +241,13 @@ const OptimizerPopover = ({ >