From 051455238c6ed68a4216b5599477784864d5d59f Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Wed, 24 Sep 2025 22:40:31 +0800 Subject: [PATCH] V4.13.0 features (#5693) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: concat usage code (#5657) * feat: dataset parse queue (#5661) * feat: chat usage concat (#5669) * perf: search test usage * feat: chat usage concat * fix: ts * fix: ts * feat: chat node response store (#5675) * feat: chat node response store * limit export * test * add ai generate node (#5506) * add node copilot * apply code * update dynamic input & output * add code test * usage * dynamic input border render * optimize input & output * optimize code * update style * change card to popover * prompt editor basic * prompt editor * handle key down * update prompt * merge * fix * fix * fix * perf: workflow performance (#5677) * feat: chat node response store * limit export * perf: workflow performance * remove log * fix: app template get duplicate (#5682) * fix: dynamic input lock & code param (#5680) * fix: dynamic input lock & code param * fix * fix * feat: multi node data sync & system tool hot-swapping (#5575) * Enhance file upload functionality and system tool integration (#5257) * Enhance file upload functionality and system tool integration * Add supplementary documents and optimize the upload interface * Refactor file plugin types and update upload configurations * Refactor MinIO configuration variables and clean up API plugin handlers for improved readability and consistency * File name change * Refactor SystemTools component layout * fix i18n * fix * fix * fix * optimize app logs sort (#5310) * log keys config modal * multiple select * api * fontsize * code * chatid * fix build * fix * fix component * change name * log keys config * fix * delete unused * fix * chore: minio service class rewrite * chore: s3 plugin upload * feat: system global cache with multi node sync feature * feat: cache * chore: move images * docs: update & remove useless code * chore: resolve merge conflicts * chore: adjust the code * chore: adjust * deps: upgrade @fastgpt-sdk/plugin to 0.1.17 * perf(s3): s3 config * fix: cache syncKey refresh * fix: update @fastgpt-sdk/plugin to v0.1.18 removing mongo definition for fixing vitest * chore: adjust --------- Co-authored-by: Ctrlz <143257420+ctrlz526@users.noreply.github.com> Co-authored-by: heheer Co-authored-by: Archer <545436317@qq.com> * perf: s3 api code * fix: toolbox empty when second open modal * feat: http tool set (#5599) * feat: http toolSet manual create front end * feat: http toolSet manual create i18n * feat: http toolSet manual create back end * feat: auth, as tool param, adapt mcp * fix: delete unused httpPlugin * fix: delete FlowNodeTypeEnum.httpPlugin * fix: AppTypeEnum include httpToolSet and httpPlugin * fix * delete console * fix * output schema * fix * fix bg * fix base url * fix --------- Co-authored-by: heheer * feat: app count * perf: type check * feat: catch error * perf: plugin hot-swapping (#5688) * perf: plugin hot-swapping * chore: adjust code * perf: cite data auth * fix http toolset (#5689) * temp * fix http tool set * fix * template author hide * dynamic IO ui * fix: auth test * fix dynamic input & output (#5690) Co-authored-by: Archer <545436317@qq.com> * fix: dynamic output id * doc * feat: model permission (#5666) * feat(permission): model permission definition & api * chore: support update model's collaborators * feat: remove unauthedmodel when paste and import * fix: type error * fix: test setup global model list * fix: http tool api * chore: update fastgpt-sdk version * chore: remove useless code * chore: myModelList cache * perf: user who is not manager can not configure model permission (FE) * perf: model => Set * feat: getMyModels moved to opensource code; cache the myModelList * fix: type error * fix dynamic input reference select type (#5694) * remove unique index * read file usage * perf: connection error * fix: abort token count * fix: debug usage concat * fix: immer clone object * fix: immer clone object * perf: throw error when error chat * update audit i18n * fix: 修复识别pptx文件后,返回内容顺序错乱问题 (#5696) * fix: pptx sort error * fix prompt editor (#5695) * fix prompt editor * fix * fix: redis cache prefix (#5697) * fix: redis cache prefix * fix: cache * fix: get model collaborator by model.model * feat: hint for model per * rename bucket name * model ui * doc * doc --------- Co-authored-by: heheer Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com> Co-authored-by: Ctrlz <143257420+ctrlz526@users.noreply.github.com> Co-authored-by: Zeng Qingwen <143274079+fishwww-ww@users.noreply.github.com> Co-authored-by: heheer Co-authored-by: Deepturn <33342819+Deepturn@users.noreply.github.com> --- .../web/common/hook/tableMultiple/index.md | 2 +- .../docs/introduction/guide/plugins/meta.json | 13 +- .../guide/plugins/upload_system_tool.mdx | 123 ++ document/content/docs/toc.mdx | 3 +- document/content/docs/upgrading/4-12/4125.mdx | 26 - .../content/docs/upgrading/4-12/meta.json | 2 +- document/content/docs/upgrading/4-13/4130.mdx | 83 ++ .../content/docs/upgrading/4-13/meta.json | 5 + document/content/docs/upgrading/meta.json | 2 + document/data/doc-last-modified.json | 7 +- document/public/imgs/plugins/entry.png | Bin 0 -> 525748 bytes document/public/imgs/plugins/file.png | Bin 0 -> 50462 bytes .../global/common/system/types/index.d.ts | 4 +- packages/global/core/app/constants.ts | 9 +- packages/global/core/app/httpPlugin/utils.ts | 390 ------ .../app/{httpPlugin => httpTools}/type.d.ts | 2 +- packages/global/core/app/httpTools/utils.ts | 174 +++ packages/global/core/app/jsonschema.ts | 127 +- packages/global/core/app/mcpTools/utils.ts | 12 +- packages/global/core/app/plugin/constants.ts | 1 + packages/global/core/app/plugin/type.d.ts | 3 + packages/global/core/app/plugin/utils.ts | 6 + packages/global/core/app/type.d.ts | 11 +- packages/global/core/chat/type.d.ts | 31 +- packages/global/core/chat/utils.ts | 79 +- .../global/core/workflow/runtime/type.d.ts | 2 + .../core/workflow/template/system/http468.ts | 3 +- .../template/system/interactive/type.d.ts | 2 + packages/global/core/workflow/type/node.d.ts | 19 +- packages/global/core/workflow/utils.ts | 24 +- packages/global/package.json | 2 +- .../global/support/permission/constant.ts | 3 +- .../support/permission/model/constant.ts | 11 + .../support/permission/model/controller.ts | 3 + packages/global/support/permission/type.ts | 9 +- packages/global/support/wallet/usage/api.d.ts | 26 +- .../global/support/wallet/usage/constants.ts | 18 +- .../global/support/wallet/usage/type.d.ts | 45 +- packages/service/common/api/type.d.ts | 7 +- packages/service/common/cache/index.ts | 60 + packages/service/common/cache/init.ts | 17 + packages/service/common/cache/type.ts | 23 + .../service/common/file/gridfs/controller.ts | 5 +- packages/service/common/file/read/utils.ts | 8 +- packages/service/common/s3/config.ts | 10 + packages/service/common/s3/const.ts | 20 + packages/service/common/s3/controller.ts | 168 +++ packages/service/common/s3/index.ts | 16 + packages/service/common/s3/type.ts | 49 + packages/service/common/system/constants.ts | 4 + .../service/common/vectorDB/controller.ts | 8 +- packages/service/core/ai/config/utils.ts | 3 + packages/service/core/ai/llm/request.ts | 6 +- packages/service/core/app/controller.ts | 4 + .../service/core/app/evaluation/evalSchema.ts | 2 +- packages/service/core/app/http.ts | 58 + .../service/core/app/plugin/controller.ts | 190 +-- .../service/core/app/templates/register.ts | 6 +- packages/service/core/app/tool/api.ts | 6 +- .../core/chat/chatItemResponseSchema.ts | 47 + packages/service/core/chat/chatItemSchema.ts | 45 +- packages/service/core/chat/chatSchema.ts | 3 +- packages/service/core/chat/constants.ts | 3 + packages/service/core/chat/controller.ts | 41 +- packages/service/core/chat/pushChatLog.ts | 18 +- packages/service/core/chat/saveChat.ts | 190 ++- .../core/dataset/collection/controller.ts | 18 +- packages/service/core/dataset/read.ts | 7 +- .../workflow/dispatch/abandoned/runApp.ts | 1 + .../core/workflow/dispatch/ai/agent/index.ts | 9 +- .../service/core/workflow/dispatch/ai/chat.ts | 9 +- .../core/workflow/dispatch/child/runApp.ts | 5 +- .../core/workflow/dispatch/child/runTool.ts | 58 +- .../core/workflow/dispatch/dataset/search.ts | 1 - .../service/core/workflow/dispatch/index.ts | 78 +- .../core/workflow/dispatch/plugin/run.ts | 5 +- .../core/workflow/dispatch/tools/readFiles.ts | 13 +- .../service/core/workflow/dispatch/utils.ts | 21 +- packages/service/package.json | 3 + .../service/support/permission/auth/team.ts | 32 - .../support/permission/model/controller.ts | 46 + packages/service/support/permission/schema.ts | 118 +- .../service/support/permission/teamLimit.ts | 8 +- packages/service/support/user/audit/util.ts | 1 + packages/service/support/user/team/utils.ts | 25 + .../service/support/wallet/usage/constants.ts | 2 + .../support/wallet/usage/controller.ts | 451 ++++--- .../service/support/wallet/usage/schema.ts | 33 +- .../service/support/wallet/usage/type.d.ts | 14 +- .../support/wallet/usage/usageItemSchema.ts | 53 + .../thirdProvider/fastgptPlugin/index.ts | 8 +- .../service/worker/readFile/parseOffice.ts | 11 +- .../common/DateRangePicker/index.tsx | 2 +- .../web/components/common/Icon/constants.ts | 1 + .../common/Icon/icons/codeCopilot.svg | 46 + .../web/components/common/MyMenu/index.tsx | 2 +- .../common/MyPopover/PopoverConfirm.tsx | 2 +- .../web/components/common/MyPopover/index.tsx | 2 +- .../common/MySelect/MultipleSelect.tsx | 1 - .../common/Textarea/PromptEditor/Editor.tsx | 29 +- .../common/Textarea/PromptEditor/index.tsx | 3 + .../plugins/KeyDownPlugin/index.tsx | 38 + .../plugins/VariableLabelPlugin/index.tsx | 25 +- packages/web/core/workflow/constants.ts | 2 +- packages/web/hooks/useMemoEnhance.ts | 27 + packages/web/hooks/useTableMultipleSelect.tsx | 18 +- packages/web/i18n/en/account_model.json | 3 +- packages/web/i18n/en/account_team.json | 4 +- packages/web/i18n/en/account_usage.json | 2 + packages/web/i18n/en/app.json | 28 +- packages/web/i18n/en/common.json | 7 +- packages/web/i18n/en/file.json | 2 + packages/web/i18n/zh-CN/account_model.json | 3 +- packages/web/i18n/zh-CN/account_team.json | 5 +- packages/web/i18n/zh-CN/account_usage.json | 2 + packages/web/i18n/zh-CN/app.json | 36 +- packages/web/i18n/zh-CN/common.json | 7 +- packages/web/i18n/zh-CN/file.json | 2 + packages/web/i18n/zh-Hant/account_model.json | 3 +- packages/web/i18n/zh-Hant/account_team.json | 4 +- packages/web/i18n/zh-Hant/account_usage.json | 2 + packages/web/i18n/zh-Hant/app.json | 27 + packages/web/i18n/zh-Hant/common.json | 7 +- packages/web/i18n/zh-Hant/file.json | 2 + pnpm-lock.yaml | 221 +++- projects/app/.env.template | 12 +- projects/app/data/config.json | 1 + projects/app/package.json | 3 +- .../src/components/Select/AIModelSelector.tsx | 57 +- .../Select/FileSelectorBox.tsx} | 0 .../common/secret/HeaderAuthConfig.tsx | 348 +----- .../common/secret/HeaderAuthForm.tsx | 279 +++++ .../components/core/ai/ModelTable/index.tsx | 112 +- .../core/chat/ChatContainer/ChatBox/index.tsx | 14 +- .../PluginRunBox/components/RenderOutput.tsx | 1 + .../chat/components/WholeResponseModal.tsx | 4 - .../permission/MemberManager/MemberModal.tsx | 19 +- .../permission/MemberManager/context.tsx | 15 +- .../app/src/global/core/workflow/api.d.ts | 2 + .../account/team/PermissionManage/index.tsx | 10 +- .../account/team/SelectMember.tsx | 266 ---- .../account/usage/UsageDetail.tsx | 4 +- .../account/usage/UsageTable.tsx | 4 +- .../app/detail/HTTPTools/AppCard.tsx | 86 ++ .../app/detail/HTTPTools/ChatTest.tsx | 212 ++++ .../app/detail/HTTPTools/ConfigModal.tsx | 333 +++++ .../app/detail/HTTPTools/Edit.tsx | 88 ++ .../app/detail/HTTPTools/EditForm.tsx | 437 +++++++ .../app/detail/HTTPTools/Header.tsx | 57 + .../app/detail/HTTPTools/index.tsx | 15 + .../SimpleApp/components/ToolSelectModal.tsx | 14 +- .../Flow/ImportSettings.tsx | 9 + .../Flow/components/NodeTemplates/list.tsx | 186 ++- .../NodeTemplates/useNodeTemplates.tsx | 32 +- .../Flow/hooks/useDebug.tsx | 3 +- .../Flow/hooks/useKeyboard.tsx | 18 +- .../Flow/nodes/NodeAgent.tsx | 6 +- .../Flow/nodes/NodeAnswer.tsx | 18 +- .../Flow/nodes/NodeCode/Copilot.tsx | 419 +++++++ .../{NodeCode.tsx => NodeCode/index.tsx} | 56 +- .../Flow/nodes/NodeCode/parser.ts | 32 + .../Flow/nodes/NodeExtract/index.tsx | 12 +- .../Flow/nodes/NodeHttp/index.tsx | 11 +- .../WorkflowComponents/Flow/nodes/NodeLaf.tsx | 12 +- .../Flow/nodes/NodeSimple.tsx | 26 +- .../Flow/nodes/NodeTool.tsx | 6 +- .../Flow/nodes/NodeToolSet.tsx | 6 +- .../Flow/nodes/render/NodeCard.tsx | 110 +- .../Flow/nodes/render/RenderInput/index.tsx | 7 +- .../templates/DynamicInputs/index.tsx | 383 +++--- .../render/RenderOutput/DynamicOutputs.tsx | 228 ++++ .../Flow/nodes/render/RenderOutput/index.tsx | 105 +- .../nodes/render/RenderToolInput/index.tsx | 7 +- .../WorkflowComponents/context/index.tsx | 10 +- .../app/plugin/UploadSystemToolModal.tsx | 127 ++ .../chat/ChatSetting/ToolSelectModal.tsx | 19 +- .../chat/ChatTeamApp/TypeTag.tsx | 8 +- .../pageComponents/chat/ChatTeamApp/index.tsx | 1 + .../dashboard/SystemPlugin/ToolCard.tsx | 62 +- .../dashboard/apps/HttpPluginEditModal.tsx | 469 ------- .../dashboard/apps/HttpToolsCreateModal.tsx | 199 +++ .../pageComponents/dashboard/apps/List.tsx | 38 +- .../pageComponents/dashboard/apps/TypeTag.tsx | 6 + .../CollectionCard/BackupImportModal.tsx | 4 +- .../CollectionCard/TemplateImportModal.tsx | 2 +- .../detail/CollectionCard/TrainingStates.tsx | 11 +- .../dataset/detail/CollectionCard/index.tsx | 13 +- .../pageComponents/dataset/detail/NavBar.tsx | 149 --- .../dataset/detail/data/InsertImageModal.tsx | 2 +- .../app/src/pages/account/model/index.tsx | 2 +- .../pages/api/core/ai/model/getMyModels.ts | 56 + projects/app/src/pages/api/core/app/create.ts | 34 +- .../src/pages/api/core/app/exportChatLogs.ts | 100 +- .../app/src/pages/api/core/app/getChatLogs.ts | 69 +- .../pages/api/core/app/httpPlugin/update.ts | 130 -- .../app/{httpPlugin => httpTools}/create.ts | 62 +- .../getApiSchemaByUrl.ts | 0 .../pages/api/core/app/httpTools/runTool.ts | 36 + .../pages/api/core/app/httpTools/update.ts | 60 + .../app/plugin/getSystemPluginTemplates.ts | 9 +- .../app/src/pages/api/core/chat/chatTest.ts | 128 +- .../src/pages/api/core/chat/clearHistories.ts | 28 +- .../app/src/pages/api/core/chat/delHistory.ts | 8 +- .../api/core/chat/getPaginationRecords.ts | 15 +- .../app/src/pages/api/core/chat/getResData.ts | 17 +- .../src/pages/api/core/chat/item/delete.ts | 18 +- .../api/core/chat/quote/getCollectionQuote.ts | 8 +- .../src/pages/api/core/chat/quote/getQuote.ts | 6 +- .../core/dataset/collection/trainingDetail.ts | 105 +- .../api/core/dataset/data/getQuoteData.ts | 4 +- .../api/core/dataset/data/insertImages.ts | 4 +- .../src/pages/api/core/dataset/searchTest.ts | 46 +- .../api/core/dataset/training/getQueueLen.ts | 51 - .../core/dataset/training/rebuildEmbedding.ts | 4 +- .../app/src/pages/api/core/workflow/debug.ts | 37 +- .../pages/api/core/workflow/optimizeCode.ts | 171 +++ .../api/plugin/[...pluginRequestPath].ts | 34 + .../wallet/usage/createTrainingUsage.ts | 4 +- .../app/src/pages/api/v1/chat/completions.ts | 114 +- .../app/src/pages/api/v2/chat/completions.ts | 114 +- projects/app/src/pages/app/detail/index.tsx | 5 + .../pages/dashboard/[pluginGroupId]/index.tsx | 129 +- .../app/src/pages/dashboard/apps/index.tsx | 37 +- .../src/pages/dashboard/evaluation/create.tsx | 4 +- .../src/service/common/system/constants.ts | 3 - .../app/src/service/common/system/index.ts | 17 +- .../service/common/system/volumnMongoWatch.ts | 2 - projects/app/src/service/core/app/utils.ts | 71 +- .../core/dataset/queues/datasetParse.ts | 489 ++++---- .../service/core/dataset/queues/generateQA.ts | 6 +- .../core/dataset/queues/generateVector.ts | 2 +- projects/app/src/service/support/mcp/utils.ts | 28 +- .../service/support/permission/auth/chat.ts | 53 +- .../support/permission/auth/outLink.ts | 8 +- .../src/service/support/wallet/usage/push.ts | 104 +- projects/app/src/types/index.d.ts | 1 + projects/app/src/web/common/api/fetch.ts | 30 +- projects/app/src/web/common/file/api.ts | 16 +- projects/app/src/web/common/system/api.ts | 20 +- .../src/web/common/system/useSystemStore.ts | 29 + projects/app/src/web/core/app/api/plugin.ts | 52 +- projects/app/src/web/core/dataset/api.ts | 4 - .../app/src/web/support/wallet/usage/api.ts | 4 +- .../wallet/usage/creatTrainingUsage.test.ts | 205 ++++ .../support/permission/auth/chat.test.ts | 1093 ++++++++++++++--- .../app/workflow/workflowDispatch.test.ts | 5 +- test/cases/service/support/mcp/utils.test.ts | 6 +- test/setup.ts | 2 + test/setupModels.ts | 1 + 249 files changed, 8797 insertions(+), 4202 deletions(-) create mode 100644 document/content/docs/introduction/guide/plugins/upload_system_tool.mdx delete mode 100644 document/content/docs/upgrading/4-12/4125.mdx create mode 100644 document/content/docs/upgrading/4-13/4130.mdx create mode 100644 document/content/docs/upgrading/4-13/meta.json create mode 100644 document/public/imgs/plugins/entry.png create mode 100644 document/public/imgs/plugins/file.png delete mode 100644 packages/global/core/app/httpPlugin/utils.ts rename packages/global/core/app/{httpPlugin => httpTools}/type.d.ts (88%) create mode 100644 packages/global/core/app/httpTools/utils.ts create mode 100644 packages/global/support/permission/model/constant.ts create mode 100644 packages/global/support/permission/model/controller.ts create mode 100644 packages/service/common/cache/index.ts create mode 100644 packages/service/common/cache/init.ts create mode 100644 packages/service/common/cache/type.ts create mode 100644 packages/service/common/s3/config.ts create mode 100644 packages/service/common/s3/const.ts create mode 100644 packages/service/common/s3/controller.ts create mode 100644 packages/service/common/s3/index.ts create mode 100644 packages/service/common/s3/type.ts create mode 100644 packages/service/core/app/http.ts create mode 100644 packages/service/core/chat/chatItemResponseSchema.ts create mode 100644 packages/service/core/chat/constants.ts delete mode 100644 packages/service/support/permission/auth/team.ts create mode 100644 packages/service/support/permission/model/controller.ts create mode 100644 packages/service/support/wallet/usage/constants.ts create mode 100644 packages/service/support/wallet/usage/usageItemSchema.ts create mode 100644 packages/web/components/common/Icon/icons/codeCopilot.svg create mode 100644 packages/web/components/common/Textarea/PromptEditor/plugins/KeyDownPlugin/index.tsx create mode 100644 packages/web/hooks/useMemoEnhance.ts rename projects/app/src/{pageComponents/dataset/detail/components/FileSelector.tsx => components/Select/FileSelectorBox.tsx} (100%) create mode 100644 projects/app/src/components/common/secret/HeaderAuthForm.tsx delete mode 100644 projects/app/src/pageComponents/account/team/SelectMember.tsx create mode 100644 projects/app/src/pageComponents/app/detail/HTTPTools/AppCard.tsx create mode 100644 projects/app/src/pageComponents/app/detail/HTTPTools/ChatTest.tsx create mode 100644 projects/app/src/pageComponents/app/detail/HTTPTools/ConfigModal.tsx create mode 100644 projects/app/src/pageComponents/app/detail/HTTPTools/Edit.tsx create mode 100644 projects/app/src/pageComponents/app/detail/HTTPTools/EditForm.tsx create mode 100644 projects/app/src/pageComponents/app/detail/HTTPTools/Header.tsx create mode 100644 projects/app/src/pageComponents/app/detail/HTTPTools/index.tsx create mode 100644 projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/nodes/NodeCode/Copilot.tsx rename projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/nodes/{NodeCode.tsx => NodeCode/index.tsx} (78%) create mode 100644 projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/nodes/NodeCode/parser.ts create mode 100644 projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/nodes/render/RenderOutput/DynamicOutputs.tsx create mode 100644 projects/app/src/pageComponents/app/plugin/UploadSystemToolModal.tsx create mode 100644 projects/app/src/pageComponents/dashboard/apps/HttpToolsCreateModal.tsx create mode 100644 projects/app/src/pages/api/core/ai/model/getMyModels.ts delete mode 100644 projects/app/src/pages/api/core/app/httpPlugin/update.ts rename projects/app/src/pages/api/core/app/{httpPlugin => httpTools}/create.ts (50%) rename projects/app/src/pages/api/core/app/{httpPlugin => httpTools}/getApiSchemaByUrl.ts (100%) create mode 100644 projects/app/src/pages/api/core/app/httpTools/runTool.ts create mode 100644 projects/app/src/pages/api/core/app/httpTools/update.ts delete mode 100644 projects/app/src/pages/api/core/dataset/training/getQueueLen.ts create mode 100644 projects/app/src/pages/api/core/workflow/optimizeCode.ts create mode 100644 projects/app/src/pages/api/plugin/[...pluginRequestPath].ts delete mode 100644 projects/app/src/service/common/system/constants.ts create mode 100644 projects/app/test/api/support/wallet/usage/creatTrainingUsage.test.ts diff --git a/.claude/design/web/common/hook/tableMultiple/index.md b/.claude/design/web/common/hook/tableMultiple/index.md index e1a557353..99fc303f9 100644 --- a/.claude/design/web/common/hook/tableMultiple/index.md +++ b/.claude/design/web/common/hook/tableMultiple/index.md @@ -12,4 +12,4 @@ 1. 选中的值存储在 hook 里,便于判断是否触发底部悬浮层 2. 悬浮层外层 Box 在 hook 里,child 由调用组件实现 -3. FastGPT/packages/web/hooks/useTableMultipleSelect.tsx 在这个文件下实现 \ No newline at end of file +3. FastGPT/packages/web/hooks/useTableMultipleSelect.tsx 在这个文件下实现 diff --git a/document/content/docs/introduction/guide/plugins/meta.json b/document/content/docs/introduction/guide/plugins/meta.json index 9cda406e9..774b87483 100644 --- a/document/content/docs/introduction/guide/plugins/meta.json +++ b/document/content/docs/introduction/guide/plugins/meta.json @@ -1,5 +1,14 @@ { "title": "系统插件", "description": "介绍如何使用和提交系统插件,以及各插件的填写说明", - "pages": ["dev_system_tool","how_to_submit_system_plugin","searxng_plugin_guide","google_search_plugin_guide","bing_search_plugin","doc2x_plugin_guide"] -} \ No newline at end of file + "pages": [ + "dev_system_tool", + "how_to_submit_system_plugin", + "upload_system_tool", + "searxng_plugin_guide", + "google_search_plugin_guide", + "bing_search_plugin", + "doc2x_plugin_guide", + "deepseek_plugin_guide" + ] +} diff --git a/document/content/docs/introduction/guide/plugins/upload_system_tool.mdx b/document/content/docs/introduction/guide/plugins/upload_system_tool.mdx new file mode 100644 index 000000000..b5dc82156 --- /dev/null +++ b/document/content/docs/introduction/guide/plugins/upload_system_tool.mdx @@ -0,0 +1,123 @@ +--- +title: 如何在线上传系统工具 +description: FastGPT 系统工具在线上传指南 +--- + +> 从 FastGPT 4.14.0 版本开始,系统管理员可以通过 Web 界面直接上传和更新系统工具,无需重新部署服务 + +## 权限要求 + +⚠️ **重要提示**:只有 **root 用户** 才能使用在线上传系统工具功能。 + +- 确保您已使用 `root` 账户登录 FastGPT +- 普通用户无法看到"导入/更新"按钮和删除功能 + +## 支持的文件格式 + +- **文件类型**:`.js` 文件 +- **文件大小**:最大 10MB +- **文件数量**:每次只能上传一个文件 + +## 上传步骤 + +### 1. 进入系统工具页面 + +1. 登录 FastGPT 管理后台 +2. 导航到:**工作台** → **系统工具** +3. 确认页面右上角显示"导入/更新"按钮(只有 root 用户可见) + +![](/imgs/plugins/entry.png) + +### 2. 准备工具文件 + +在上传之前,请确保您的 `.js` 文件是从 fastgpt-plugin 项目中通过 `bun run build` 命令打包后的 dist/tools/built-in 文件夹下得到的 + +![](/imgs/plugins/file.png) + +### 3. 执行上传 + +1. 点击 **"导入/更新"** 按钮 +2. 在弹出的对话框中,点击文件选择区域 +3. 选择您准备好的 `.js` 工具文件 +4. 确认文件信息无误后,点击 **"确认导入"** + +### 4. 上传过程 + +- 上传成功后会显示成功提示 +- 页面自动刷新,新工具会出现在工具列表中 + +## 功能特点 + +### 工具管理 + +- **查看工具**:所有用户都可以查看已安装的系统工具 +- **上传工具**:仅 root 用户可以上传新工具或更新现有工具 +- **删除工具**:仅 root 用户可以删除已上传的工具 + +### 工具类型识别 + +系统会根据工具的配置自动识别工具类型: + +- 🔧 **工具 (tools)** +- 🔍 **搜索 (search)** +- 🎨 **多模态 (multimodal)** +- 💬 **通讯 (communication)** +- 📦 **其他 (other)** + +## 常见问题 + +### Q: 上传失败,提示"文件内容存在错误" + +**可能原因:** +- fastgpt-plugin 项目不是最新的,导致打包的 `.js` 文件缺少正确的内容 +- 工具配置格式不正确 + +**解决方案:** +1. 拉取最新的 fastgpt-plugin 项目重新进行 `bun run build` 获得打包后的 `.js` 文件 +2. 检查本地插件运行是否成功 + +### Q: 无法看到"导入/更新"按钮 + +**原因:** 当前用户不是 root 用户 + +**解决方案:** 使用 root 账户重新登录 + +### Q: 文件上传超时 + +**可能原因:** +- 文件过大(超过 10MB) +- 网络连接不稳定 + +**解决方案:** +1. 确认文件大小在限制范围内 +2. 检查网络连接 +3. 尝试重新上传 + +## 最佳实践 + +### 上传前检查 + +1. **代码测试**:在本地环境测试工具功能 +2. **格式验证**:确保符合 FastGPT 工具规范 +3. **文件大小**:保持文件在合理大小范围内 + +### 版本管理 + +- 建议为工具添加版本号注释 +- 更新工具时,先备份原有版本 +- 记录更新日志和功能变更 + +### 安全考虑 + +- 仅上传来源可信的工具文件 +- 避免包含敏感信息或凭据 +- 定期审查已安装的工具 + +### 存储方式 + +- 工具文件存储在 MinIO 中 +- 工具元数据保存在 MongoDB 中 + +--- + +通过在线上传功能,您可以快速部署和管理系统工具,提高 FastGPT 的扩展性和灵活性。如遇到问题,请参考上述常见问题或联系技术支持。 diff --git a/document/content/docs/toc.mdx b/document/content/docs/toc.mdx index 48f073af6..21538ea8d 100644 --- a/document/content/docs/toc.mdx +++ b/document/content/docs/toc.mdx @@ -90,6 +90,7 @@ description: FastGPT 文档目录 - [/docs/introduction/guide/plugins/doc2x_plugin_guide](/docs/introduction/guide/plugins/doc2x_plugin_guide) - [/docs/introduction/guide/plugins/google_search_plugin_guide](/docs/introduction/guide/plugins/google_search_plugin_guide) - [/docs/introduction/guide/plugins/searxng_plugin_guide](/docs/introduction/guide/plugins/searxng_plugin_guide) +- [/docs/introduction/guide/plugins/upload_system_tool](/docs/introduction/guide/plugins/upload_system_tool) - [/docs/introduction/guide/team_permissions/invitation_link](/docs/introduction/guide/team_permissions/invitation_link) - [/docs/introduction/guide/team_permissions/team_roles_permissions](/docs/introduction/guide/team_permissions/team_roles_permissions) - [/docs/introduction/index](/docs/introduction/index) @@ -105,7 +106,7 @@ description: FastGPT 文档目录 - [/docs/upgrading/4-12/4122](/docs/upgrading/4-12/4122) - [/docs/upgrading/4-12/4123](/docs/upgrading/4-12/4123) - [/docs/upgrading/4-12/4124](/docs/upgrading/4-12/4124) -- [/docs/upgrading/4-12/4125](/docs/upgrading/4-12/4125) +- [/docs/upgrading/4-13/4130](/docs/upgrading/4-13/4130) - [/docs/upgrading/4-8/40](/docs/upgrading/4-8/40) - [/docs/upgrading/4-8/41](/docs/upgrading/4-8/41) - [/docs/upgrading/4-8/42](/docs/upgrading/4-8/42) diff --git a/document/content/docs/upgrading/4-12/4125.mdx b/document/content/docs/upgrading/4-12/4125.mdx deleted file mode 100644 index 883913ba7..000000000 --- a/document/content/docs/upgrading/4-12/4125.mdx +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: 'V4.12.5(进行中)' -description: 'FastGPT V4.12.5 更新说明' ---- - -## 🚀 新增内容 - - -## ⚙️ 优化 - -1. 系统工具增加对应 author 名字显示。同时使用安全的 I18n 翻译。 - -## 🐛 修复 - -1. debug 模式下,全局变量未传递。 -2. debug 模式下,前方节点参数无法传递至后方节点。 -3. 调试模式下,开启“自动执行”,会跳过外部变量的填写。 -4. 自动语音回复未生效。 -5. 节点复制,报错捕获配置丢失。 -6. “猜你想问”的自定义提示词,保存时,上一次的值会被置空。 -7. 配置了二级路由的情况下,知识库检索出来的图片地址拼接异常。 -8. Prompt 编辑器,键盘输入时会清除掉 Markdown 标记。 - -## 🔨 插件更新 - -1. 新增火山引擎融合信息搜索工具。 diff --git a/document/content/docs/upgrading/4-12/meta.json b/document/content/docs/upgrading/4-12/meta.json index 1d468c07c..30c62716d 100644 --- a/document/content/docs/upgrading/4-12/meta.json +++ b/document/content/docs/upgrading/4-12/meta.json @@ -1,5 +1,5 @@ { "title": "4.12.x", "description": "", - "pages": ["4125", "4124", "4123", "4122", "4121", "4120"] + "pages": ["4124", "4123", "4122", "4121", "4120"] } diff --git a/document/content/docs/upgrading/4-13/4130.mdx b/document/content/docs/upgrading/4-13/4130.mdx new file mode 100644 index 000000000..24ff33150 --- /dev/null +++ b/document/content/docs/upgrading/4-13/4130.mdx @@ -0,0 +1,83 @@ +--- +title: 'V4.13.0(进行中)' +description: 'FastGPT V4.13.0 更新说明' +--- + +## 更新指南 + +### 1. 更新镜像: + +- 更新 FastGPT 镜像tag: v4.13.0 +- 更新 FastGPT 商业版镜像tag: v4.13.0 +- 更新 fastgpt-plugin 镜像 tag: v0.2.0 +- mcp_server 无需更新 +- Sandbox 无需更新 +- AIProxy 无需更新 + +### 2. 更新环境变量 + +1. 更新 `fastgpt-plugin` 环境变量名字,并新增`S3_PLUGIN_BUCKET`、`MONGODB_URI`、`REDIS_URL`值。 + +``` + +S3_EXTERNAL_BASE_URL=https://xxx.com # S3 外网地址 +S3_ENDPOINT=localhost +S3_PORT=9000 +S3_USE_SSL=false +S3_ACCESS_KEY=minioadmin +S3_SECRET_KEY=minioadmin +S3_TOOL_BUCKET=fastgpt-tool # 系统工具,创建的临时文件,存储的桶,要求公开读私有写。 +S3_PLUGIN_BUCKET=fastgpt-plugin # 系统插件热安装文件的桶,私有读写。 +RETENTION_DAYS=15 # 系统工具临时文件保存天数 +MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin # MongoDB 链接参数 +REDIS_URL=redis://default:mypassword@redis:6379 # Redis 链接参数 +``` + +2. 增加`fastgpt`和`fastgpt-pro(商业版)` s3 相关环境变量。 + +``` +# S3 外网地址 +S3_EXTERNAL_BASE_URL= +S3_ENDPOINT=localhost +S3_PORT=9000 +S3_USE_SSL=false +S3_ACCESS_KEY=minioadmin +S3_SECRET_KEY=minioadmin +S3_PLUGIN_BUCKET=fastgpt-plugin # 系统插件热安装文件的桶,私有读写。 +``` + +## 🚀 新增内容 + +1. 应用新增 HTTP 工具集类型,取代原 HTTP 插件。 +2. 支持系统管理员通过文件形式快速安装系统工具。 +3. 团队管理员支持分配模型权限。 +4. 代码运行节点支持 AI 辅助生成。 +5. 知识库文件解析支持配置最大并发数。(开源版通过 config.json 文件中`systemEnv.datasetParseMaxProcess`属性配置,商业版通过 admin 后台配置。) + +## ⚙️ 优化 + +1. 系统工具增加对应 author 名字显示。同时使用安全的 I18n 翻译。 +2. 计量计费账单推送和合并逻辑。 +3. 对话记录中,节点详情单独分表存储。 +4. 删除 chat_items 中无效的 dataId 索引。 +5. 工作流UI性能优化,减少 UI 重绘。 +6. 对话中,知识库引用鉴权采用整个对话框鉴权,而不是单条记录。 +7. 工作流动态输入输出变量交互优化。 + +## 🐛 修复 + +1. debug 模式下,全局变量未传递。 +2. debug 模式下,前方节点参数无法传递至后方节点。 +3. 调试模式下,开启“自动执行”,会跳过外部变量的填写。 +4. 自动语音回复未生效。 +5. 节点复制,报错捕获配置丢失。 +6. “猜你想问”的自定义提示词,保存时,上一次的值会被置空。 +7. 配置了二级路由的情况下,知识库检索出来的图片地址拼接异常。 +8. Prompt 编辑器,键盘输入时会清除掉 Markdown 标记。 +9. 知识库集合页面,有训练数据时候无法自动刷新页面。 +10. 工作流快速添加节点弹窗,工具箱页面二次打开时为空。 +11. PPTX 文件解析顺序错误。 + +## 🔨 插件更新 + +1. 新增火山引擎融合信息搜索工具。 diff --git a/document/content/docs/upgrading/4-13/meta.json b/document/content/docs/upgrading/4-13/meta.json new file mode 100644 index 000000000..6ed99a30c --- /dev/null +++ b/document/content/docs/upgrading/4-13/meta.json @@ -0,0 +1,5 @@ +{ + "title": "4.13.x", + "description": "", + "pages": ["4130"] +} diff --git a/document/content/docs/upgrading/meta.json b/document/content/docs/upgrading/meta.json index 8427f6eaa..89e4c054a 100644 --- a/document/content/docs/upgrading/meta.json +++ b/document/content/docs/upgrading/meta.json @@ -4,6 +4,8 @@ "description": "FastGPT 版本更新介绍及升级操作", "pages": [ "index", + "---4.13.x---", + "...4-13", "---4.12.x---", "...4-12", "---4.11.x---", diff --git a/document/data/doc-last-modified.json b/document/data/doc-last-modified.json index 947298e8f..4f906560f 100644 --- a/document/data/doc-last-modified.json +++ b/document/data/doc-last-modified.json @@ -8,7 +8,7 @@ "document/content/docs/faq/other.mdx": "2025-08-04T22:07:52+08:00", "document/content/docs/faq/points_consumption.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/introduction/cloud.mdx": "2025-08-02T19:38:37+08:00", - "document/content/docs/introduction/commercial.mdx": "2025-08-04T22:07:52+08:00", + "document/content/docs/introduction/commercial.mdx": "2025-09-21T23:09:46+08:00", "document/content/docs/introduction/development/community.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/introduction/development/configuration.mdx": "2025-08-05T23:20:39+08:00", "document/content/docs/introduction/development/custom-models/bge-rerank.mdx": "2025-07-23T21:35:03+08:00", @@ -87,6 +87,7 @@ "document/content/docs/introduction/guide/plugins/doc2x_plugin_guide.mdx": "2025-07-23T21:35:03+08:00", "document/content/docs/introduction/guide/plugins/google_search_plugin_guide.mdx": "2025-07-23T21:35:03+08:00", "document/content/docs/introduction/guide/plugins/searxng_plugin_guide.mdx": "2025-07-23T21:35:03+08:00", + "document/content/docs/introduction/guide/plugins/upload_system_tool.mdx": "2025-09-20T19:49:21+08:00", "document/content/docs/introduction/guide/team_permissions/invitation_link.mdx": "2025-07-23T21:35:03+08:00", "document/content/docs/introduction/guide/team_permissions/team_roles_permissions.mdx": "2025-07-23T21:35:03+08:00", "document/content/docs/introduction/index.en.mdx": "2025-07-23T21:35:03+08:00", @@ -99,7 +100,7 @@ "document/content/docs/protocol/terms.en.mdx": "2025-08-03T22:37:45+08:00", "document/content/docs/protocol/terms.mdx": "2025-08-03T22:37:45+08:00", "document/content/docs/toc.en.mdx": "2025-08-04T13:42:36+08:00", - "document/content/docs/toc.mdx": "2025-09-17T22:29:56+08:00", + "document/content/docs/toc.mdx": "2025-09-23T14:19:37+08:00", "document/content/docs/upgrading/4-10/4100.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/upgrading/4-10/4101.mdx": "2025-09-08T20:07:20+08:00", "document/content/docs/upgrading/4-11/4110.mdx": "2025-08-05T23:20:39+08:00", @@ -109,7 +110,7 @@ "document/content/docs/upgrading/4-12/4122.mdx": "2025-09-07T14:41:48+08:00", "document/content/docs/upgrading/4-12/4123.mdx": "2025-09-07T20:55:14+08:00", "document/content/docs/upgrading/4-12/4124.mdx": "2025-09-17T22:29:56+08:00", - "document/content/docs/upgrading/4-12/4125.mdx": "2025-09-18T16:15:12+08:00", + "document/content/docs/upgrading/4-13/4130.mdx": "2025-09-24T21:54:28+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/document/public/imgs/plugins/entry.png b/document/public/imgs/plugins/entry.png new file mode 100644 index 0000000000000000000000000000000000000000..aaadd6fad6cf49819b8686d51e3a1ae7c06f2c8a GIT binary patch literal 525748 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Ů@u&c6ZklSbmr~h#&*?#x%0YC{-aBHZD+NwW4NJ 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%0AGDTwwb^Ldrz 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

LW+MnkQdlj0+78!m8w^LZ6^QFNNZ&Ar?}9 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 z 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 z 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

wi=gE6L{B+l%_`8{cQLRjR(?jb2 zK^@=(QXca1<&BYYXEq?i6(cdiC=ZVN4<}{)0s?NOyv}y`b!J~HFL>$wgCwgbuC>2j z6%#iR3ro4gN&eFV{Dj5!2H3gP)@iLs!HFZE?DN1|$^K6c^aQ81YdKOJ{ZoRh>WLe} zGe7-K0sG5-)yrL$C?$4hkCcwDydjtW)_%B1)3{^;eu@9H-i!mUsK(aytt^YwhYOQ6 zgGG9^+k)kJQ6op2%naJq4NbYFoNn`9N={-SnQ00iZKM)8m@ajoHKJ1LkV>YtySj;ViHrZ;Tx)D&p3Kl&zcGRXr z1#b_W&Rxp4flYLMaC5Y7lf=WQN3lu)IRKUlj3PLq#_+W9urU5}iQ}};le6-{wQcv) z2k%&C;w;$kF1~OO#!OTNb?murvLp#VE$L)DvYYoedl&J)wXw*2m zIbAOvsh-=4Zk4@Q#KAJMALT|~kL-En$eUW?`^>9j<;{st!QSwlevOE2em)ARq|}0F z1d4Rrxbvlsl2)sl3>@s~nK@QTmcKFc_~WOKOqV_6XH{EPABgywxer8R``z|D1Wpb% zVzUHyZQ+dDjY~S5PDeS+4!4c_$}nHmpRh_#4*(v62?V1U;Ec@LS37OVA>er1-L6of zC(|rGpFV#3U7Sg$T^;Uq`XDfPp*<=fX|iT(`^QBjo%)2H&H*v!uL*%CrS5R;^wpa= z@`cQsb-V0*HIDA7?NdOx?;pK+=z2(a^Zurr3SFXXR0lSF0yVIO%F(=E`KXRCbufry z(gL-u#5Et`J?ZWZdmI=XMX!}W?CS{(3#rk7>D)K@T&0{LQ^Q!KD|+%7^GjpnyBz1m zm``?|BGnW_$u1@bSwaCT?k5I?f*~1R+UhS1V83J4o5E;M+GOjh%jNQiSk2{P!1PiZzy=01wmbQ}B4th)j);UboLT;Q-Edr9~)>r3o24EYcVr14w zzB}XNKPK9{dB(kMv{PLZTSyBS%w;i6&HkOzLI|r!y8JF{|HJ!-(~E?;cY3WRYPE8+ zRrd23-M4rJm6TXd9}vjwI^!^Cl~JKot_H?&Vij0cpBmFNpx7L0z;y9Aaus;92ne!j39?3y<%lc$<1 zh{@Qv!UafbnRiKCM%~&?!!37`IV9_xvPFV36y8ISUG{S1Qd>iPE{@j;5=eNv22HU& zyOUa6i9Jz&G>~7afdC1r|KQO3!;Pi>Z}c=#{^j`W*)HA0p7e%;UnGP@Gk<--!^Lji zjxgf%*tu`SsA;fK&<=QN{HQ(?d(pX=wj8RHxN z&)9|%PnA;hK7w>6Id7NpFYymYJem%lLJFS*wQz2UWDk5Z>)~H;wFmd)<@+c~UlD;5 z->G3KmePivJ4|DxBWgsq@ARej2yXD*Wwm@=4F6SiuWY5)TfIIw+vu=J#r;9JMk#}d zo>L{mx*~mz)#WoN(Q)bMoId55>9@KY?yi}5g2gKN%fsdAC26q8Wm~ngR=R-wjVV{b zc2b=@Cnmsunr|n3-LmFC-O(@QG z!G!DrM`{=Q*XLHcX+}MIRV$vfwmfA0&45ItZ3wMA6 zjsPSbvV@$zExd`mqo3XfeEQM|6y5uRqrrUC(dDph3+Z6Zayq=A+85=!!(?)jy8sAJ zYA8-^j#uoVCvUM?X}XOCV??$UEyNbV;r2<3uydGRH~w*o*QR|-P*Mc@q`+4OJB-N&rU8KFo~@Q z^xbFr+3dLI;I9|lCF^_1UWD1R;-Rzq6C3%0%vg^@pHVKVDcNGC&P>=}51m$g;*fVqNcBe9yYWxkF=;-iknc+L91 zq4IiLa;`!Z>GXZs4)*EQLWVN4ab{^)bX$9S7{)rJ)NKfYbTMA-ed&Je*Ix4N+c&V0 z5o7M;M&iKGTN&HKDR=VcZf{M8Gj#pI4E=9!uD-*F_#o4=i$M% zKfVHQ?27=)5Vrsks}yRIV_9XkU2Zt9^U2@}&MTnPsji!cQNNFaL6iJGG!cz`nhf~( zcs`VjwuvRJ|Doxt!=n1WuLld2R76lpMM6YCML=p)6a<73>28qj5|}{|kXA{lQBjbV z?k))#LOO;XddLZwcn_cN?|mNl2Y4=b?mcJkwbxpEpORBEGkgy{3G8z)WQoP!!%H;O zEJt*;(wAQ!{|se9)KVpG+`RdoOdFVR?hK{UdFY#i3nO;=1%*U}yw++I0UR!n-T=ZFlmXSfT0@>c~w(>{AK*GgBOGHp`OmO>$-9o(Oi6Es|?x9i??UXa_B9`8bvz3eETHI{5}9!-7#H^JF7E>BR_Wu+3DRpZ|JtySq^z`u{?=&t6s zMO6Hk1l?n7Z@n*dGoCIfKb4&zb-g&kx0-mS!(Bu$BZ6BwZVo5`f|Daw-%;n_oDZWU zWhyN(h2%@O=5uaN`x*Z)dGpA?(px&rmE0!0OI(&K==7bn!uplgh~Xn421|H35^qYqip9LWXipiX$R zf93gWUnzhDe;H=;fBK}6CcUY&&8u)C|7%$6%7h0b3`YtpEsYx>GMxxs=`WA{T+V$B zC_Gmse<^_-JYJ87ylrNp@x6MbJ?Jg6)Vuu&IEf;3l_9 zl2m>^$sRJ#99EYDAB)R4B(q=T~hiMgbV^RynG~*G}Z>i*#XC0_B zn7_T)rCH&GE^zeO{HIQwDs-Zw;18b9ml+hI>)ONPY=3D?*EIbGXQX}}{hRPbvlEQX zHg;cfS1+$CEoHf%9h2#Rq5+aDfL7n_(`~xlik_S%0_MW5PTEqg#_QFI6&Nvn0jU16 zbgVBloUs%ImD$Mj0)})M{iFir?_T&VmX=1(RJga~1>2+3 z`&6wZ)UUV0tC1=Q`n-cN$s(rx3?~%689tGHJQ|PPE=@=;xZ{G~=l~=D3oA=&_wYJl zmhAH)kpUFi#{RgIp)V%EaTlfRkD!6xuUy~3^j#{P^~^z>1<`)`*G{kgZ|0!%T098w zF7f(Dev>|%KULayUwqkSVZ9v>E8p02o~mjGfkN;LlT3wEJC8?HFovc>EyekgEc%DJ zT$Va}fz{Kf*irZG{tIUUwogY=)ye+M+?4mCVNqHYT$`Kv)s8d_Yoi*t_KxZ8~DGIJ{oyiz3C6b!D%M9sW$B$9lHk~280bNo~*6|Rh9q>%vWUjo0Zm+jC>!m zpOtnjswZz-sRJZST-%FH*eqX{yhZcWSf)JFxA^`{YURNpisnyg{>k# z0ouu1lC2&;(b^(JGb&A@bPKa=9eTBepi-Tw}19iBu9YEQ3^Z^t%%U@f0fuXvpzW4gSC-+(unPk*r<0H1owlq*cpV9 z9js`y)E51C298m%SePGJJ)l3dmr}wx-96s{h0lwZVo2W{lSDMq5V|5io|}tWo9g*W zAsHx&L@sIHMRq!hk%f1ZWA`7P&fAtxZ3P5$MABi?6A$jB@f{Zx2dEUaw0#+uGVHo2 z^t(>^4{c@V>4u(};LiBXNgoDfdL|wjr~OJ{q2((mj2-bSf{E`WIfJZJx94*v=KWq5Rq^L9hp9z$ zJgVpNi}sm55iZ?Z_aaqJUu9T1=s3ziOC&8C6-bzx6oi(CF-!`vdgi1)9Q|lQKH4`M z!P51w9ta!Nv^cspfg!d1{IZ=`bY*tC@-tSG(0=FvD$qa z38*$OclMK2vt*8S#3_ZQ7qOK!?D*ln7}Jg@tD_jX?rV{Gpat-MUH~t?!n0-tnzo-! zIJsrqB5I;1PlPI84L2y;3>7l(==MRw+nIPnAzz2>_3QR|nts2V_^|`MN_I5)C#gVN z?7UzzUv8j7t$q6#SqFQFEaC6zORj%J9LKNCJZQ&O-m>nA?*LfkS2DZ&)iLA=zda!q zfr|%Q2bcZvJm#H+_4M3U#-bPLqts%xj%op_y5o4i<${|GY*5v8;jX@FC!f1mm6*O;>eMg2U`)%07+P zWT|n-eK$SU>%8V)gAt4n6Dp%Z8 zV?N_oB(O69^TWBI(oEjliM^_KuRj8Ig!P~PquyoqHiXH*%?>A>BJ}6)QP}YNpxBAC zpqlpRWRGEpMmM5tqCaQcHEDP=Ef@svjyioxR?I}hXJN$Hamv0*H`k~c2>iIyFLlf= z=qnYCX6iWn{vW0B|LwQ>ibEA#xR3VCfeq4Lz1%$_w{?oN<$X5#uO4^|$QVmkXq;FX zEu_X4Lj!HKB|1j#r2f1GypgfIVL#7)71jA6_BTab+#~ehpZ$aBnT@tyG#g|aJ(3PQ z5nj?SfXHRAcEnSM;%i&SPtuX>qKpG+tQeJx3*We))6cCrkL!x~TkD3*tSMY7%kk zid=vglzcB3jAUizK^_Lr4X;;R+!GEp>Z|s>%%KYWJv3Ec99Q?x%Uj1knvXX0Sy*0E z36@rFZafw}Tb3Ne9kiH|WJ85}B(5$vj@~%Rd4ARv;f&dvZ10^q{H2}Mlc(KPGLmOD zZC>?;twCK*=elZwuzp%7pbxRL7eq`Nx{DXGU!D35e5i?hRs*G#<>f*{6$J$hNVrs! z#Y0+J+VlRbukJ+{p8tx#rdJMe%2K!Icx$||sOk5R&5DAQ9SrFTf2S%fBTXHPn!}+H)U@v0PG3}<?Gm=j8`vIbif3t1bMy54;g-zfbNJKt`FlMC3L^#d~b%qF_i(ezmUz4!M;{fsnaOjUaR1FbxA1u`vBrparuKO ze|x?l`JNmtAx~*835Y?#{~4-3L}`AHm&{gp)erCl~lsS5# z+dE19*8S`6XT@Ka|r!?k<&x?ev8 z8JMVJ%NIle2d}>m3FA1;bX@11D|7uD7dCR|j_G>O4RP_PFQu4lVx0$@NTchq^0~D5 zrBo*&ojUp|ue;oS=IM!JueR0IdK1+5rSRSCb^VUu$E4tf>=%i7ue!p75&}Me`q_C% zy*p7v9aJOn3l5T-vtSRGxeULzcqXSda=iozl7IR2-~bDLKTT6(k1z62zcYu6ro(GL zdU4@LMN?t7XnrzIDXs-LFnm8Ap>?Ej5<%9`l{ArBWxr_Cu3+Bw}eWswJI|%u>YyG zUZhd*Dwk$IyDv>sURMwsXK%daTzCm5{In^s70*iy^cxmpb@On$E-sq}jCNBEERTx6 zhnjxpZRkuG?oN@k3sTH9pAc3s!!?`?Tb=nUHZFDVUW5l5{V3+O3vAjdFGUVj`jz%H zvd2EbXs#tB9`)@U&E`n1aqStCkn>q%Je;JDRqxrnLFFCK7OAeTywJlXgBL<_Nan(< zO1c=A0fCx*h$ZiJkO+7DaT^%;OEF0o^wKm_gW17uW4!dS|8b?qC1JNUEHK>1Ze8Ff zg0lK3S1b3U#j5~!b@dp}&9p z95iQJ7O*oV9&31PrEUNw)jtWs6)k;z+r9Ua;xY%|YHN{ivp&kokbmB$I8K%$&o6Zk ze)D3nrUHbjX!>mARi5@3Fa<@b)}Q~62KaQ@*?Fs~2E*6;gt>lN*R-W*=+&u#Bo6tg z&%tMGZPH1|IM{DD560ej{ztT&UwFi zv6x2@_WS|Mhw|Wl*tb#^uE;tv!Yu(F_U=zDNzr?E4Osd)-NU9n*Ji`MYjS-OBvh z+R`#!k52mV;W>~vW8&g?8P-R>I)o+WAGzp8?4sxx=oDfZeI&aslkUCB`AkurQr}$P zySQMcmLRE({qf-UHCl#;6Xj0I|3~>9MjNtI_nsRWeLmrLS;Y8T0C#_-ZOVG1Cs9a1 z{m^Z&v%2Ju<9hYZMLkWnK)B1OQeBOc^Ye*_49t@DpN+d>RTUeh_1P_-Dv&C2C?5H5l3@x^7H9_Sn|E#bDB1KjxJru($)TogkiFWmz(+FKQ~Y8 zedeG*+E}0qyOHiK`vZ|5gog56|G}@$cg`Rv--f+T{wpxPKfC}!iNV1gyri(c4Fwng zf7H};{lbO~6dOCN%K$~{M$c14B^Hv{0cNbLCnBxWD9hJ@VS1+xxOez$Gj|wX_y-L| z;s(+H*>#Ji2W41mUaE0s=S{hTjW5LCyV6A&AYWR(7w!`OeAp|W%;@0nND;n`TjoT& zT_h6XwShnNi=KwirzG38h4TVRdzPOUNAZgKJ)_HU`7eOs6jVE76BF#wdHFecuP=y# zr*)L{f zd>=O*Twl*sQQ`em@6*>ORomla&8zzQKb}RoAV#Tc{Gk+bn3y+S3 z?fDJoX)jY4dh{`<^v0(zf6w{kKY57My8ntlTbb{p0=P-v3)y6m5{u2tLJ0`4=jwnV z2I4Ox6UszPR#1Z7YTkooD7s?d%s$xD7hRzr{qZNOQ$G?9H`;Hf)%%{7G4z+Na0*rV zIY0C^FkhXrvr>G0J-xQp@QmrtKj%SjNHXk9fiLst3J<4$%dy7wwAOX`SWBCd((<1^ zMU~0&{@faO@8;{3Co<9EXlIYRgf_>S9<5$%w|j{`WX%VaQX;8d=zdMQNH7)8 z1uQt3uP+R#Lf(gk-9|>T-L@!hm~W3vk-L2Hs(qPp{;#FO&q?PP?)PoX)G71w5tjc9 z#HqaeI}=Dt^Gmlf@m_J&W3n{hbOB4nbPIFD-}7?3EPVB@wYoR;@z;A>y^eQM9@xwV z$qVaM(Fau{gaJp$(~==;?$d&w{M#P#u#`VLMOnW7qQFJHb=-82R;&`g@c13DqA@w9 zwbEpNpYq&|?~S7+Zh1>x_47;f9PB;)T(A|>t}elTveC!6hc3H;9^^%r!yf+o*g1v4 zs*76g-?}>FP`CA`BHUgU|Jc#;B@B7uc^`BY6}{HzQLW+=%^X@k$HXLH+E8c5os=_d zf1VAu*!=*Z0Bz|-6hZj%5Z^VRFslt%>m3|uR(TKkgV|CHw?gr0?g1dXgRh z&(hc|u@ocX3Z$;gz^;=^f5YLpC}4{nsKgsynLvi9Qq8e%Tf1@l%9eKMLOw5!^0~PM zX3sZrru4)Z1%FCu)sHN`Y4paQmEySmHP4M1|Dfb#c3@Jh0wGe;`AVX&h{0IT>+wO| zw?3<%30vrt<-Pw|*7d0}`KmZGNg`w_?IGReTl)UXsFdDRV;O_#M3bVV;ZAVhR=<*y zZC@M(Ug%Sg3BWxzjk5*@v@GME4pPOeOAJ!FbLi|sQVrOmizwT(zM|T7f}qCx{@eEP zlCJ^9+qlZ}&NuEJ(UfO>nJod{#KnvhaTiiyrlOyc7Hl4B5Zo5Rji}pj;Yw<=t$KL0k;#b9$s_mE$nN~O@Wb1*cr98ID?-z zU@f`!Ssm8$F7bB_V@-+#u3aBL5mX!E*a*!Nxnol3`~M2h(nC*4ET)Ula6rxA$yKOX&B&YFUsK?nhQ%FxD_{-C+3|2NzixJaJ@k3TSJ zd{b|>gzEU`9t@cCK;!53`x<2moG)ar_jKOlH9n2r|RcE4Yv@tf01QkE6%VAZuwSXe$W; z1kk5}&@XJj&;Xnm153A+S(=b8qrf$1U9al4lmb0A5emzuk!cw-hd6WyP9x&Cc&$sV z#&6-bWS+0S;*;|0{>@pIt@Kvwq@w#f03c^US6*7J>!-0QUvrC;xhJ-6Zr#Q3`dV9qM^Od^%M%YxBbV$Y z9TlFp2%QGb=ho7fk4vpRFntN;WY7rx2@cv2+U7Dt8#~|7BN`>0rdyXckMgCVcdv9* zLe&)$J{JEr+03P<{6O&U>-=~|RZ$nc^av^F$AzM8(B1$2?Ryx5YM)|uP64R;MW;kP zYP_9Y$^r#uGcGonRO)!maP-RzP4u1HG~@+&LQeMlqbJwkz>9UIzfw1JpV;zj&ob?4 zlBlV+JVsR_wEH^V6%hb$bQ6RXlI$gIL10;poJ&c9&b%xWWC-@J>IFi9STB zfZ=10-Uit8oFG*?KLmu|&<|_d6I&c7u(W{(cR&ZoPc3CX#hYNgwXYt$xsi#S+j5>3 z`q0dzFy_⪙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 literal 0 HcmV?d00001 diff --git a/packages/global/common/system/types/index.d.ts b/packages/global/common/system/types/index.d.ts index fa5bc8a7f..4fd196276 100644 --- a/packages/global/common/system/types/index.d.ts +++ b/packages/global/common/system/types/index.d.ts @@ -130,10 +130,12 @@ export type FastGPTFeConfigsType = { export type SystemEnvType = { openapiPrefix?: string; + tokenWorkers: number; // token count max worker + + datasetParseMaxProcess: number; vectorMaxProcess: number; qaMaxProcess: number; vlmMaxProcess: number; - tokenWorkers: number; // token count max worker hnswEfSearch: number; hnswMaxScanTuples: number; diff --git a/packages/global/core/app/constants.ts b/packages/global/core/app/constants.ts index 92216c8f6..e44d1fedf 100644 --- a/packages/global/core/app/constants.ts +++ b/packages/global/core/app/constants.ts @@ -11,10 +11,13 @@ export enum AppTypeEnum { simple = 'simple', workflow = 'advanced', plugin = 'plugin', - httpPlugin = 'httpPlugin', - toolSet = 'toolSet', + toolSet = 'toolSet', // 'mcp' + httpToolSet = 'httpToolSet', tool = 'tool', - hidden = 'hidden' + hidden = 'hidden', + + // deprecated + httpPlugin = 'httpPlugin' } export const AppFolderTypeList = [AppTypeEnum.folder, AppTypeEnum.httpPlugin]; diff --git a/packages/global/core/app/httpPlugin/utils.ts b/packages/global/core/app/httpPlugin/utils.ts deleted file mode 100644 index d69967ed3..000000000 --- a/packages/global/core/app/httpPlugin/utils.ts +++ /dev/null @@ -1,390 +0,0 @@ -import { getNanoid } from '../../../common/string/tools'; -import { type OpenApiJsonSchema } from './type'; -import yaml from 'js-yaml'; -import type { OpenAPIV3 } from 'openapi-types'; -import { type FlowNodeInputItemType, type FlowNodeOutputItemType } from '../../workflow/type/io'; -import { FlowNodeInputTypeEnum, FlowNodeOutputTypeEnum } from '../../workflow/node/constant'; -import { WorkflowIOValueTypeEnum } from '../../workflow/constants'; -import { PluginInputModule } from '../../workflow/template/system/pluginInput'; -import { PluginOutputModule } from '../../workflow/template/system/pluginOutput'; -import { HttpNode468 } from '../../workflow/template/system/http468'; -import { type HttpParamAndHeaderItemType } from '../../workflow/type/io'; -import { type StoreNodeItemType } from '../../workflow/type/node'; -import { HttpImgUrl } from '../../../common/file/image/constants'; -import SwaggerParser from '@apidevtools/swagger-parser'; -import { getHandleId } from '../../workflow/utils'; -import { type CreateHttpPluginChildrenPros } from '../controller'; -import { AppTypeEnum } from '../constants'; -import type { StoreEdgeItemType } from '../../workflow/type/edge'; - -export const str2OpenApiSchema = async (yamlStr = ''): Promise => { - try { - const data = (() => { - try { - return JSON.parse(yamlStr); - } catch (jsonError) { - return yaml.load(yamlStr, { schema: yaml.FAILSAFE_SCHEMA }); - } - })(); - const jsonSchema = (await SwaggerParser.parse(data)) as OpenAPIV3.Document; - - const serverPath = jsonSchema.servers?.[0].url || ''; - const pathData = Object.keys(jsonSchema.paths) - .map((path) => { - const methodData: any = data.paths[path]; - return Object.keys(methodData) - .filter((method) => - ['get', 'post', 'put', 'delete', 'patch'].includes(method.toLocaleLowerCase()) - ) - .map((method) => { - const methodInfo = methodData[method]; - if (methodInfo.deprecated) return; - const result = { - path, - method, - name: methodInfo.operationId || path, - description: methodInfo.description || methodInfo.summary, - params: methodInfo.parameters, - request: methodInfo?.requestBody, - response: methodInfo.responses - }; - return result; - }); - }) - .flat() - .filter(Boolean) as OpenApiJsonSchema['pathData']; - return { pathData, serverPath }; - } catch (err) { - throw new Error('Invalid Schema'); - } -}; - -export const getType = (schema: { type: string; items?: { type: string } }) => { - const typeMap: { [key: string]: WorkflowIOValueTypeEnum } = { - string: WorkflowIOValueTypeEnum.arrayString, - number: WorkflowIOValueTypeEnum.arrayNumber, - integer: WorkflowIOValueTypeEnum.arrayNumber, - boolean: WorkflowIOValueTypeEnum.arrayBoolean, - object: WorkflowIOValueTypeEnum.arrayObject - }; - - if (schema?.type === 'integer') { - return WorkflowIOValueTypeEnum.number; - } - - if (schema?.type === 'array' && schema?.items) { - const itemType = typeMap[schema.items.type]; - if (itemType) { - return itemType; - } - } - - return schema?.type as WorkflowIOValueTypeEnum; -}; - -export const httpApiSchema2Plugins = async ({ - parentId, - apiSchemaStr = '', - customHeader = '' -}: { - parentId: string; - apiSchemaStr?: string; - customHeader?: string; -}): Promise => { - const jsonSchema = await str2OpenApiSchema(apiSchemaStr); - - const baseUrl = jsonSchema.serverPath; - - return jsonSchema.pathData.map((item) => { - const pluginOutputId = getNanoid(); - const httpId = getNanoid(); - const pluginInputId = getNanoid(); - const inputIdMap = new Map(); - - const pluginOutputKey = 'result'; - - const properties = item.request?.content?.['application/json']?.schema?.properties; - const propsKeys = properties ? Object.keys(properties) : []; - - const pluginInputs: FlowNodeInputItemType[] = [ - ...(item.params?.map((param: any) => { - return { - key: param.name, - valueType: getType(param.schema), - label: param.name, - renderTypeList: [FlowNodeInputTypeEnum.reference], - required: param.required, - description: param.description, - toolDescription: param.description, - canEdit: true - }; - }) || []), - ...(propsKeys?.map((key) => { - const prop = properties[key]; - return { - key, - valueType: getType(prop), - label: key, - renderTypeList: [FlowNodeInputTypeEnum.reference], - required: false, - description: prop.description, - toolDescription: prop.description, - canEdit: true - }; - }) || []) - ]; - - const pluginOutputs: FlowNodeOutputItemType[] = [ - ...(item.params?.map((param: any) => { - const id = getNanoid(); - inputIdMap.set(param.name, id); - return { - id, - key: param.name, - valueType: getType(param.schema), - label: param.name, - type: FlowNodeOutputTypeEnum.source - }; - }) || []), - ...(propsKeys?.map((key) => { - const id = getNanoid(); - inputIdMap.set(key, id); - return { - id, - key, - valueType: getType(properties[key]), - label: key, - type: FlowNodeOutputTypeEnum.source, - edit: true - }; - }) || []) - ]; - - const httpInputs: FlowNodeInputItemType[] = [ - ...(item.params?.map((param: any) => { - return { - key: param.name, - valueType: getType(param.schema), - label: param.name, - renderTypeList: [FlowNodeInputTypeEnum.reference], - canEdit: true, - value: [pluginInputId, inputIdMap.get(param.name)] - }; - }) || []), - ...(propsKeys?.map((key) => { - return { - key, - valueType: getType(properties[key]), - label: key, - renderTypeList: [FlowNodeInputTypeEnum.reference], - canEdit: true, - value: [pluginInputId, inputIdMap.get(key)] - }; - }) || []) - ]; - - /* http node setting */ - const httpNodeParams: HttpParamAndHeaderItemType[] = []; - const httpNodeHeaders: HttpParamAndHeaderItemType[] = []; - let httpNodeBody = '{}'; - const requestUrl = `${baseUrl}${item.path}`; - - if (item.params && item.params.length > 0) { - for (const param of item.params) { - if (param.in === 'header') { - httpNodeHeaders.push({ - key: param.name, - type: getType(param.schema) || WorkflowIOValueTypeEnum.string, - value: `{{${param.name}}}` - }); - } else if (param.in === 'body') { - httpNodeBody = JSON.stringify( - { ...JSON.parse(httpNodeBody), [param.name]: `{{${param.name}}}` }, - null, - 2 - ); - } else if (param.in === 'query') { - httpNodeParams.push({ - key: param.name, - type: getType(param.schema) || WorkflowIOValueTypeEnum.string, - value: `{{${param.name}}}` - }); - } - } - } - if (item.request) { - const properties = item.request?.content?.['application/json']?.schema?.properties || {}; - const keys = Object.keys(properties); - if (keys.length > 0) { - httpNodeBody = JSON.stringify( - keys.reduce((acc: any, key) => { - acc[key] = `{{${key}}}`; - return acc; - }, {}), - null, - 2 - ); - } - } - if (customHeader) { - const headersObj = (() => { - try { - return JSON.parse(customHeader) as Record; - } catch (err) { - return {}; - } - })(); - for (const key in headersObj) { - httpNodeHeaders.push({ - key, - type: WorkflowIOValueTypeEnum.string, - // @ts-ignore - value: headersObj[key] - }); - } - } - - /* Combine complete modules */ - const nodes: StoreNodeItemType[] = [ - { - nodeId: pluginInputId, - name: PluginInputModule.name, - intro: PluginInputModule.intro, - avatar: PluginInputModule.avatar, - flowNodeType: PluginInputModule.flowNodeType, - showStatus: PluginInputModule.showStatus, - position: { - x: 473.55206291900333, - y: -145.65080850146154 - }, - version: PluginInputModule.version, - inputs: pluginInputs, - outputs: pluginOutputs - }, - { - nodeId: pluginOutputId, - name: PluginOutputModule.name, - intro: PluginOutputModule.intro, - avatar: PluginOutputModule.avatar, - flowNodeType: PluginOutputModule.flowNodeType, - showStatus: PluginOutputModule.showStatus, - position: { - x: 1847.5956872650024, - y: 5.114324648101558 - }, - version: PluginOutputModule.version, - inputs: [ - { - key: pluginOutputKey, - valueType: WorkflowIOValueTypeEnum.string, - label: pluginOutputKey, - renderTypeList: [FlowNodeInputTypeEnum.reference], - required: false, - description: '', - canEdit: true, - value: [httpId, 'httpRawResponse'] - } - ], - outputs: [ - { - id: pluginOutputId, - key: pluginOutputKey, - valueType: WorkflowIOValueTypeEnum.string, - label: pluginOutputKey, - type: FlowNodeOutputTypeEnum.static - } - ] - }, - { - nodeId: httpId, - name: HttpNode468.name, - intro: HttpNode468.intro, - avatar: HttpNode468.avatar, - flowNodeType: HttpNode468.flowNodeType, - showStatus: true, - position: { - x: 1188.947986995841, - y: -473.52694296182904 - }, - version: HttpNode468.version, - inputs: [ - HttpNode468.inputs[0], - ...httpInputs, - { - key: 'system_httpMethod', - renderTypeList: [FlowNodeInputTypeEnum.custom], - valueType: WorkflowIOValueTypeEnum.string, - label: '', - value: item.method.toUpperCase(), - required: true - }, - { - key: 'system_httpReqUrl', - renderTypeList: [FlowNodeInputTypeEnum.hidden], - valueType: WorkflowIOValueTypeEnum.string, - label: '', - description: 'core.module.input.description.Http Request Url', - placeholder: 'https://api.ai.com/getInventory', - required: false, - value: requestUrl - }, - { - key: 'system_httpHeader', - renderTypeList: [FlowNodeInputTypeEnum.custom], - valueType: WorkflowIOValueTypeEnum.any, - value: httpNodeHeaders, - label: '', - description: 'core.module.input.description.Http Request Header', - placeholder: 'core.module.input.description.Http Request Header', - required: false - }, - { - key: 'system_httpParams', - renderTypeList: [FlowNodeInputTypeEnum.hidden], - valueType: WorkflowIOValueTypeEnum.any, - value: httpNodeParams, - label: '', - required: false - }, - { - key: 'system_httpJsonBody', - renderTypeList: [FlowNodeInputTypeEnum.hidden], - valueType: WorkflowIOValueTypeEnum.any, - value: httpNodeBody, - label: '', - required: false - } - ], - outputs: HttpNode468.outputs - } - ]; - - const edges: StoreEdgeItemType[] = [ - { - source: pluginInputId, - target: httpId, - sourceHandle: getHandleId(pluginInputId, 'source', 'right'), - targetHandle: getHandleId(httpId, 'target', 'left') - }, - { - source: httpId, - target: pluginOutputId, - sourceHandle: getHandleId(httpId, 'source', 'right'), - targetHandle: getHandleId(pluginOutputId, 'target', 'left') - } - ]; - - return { - name: item.name, - avatar: HttpImgUrl, - intro: item.description, - parentId, - type: AppTypeEnum.plugin, - modules: nodes, - edges, - pluginData: { - pluginUniId: item.name - } - }; - }); -}; diff --git a/packages/global/core/app/httpPlugin/type.d.ts b/packages/global/core/app/httpTools/type.d.ts similarity index 88% rename from packages/global/core/app/httpPlugin/type.d.ts rename to packages/global/core/app/httpTools/type.d.ts index f8494334e..be3dd4eb9 100644 --- a/packages/global/core/app/httpPlugin/type.d.ts +++ b/packages/global/core/app/httpTools/type.d.ts @@ -1,4 +1,4 @@ -export type PathDataType = { +type PathDataType = { name: string; description: string; method: string; diff --git a/packages/global/core/app/httpTools/utils.ts b/packages/global/core/app/httpTools/utils.ts new file mode 100644 index 000000000..329e5ce7b --- /dev/null +++ b/packages/global/core/app/httpTools/utils.ts @@ -0,0 +1,174 @@ +import { getNanoid } from '../../../common/string/tools'; +import type { PathDataType } from './type'; +import { type RuntimeNodeItemType } from '../../workflow/runtime/type'; +import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../workflow/node/constant'; +import { type HttpToolConfigType } from '../type'; +import { PluginSourceEnum } from '../plugin/constants'; +import { jsonSchema2NodeInput, jsonSchema2NodeOutput } from '../jsonschema'; +import { type StoreSecretValueType } from '../../../common/secret/type'; +import { type JsonSchemaPropertiesItemType } from '../jsonschema'; +import { NodeOutputKeyEnum, WorkflowIOValueTypeEnum } from '../../workflow/constants'; +import { i18nT } from '../../../../web/i18n/utils'; + +export const getHTTPToolSetRuntimeNode = ({ + name, + avatar, + baseUrl = '', + customHeaders = '', + apiSchemaStr = '', + toolList = [], + headerSecret +}: { + name?: string; + avatar?: string; + baseUrl?: string; + customHeaders?: string; + apiSchemaStr?: string; + toolList?: HttpToolConfigType[]; + headerSecret?: StoreSecretValueType; +}): RuntimeNodeItemType => { + return { + nodeId: getNanoid(16), + flowNodeType: FlowNodeTypeEnum.toolSet, + avatar, + intro: 'HTTP Tools', + toolConfig: { + httpToolSet: { + baseUrl, + toolList, + headerSecret, + customHeaders, + apiSchemaStr, + toolId: '' + } + }, + inputs: [], + outputs: [], + name: name || '', + version: '' + }; +}; + +export const getHTTPToolRuntimeNode = ({ + tool, + nodeId, + avatar = 'core/app/type/httpToolsFill', + parentId +}: { + tool: Omit; + nodeId?: string; + avatar?: string; + parentId: string; +}): RuntimeNodeItemType => { + return { + nodeId: nodeId || getNanoid(16), + flowNodeType: FlowNodeTypeEnum.tool, + avatar, + intro: tool.description, + toolConfig: { + httpTool: { + toolId: `${PluginSourceEnum.http}-${parentId}/${tool.name}` + } + }, + inputs: jsonSchema2NodeInput(tool.inputSchema), + outputs: [ + ...jsonSchema2NodeOutput(tool.outputSchema), + { + id: NodeOutputKeyEnum.rawResponse, + key: NodeOutputKeyEnum.rawResponse, + required: true, + label: i18nT('workflow:raw_response'), + description: i18nT('workflow:tool_raw_response_description'), + valueType: WorkflowIOValueTypeEnum.any, + type: FlowNodeOutputTypeEnum.static + } + ], + name: tool.name, + version: '' + }; +}; + +export const pathData2ToolList = async ( + pathData: PathDataType[] +): Promise => { + try { + return pathData.map((pathItem) => { + const inputProperties: Record = {}; + const inputRequired: string[] = []; + const outputProperties: Record = {}; + const outputRequired: string[] = []; + + if (pathItem.params && Array.isArray(pathItem.params)) { + pathItem.params.forEach((param) => { + if (param.name && param.schema) { + inputProperties[param.name] = { + type: param.schema.type || 'any', + description: param.description || '' + }; + + if (param.required) { + inputRequired.push(param.name); + } + } + }); + } + if (pathItem.request?.content?.['application/json']?.schema) { + const requestSchema = pathItem.request.content['application/json'].schema; + + if (requestSchema.properties) { + Object.entries(requestSchema.properties).forEach(([key, value]: [string, any]) => { + inputProperties[key] = { + type: value.type || 'any', + description: value.description || '' + }; + }); + } + + if (requestSchema.required && Array.isArray(requestSchema.required)) { + inputRequired.push(...requestSchema.required); + } + } + + const responseToProcess = + pathItem.response?.['200'] || + pathItem.response?.['201'] || + pathItem.response?.['202'] || + pathItem.response?.default; + + if (responseToProcess?.content?.['application/json']?.schema) { + const responseSchema = responseToProcess.content['application/json'].schema; + if (responseSchema.properties) { + Object.entries(responseSchema.properties).forEach(([key, value]: [string, any]) => { + outputProperties[key] = { + type: value.type || 'any', + description: value.description || '' + }; + }); + } + if (responseSchema.required && Array.isArray(responseSchema.required)) { + outputRequired.push(...responseSchema.required); + } + } + + return { + name: pathItem.name, + description: pathItem.description || pathItem.name, + path: pathItem.path, + method: pathItem.method?.toLowerCase(), + inputSchema: { + type: 'object', + properties: inputProperties, + required: inputRequired + }, + outputSchema: { + type: 'object', + properties: outputProperties, + required: outputRequired + } + }; + }); + } catch (error) { + console.error('Error converting API schema to tool list:', error); + return []; + } +}; diff --git a/packages/global/core/app/jsonschema.ts b/packages/global/core/app/jsonschema.ts index ac28f7367..18836a3f8 100644 --- a/packages/global/core/app/jsonschema.ts +++ b/packages/global/core/app/jsonschema.ts @@ -1,10 +1,15 @@ import { WorkflowIOValueTypeEnum } from '../workflow/constants'; -import { FlowNodeInputTypeEnum } from '../workflow/node/constant'; -import type { FlowNodeInputItemType } from '../workflow/type/io'; +import { FlowNodeInputTypeEnum, FlowNodeOutputTypeEnum } from '../workflow/node/constant'; +import type { FlowNodeInputItemType, FlowNodeOutputItemType } from '../workflow/type/io'; +import SwaggerParser from '@apidevtools/swagger-parser'; +import yaml from 'js-yaml'; +import type { OpenAPIV3 } from 'openapi-types'; +import type { OpenApiJsonSchema } from './httpTools/type'; type SchemaInputValueType = 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object'; export type JsonSchemaPropertiesItemType = { description?: string; + 'x-tool-description'?: string; type: SchemaInputValueType; enum?: string[]; minimum?: number; @@ -16,6 +21,11 @@ export type JSONSchemaInputType = { properties?: Record; required?: string[]; }; +export type JSONSchemaOutputType = { + type: SchemaInputValueType; + properties?: Record; + required?: string[]; +}; export const getNodeInputTypeFromSchemaInputType = ({ type, @@ -79,8 +89,119 @@ export const jsonSchema2NodeInput = (jsonSchema: JSONSchemaInputType): FlowNodeI label: key, valueType: getNodeInputTypeFromSchemaInputType({ type: value.type, arrayItems: value.items }), description: value.description, - toolDescription: value.description || key, + toolDescription: value['x-tool-description'] ?? value.description ?? key, required: jsonSchema?.required?.includes(key), ...getNodeInputRenderTypeFromSchemaInputType(value) })); }; +export const jsonSchema2NodeOutput = ( + jsonSchema: JSONSchemaOutputType +): FlowNodeOutputItemType[] => { + return Object.entries(jsonSchema?.properties || {}).map(([key, value]) => ({ + id: key, + key, + label: key, + required: jsonSchema?.required?.includes(key), + type: FlowNodeOutputTypeEnum.static, + valueType: getNodeInputTypeFromSchemaInputType({ type: value.type, arrayItems: value.items }), + description: value.description, + toolDescription: value['x-tool-description'] ?? value.description ?? key + })); +}; +export const str2OpenApiSchema = async (yamlStr = ''): Promise => { + try { + const data = (() => { + try { + return JSON.parse(yamlStr); + } catch (jsonError) { + return yaml.load(yamlStr, { schema: yaml.FAILSAFE_SCHEMA }); + } + })(); + const jsonSchema = (await SwaggerParser.dereference(data)) as OpenAPIV3.Document; + + const serverPath = (() => { + if (jsonSchema.servers && jsonSchema.servers.length > 0) { + return jsonSchema.servers[0].url || ''; + } + if (data.host || data.basePath) { + const scheme = data.schemes && data.schemes.length > 0 ? data.schemes[0] : 'https'; + const host = data.host || ''; + const basePath = data.basePath || ''; + return `${scheme}://${host}${basePath}`; + } + return ''; + })(); + + const pathData = Object.keys(jsonSchema.paths) + .map((path) => { + const methodData: any = jsonSchema.paths[path]; + return Object.keys(methodData) + .filter((method) => + ['get', 'post', 'put', 'delete', 'patch'].includes(method.toLocaleLowerCase()) + ) + .map((method) => { + const methodInfo = methodData[method]; + if (methodInfo.deprecated) return; + + const requestBody = (() => { + if (methodInfo?.requestBody) { + return methodInfo.requestBody; + } + if (methodInfo.parameters) { + const bodyParam = methodInfo.parameters.find( + (param: OpenAPIV3.ParameterObject) => param.in === 'body' + ); + if (bodyParam) { + return { + content: { + 'application/json': { + schema: bodyParam.schema + } + } + }; + } + } + return undefined; + })(); + + const result = { + path, + method, + name: methodInfo.operationId || path, + description: methodInfo.description || methodInfo.summary, + params: methodInfo.parameters, + request: requestBody, + response: methodInfo.responses + }; + return result; + }); + }) + .flat() + .filter(Boolean) as OpenApiJsonSchema['pathData']; + return { pathData, serverPath }; + } catch (err) { + throw new Error('Invalid Schema'); + } +}; +export const getSchemaValueType = (schema: { type: string; items?: { type: string } }) => { + const typeMap: { [key: string]: WorkflowIOValueTypeEnum } = { + string: WorkflowIOValueTypeEnum.arrayString, + number: WorkflowIOValueTypeEnum.arrayNumber, + integer: WorkflowIOValueTypeEnum.arrayNumber, + boolean: WorkflowIOValueTypeEnum.arrayBoolean, + object: WorkflowIOValueTypeEnum.arrayObject + }; + + if (schema?.type === 'integer') { + return WorkflowIOValueTypeEnum.number; + } + + if (schema?.type === 'array' && schema?.items) { + const itemType = typeMap[schema.items.type]; + if (itemType) { + return itemType; + } + } + + return schema?.type as WorkflowIOValueTypeEnum; +}; diff --git a/packages/global/core/app/mcpTools/utils.ts b/packages/global/core/app/mcpTools/utils.ts index 38e24c311..9d387081e 100644 --- a/packages/global/core/app/mcpTools/utils.ts +++ b/packages/global/core/app/mcpTools/utils.ts @@ -1,14 +1,6 @@ -import { - NodeInputKeyEnum, - NodeOutputKeyEnum, - WorkflowIOValueTypeEnum -} from '../../workflow/constants'; +import { NodeOutputKeyEnum, WorkflowIOValueTypeEnum } from '../../workflow/constants'; import { i18nT } from '../../../../web/i18n/utils'; -import { - FlowNodeInputTypeEnum, - FlowNodeOutputTypeEnum, - FlowNodeTypeEnum -} from '../../workflow/node/constant'; +import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../workflow/node/constant'; import { type McpToolConfigType } from '../type'; import { type RuntimeNodeItemType } from '../../workflow/runtime/type'; import { type StoreSecretValueType } from '../../../common/secret/type'; diff --git a/packages/global/core/app/plugin/constants.ts b/packages/global/core/app/plugin/constants.ts index 56f44a0db..3dc350f9f 100644 --- a/packages/global/core/app/plugin/constants.ts +++ b/packages/global/core/app/plugin/constants.ts @@ -3,6 +3,7 @@ export enum PluginSourceEnum { systemTool = 'systemTool', // FastGPT-plugin tools, pure code. commercial = 'commercial', // configured in Pro, with associatedPluginId. Specially, commercial-dalle3 is a systemTool mcp = 'mcp', // mcp + http = 'http', // http // @deprecated community = 'community' // this is deprecated, will be replaced by systemTool } diff --git a/packages/global/core/app/plugin/type.d.ts b/packages/global/core/app/plugin/type.d.ts index 807e15a4d..1849beef7 100644 --- a/packages/global/core/app/plugin/type.d.ts +++ b/packages/global/core/app/plugin/type.d.ts @@ -56,6 +56,9 @@ export type SystemPluginTemplateItemType = WorkflowTemplateType & { inputList?: FlowNodeInputItemType['inputList']; inputListVal?: Record; hasSystemSecret?: boolean; + + // Plugin source type + toolSource?: 'uploaded' | 'built-in'; }; export type SystemPluginTemplateListItemType = Omit< diff --git a/packages/global/core/app/plugin/utils.ts b/packages/global/core/app/plugin/utils.ts index 8b6088639..a7301eff2 100644 --- a/packages/global/core/app/plugin/utils.ts +++ b/packages/global/core/app/plugin/utils.ts @@ -60,5 +60,11 @@ export function splitCombinePluginId(id: string) { pluginId }; } + if (source === 'http') { + return { + source: PluginSourceEnum.http, + pluginId + }; + } return { source, pluginId: id }; } diff --git a/packages/global/core/app/type.d.ts b/packages/global/core/app/type.d.ts index f0fb3666a..017dff7d7 100644 --- a/packages/global/core/app/type.d.ts +++ b/packages/global/core/app/type.d.ts @@ -15,7 +15,7 @@ import type { ParentIdType } from '../../common/parentFolder/type'; import { FlowNodeInputTypeEnum } from '../../core/workflow/node/constant'; import type { WorkflowTemplateBasicType } from '@fastgpt/global/core/workflow/type'; import type { SourceMemberType } from '../../support/user/type'; -import type { JSONSchemaInputType } from './jsonschema'; +import type { JSONSchemaInputType, JSONSchemaOutputType } from './jsonschema'; export type AppSchema = { _id: string; @@ -120,6 +120,15 @@ export type McpToolConfigType = { inputSchema: JSONSchemaInputType; }; +export type HttpToolConfigType = { + name: string; + description: string; + inputSchema: JSONSchemaInputType; + outputSchema: JSONSchemaOutputType; + path: string; + method: string; +}; + /* app chat config type */ export type AppChatConfigType = { welcomeText?: string; diff --git a/packages/global/core/chat/type.d.ts b/packages/global/core/chat/type.d.ts index df10bd3fd..3a69f7d91 100644 --- a/packages/global/core/chat/type.d.ts +++ b/packages/global/core/chat/type.d.ts @@ -20,6 +20,7 @@ import type { WorkflowInteractiveResponseType } from '../workflow/template/syste import type { FlowNodeInputItemType } from '../workflow/type/io'; import type { FlowNodeTemplateType } from '../workflow/type/node.d'; +/* --------- chat ---------- */ export type ChatSchemaType = { _id: string; chatId: string; @@ -49,6 +50,7 @@ export type ChatWithAppSchema = Omit & { appId: AppSchema; }; +/* --------- chat item ---------- */ export type UserChatItemValueItemType = { type: ChatItemValueTypeEnum.text | ChatItemValueTypeEnum.file; text?: { @@ -65,6 +67,7 @@ export type UserChatItemType = { value: UserChatItemValueItemType[]; hideInUI?: boolean; }; + export type SystemChatItemValueItemType = { type: ChatItemValueTypeEnum.text; text?: { @@ -92,7 +95,6 @@ export type AIChatItemValueItemType = { tools?: ToolModuleResponseItemType[]; interactive?: WorkflowInteractiveResponseType; }; - export type AIChatItemType = { obj: ChatRoleEnum.AI; value: AIChatItemValueItemType[]; @@ -101,14 +103,22 @@ export type AIChatItemType = { userBadFeedback?: string; customFeedbacks?: string[]; adminFeedback?: AdminFbkType; + + durationSeconds?: number; + errorMsg?: string; + citeCollectionIds?: string[]; + + // @deprecated 不再存储在 chatItemSchema 里,分别存储到 chatItemResponseSchema [DispatchNodeResponseKeyEnum.nodeResponse]?: ChatHistoryItemResType[]; }; + export type ChatItemValueItemType = | UserChatItemValueItemType | SystemChatItemValueItemType | AIChatItemValueItemType; +export type ChatItemMergeType = UserChatItemType | SystemChatItemType | AIChatItemType; -export type ChatItemSchema = (UserChatItemType | SystemChatItemType | AIChatItemType) & { +export type ChatItemSchema = ChatItemMergeType & { dataId: string; chatId: string; userId: string; @@ -116,8 +126,6 @@ export type ChatItemSchema = (UserChatItemType | SystemChatItemType | AIChatItem tmbId: string; appId: string; time: Date; - durationSeconds?: number; - errorMsg?: string; }; export type AdminFbkType = { @@ -128,7 +136,6 @@ export type AdminFbkType = { a?: string; }; -/* --------- chat item ---------- */ export type ResponseTagItemType = { totalQuoteList?: SearchDataResponseItemType[]; llmModuleAccount?: number; @@ -136,12 +143,12 @@ export type ResponseTagItemType = { toolCiteLinks?: ToolCiteLinksType[]; }; -export type ChatItemType = (UserChatItemType | SystemChatItemType | AIChatItemType) & { +export type ChatItemType = ChatItemMergeType & { dataId?: string; } & ResponseTagItemType; // Frontend type -export type ChatSiteItemType = (UserChatItemType | SystemChatItemType | AIChatItemType) & { +export type ChatSiteItemType = ChatItemMergeType & { _id?: string; dataId: string; status: `${ChatStatusEnum}`; @@ -153,6 +160,16 @@ export type ChatSiteItemType = (UserChatItemType | SystemChatItemType | AIChatIt errorMsg?: string; } & ChatBoxInputType & ResponseTagItemType; + +/* --------- chat item response ---------- */ +export type ChatItemResponseSchemaType = { + teamId: string; + appId: string; + chatId: string; + chatItemDataId: string; + data: ChatHistoryItemResType; +}; + /* --------- team chat --------- */ export type ChatAppListSchema = { apps: AppType[]; diff --git a/packages/global/core/chat/utils.ts b/packages/global/core/chat/utils.ts index 56de24735..a3c4efd05 100644 --- a/packages/global/core/chat/utils.ts +++ b/packages/global/core/chat/utils.ts @@ -85,10 +85,10 @@ export const getHistoryPreview = ( // Filter workflow public response export const filterPublicNodeResponseData = ({ - flowResponses = [], + nodeRespones = [], responseDetail = false }: { - flowResponses?: ChatHistoryItemResType[]; + nodeRespones?: ChatHistoryItemResType[]; responseDetail?: boolean; }) => { const publicNodeMap: Record = { @@ -98,19 +98,28 @@ export const filterPublicNodeResponseData = ({ [FlowNodeTypeEnum.pluginOutput]: true }; - const filedList = responseDetail - ? ['quoteList', 'moduleType', 'pluginOutput', 'runningTime'] - : ['moduleType', 'pluginOutput', 'runningTime']; + const filedMap: Record = responseDetail + ? { + quoteList: true, + moduleType: true, + pluginOutput: true, + runningTime: true + } + : { + moduleType: true, + pluginOutput: true, + runningTime: true + }; - return flowResponses + return nodeRespones .filter((item) => publicNodeMap[item.moduleType]) .map((item) => { const obj: DispatchNodeResponseType = {}; for (let key in item) { if (key === 'toolDetail' || key === 'pluginDetail') { // @ts-ignore - obj[key] = filterPublicNodeResponseData({ flowResponses: item[key], responseDetail }); - } else if (filedList.includes(key)) { + obj[key] = filterPublicNodeResponseData({ nodeRespones: item[key], responseDetail }); + } else if (filedMap[key]) { // @ts-ignore obj[key] = item[key]; } @@ -211,38 +220,32 @@ export const mergeChatResponseData = ( return item; }); - let lastResponse: ChatHistoryItemResType | undefined = undefined; - let hasMerged = false; + const result: ChatHistoryItemResType[] = []; + const mergeMap = new Map(); // mergeSignId -> result index - const firstPassResult = responseWithMergedPlugins.reduce( - (acc, curr) => { - if ( - lastResponse && - lastResponse.mergeSignId && - curr.mergeSignId === lastResponse.mergeSignId - ) { - const concatResponse: ChatHistoryItemResType = { - ...curr, - runningTime: +((lastResponse.runningTime || 0) + (curr.runningTime || 0)).toFixed(2), - totalPoints: (lastResponse.totalPoints || 0) + (curr.totalPoints || 0), - childTotalPoints: (lastResponse.childTotalPoints || 0) + (curr.childTotalPoints || 0), - toolDetail: [...(lastResponse.toolDetail || []), ...(curr.toolDetail || [])], - loopDetail: [...(lastResponse.loopDetail || []), ...(curr.loopDetail || [])], - pluginDetail: [...(lastResponse.pluginDetail || []), ...(curr.pluginDetail || [])] - }; - hasMerged = true; - return [...acc.slice(0, -1), concatResponse]; - } else { - lastResponse = curr; - return [...acc, curr]; + for (const item of responseWithMergedPlugins) { + if (item.mergeSignId && mergeMap.has(item.mergeSignId)) { + // Merge with existing item + const existingIndex = mergeMap.get(item.mergeSignId)!; + const existing = result[existingIndex]; + + result[existingIndex] = { + ...item, + runningTime: +((existing.runningTime || 0) + (item.runningTime || 0)).toFixed(2), + totalPoints: (existing.totalPoints || 0) + (item.totalPoints || 0), + childTotalPoints: (existing.childTotalPoints || 0) + (item.childTotalPoints || 0), + toolDetail: [...(existing.toolDetail || []), ...(item.toolDetail || [])], + loopDetail: [...(existing.loopDetail || []), ...(item.loopDetail || [])], + pluginDetail: [...(existing.pluginDetail || []), ...(item.pluginDetail || [])] + }; + } else { + // Add new item + result.push(item); + if (item.mergeSignId) { + mergeMap.set(item.mergeSignId, result.length - 1); } - }, - [] - ); - - if (hasMerged && firstPassResult.length > 1) { - return mergeChatResponseData(firstPassResult); + } } - return firstPassResult; + return result; }; diff --git a/packages/global/core/workflow/runtime/type.d.ts b/packages/global/core/workflow/runtime/type.d.ts index 6eca00de6..31abaee7f 100644 --- a/packages/global/core/workflow/runtime/type.d.ts +++ b/packages/global/core/workflow/runtime/type.d.ts @@ -48,6 +48,7 @@ export type ChatDispatchProps = { id: string; // May be the id of the system plug-in (cannot be used directly to look up the table) teamId: string; tmbId: string; // App tmbId + name: string; isChildApp?: boolean; }; runningUserInfo: { @@ -78,6 +79,7 @@ export type ChatDispatchProps = { responseAllData?: boolean; responseDetail?: boolean; + usageId?: string; }; export type ModuleDispatchProps = ChatDispatchProps & { diff --git a/packages/global/core/workflow/template/system/http468.ts b/packages/global/core/workflow/template/system/http468.ts index 5c1412fdb..9e85e907b 100644 --- a/packages/global/core/workflow/template/system/http468.ts +++ b/packages/global/core/workflow/template/system/http468.ts @@ -36,7 +36,8 @@ export const HttpNode468: FlowNodeTemplateType = { selectValueTypeList: Object.values(WorkflowIOValueTypeEnum), showDescription: false, showDefaultValue: true - } + }, + deprecated: true }, { key: NodeInputKeyEnum.httpMethod, diff --git a/packages/global/core/workflow/template/system/interactive/type.d.ts b/packages/global/core/workflow/template/system/interactive/type.d.ts index 571ca1042..9fe0586ce 100644 --- a/packages/global/core/workflow/template/system/interactive/type.d.ts +++ b/packages/global/core/workflow/template/system/interactive/type.d.ts @@ -14,6 +14,8 @@ type InteractiveBasicType = { memoryMessages: ChatCompletionMessageParam[]; // 这轮工具中,产生的新的 messages toolCallId: string; // 记录对应 tool 的id,用于后续交互节点可以替换掉 tool 的 response }; + + usageId?: string; }; type InteractiveNodeType = { diff --git a/packages/global/core/workflow/type/node.d.ts b/packages/global/core/workflow/type/node.d.ts index 69a83353c..33656022d 100644 --- a/packages/global/core/workflow/type/node.d.ts +++ b/packages/global/core/workflow/type/node.d.ts @@ -19,7 +19,12 @@ import { ChatNodeUsageType } from '../../../support/wallet/bill/type'; import { RuntimeNodeItemType } from '../runtime/type'; import { RuntimeEdgeItemType, StoreEdgeItemType } from './edge'; import { NextApiResponse } from 'next'; -import type { AppDetailType, AppSchema, McpToolConfigType } from '../../app/type'; +import type { + AppDetailType, + AppSchema, + McpToolConfigType, + HttpToolConfigType +} from '../../app/type'; import type { ParentIdType } from 'common/parentFolder/type'; import { AppTypeEnum } from '../../app/constants'; import type { WorkflowInteractiveResponseType } from '../template/system/interactive/type'; @@ -46,6 +51,17 @@ export type NodeToolConfigType = { description: string; }[]; }; + httpToolSet?: { + toolId: string; + baseUrl: string; + toolList: HttpToolConfigType[]; + apiSchemaStr: string; + customHeaders: string; + headerSecret?: StoreSecretValueType; + }; + httpTool?: { + toolId: string; + }; }; export type FlowNodeCommonType = { @@ -142,6 +158,7 @@ export type NodeTemplateListItemType = { instructions?: string; // 使用说明 courseUrl?: string; // 教程链接 sourceMember?: SourceMember; + toolSource?: 'uploaded' | 'built-in'; // Plugin source type }; export type NodeTemplateListType = { diff --git a/packages/global/core/workflow/utils.ts b/packages/global/core/workflow/utils.ts index c5bd93296..b469c6da5 100644 --- a/packages/global/core/workflow/utils.ts +++ b/packages/global/core/workflow/utils.ts @@ -27,7 +27,8 @@ import type { ChatInputGuideConfigType, AppChatConfigType, AppAutoExecuteConfigType, - AppQGConfigType + AppQGConfigType, + AppSchema } from '../app/type'; import { type EditorVariablePickerType } from '../../../web/components/common/Textarea/PromptEditor/type'; import { @@ -441,3 +442,24 @@ export const getPluginRunUserQuery = ({ }) }; }; + +export const removeUnauthModels = async ({ + modules, + allowedModels = new Set() +}: { + modules: AppSchema['modules']; + allowedModels?: Set; +}) => { + if (modules) { + modules.forEach((module) => { + module.inputs.forEach((input) => { + if (input.key === 'model') { + if (!allowedModels.has(input.value)) { + input.value = undefined; + } + } + }); + }); + } + return modules; +}; diff --git a/packages/global/package.json b/packages/global/package.json index 75e16b2f6..9fdb0952c 100644 --- a/packages/global/package.json +++ b/packages/global/package.json @@ -2,7 +2,7 @@ "name": "@fastgpt/global", "version": "1.0.0", "dependencies": { - "@fastgpt-sdk/plugin": "^0.1.16", + "@fastgpt-sdk/plugin": "^0.1.19", "@apidevtools/swagger-parser": "^10.1.0", "@bany/curl-to-json": "^1.2.8", "axios": "^1.12.1", diff --git a/packages/global/support/permission/constant.ts b/packages/global/support/permission/constant.ts index de254f89b..d8c173bb8 100644 --- a/packages/global/support/permission/constant.ts +++ b/packages/global/support/permission/constant.ts @@ -49,7 +49,8 @@ export const PermissionTypeMap = { export enum PerResourceTypeEnum { team = 'team', app = 'app', - dataset = 'dataset' + dataset = 'dataset', + model = 'model' } /* new permission */ diff --git a/packages/global/support/permission/model/constant.ts b/packages/global/support/permission/model/constant.ts new file mode 100644 index 000000000..e4aeaf9ec --- /dev/null +++ b/packages/global/support/permission/model/constant.ts @@ -0,0 +1,11 @@ +import { + NullRoleVal, + CommonPerKeyEnum, + CommonRoleList, + CommonPerList, + CommonRoleKeyEnum +} from '../constant'; + +export const ModelDefaultRole = NullRoleVal; +export const ModelReadPerVal = CommonPerList[CommonPerKeyEnum.read]; +export const ModelReadRolVal = CommonRoleList[CommonRoleKeyEnum.read]; diff --git a/packages/global/support/permission/model/controller.ts b/packages/global/support/permission/model/controller.ts new file mode 100644 index 000000000..36cc347e1 --- /dev/null +++ b/packages/global/support/permission/model/controller.ts @@ -0,0 +1,3 @@ +import { Permission } from '../controller'; + +export class ModelPermission extends Permission {} diff --git a/packages/global/support/permission/type.ts b/packages/global/support/permission/type.ts index c1752210a..7a5e9ace6 100644 --- a/packages/global/support/permission/type.ts +++ b/packages/global/support/permission/type.ts @@ -1,8 +1,8 @@ import type { UserModelSchema } from '../user/type'; -import type { RequireOnlyOne } from '../../common/type/utils'; import type { TeamMemberSchema } from '../user/team/type'; import type { CommonRoleKeyEnum } from './constant'; import { type CommonPerKeyEnum, type PerResourceTypeEnum } from './constant'; +import type { CollaboratorIdType } from './collaborator'; // PermissionValueType, the type of permission's value is a number, which is a bit field actually. // It is spired by the permission system in Linux. @@ -63,11 +63,8 @@ export type ResourcePermissionType = { resourceType: ResourceType; permission: PermissionValueType; resourceId: string; -} & RequireOnlyOne<{ - tmbId: string; - groupId: string; - orgId: string; -}>; + resourceName: string; +} & CollaboratorIdType; export type ResourcePerWithTmbWithUser = Omit & { tmbId: TeamMemberSchema & { user: UserModelSchema }; diff --git a/packages/global/support/wallet/usage/api.d.ts b/packages/global/support/wallet/usage/api.d.ts index 72325c8e9..ffb1494e7 100644 --- a/packages/global/support/wallet/usage/api.d.ts +++ b/packages/global/support/wallet/usage/api.d.ts @@ -1,5 +1,5 @@ -import type { UsageSourceEnum } from './constants'; -import type { UsageListItemCountType, UsageListItemType } from './type'; +import type { UsageItemTypeEnum, UsageSourceEnum } from './constants'; +import type { UsageItemCountType, UsageItemType, UsageListItemType, UsageSchemaType } from './type'; export type CreateTrainingUsageProps = { name: string; @@ -22,21 +22,15 @@ export type GetUsageDashboardResponseItem = { totalPoints: number; }; -export type ConcatUsageProps = UsageListItemCountType & { +export type CreateUsageProps = Omit; +export type ConcatUsageProps = { teamId: string; - tmbId: string; - billId?: string; + usageId: string; totalPoints: number; - listIndex?: number; -}; - -export type CreateUsageProps = { + itemType: UsageItemTypeEnum; +} & UsageItemCountType; +export type PushUsageItemsProps = { teamId: string; - tmbId: string; - appName: string; - appId?: string; - pluginId?: string; - totalPoints: number; - source: `${UsageSourceEnum}`; - list: UsageListItemType[]; + usageId: string; + list: UsageItemType[]; }; diff --git a/packages/global/support/wallet/usage/constants.ts b/packages/global/support/wallet/usage/constants.ts index ac5581238..88122bc9f 100644 --- a/packages/global/support/wallet/usage/constants.ts +++ b/packages/global/support/wallet/usage/constants.ts @@ -14,7 +14,8 @@ export enum UsageSourceEnum { pdfParse = 'pdfParse', mcp = 'mcp', evaluation = 'evaluation', - optimize_prompt = 'optimize_prompt' + optimize_prompt = 'optimize_prompt', + code_copilot = 'code_copilot' } export const UsageSourceMap = { @@ -59,5 +60,20 @@ export const UsageSourceMap = { }, [UsageSourceEnum.optimize_prompt]: { label: i18nT('common:support.wallet.usage.Optimize Prompt') + }, + [UsageSourceEnum.code_copilot]: { + label: i18nT('common:support.wallet.usage.Code Copilot') } }; + +export enum UsageItemTypeEnum { + training_vector = 1, + training_qa = 2, + training_autoIndex = 3, + training_imageIndex = 4, + training_paragraph = 5, + training_imageParse = 6, + + evaluation_generateAnswer = 7, + evaluation_answerAccuracy = 8 +} diff --git a/packages/global/support/wallet/usage/type.d.ts b/packages/global/support/wallet/usage/type.d.ts index 56f4c59a8..5a9cd0199 100644 --- a/packages/global/support/wallet/usage/type.d.ts +++ b/packages/global/support/wallet/usage/type.d.ts @@ -1,8 +1,33 @@ import type { SourceMemberType } from '../../../support/user/type'; -import type { CreateUsageProps } from './api'; -import { UsageSourceEnum } from './constants'; +import type { UsageItemTypeEnum, UsageSourceEnum } from './constants'; -export type UsageListItemCountType = { +export type UsageSchemaType = { + _id: string; + time: Date; + + teamId: string; + tmbId: string; + appName: string; + appId?: string; + pluginId?: string; + totalPoints: number; + source: `${UsageSourceEnum}`; + + // @deprecated + list?: UsageItemType[]; +}; +export type UsageItemSchemaType = { + _id: string; + teamId: string; + usageId: string; + name: string; + amount: number; + time: Date; + itemType?: UsageItemTypeEnum; // Use in usage concat +} & UsageItemCountType; + +export type UsageItemCountType = { + model?: string; inputTokens?: number; outputTokens?: number; charsLength?: number; @@ -14,24 +39,18 @@ export type UsageListItemCountType = { tokens?: number; }; -export type UsageListItemType = UsageListItemCountType & { +export type UsageItemType = UsageItemCountType & { moduleName: string; amount: number; - model?: string; - count?: number; + itemType?: UsageItemTypeEnum; }; -export type UsageSchemaType = CreateUsageProps & { - _id: string; - time: Date; -}; - -export type UsageItemType = { +export type UsageListItemType = { id: string; time: Date; appName: string; source: UsageSchemaType['source']; totalPoints: number; - list: UsageSchemaType['list']; + list: Omit[]; sourceMember: SourceMemberType; }; diff --git a/packages/service/common/api/type.d.ts b/packages/service/common/api/type.d.ts index 09f596e00..04f9912e2 100644 --- a/packages/service/common/api/type.d.ts +++ b/packages/service/common/api/type.d.ts @@ -8,7 +8,11 @@ import type { SearchDatasetDataResponse } from '../../core/dataset/search/controller'; import type { AuthOpenApiLimitProps } from '../../support/openapi/auth'; -import type { CreateUsageProps, ConcatUsageProps } from '@fastgpt/global/support/wallet/usage/api'; +import type { + CreateUsageProps, + ConcatUsageProps, + PushUsageItemsProps +} from '@fastgpt/global/support/wallet/usage/api'; declare global { var textCensorHandler: (params: { text: string }) => Promise<{ code: number; message?: string }>; @@ -16,4 +20,5 @@ declare global { var authOpenApiHandler: (data: AuthOpenApiLimitProps) => Promise; var createUsageHandler: (data: CreateUsageProps) => any; var concatUsageHandler: (data: ConcatUsageProps) => any; + var pushUsageItemsHandler: (data: PushUsageItemsProps) => any; } diff --git a/packages/service/common/cache/index.ts b/packages/service/common/cache/index.ts new file mode 100644 index 000000000..546e649e5 --- /dev/null +++ b/packages/service/common/cache/index.ts @@ -0,0 +1,60 @@ +import './init'; +import { getGlobalRedisConnection } from '../../common/redis'; +import type { SystemCacheKeyEnum } from './type'; +import { randomUUID } from 'node:crypto'; +import { initCache } from './init'; + +const cachePrefix = `VERSION_KEY:`; + +/** + * + * @param key SystemCacheKeyEnum + * @param id string (teamId, tmbId, etc), if '*' is used, all keys will be refreshed + */ +export const refreshVersionKey = async (key: `${SystemCacheKeyEnum}`, id?: string | '*') => { + const redis = getGlobalRedisConnection(); + if (!global.systemCache) initCache(); + + const val = randomUUID(); + const versionKey = id ? `${cachePrefix}${key}:${id}` : `${cachePrefix}${key}`; + if (id === '*') { + const pattern = `${cachePrefix}${key}:*`; + const keys = await redis.keys(pattern); + if (keys.length > 0) { + await redis.del(keys); + } + } else { + await redis.set(versionKey, val); + } +}; + +export const getVersionKey = async (key: `${SystemCacheKeyEnum}`, id?: string) => { + const redis = getGlobalRedisConnection(); + if (!global.systemCache) initCache(); + + const versionKey = id ? `${cachePrefix}${key}:${id}` : `${cachePrefix}${key}`; + const val = await redis.get(versionKey); + if (val) return val; + + // if there is no val set to the key, init a new val. + const initVal = randomUUID(); + await redis.set(versionKey, initVal); + return initVal; +}; + +export const getCachedData = async (key: T, id?: string) => { + if (!global.systemCache) initCache(); + + const versionKey = await getVersionKey(key, id); + const isDisableCache = process.env.DISABLE_CACHE === 'true'; + + // 命中缓存 + if (global.systemCache[key].versionKey === versionKey && !isDisableCache) { + return global.systemCache[key].data; + } + + const refreshedData = await global.systemCache[key].refreshFunc(); + global.systemCache[key].data = refreshedData; + global.systemCache[key].versionKey = versionKey; + return global.systemCache[key].data; +}; diff --git a/packages/service/common/cache/init.ts b/packages/service/common/cache/init.ts new file mode 100644 index 000000000..a8a2696ac --- /dev/null +++ b/packages/service/common/cache/init.ts @@ -0,0 +1,17 @@ +import { SystemCacheKeyEnum } from './type'; +import { refreshSystemTools } from '../../core/app/plugin/controller'; + +export const initCache = () => { + global.systemCache = { + [SystemCacheKeyEnum.systemTool]: { + versionKey: '', + data: [], + refreshFunc: refreshSystemTools + }, + [SystemCacheKeyEnum.modelPermission]: { + versionKey: '', + data: null, + refreshFunc: () => Promise.resolve(null) + } + }; +}; diff --git a/packages/service/common/cache/type.ts b/packages/service/common/cache/type.ts new file mode 100644 index 000000000..6fbcfe42a --- /dev/null +++ b/packages/service/common/cache/type.ts @@ -0,0 +1,23 @@ +import type { SystemPluginTemplateItemType } from '@fastgpt/global/core/app/plugin/type'; + +export enum SystemCacheKeyEnum { + systemTool = 'systemTool', + modelPermission = 'modelPermission' +} + +export type SystemCacheDataType = { + [SystemCacheKeyEnum.systemTool]: SystemPluginTemplateItemType[]; + [SystemCacheKeyEnum.modelPermission]: null; +}; + +type SystemCacheType = { + [K in SystemCacheKeyEnum]: { + versionKey: string; + data: SystemCacheDataType[K]; + refreshFunc: () => Promise; + }; +}; + +declare global { + var systemCache: SystemCacheType; +} diff --git a/packages/service/common/file/gridfs/controller.ts b/packages/service/common/file/gridfs/controller.ts index afa99571e..d1e707816 100644 --- a/packages/service/common/file/gridfs/controller.ts +++ b/packages/service/common/file/gridfs/controller.ts @@ -196,7 +196,8 @@ export const readFileContentFromMongo = async ({ bucketName, fileId, customPdfParse = false, - getFormatText + getFormatText, + usageId }: { teamId: string; tmbId: string; @@ -204,6 +205,7 @@ export const readFileContentFromMongo = async ({ fileId: string; customPdfParse?: boolean; getFormatText?: boolean; // 数据类型都尽可能转化成 markdown 格式 + usageId?: string; }): Promise<{ rawText: string; filename: string; @@ -237,6 +239,7 @@ export const readFileContentFromMongo = async ({ // Get raw text const { rawText } = await readRawContentByFileBuffer({ customPdfParse, + usageId, getFormatText, extension, teamId, diff --git a/packages/service/common/file/read/utils.ts b/packages/service/common/file/read/utils.ts index 461da09dc..3cc8e26e8 100644 --- a/packages/service/common/file/read/utils.ts +++ b/packages/service/common/file/read/utils.ts @@ -47,6 +47,7 @@ export const readRawContentByFileBuffer = async ({ encoding, metadata, customPdfParse = false, + usageId, getFormatText = true }: { teamId: string; @@ -58,6 +59,7 @@ export const readRawContentByFileBuffer = async ({ metadata?: Record; customPdfParse?: boolean; + usageId?: string; getFormatText?: boolean; }): Promise<{ rawText: string; @@ -104,7 +106,8 @@ export const readRawContentByFileBuffer = async ({ createPdfParseUsage({ teamId, tmbId, - pages: response.pages + pages: response.pages, + usageId }); return { @@ -123,7 +126,8 @@ export const readRawContentByFileBuffer = async ({ createPdfParseUsage({ teamId, tmbId, - pages + pages, + usageId }); return { diff --git a/packages/service/common/s3/config.ts b/packages/service/common/s3/config.ts new file mode 100644 index 000000000..501d61be4 --- /dev/null +++ b/packages/service/common/s3/config.ts @@ -0,0 +1,10 @@ +import type { S3ServiceConfig } from './type'; + +export const defualtS3Config: Omit = { + endPoint: process.env.S3_ENDPOINT || 'localhost', + port: process.env.S3_PORT ? parseInt(process.env.S3_PORT) : 9000, + useSSL: process.env.S3_USE_SSL === 'true', + accessKey: process.env.S3_ACCESS_KEY || 'minioadmin', + secretKey: process.env.S3_SECRET_KEY || 'minioadmin', + externalBaseURL: process.env.S3_EXTERNAL_BASE_URL +}; diff --git a/packages/service/common/s3/const.ts b/packages/service/common/s3/const.ts new file mode 100644 index 000000000..c91043dc1 --- /dev/null +++ b/packages/service/common/s3/const.ts @@ -0,0 +1,20 @@ +export const mimeMap: Record = { + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.png': 'image/png', + '.gif': 'image/gif', + '.webp': 'image/webp', + '.svg': 'image/svg+xml', + '.pdf': 'application/pdf', + '.txt': 'text/plain', + '.json': 'application/json', + '.csv': 'text/csv', + '.zip': 'application/zip', + '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + '.doc': 'application/msword', + '.xls': 'application/vnd.ms-excel', + '.ppt': 'application/vnd.ms-powerpoint', + '.js': 'application/javascript' +}; diff --git a/packages/service/common/s3/controller.ts b/packages/service/common/s3/controller.ts new file mode 100644 index 000000000..faaae7cdc --- /dev/null +++ b/packages/service/common/s3/controller.ts @@ -0,0 +1,168 @@ +import { Client } from 'minio'; +import { + type FileMetadataType, + type PresignedUrlInput as UploadPresignedURLProps, + type UploadPresignedURLResponse, + type S3ServiceConfig +} from './type'; +import { defualtS3Config } from './config'; +import { randomBytes } from 'crypto'; +import { HttpProxyAgent } from 'http-proxy-agent'; +import { HttpsProxyAgent } from 'https-proxy-agent'; +import { extname } from 'path'; +import { addLog } from '../../common/system/log'; +import { getErrText } from '@fastgpt/global/common/error/utils'; +import { mimeMap } from './const'; + +export class S3Service { + private client: Client; + private config: S3ServiceConfig; + private initialized: boolean = false; + initFunction?: () => Promise; + + constructor(config?: Partial) { + this.config = { ...defualtS3Config, ...config } as S3ServiceConfig; + + this.client = new Client({ + endPoint: this.config.endPoint, + port: this.config.port, + useSSL: this.config.useSSL, + accessKey: this.config.accessKey, + secretKey: this.config.secretKey, + transportAgent: process.env.HTTP_PROXY + ? new HttpProxyAgent(process.env.HTTP_PROXY) + : process.env.HTTPS_PROXY + ? new HttpsProxyAgent(process.env.HTTPS_PROXY) + : undefined + }); + + this.initFunction = config?.initFunction; + } + + public async init() { + if (!this.initialized) { + if (!(await this.client.bucketExists(this.config.bucket))) { + addLog.debug(`Creating bucket: ${this.config.bucket}`); + await this.client.makeBucket(this.config.bucket); + } + + await this.initFunction?.(); + this.initialized = true; + } + } + + private generateFileId(): string { + return randomBytes(16).toString('hex'); + } + + private generateAccessUrl(filename: string): string { + const protocol = this.config.useSSL ? 'https' : 'http'; + const port = + this.config.port && this.config.port !== (this.config.useSSL ? 443 : 80) + ? `:${this.config.port}` + : ''; + + const externalBaseURL = this.config.externalBaseURL; + return externalBaseURL + ? `${externalBaseURL}/${this.config.bucket}/${encodeURIComponent(filename)}` + : `${protocol}://${this.config.endPoint}${port}/${this.config.bucket}/${encodeURIComponent(filename)}`; + } + + uploadFile = async (fileBuffer: Buffer, originalFilename: string): Promise => { + await this.init(); + const inferContentType = (filename: string) => { + const ext = extname(filename).toLowerCase(); + return mimeMap[ext] || 'application/octet-stream'; + }; + + if (this.config.maxFileSize && fileBuffer.length > this.config.maxFileSize) { + return Promise.reject( + `File size ${fileBuffer.length} exceeds limit ${this.config.maxFileSize}` + ); + } + + const fileId = this.generateFileId(); + const objectName = `${fileId}-${originalFilename}`; + const uploadTime = new Date(); + + const contentType = inferContentType(originalFilename); + await this.client.putObject(this.config.bucket, objectName, fileBuffer, fileBuffer.length, { + 'Content-Type': contentType, + 'Content-Disposition': `attachment; filename="${encodeURIComponent(originalFilename)}"`, + 'x-amz-meta-original-filename': encodeURIComponent(originalFilename), + 'x-amz-meta-upload-time': uploadTime.toISOString() + }); + + const metadata: FileMetadataType = { + fileId, + originalFilename, + contentType, + size: fileBuffer.length, + uploadTime, + accessUrl: this.generateAccessUrl(objectName) + }; + + return metadata; + }; + + generateUploadPresignedURL = async ({ + filepath, + contentType, + metadata, + filename + }: UploadPresignedURLProps): Promise => { + await this.init(); + const objectName = `${filepath}/${filename}`; + + try { + const policy = this.client.newPostPolicy(); + + policy.setBucket(this.config.bucket); + policy.setKey(objectName); + if (contentType) { + policy.setContentType(contentType); + } + if (this.config.maxFileSize) { + policy.setContentLengthRange(1, this.config.maxFileSize); + } + policy.setExpires(new Date(Date.now() + 10 * 60 * 1000)); // 10 mins + + policy.setUserMetaData({ + 'original-filename': encodeURIComponent(filename), + 'upload-time': new Date().toISOString(), + ...metadata + }); + + const { postURL, formData } = await this.client.presignedPostPolicy(policy); + + const response: UploadPresignedURLResponse = { + objectName, + uploadUrl: postURL, + formData + }; + + return response; + } catch (error) { + addLog.error('Failed to generate Upload Presigned URL', error); + return Promise.reject(`Failed to generate Upload Presigned URL: ${getErrText(error)}`); + } + }; + + generateDownloadUrl = (objectName: string): string => { + const pathParts = objectName.split('/'); + const encodedParts = pathParts.map((part) => encodeURIComponent(part)); + const encodedObjectName = encodedParts.join('/'); + return `${this.config.bucket}/${encodedObjectName}`; + }; + + getFile = async (objectName: string): Promise => { + const stat = await this.client.statObject(this.config.bucket, objectName); + + if (stat.size > 0) { + const accessUrl = this.generateDownloadUrl(objectName); + return accessUrl; + } + + return Promise.reject(`File ${objectName} not found`); + }; +} diff --git a/packages/service/common/s3/index.ts b/packages/service/common/s3/index.ts new file mode 100644 index 000000000..761bd5640 --- /dev/null +++ b/packages/service/common/s3/index.ts @@ -0,0 +1,16 @@ +import { S3Service } from './controller'; + +export const PluginS3Service = (() => { + if (!global.pluginS3Service) { + global.pluginS3Service = new S3Service({ + bucket: process.env.S3_PLUGIN_BUCKET || 'fastgpt-plugin', + maxFileSize: 50 * 1024 * 1024 // 50MB + }); + } + + return global.pluginS3Service; +})(); + +declare global { + var pluginS3Service: S3Service; +} diff --git a/packages/service/common/s3/type.ts b/packages/service/common/s3/type.ts new file mode 100644 index 000000000..a48053049 --- /dev/null +++ b/packages/service/common/s3/type.ts @@ -0,0 +1,49 @@ +import type { ClientOptions } from 'minio'; + +export type S3ServiceConfig = { + bucket: string; + externalBaseURL?: string; + /** + * Unit: Byte + */ + maxFileSize?: number; + /** + * for executing some init function for the s3 service + */ + initFunction?: () => Promise; +} & ClientOptions; + +export type FileMetadataType = { + fileId: string; + originalFilename: string; + contentType: string; + size: number; + uploadTime: Date; + accessUrl: string; +}; + +export type PresignedUrlInput = { + filepath: string; + filename: string; + contentType?: string; + metadata?: Record; +}; + +export type UploadPresignedURLResponse = { + objectName: string; + uploadUrl: string; + formData: Record; +}; + +export type FileUploadInput = { + buffer: Buffer; + filename: string; +}; + +export enum PluginTypeEnum { + tool = 'tool' +} + +export const PluginFilePath = { + [PluginTypeEnum.tool]: 'plugin/tools' +}; diff --git a/packages/service/common/system/constants.ts b/packages/service/common/system/constants.ts index facf9ab12..313e9031c 100644 --- a/packages/service/common/system/constants.ts +++ b/packages/service/common/system/constants.ts @@ -2,3 +2,7 @@ export const FastGPTProUrl = process.env.PRO_URL ? `${process.env.PRO_URL}/api` export const FastGPTPluginUrl = process.env.PLUGIN_BASE_URL ? `${process.env.PLUGIN_BASE_URL}` : ''; // @ts-ignore export const isFastGPTProService = () => !!global.systemConfig; + +export const isProVersion = () => { + return !!global.feConfigs?.isPlus; +}; diff --git a/packages/service/common/vectorDB/controller.ts b/packages/service/common/vectorDB/controller.ts index a2658b97e..dc59726dc 100644 --- a/packages/service/common/vectorDB/controller.ts +++ b/packages/service/common/vectorDB/controller.ts @@ -2,12 +2,8 @@ import { PgVectorCtrl } from './pg'; import { ObVectorCtrl } from './oceanbase'; import { getVectorsByText } from '../../core/ai/embedding'; -import type { - EmbeddingRecallCtrlProps} from './controller.d'; -import { - type DelDatasetVectorCtrlProps, - type InsertVectorProps -} from './controller.d'; +import type { EmbeddingRecallCtrlProps } from './controller.d'; +import { type DelDatasetVectorCtrlProps, type InsertVectorProps } from './controller.d'; import { type EmbeddingModelItemType } from '@fastgpt/global/core/ai/model.d'; import { MILVUS_ADDRESS, PG_ADDRESS, OCEANBASE_ADDRESS } from './constants'; import { MilvusCtrl } from './milvus'; diff --git a/packages/service/core/ai/config/utils.ts b/packages/service/core/ai/config/utils.ts index 743b1a521..3869b264d 100644 --- a/packages/service/core/ai/config/utils.ts +++ b/packages/service/core/ai/config/utils.ts @@ -19,6 +19,8 @@ import { delay } from '@fastgpt/global/common/system/utils'; import { pluginClient } from '../../../thirdProvider/fastgptPlugin'; import { setCron } from '../../../common/system/cron'; import { preloadModelProviders } from '../../../core/app/provider/controller'; +import { refreshVersionKey } from '../../../common/cache'; +import { SystemCacheKeyEnum } from '../../../common/cache/type'; export const loadSystemModels = async (init = false, language = 'en') => { const pushModel = (model: SystemModelItemType) => { @@ -253,6 +255,7 @@ export const updatedReloadSystemModel = async () => { await loadSystemModels(true); // 2. 更新缓存(仅主节点触发) await updateFastGPTConfigBuffer(); + await refreshVersionKey(SystemCacheKeyEnum.modelPermission, '*'); // 3. 延迟1秒,等待其他节点刷新 await delay(1000); }; diff --git a/packages/service/core/ai/llm/request.ts b/packages/service/core/ai/llm/request.ts index 41b84ced2..1a45ac6be 100644 --- a/packages/service/core/ai/llm/request.ts +++ b/packages/service/core/ai/llm/request.ts @@ -142,8 +142,8 @@ export const createLLMResponse = async ( // Usage count const inputTokens = - usage?.prompt_tokens ?? (await countGptMessagesTokens(requestBody.messages, requestBody.tools)); - const outputTokens = usage?.completion_tokens ?? (await countGptMessagesTokens(assistantMessage)); + usage?.prompt_tokens || (await countGptMessagesTokens(requestBody.messages, requestBody.tools)); + const outputTokens = usage?.completion_tokens || (await countGptMessagesTokens(assistantMessage)); return { isStreamResponse, @@ -645,4 +645,4 @@ const createChatCompletion = async ({ } return Promise.reject(error); } -}; \ No newline at end of file +}; diff --git a/packages/service/core/app/controller.ts b/packages/service/core/app/controller.ts index 5cf05f1fb..4821b344d 100644 --- a/packages/service/core/app/controller.ts +++ b/packages/service/core/app/controller.ts @@ -23,6 +23,7 @@ import { PerResourceTypeEnum } from '@fastgpt/global/support/permission/constant import { removeImageByPath } from '../../common/file/image/controller'; import { mongoSessionRun } from '../../common/mongo/sessionRun'; import { MongoAppLogKeys } from './logs/logkeysSchema'; +import { MongoChatItemResponse } from '../chat/chatItemResponseSchema'; export const beforeUpdateAppFormat = ({ nodes }: { nodes?: StoreNodeItemType[] }) => { if (!nodes) return; @@ -159,6 +160,9 @@ export const onDelOneApp = async ({ // Delete chats await deleteChatFiles({ appId }); + await MongoChatItemResponse.deleteMany({ + appId + }); await MongoChatItem.deleteMany({ appId }); diff --git a/packages/service/core/app/evaluation/evalSchema.ts b/packages/service/core/app/evaluation/evalSchema.ts index a8678ebda..e5a78a013 100644 --- a/packages/service/core/app/evaluation/evalSchema.ts +++ b/packages/service/core/app/evaluation/evalSchema.ts @@ -5,7 +5,7 @@ import { import { connectionMongo, getMongoModel } from '../../../common/mongo'; import { AppCollectionName } from '../schema'; import type { EvaluationSchemaType } from '@fastgpt/global/core/app/evaluation/type'; -import { UsageCollectionName } from '../../../support/wallet/usage/schema'; +import { UsageCollectionName } from '../../../support/wallet/usage/constants'; const { Schema } = connectionMongo; export const EvaluationCollectionName = 'eval'; diff --git a/packages/service/core/app/http.ts b/packages/service/core/app/http.ts new file mode 100644 index 000000000..698695441 --- /dev/null +++ b/packages/service/core/app/http.ts @@ -0,0 +1,58 @@ +import { type StoreSecretValueType } from '@fastgpt/global/common/secret/type'; +import { getSecretValue } from '../../common/secret/utils'; +import axios from 'axios'; +import { getErrText } from '@fastgpt/global/common/error/utils'; +import type { RequireOnlyOne } from '@fastgpt/global/common/type/utils'; + +export type RunHTTPToolParams = { + baseUrl: string; + toolPath: string; + method: string; + params: Record; + headerSecret?: StoreSecretValueType; + customHeaders?: Record; +}; + +export type RunHTTPToolResult = RequireOnlyOne<{ + data?: any; + errorMsg?: string; +}>; + +export async function runHTTPTool({ + baseUrl, + toolPath, + method = 'POST', + params, + headerSecret, + customHeaders +}: RunHTTPToolParams): Promise { + try { + const headers = { + 'Content-Type': 'application/json', + ...(customHeaders || {}), + ...(headerSecret ? getSecretValue({ storeSecret: headerSecret }) : {}) + }; + + const { data } = await axios({ + method: method.toUpperCase(), + baseURL: baseUrl.startsWith('https://') ? baseUrl : `https://${baseUrl}`, + url: toolPath, + headers, + data: params, + params, + timeout: 300000, + httpsAgent: new (require('https').Agent)({ + rejectUnauthorized: false + }) + }); + + return { + data + }; + } catch (error: any) { + console.log(error); + return { + errorMsg: getErrText(error) + }; + } +} diff --git a/packages/service/core/app/plugin/controller.ts b/packages/service/core/app/plugin/controller.ts index 387985927..d76fa9689 100644 --- a/packages/service/core/app/plugin/controller.ts +++ b/packages/service/core/app/plugin/controller.ts @@ -43,10 +43,13 @@ import { isProduction } from '@fastgpt/global/common/system/constants'; import { Output_Template_Error_Message } from '@fastgpt/global/core/workflow/template/output'; import { splitCombinePluginId } from '@fastgpt/global/core/app/plugin/utils'; import { getMCPToolRuntimeNode } from '@fastgpt/global/core/app/mcpTools/utils'; +import { getHTTPToolRuntimeNode } from '@fastgpt/global/core/app/httpTools/utils'; import { AppTypeEnum } from '@fastgpt/global/core/app/constants'; import { getMCPChildren } from '../mcp'; import { cloneDeep } from 'lodash'; import { UserError } from '@fastgpt/global/common/error/utils'; +import { getCachedData } from '../../../common/cache'; +import { SystemCacheKeyEnum } from '../../../common/cache/type'; type ChildAppType = SystemPluginTemplateItemType & { teamId?: string; @@ -56,6 +59,8 @@ type ChildAppType = SystemPluginTemplateItemType & { isLatestVersion?: boolean; // Auto computed }; +export const getSystemTools = () => getCachedData(SystemCacheKeyEnum.systemTool); + export const getSystemPluginByIdAndVersionId = async ( pluginId: string, versionId?: string @@ -190,11 +195,11 @@ export async function getChildAppPreviewNode({ mcpToolSet: { toolId: pluginId, toolList: children, - url: '' + url: '', + headerSecret: {} } }; } - return { id: String(item._id), teamId: String(item.teamId), @@ -260,6 +265,45 @@ export async function getChildAppPreviewNode({ isLatestVersion: true }; } + // http tool + else if (source === PluginSourceEnum.http) { + const [parentId, toolName] = pluginId.split('/'); + const item = await MongoApp.findById(parentId).lean(); + if (!item) return Promise.reject(PluginErrEnum.unExist); + + const version = await getAppVersionById({ appId: parentId, versionId, app: item }); + const toolConfig = version.nodes[0].toolConfig?.httpToolSet; + const tool = await (async () => { + if (toolConfig?.toolList) { + return toolConfig.toolList.find((item) => item.name === toolName); + } + return undefined; + })(); + if (!tool) return Promise.reject(PluginErrEnum.unExist); + return { + avatar: item.avatar, + id: appId, + name: tool.name, + templateType: FlowNodeTemplateTypeEnum.tools, + workflow: { + nodes: [ + getHTTPToolRuntimeNode({ + tool: { + description: tool.description, + inputSchema: tool.inputSchema, + outputSchema: tool.outputSchema, + name: `${item.name}/${tool.name}` + }, + avatar: item.avatar, + parentId: item._id + }) + ], + edges: [] + }, + version: '', + isLatestVersion: true + }; + } // 1. System Tools // 2. System Plugins configured in Pro (has associatedPluginId) else { @@ -503,97 +547,63 @@ const dbPluginFormat = (item: SystemPluginConfigSchemaType): SystemPluginTemplat }; /* FastsGPT-Pluign api: */ -function getCachedSystemPlugins() { - if (!global.systemToolsCache) { - global.systemToolsCache = { - expires: 0, - data: [] as SystemPluginTemplateItemType[] +export const refreshSystemTools = async (): Promise => { + const tools = await APIGetSystemToolList(); + // 从数据库里加载插件配置进行替换 + const systemToolsArray = await MongoSystemPlugin.find({}).lean(); + const systemTools = new Map(systemToolsArray.map((plugin) => [plugin.pluginId, plugin])); + + const formatTools = tools.map((item) => { + const dbPluginConfig = systemTools.get(item.id); + const isFolder = tools.some((tool) => tool.parentId === item.id); + + const versionList = (item.versionList as SystemPluginTemplateItemType['versionList']) || []; + + return { + id: item.id, + parentId: item.parentId, + isFolder, + name: item.name, + avatar: item.avatar, + intro: item.description, + toolDescription: item.toolDescription, + author: item.author, + courseUrl: item.courseUrl, + instructions: dbPluginConfig?.customConfig?.userGuide, + weight: item.weight, + toolSource: item.toolSource || 'built-in', + workflow: { + nodes: [], + edges: [] + }, + versionList, + templateType: item.templateType, + showStatus: true, + isActive: dbPluginConfig?.isActive ?? item.isActive ?? true, + inputList: item?.secretInputConfig, + hasSystemSecret: !!dbPluginConfig?.inputListVal, + + originCost: dbPluginConfig?.originCost ?? 0, + currentCost: dbPluginConfig?.currentCost ?? 0, + systemKeyCost: dbPluginConfig?.systemKeyCost ?? 0, + hasTokenFee: dbPluginConfig?.hasTokenFee ?? false, + pluginOrder: dbPluginConfig?.pluginOrder }; - } - return global.systemToolsCache; -} - -const cleanSystemPluginCache = () => { - global.systemToolsCache = undefined; -}; - -export const refetchSystemPlugins = () => { - const changeStream = MongoSystemPlugin.watch(); - - changeStream.on('change', () => { - try { - cleanSystemPluginCache(); - } catch (error) {} }); -}; -export const getSystemTools = async (): Promise => { - if (getCachedSystemPlugins().expires > Date.now() && isProduction) { - return getCachedSystemPlugins().data; - } else { - const tools = await APIGetSystemToolList(); + const dbPlugins = systemToolsArray + .filter((item) => item.customConfig?.associatedPluginId) + .map((item) => dbPluginFormat(item)); - // 从数据库里加载插件配置进行替换 - const systemToolsArray = await MongoSystemPlugin.find({}).lean(); - const systemTools = new Map(systemToolsArray.map((plugin) => [plugin.pluginId, plugin])); + const concatTools = [...formatTools, ...dbPlugins]; + concatTools.sort((a, b) => (a.pluginOrder ?? 0) - (b.pluginOrder ?? 0)); - const formatTools = tools.map((item) => { - const dbPluginConfig = systemTools.get(item.id); - const isFolder = tools.some((tool) => tool.parentId === item.id); + global.systemToolsTypeCache = {}; + concatTools.forEach((item) => { + global.systemToolsTypeCache[item.templateType] = 1; + }); - const versionList = (item.versionList as SystemPluginTemplateItemType['versionList']) || []; - - return { - id: item.id, - parentId: item.parentId, - isFolder, - name: item.name, - avatar: item.avatar, - intro: item.description, - toolDescription: item.toolDescription, - author: item.author, - courseUrl: item.courseUrl, - instructions: dbPluginConfig?.customConfig?.userGuide, - weight: item.weight, - workflow: { - nodes: [], - edges: [] - }, - versionList, - templateType: item.templateType, - showStatus: true, - isActive: dbPluginConfig?.isActive ?? item.isActive ?? true, - inputList: item?.secretInputConfig, - hasSystemSecret: !!dbPluginConfig?.inputListVal, - - originCost: dbPluginConfig?.originCost ?? 0, - currentCost: dbPluginConfig?.currentCost ?? 0, - systemKeyCost: dbPluginConfig?.systemKeyCost ?? 0, - hasTokenFee: dbPluginConfig?.hasTokenFee ?? false, - pluginOrder: dbPluginConfig?.pluginOrder - }; - }); - - // TODO: Check the app exists - const dbPlugins = systemToolsArray - .filter((item) => item.customConfig?.associatedPluginId) - .map((item) => dbPluginFormat(item)); - - const concatTools = [...formatTools, ...dbPlugins]; - concatTools.sort((a, b) => (a.pluginOrder ?? 0) - (b.pluginOrder ?? 0)); - - global.systemToolsCache = { - expires: Date.now() + 30 * 60 * 1000, // 30 minutes - data: concatTools - }; - - global.systemToolsTypeCache = {}; - concatTools.forEach((item) => { - global.systemToolsTypeCache[item.templateType] = 1; - }); - - return concatTools; - } + return concatTools; }; export const getSystemToolById = async (id: string): Promise => { @@ -613,11 +623,5 @@ export const getSystemToolById = async (id: string): Promise; } diff --git a/packages/service/core/app/templates/register.ts b/packages/service/core/app/templates/register.ts index 3b3df55b7..23daf81d1 100644 --- a/packages/service/core/app/templates/register.ts +++ b/packages/service/core/app/templates/register.ts @@ -35,7 +35,7 @@ const getAppTemplates = async () => { const res = [ ...communityTemplateConfig, - ...dbTemplates.filter((t) => !isCommunityTemplate(t.templateId)) + ...dbTemplates.filter((t) => isCommercialTemaplte(t.templateId)) ].sort((a, b) => (a.order ?? 0) - (b.order ?? 0)); return res; @@ -60,8 +60,8 @@ export const getAppTemplatesAndLoadThem = async (refresh = false) => { } }; -export const isCommunityTemplate = (templateId: string) => { - return templateId.startsWith(PluginSourceEnum.community); +export const isCommercialTemaplte = (templateId: string) => { + return templateId.startsWith(PluginSourceEnum.commercial); }; declare global { diff --git a/packages/service/core/app/tool/api.ts b/packages/service/core/app/tool/api.ts index db76aa5f8..5890515bf 100644 --- a/packages/service/core/app/tool/api.ts +++ b/packages/service/core/app/tool/api.ts @@ -1,7 +1,7 @@ import type { I18nStringStrictType, ToolTypeEnum } from '@fastgpt/global/sdk/fastgpt-plugin'; import { RunToolWithStream } from '@fastgpt/global/sdk/fastgpt-plugin'; import { PluginSourceEnum } from '@fastgpt/global/core/app/plugin/constants'; -import { pluginClient, BASE_URL, TOKEN } from '../../../thirdProvider/fastgptPlugin'; +import { pluginClient, PLUGIN_BASE_URL, PLUGIN_TOKEN } from '../../../thirdProvider/fastgptPlugin'; import { addLog } from '../../../common/system/log'; import { retryFn } from '@fastgpt/global/common/system/utils'; @@ -26,8 +26,8 @@ export async function APIGetSystemToolList() { } const runToolInstance = new RunToolWithStream({ - baseUrl: BASE_URL, - token: TOKEN + baseUrl: PLUGIN_BASE_URL, + token: PLUGIN_TOKEN }); export const APIRunSystemTool = runToolInstance.run.bind(runToolInstance); diff --git a/packages/service/core/chat/chatItemResponseSchema.ts b/packages/service/core/chat/chatItemResponseSchema.ts new file mode 100644 index 000000000..31b2c2258 --- /dev/null +++ b/packages/service/core/chat/chatItemResponseSchema.ts @@ -0,0 +1,47 @@ +import { connectionMongo, getMongoModel } from '../../common/mongo'; +const { Schema } = connectionMongo; +import type { ChatItemResponseSchemaType } from '@fastgpt/global/core/chat/type'; +import { TeamCollectionName } from '@fastgpt/global/support/user/team/constant'; +import { AppCollectionName } from '../app/schema'; +import { ChatItemResponseCollectionName } from './constants'; + +const ChatItemResponseSchema = new Schema({ + teamId: { + type: Schema.Types.ObjectId, + ref: TeamCollectionName, + required: true + }, + appId: { + type: Schema.Types.ObjectId, + ref: AppCollectionName, + required: true + }, + chatId: { + type: String, + require: true + }, + chatItemDataId: { + type: String, + require: true + }, + data: { + type: Object, + default: {} + }, + + time: { + type: Date, + default: () => new Date() + } +}); + +// Get response/Delete +ChatItemResponseSchema.index({ appId: 1, chatId: 1, chatItemDataId: 1 }); + +// Clear expired response +ChatItemResponseSchema.index({ teamId: 1, time: -1 }); + +export const MongoChatItemResponse = getMongoModel( + ChatItemResponseCollectionName, + ChatItemResponseSchema +); diff --git a/packages/service/core/chat/chatItemSchema.ts b/packages/service/core/chat/chatItemSchema.ts index c192d81b1..770d3637f 100644 --- a/packages/service/core/chat/chatItemSchema.ts +++ b/packages/service/core/chat/chatItemSchema.ts @@ -10,8 +10,7 @@ import { import { AppCollectionName } from '../app/schema'; import { userCollectionName } from '../../support/user/schema'; import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/workflow/runtime/constants'; - -export const ChatItemCollectionName = 'chatitems'; +import { ChatItemCollectionName } from './constants'; const ChatItemSchema = new Schema({ teamId: { @@ -35,7 +34,7 @@ const ChatItemSchema = new Schema({ dataId: { type: String, require: true, - default: () => getNanoid(22) + default: () => getNanoid(24) }, appId: { type: Schema.Types.ObjectId, @@ -61,6 +60,8 @@ const ChatItemSchema = new Schema({ type: Array, default: [] }, + + // Field memory memories: Object, errorMsg: String, userGoodFeedback: String, @@ -75,29 +76,25 @@ const ChatItemSchema = new Schema({ a: String } }, - [DispatchNodeResponseKeyEnum.nodeResponse]: { - type: Array, - default: [] - }, - durationSeconds: Number + durationSeconds: Number, + citeCollectionIds: [String], + + // @deprecated + [DispatchNodeResponseKeyEnum.nodeResponse]: Array }); -try { - ChatItemSchema.index({ dataId: 1 }); - /* delete by app; - delete by chat id; - get chat list; - get chat logs; - close custom feedback; - */ - ChatItemSchema.index({ appId: 1, chatId: 1, dataId: 1 }); - // timer, clear history - ChatItemSchema.index({ teamId: 1, time: -1 }); +/* + delete by app; + delete by chat id; + get chat list; + get chat logs; + close custom feedback; +*/ +ChatItemSchema.index({ appId: 1, chatId: 1, dataId: 1 }); +// timer, clear history +ChatItemSchema.index({ teamId: 1, time: -1 }); - // Admin charts - ChatItemSchema.index({ obj: 1, time: -1 }, { partialFilterExpression: { obj: 'Human' } }); -} catch (error) { - console.log(error); -} +// Admin charts +ChatItemSchema.index({ obj: 1, time: -1 }, { partialFilterExpression: { obj: 'Human' } }); export const MongoChatItem = getMongoModel(ChatItemCollectionName, ChatItemSchema); diff --git a/packages/service/core/chat/chatSchema.ts b/packages/service/core/chat/chatSchema.ts index a8bdf2e0e..8ca948960 100644 --- a/packages/service/core/chat/chatSchema.ts +++ b/packages/service/core/chat/chatSchema.ts @@ -7,8 +7,7 @@ import { TeamMemberCollectionName } from '@fastgpt/global/support/user/team/constant'; import { AppCollectionName } from '../app/schema'; - -export const chatCollectionName = 'chat'; +import { chatCollectionName } from './constants'; const ChatSchema = new Schema({ chatId: { diff --git a/packages/service/core/chat/constants.ts b/packages/service/core/chat/constants.ts new file mode 100644 index 000000000..c3b6a6444 --- /dev/null +++ b/packages/service/core/chat/constants.ts @@ -0,0 +1,3 @@ +export const chatCollectionName = 'chats'; +export const ChatItemResponseCollectionName = 'chat_item_responses'; +export const ChatItemCollectionName = 'chatitems'; diff --git a/packages/service/core/chat/controller.ts b/packages/service/core/chat/controller.ts index b6113869a..c854e4c11 100644 --- a/packages/service/core/chat/controller.ts +++ b/packages/service/core/chat/controller.ts @@ -1,10 +1,13 @@ -import type { ChatItemType } from '@fastgpt/global/core/chat/type'; +import type { ChatHistoryItemResType, ChatItemType } from '@fastgpt/global/core/chat/type'; import { MongoChatItem } from './chatItemSchema'; import { addLog } from '../../common/system/log'; import { delFileByFileIdList, getGFSCollection } from '../../common/file/gridfs/controller'; import { BucketNameEnum } from '@fastgpt/global/common/file/constants'; import { MongoChat } from './chatSchema'; import { UserError } from '@fastgpt/global/common/error/utils'; +import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/workflow/runtime/constants'; +import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants'; +import { MongoChatItemResponse } from './chatItemResponseSchema'; export async function getChatItems({ appId, @@ -23,12 +26,44 @@ export async function getChatItems({ return { histories: [], total: 0 }; } + // Extend dataId + field = `dataId ${field}`; + const [histories, total] = await Promise.all([ - MongoChatItem.find({ chatId, appId }, field).sort({ _id: -1 }).skip(offset).limit(limit).lean(), - MongoChatItem.countDocuments({ chatId, appId }) + MongoChatItem.find({ appId, chatId }, field).sort({ _id: -1 }).skip(offset).limit(limit).lean(), + MongoChatItem.countDocuments({ appId, chatId }) ]); histories.reverse(); + // Add node responses field + if (field.includes(DispatchNodeResponseKeyEnum.nodeResponse)) { + const chatItemDataIds = histories + .filter((item) => item.obj === ChatRoleEnum.AI && !item.responseData?.length) + .map((item) => item.dataId); + + const chatItemResponsesMap = await MongoChatItemResponse.find( + { appId, chatId, chatItemDataId: { $in: chatItemDataIds } }, + { chatItemDataId: 1, data: 1 } + ) + .lean() + .then((res) => { + const map = new Map(); + res.forEach((item) => { + const val = map.get(item.chatItemDataId) || []; + val.push(item.data); + map.set(item.chatItemDataId, val); + }); + return map; + }); + + histories.forEach((item) => { + const val = chatItemResponsesMap.get(String(item.dataId)); + if (item.obj === ChatRoleEnum.AI && val) { + item.responseData = val; + } + }); + } + return { histories, total }; } diff --git a/packages/service/core/chat/pushChatLog.ts b/packages/service/core/chat/pushChatLog.ts index 86677c55f..afc14ab3f 100644 --- a/packages/service/core/chat/pushChatLog.ts +++ b/packages/service/core/chat/pushChatLog.ts @@ -2,11 +2,7 @@ import { addLog } from '../../common/system/log'; import { MongoChatItem } from './chatItemSchema'; import { MongoChat } from './chatSchema'; import axios from 'axios'; -import { - type AIChatItemType, - type ChatItemType, - type UserChatItemType -} from '@fastgpt/global/core/chat/type'; +import { type AIChatItemType, type UserChatItemType } from '@fastgpt/global/core/chat/type'; import { ChatItemValueTypeEnum } from '@fastgpt/global/core/chat/constants'; export type Metadata = { @@ -43,18 +39,6 @@ export const pushChatLog = ({ } }; -type ChatItem = ChatItemType & { - userGoodFeedback?: string; - userBadFeedback?: string; - chatId: string; - responseData: { - moduleType: string; - runningTime: number; //s - historyPreview: { obj: string; value: string }[]; - }[]; - time: Date; -}; - type ChatLog = { title: string; feedback: 'like' | 'dislike' | null; diff --git a/packages/service/core/chat/saveChat.ts b/packages/service/core/chat/saveChat.ts index 09e466ade..f6ae19003 100644 --- a/packages/service/core/chat/saveChat.ts +++ b/packages/service/core/chat/saveChat.ts @@ -12,10 +12,11 @@ import { type AppChatConfigType } from '@fastgpt/global/core/app/type'; import { mergeChatResponseData } from '@fastgpt/global/core/chat/utils'; import { pushChatLog } from './pushChatLog'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; -import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/workflow/runtime/constants'; import { extractDeepestInteractive } from '@fastgpt/global/core/workflow/runtime/utils'; import { MongoAppChatLog } from '../app/logs/chatLogsSchema'; import { writePrimary } from '../../common/mongo/utils'; +import { MongoChatItemResponse } from './chatItemResponseSchema'; +import { chatValue2RuntimePrompt } from '@fastgpt/global/core/chat/adapt'; type Props = { chatId: string; @@ -31,12 +32,59 @@ type Props = { sourceName?: string; shareId?: string; outLinkUid?: string; - content: [UserChatItemType & { dataId?: string }, AIChatItemType & { dataId?: string }]; + userContent: UserChatItemType & { dataId?: string }; + aiContent: AIChatItemType & { dataId?: string }; metadata?: Record; durationSeconds: number; //s errorMsg?: string; }; +const formatAiContent = ({ + aiContent, + durationSeconds, + errorMsg +}: { + aiContent: AIChatItemType & { dataId?: string }; + durationSeconds: number; + errorMsg?: string; +}) => { + const { responseData, ...aiResponse } = aiContent; + + const citeCollectionIds = new Set(); + + const nodeResponses = responseData?.map((responseItem) => { + if (responseItem.moduleType === FlowNodeTypeEnum.datasetSearchNode && responseItem.quoteList) { + return { + ...responseItem, + quoteList: responseItem.quoteList.map((quote) => { + citeCollectionIds.add(quote.collectionId); + return { + id: quote.id, + chunkIndex: quote.chunkIndex, + datasetId: quote.datasetId, + collectionId: quote.collectionId, + sourceId: quote.sourceId, + sourceName: quote.sourceName, + score: quote.score + }; + }) + }; + } + return responseItem; + }); + + return { + aiResponse: { + ...aiResponse, + durationSeconds, + errorMsg, + citeCollectionIds: Array.from(citeCollectionIds) + }, + nodeResponses, + citeCollectionIds + }; +}; + export async function saveChat({ chatId, appId, @@ -51,7 +99,8 @@ export async function saveChat({ sourceName, shareId, outLinkUid, - content, + userContent, + aiContent, durationSeconds, errorMsg, metadata = {} @@ -81,42 +130,15 @@ export async function saveChat({ )?.inputs; // Format save chat content: Remove quote q/a - const processedContent = content.map((item) => { - if (item.obj === ChatRoleEnum.AI) { - const nodeResponse = item[DispatchNodeResponseKeyEnum.nodeResponse]?.map((responseItem) => { - if ( - responseItem.moduleType === FlowNodeTypeEnum.datasetSearchNode && - responseItem.quoteList - ) { - return { - ...responseItem, - quoteList: responseItem.quoteList.map((quote: any) => ({ - id: quote.id, - chunkIndex: quote.chunkIndex, - datasetId: quote.datasetId, - collectionId: quote.collectionId, - sourceId: quote.sourceId, - sourceName: quote.sourceName, - score: quote.score, - tokens: quote.tokens - })) - }; - } - return responseItem; - }); - - return { - ...item, - [DispatchNodeResponseKeyEnum.nodeResponse]: nodeResponse, - durationSeconds, - errorMsg - }; - } - return item; + const { aiResponse, nodeResponses } = formatAiContent({ + aiContent, + durationSeconds, + errorMsg }); + const processedContent = [userContent, aiResponse]; await mongoSessionRun(async (session) => { - const [{ _id: chatItemIdHuman }, { _id: chatItemIdAi }] = await MongoChatItem.create( + const [{ _id: chatItemIdHuman }, { _id: chatItemIdAi, dataId }] = await MongoChatItem.create( processedContent.map((item) => ({ chatId, teamId, @@ -127,6 +149,20 @@ export async function saveChat({ { session, ordered: true, ...writePrimary } ); + // Create chat item respones + if (nodeResponses) { + await MongoChatItemResponse.create( + nodeResponses.map((item) => ({ + teamId, + appId, + chatId, + chatItemDataId: dataId, + data: item + })), + { session, ordered: true, ...writePrimary } + ); + } + await MongoChat.updateOne( { appId, @@ -166,18 +202,15 @@ export async function saveChat({ }); }); + // Create chat data log try { const userId = String(outLinkUid || tmbId); const now = new Date(); const fifteenMinutesAgo = new Date(now.getTime() - 15 * 60 * 1000); - const aiResponse = processedContent.find((item) => item.obj === ChatRoleEnum.AI); - const errorCount = aiResponse?.responseData?.some((item) => item.errorText) ? 1 : 0; + const errorCount = nodeResponses?.some((item) => item.errorText) ? 1 : 0; const totalPoints = - aiResponse?.responseData?.reduce( - (sum: number, item: any) => sum + (item.totalPoints || 0), - 0 - ) || 0; + nodeResponses?.reduce((sum: number, item: any) => sum + (item.totalPoints || 0), 0) || 0; const hasHistoryChat = await MongoAppChatLog.exists({ teamId, @@ -242,20 +275,16 @@ export async function saveChat({ } export const updateInteractiveChat = async ({ + teamId, chatId, + appId, - userInteractiveVal, - aiResponse, - newVariables, - durationSeconds -}: { - chatId: string; - appId: string; - userInteractiveVal: string; - aiResponse: AIChatItemType & { dataId?: string }; - newVariables?: Record; - durationSeconds: number; -}) => { + userContent, + aiContent, + variables, + durationSeconds, + errorMsg +}: Props) => { if (!chatId) return; const chatItem = await MongoChatItem.findOne({ appId, chatId, obj: ChatRoleEnum.AI }).sort({ @@ -276,17 +305,23 @@ export const updateInteractiveChat = async ({ } const parsedUserInteractiveVal = (() => { + const { text: userInteractiveVal } = chatValue2RuntimePrompt(userContent.value); try { return JSON.parse(userInteractiveVal); } catch (err) { return userInteractiveVal; } })(); + const { aiResponse, nodeResponses } = formatAiContent({ + aiContent, + durationSeconds, + errorMsg + }); let finalInteractive = extractDeepestInteractive(interactiveValue.interactive); if (finalInteractive.type === 'userSelect') { - finalInteractive.params.userSelectedVal = userInteractiveVal; + finalInteractive.params.userSelectedVal = parsedUserInteractiveVal; } else if ( finalInteractive.type === 'userInput' && typeof parsedUserInteractiveVal === 'object' @@ -308,16 +343,14 @@ export const updateInteractiveChat = async ({ ? [...chatItem.customFeedbacks, ...aiResponse.customFeedbacks] : aiResponse.customFeedbacks; } - - if (aiResponse.responseData) { - chatItem.responseData = chatItem.responseData - ? mergeChatResponseData([...chatItem.responseData, ...aiResponse.responseData]) - : aiResponse.responseData; - } - if (aiResponse.value) { chatItem.value = chatItem.value ? [...chatItem.value, ...aiResponse.value] : aiResponse.value; } + if (aiResponse.citeCollectionIds) { + chatItem.citeCollectionIds = chatItem.citeCollectionIds + ? [...chatItem.citeCollectionIds, ...aiResponse.citeCollectionIds] + : aiResponse.citeCollectionIds; + } chatItem.durationSeconds = chatItem.durationSeconds ? +(chatItem.durationSeconds + durationSeconds).toFixed(2) @@ -332,7 +365,7 @@ export const updateInteractiveChat = async ({ }, { $set: { - variables: newVariables, + variables, updateTime: new Date() } }, @@ -340,5 +373,36 @@ export const updateInteractiveChat = async ({ session } ); + + // Create chat item respones + if (nodeResponses) { + // Merge + const lastResponse = await MongoChatItemResponse.findOneAndDelete({ + appId, + chatId, + chatItemDataId: chatItem.dataId + }) + .sort({ + _id: -1 + }) + .lean() + .session(session); + + const newResponses = lastResponse?.data + ? // @ts-ignore + mergeChatResponseData([lastResponse?.data, ...nodeResponses]) + : nodeResponses; + + await MongoChatItemResponse.create( + newResponses.map((item) => ({ + teamId, + appId, + chatId, + chatItemDataId: chatItem.dataId, + data: item + })), + { session, ordered: true, ...writePrimary } + ); + } }); }; diff --git a/packages/service/core/dataset/collection/controller.ts b/packages/service/core/dataset/collection/controller.ts index 3e0231005..2ff967309 100644 --- a/packages/service/core/dataset/collection/controller.ts +++ b/packages/service/core/dataset/collection/controller.ts @@ -1,8 +1,4 @@ -import { - DatasetCollectionTypeEnum, - DatasetCollectionDataProcessModeEnum, - DatasetTypeEnum -} from '@fastgpt/global/core/dataset/constants'; +import { DatasetCollectionDataProcessModeEnum } from '@fastgpt/global/core/dataset/constants'; import type { CreateDatasetCollectionParams } from '@fastgpt/global/core/dataset/api.d'; import { MongoDatasetCollection } from './schema'; import type { @@ -25,9 +21,7 @@ import { createTrainingUsage } from '../../../support/wallet/usage/controller'; import { UsageSourceEnum } from '@fastgpt/global/support/wallet/usage/constants'; import { getLLMModel, getEmbeddingModel, getVlmModel } from '../../ai/model'; import { pushDataListToTrainingQueue, pushDatasetToParseQueue } from '../training/controller'; -import { MongoImage } from '../../../common/file/image/schema'; import { hashStr } from '@fastgpt/global/common/string/tools'; -import { addDays } from 'date-fns'; import { MongoDatasetDataText } from '../data/dataTextSchema'; import { retryFn } from '@fastgpt/global/common/system/utils'; import { getTrainingModeByCollection } from './utils'; @@ -184,9 +178,9 @@ export const createCollectionAndInsertData = async ({ }); // 4. create training bill - const traingBillId = await (async () => { + const traingUsageId = await (async () => { if (billId) return billId; - const { billId: newBillId } = await createTrainingUsage({ + const { usageId: newUsageId } = await createTrainingUsage({ teamId, tmbId, appName: formatCreateCollectionParams.name, @@ -196,7 +190,7 @@ export const createCollectionAndInsertData = async ({ vllmModel: getVlmModel(dataset.vlmModel)?.name, session }); - return newBillId; + return newUsageId; })(); // 5. insert to training queue @@ -212,7 +206,7 @@ export const createCollectionAndInsertData = async ({ vlmModel: dataset.vlmModel, indexSize, mode: trainingMode, - billId: traingBillId, + billId: traingUsageId, data: chunks.map((item, index) => ({ ...item, indexes: item.indexes?.map((text) => ({ @@ -229,7 +223,7 @@ export const createCollectionAndInsertData = async ({ tmbId, datasetId: dataset._id, collectionId, - billId: traingBillId, + billId: traingUsageId, session }); return { diff --git a/packages/service/core/dataset/read.ts b/packages/service/core/dataset/read.ts index 694aefcec..b17efe205 100644 --- a/packages/service/core/dataset/read.ts +++ b/packages/service/core/dataset/read.ts @@ -156,7 +156,8 @@ export const readDatasetSourceRawText = async ({ externalFileId, apiDatasetServer, customPdfParse, - getFormatText + getFormatText, + usageId }: { teamId: string; tmbId: string; @@ -168,6 +169,7 @@ export const readDatasetSourceRawText = async ({ selector?: string; // link selector externalFileId?: string; // external file dataset apiDatasetServer?: ApiDatasetServerType; // api dataset + usageId?: string; }): Promise<{ title?: string; rawText: string; @@ -178,8 +180,9 @@ export const readDatasetSourceRawText = async ({ tmbId, bucketName: BucketNameEnum.dataset, fileId: sourceId, + getFormatText, customPdfParse, - getFormatText + usageId }); return { title: filename, diff --git a/packages/service/core/workflow/dispatch/abandoned/runApp.ts b/packages/service/core/workflow/dispatch/abandoned/runApp.ts index d97229957..4f97a4af8 100644 --- a/packages/service/core/workflow/dispatch/abandoned/runApp.ts +++ b/packages/service/core/workflow/dispatch/abandoned/runApp.ts @@ -63,6 +63,7 @@ export const dispatchAppRequest = async (props: Props): Promise => { ...props, runningAppInfo: { id: String(appData._id), + name: appData.name, teamId: String(appData.teamId), tmbId: String(appData.tmbId) }, diff --git a/packages/service/core/workflow/dispatch/ai/agent/index.ts b/packages/service/core/workflow/dispatch/ai/agent/index.ts index da334a04b..55e553b8f 100644 --- a/packages/service/core/workflow/dispatch/ai/agent/index.ts +++ b/packages/service/core/workflow/dispatch/ai/agent/index.ts @@ -48,6 +48,7 @@ export const dispatchRunTools = async (props: DispatchToolModuleProps): Promise< lastInteractive, runningUserInfo, externalProvider, + usageId, params: { model, systemPrompt, @@ -117,7 +118,8 @@ export const dispatchRunTools = async (props: DispatchToolModuleProps): Promise< customPdfParse: chatConfig?.fileSelectConfig?.customPdfParse, fileLinks, inputFiles: globalFiles, - hasReadFilesTool + hasReadFilesTool, + usageId }); const concatenateSystemPrompt = [ @@ -273,7 +275,8 @@ const getMultiInput = async ({ maxFiles, customPdfParse, inputFiles, - hasReadFilesTool + hasReadFilesTool, + usageId }: { runningUserInfo: ChatDispatchProps['runningUserInfo']; histories: ChatItemType[]; @@ -283,6 +286,7 @@ const getMultiInput = async ({ customPdfParse?: boolean; inputFiles: UserChatItemValueItemType['file'][]; hasReadFilesTool: boolean; + usageId?: string; }) => { // Not file quote if (!fileLinks || hasReadFilesTool) { @@ -309,6 +313,7 @@ const getMultiInput = async ({ requestOrigin, maxFiles, customPdfParse, + usageId, teamId: runningUserInfo.teamId, tmbId: runningUserInfo.tmbId }); diff --git a/packages/service/core/workflow/dispatch/ai/chat.ts b/packages/service/core/workflow/dispatch/ai/chat.ts index d7275ab03..c6cf2d37f 100644 --- a/packages/service/core/workflow/dispatch/ai/chat.ts +++ b/packages/service/core/workflow/dispatch/ai/chat.ts @@ -74,6 +74,7 @@ export const dispatchChatCompletion = async (props: ChatProps): Promise @@ -359,9 +363,10 @@ async function getMultiInput({ urls, requestOrigin, maxFiles, - customPdfParse, teamId: runningUserInfo.teamId, - tmbId: runningUserInfo.tmbId + tmbId: runningUserInfo.tmbId, + customPdfParse, + usageId }); return { diff --git a/packages/service/core/workflow/dispatch/child/runApp.ts b/packages/service/core/workflow/dispatch/child/runApp.ts index 878e3702f..6502e1981 100644 --- a/packages/service/core/workflow/dispatch/child/runApp.ts +++ b/packages/service/core/workflow/dispatch/child/runApp.ts @@ -20,7 +20,7 @@ import { authAppByTmbId } from '../../../../support/permission/app/auth'; import { ReadPermissionVal } from '@fastgpt/global/support/permission/constant'; import { getAppVersionById } from '../../../app/version/controller'; import { parseUrlToFileType } from '@fastgpt/global/common/file/tools'; -import { getUserChatInfoAndAuthTeamPoints } from '../../../../support/permission/auth/team'; +import { getUserChatInfo } from '../../../../support/user/team/utils'; import { getRunningUserInfoByTmbId } from '../../../../support/user/team/utils'; type Props = ModuleDispatchProps<{ @@ -99,7 +99,7 @@ export const dispatchRunAppNode = async (props: Props): Promise => { // Rewrite children app variables const systemVariables = filterSystemVariables(variables); - const { externalProvider } = await getUserChatInfoAndAuthTeamPoints(appData.tmbId); + const { externalProvider } = await getUserChatInfo(appData.tmbId); const childrenRunVariables = { ...systemVariables, ...childrenAppVariables, @@ -144,6 +144,7 @@ export const dispatchRunAppNode = async (props: Props): Promise => { : {}), runningAppInfo: { id: String(appData._id), + name: appData.name, teamId: String(appData.teamId), tmbId: String(appData.tmbId), isChildApp: true diff --git a/packages/service/core/workflow/dispatch/child/runTool.ts b/packages/service/core/workflow/dispatch/child/runTool.ts index 5b3136b6a..6b03fe0d4 100644 --- a/packages/service/core/workflow/dispatch/child/runTool.ts +++ b/packages/service/core/workflow/dispatch/child/runTool.ts @@ -10,6 +10,7 @@ import { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants'; import { MCPClient } from '../../../app/mcp'; import { getSecretValue } from '../../../../common/secret/utils'; import type { McpToolDataType } from '@fastgpt/global/core/app/mcpTools/type'; +import type { HttpToolConfigType } from '@fastgpt/global/core/app/type'; import { APIRunSystemTool } from '../../../app/tool/api'; import { MongoSystemPlugin } from '../../../app/plugin/systemPluginSchema'; import { SystemToolInputTypeEnum } from '@fastgpt/global/core/app/systemTool/constants'; @@ -20,6 +21,7 @@ import { pushTrack } from '../../../../common/middle/tracks/utils'; import { getNodeErrResponse } from '../utils'; import { splitCombinePluginId } from '@fastgpt/global/core/app/plugin/utils'; import { getAppVersionById } from '../../../../core/app/version/controller'; +import { runHTTPTool } from '../../../app/http'; type SystemInputConfigType = { type: SystemToolInputTypeEnum; @@ -34,7 +36,7 @@ type RunToolProps = ModuleDispatchProps<{ type RunToolResponse = DispatchNodeResultType< { - [NodeOutputKeyEnum.rawResponse]?: any; // MCP Tool + [NodeOutputKeyEnum.rawResponse]?: any; [key: string]: any; }, Record @@ -214,6 +216,60 @@ export const dispatchRunTool = async (props: RunToolProps): Promise tool.name === toolName); + if (!httpTool) { + throw new Error(`HTTP tool ${toolName} not found`); + } + + const { data, errorMsg } = await runHTTPTool({ + baseUrl: baseUrl, + toolPath: httpTool.path, + method: httpTool.method, + params, + headerSecret, + customHeaders: customHeaders + ? typeof customHeaders === 'string' + ? JSON.parse(customHeaders) + : customHeaders + : undefined + }); + + if (errorMsg) { + if (catchError) { + return { + error: { [NodeOutputKeyEnum.errorText]: errorMsg }, + [DispatchNodeResponseKeyEnum.nodeResponse]: { + toolRes: errorMsg, + moduleLogo: avatar + }, + [DispatchNodeResponseKeyEnum.toolResponses]: errorMsg + }; + } + throw new Error(errorMsg); + } + + return { + data: { [NodeOutputKeyEnum.rawResponse]: data, ...(typeof data === 'object' ? data : {}) }, + [DispatchNodeResponseKeyEnum.nodeResponse]: { + toolRes: data, + moduleLogo: avatar + }, + [DispatchNodeResponseKeyEnum.toolResponses]: data + }; } else { // mcp tool (old version compatible) const { toolData, system_toolData, ...restParams } = params; diff --git a/packages/service/core/workflow/dispatch/dataset/search.ts b/packages/service/core/workflow/dispatch/dataset/search.ts index 07d657d6d..0708c5f18 100644 --- a/packages/service/core/workflow/dispatch/dataset/search.ts +++ b/packages/service/core/workflow/dispatch/dataset/search.ts @@ -15,7 +15,6 @@ import { type ChatNodeUsageType } from '@fastgpt/global/support/wallet/bill/type import { MongoDataset } from '../../../dataset/schema'; import { i18nT } from '../../../../../web/i18n/utils'; import { filterDatasetsByTmbId } from '../../../dataset/utils'; -import { ModelTypeEnum } from '@fastgpt/global/core/ai/model'; import { getDatasetSearchToolResponsePrompt } from '../../../../../global/core/ai/prompt/dataset'; import { getNodeErrResponse } from '../utils'; diff --git a/packages/service/core/workflow/dispatch/index.ts b/packages/service/core/workflow/dispatch/index.ts index 73097fc6d..eed55c500 100644 --- a/packages/service/core/workflow/dispatch/index.ts +++ b/packages/service/core/workflow/dispatch/index.ts @@ -47,8 +47,13 @@ import { rewriteRuntimeWorkFlow, removeSystemVariable } from './utils'; import { getHandleId } from '@fastgpt/global/core/workflow/utils'; import { callbackMap } from './constants'; import { anyValueDecrypt } from '../../../common/secret/utils'; +import { getUserChatInfo } from '../../../support/user/team/utils'; +import { checkTeamAIPoints } from '../../../support/permission/teamLimit'; +import type { UsageSourceEnum } from '@fastgpt/global/support/wallet/usage/constants'; +import { createChatUsageRecord, pushChatItemUsage } from '../../../support/wallet/usage/controller'; +import type { RequireOnlyOne } from '@fastgpt/global/common/type/utils'; -type Props = Omit & { +type Props = Omit & { runtimeNodes: RuntimeNodeItemType[]; runtimeEdges: RuntimeEdgeItemType[]; defaultSkipNodeQueue?: WorkflowDebugResponse['skipNodeQueue']; @@ -61,8 +66,38 @@ type NodeResponseCompleteType = Omit & { }; // Run workflow -export async function dispatchWorkFlow(data: Props): Promise { - const { res, stream, externalProvider } = data; +type WorkflowUsageProps = RequireOnlyOne<{ + usageSource: UsageSourceEnum; + concatUsage: (points: number) => any; + usageId: string; +}>; +export async function dispatchWorkFlow({ + usageSource, + usageId, + concatUsage, + ...data +}: Props & WorkflowUsageProps): Promise { + const { res, stream, runningUserInfo, runningAppInfo, lastInteractive } = data; + + await checkTeamAIPoints(runningUserInfo.teamId); + const [{ timezone, externalProvider }, newUsageId] = await Promise.all([ + getUserChatInfo(runningUserInfo.tmbId), + (() => { + if (lastInteractive?.usageId) { + return lastInteractive.usageId; + } + if (usageSource) { + return createChatUsageRecord({ + appName: runningAppInfo.name, + appId: runningAppInfo.id, + teamId: runningUserInfo.teamId, + tmbId: runningUserInfo.tmbId, + source: usageSource + }); + } + return usageId; + })() + ]); let streamCheckTimer: NodeJS.Timeout | null = null; @@ -96,15 +131,22 @@ export async function dispatchWorkFlow(data: Props): Promise { if (streamCheckTimer) { clearInterval(streamCheckTimer); @@ -116,6 +158,7 @@ type RunWorkflowProps = ChatDispatchProps & { runtimeNodes: RuntimeNodeItemType[]; runtimeEdges: RuntimeEdgeItemType[]; defaultSkipNodeQueue?: WorkflowDebugResponse['skipNodeQueue']; + concatUsage?: (points: number) => any; }; export const runWorkflow = async (data: RunWorkflowProps): Promise => { let { @@ -129,7 +172,10 @@ export const runWorkflow = async (data: RunWorkflowProps): Promise sum + (item.totalPoints || 0), 0)); + } + this.chatNodeUsages = this.chatNodeUsages.concat(nodeDispatchUsages); } @@ -827,7 +884,8 @@ export const runWorkflow = async (data: RunWorkflowProps): Promise { +}: Props & { + timezone: string; +}): SystemVariablesType => { // Get global variables(Label -> key; Key -> key) const variablesConfig = chatConfig?.variables || []; diff --git a/packages/service/core/workflow/dispatch/plugin/run.ts b/packages/service/core/workflow/dispatch/plugin/run.ts index 275600609..fa2602d0e 100644 --- a/packages/service/core/workflow/dispatch/plugin/run.ts +++ b/packages/service/core/workflow/dispatch/plugin/run.ts @@ -21,7 +21,7 @@ import { getPluginRunUserQuery } from '@fastgpt/global/core/workflow/utils'; import type { NodeInputKeyEnum, NodeOutputKeyEnum } from '@fastgpt/global/core/workflow/constants'; import { getChildAppRuntimeById } from '../../../app/plugin/controller'; import { runWorkflow } from '../index'; -import { getUserChatInfoAndAuthTeamPoints } from '../../../../support/permission/auth/team'; +import { getUserChatInfo } from '../../../../support/user/team/utils'; import { dispatchRunTool } from '../child/runTool'; import type { PluginRuntimeType } from '@fastgpt/global/core/app/plugin/type'; @@ -111,7 +111,7 @@ export const dispatchRunPlugin = async (props: RunPluginProps): Promise => { histories, chatConfig, node: { version }, - params: { fileUrlList = [] } + params: { fileUrlList = [] }, + usageId } = props; const maxFiles = chatConfig?.fileSelectConfig?.maxFiles || 20; const customPdfParse = chatConfig?.fileSelectConfig?.customPdfParse || false; @@ -68,7 +69,8 @@ export const dispatchReadFiles = async (props: Props): Promise => { maxFiles, teamId, tmbId, - customPdfParse + customPdfParse, + usageId }); return { @@ -119,7 +121,8 @@ export const getFileContentFromLinks = async ({ maxFiles, teamId, tmbId, - customPdfParse + customPdfParse, + usageId }: { urls: string[]; requestOrigin?: string; @@ -127,6 +130,7 @@ export const getFileContentFromLinks = async ({ teamId: string; tmbId: string; customPdfParse?: boolean; + usageId?: string; }) => { const parseUrlList = urls // Remove invalid urls @@ -225,7 +229,8 @@ export const getFileContentFromLinks = async ({ buffer, encoding, customPdfParse, - getFormatText: true + getFormatText: true, + usageId }); // Add to buffer diff --git a/packages/service/core/workflow/dispatch/utils.ts b/packages/service/core/workflow/dispatch/utils.ts index 70fdcf7a6..3200561d4 100644 --- a/packages/service/core/workflow/dispatch/utils.ts +++ b/packages/service/core/workflow/dispatch/utils.ts @@ -18,11 +18,13 @@ import { import { getNanoid } from '@fastgpt/global/common/string/tools'; import { type SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type'; import { getMCPToolRuntimeNode } from '@fastgpt/global/core/app/mcpTools/utils'; +import { getHTTPToolRuntimeNode } from '@fastgpt/global/core/app/httpTools/utils'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; import { MongoApp } from '../../../core/app/schema'; import { getMCPChildren } from '../../../core/app/mcp'; import { getSystemToolRunTimeNodeFromSystemToolset } from '../utils'; import type { localeType } from '@fastgpt/global/common/i18n/type'; +import type { HttpToolConfigType } from '@fastgpt/global/core/app/type'; export const getWorkflowResponseWrite = ({ res, @@ -197,7 +199,8 @@ export const rewriteRuntimeWorkFlow = async ({ for (const toolSetNode of toolSetNodes) { nodeIdsToRemove.add(toolSetNode.nodeId); const systemToolId = toolSetNode.toolConfig?.systemToolSet?.toolId; - const mcpToolsetVal = toolSetNode.toolConfig?.mcpToolSet ?? toolSetNode.inputs[0].value; + const mcpToolsetVal = toolSetNode.toolConfig?.mcpToolSet ?? toolSetNode.inputs?.[0]?.value; + const httpToolsetVal = toolSetNode.toolConfig?.httpToolSet; const incomingEdges = edges.filter((edge) => edge.target === toolSetNode.nodeId); const pushEdges = (nodeId: string) => { @@ -243,6 +246,22 @@ export const rewriteRuntimeWorkFlow = async ({ }); pushEdges(newToolNode.nodeId); }); + } else if (httpToolsetVal) { + const parentId = toolSetNode.pluginId || ''; + httpToolsetVal.toolList.forEach((tool: HttpToolConfigType, index: number) => { + const newToolNode = getHTTPToolRuntimeNode({ + tool: { + ...tool, + name: `${toolSetNode.name}/${tool.name}` + }, + nodeId: `${parentId}${index}`, + avatar: toolSetNode.avatar, + parentId + }); + + nodes.push(newToolNode); + pushEdges(newToolNode.nodeId); + }); } } diff --git a/packages/service/package.json b/packages/service/package.json index bb146d44b..eb367ff8e 100644 --- a/packages/service/package.json +++ b/packages/service/package.json @@ -27,6 +27,8 @@ "encoding": "^0.1.13", "file-type": "^19.0.0", "form-data": "^4.0.4", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", "iconv-lite": "^0.6.3", "ioredis": "^5.6.0", "joplin-turndown-plugin-gfm": "^1.0.12", @@ -35,6 +37,7 @@ "jsonwebtoken": "^9.0.2", "lodash": "^4.17.21", "mammoth": "^1.6.0", + "minio": "^8.0.5", "mongoose": "^8.10.1", "multer": "2.0.2", "mysql2": "^3.11.3", diff --git a/packages/service/support/permission/auth/team.ts b/packages/service/support/permission/auth/team.ts deleted file mode 100644 index adfe5b40a..000000000 --- a/packages/service/support/permission/auth/team.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { MongoTeamMember } from '../../user/team/teamMemberSchema'; -import { checkTeamAIPoints } from '../teamLimit'; -import { type UserModelSchema } from '@fastgpt/global/support/user/type'; -import { type TeamSchema } from '@fastgpt/global/support/user/team/type'; -import { TeamErrEnum } from '@fastgpt/global/common/error/code/team'; - -export async function getUserChatInfoAndAuthTeamPoints(tmbId: string) { - const tmb = await MongoTeamMember.findById(tmbId, 'userId teamId') - .populate<{ user: UserModelSchema; team: TeamSchema }>([ - { - path: 'user', - select: 'timezone' - }, - { - path: 'team', - select: 'openaiAccount externalWorkflowVariables' - } - ]) - .lean(); - - if (!tmb) return Promise.reject(TeamErrEnum.notUser); - - await checkTeamAIPoints(tmb.team._id); - - return { - timezone: tmb.user.timezone, - externalProvider: { - openaiAccount: tmb.team.openaiAccount, - externalWorkflowVariables: tmb.team.externalWorkflowVariables - } - }; -} diff --git a/packages/service/support/permission/model/controller.ts b/packages/service/support/permission/model/controller.ts new file mode 100644 index 000000000..c7eb0cf4f --- /dev/null +++ b/packages/service/support/permission/model/controller.ts @@ -0,0 +1,46 @@ +import { PerResourceTypeEnum } from '@fastgpt/global/support/permission/constant'; +import { getGroupsByTmbId } from '../memberGroup/controllers'; +import { getOrgsByTmbId } from '../org/controllers'; +import { MongoResourcePermission } from '../schema'; +import { getCollaboratorId } from '@fastgpt/global/support/permission/utils'; +import { isProVersion } from '../../../common/system/constants'; + +export const getMyModels = async ({ + teamId, + tmbId, + isTeamOwner +}: { + teamId: string; + tmbId: string; + isTeamOwner: boolean; +}) => { + if (isTeamOwner || !isProVersion()) { + return global.systemModelList.map((m) => m.model); + } + const [groups, orgs] = await Promise.all([ + getGroupsByTmbId({ + teamId, + tmbId + }), + getOrgsByTmbId({ + teamId, + tmbId + }) + ]); + + const myIdSet = new Set([tmbId, ...groups.map((g) => g._id), ...orgs.map((o) => o._id)]); + + const rps = await MongoResourcePermission.find({ + teamId, + resourceType: PerResourceTypeEnum.model + }).lean(); + + const permissionConfiguredModelSet = new Set(rps.map((rp) => rp.resourceName)); + const unconfiguredModels = global.systemModelList.filter( + (model) => !permissionConfiguredModelSet.has(model.model) + ); + + const myModels = rps.filter((rp) => myIdSet.has(getCollaboratorId(rp))); + + return [...unconfiguredModels.map((m) => m.model), ...myModels.map((m) => m.resourceName)]; +}; diff --git a/packages/service/support/permission/schema.ts b/packages/service/support/permission/schema.ts index 56c5e602d..1eebfceb2 100644 --- a/packages/service/support/permission/schema.ts +++ b/packages/service/support/permission/schema.ts @@ -41,14 +41,20 @@ export const ResourcePermissionSchema = new Schema({ type: Number, required: true }, + /** * Optional. Only be set when the resource is *inherited* from the parent resource. * For recording the self permission. When cancel the inheritance, it will overwrite the permission property and set to `unset`. */ - // Resource ID: App or DataSet or any other resource type. - // It is null if the resourceType is team. resourceId: { type: Schema.Types.ObjectId + }, + + /** + * Optional, For some resources, which do not have resourceId, the resourceName is required. + */ + resourceName: { + type: String } }); @@ -72,6 +78,7 @@ ResourcePermissionSchema.virtual('org', { }); try { + // Indexes for resourceId-based resources ResourcePermissionSchema.index( { resourceType: 1, @@ -84,6 +91,9 @@ try { partialFilterExpression: { groupId: { $exists: true + }, + resourceId: { + $exists: true } } } @@ -101,6 +111,9 @@ try { partialFilterExpression: { orgId: { $exists: true + }, + resourceId: { + $exists: true } } } @@ -118,17 +131,106 @@ try { partialFilterExpression: { tmbId: { $exists: true + }, + resourceId: { + $exists: true } } } ); - // Delete tmb permission - ResourcePermissionSchema.index({ - resourceType: 1, - teamId: 1, - resourceId: 1 - }); + // General index for resourceId-based resources + ResourcePermissionSchema.index( + { + resourceType: 1, + teamId: 1, + resourceId: 1 + }, + { + partialFilterExpression: { + resourceId: { + $exists: true + } + } + } + ); + + // Indexes for resourceName-based resources + ResourcePermissionSchema.index( + { + resourceType: 1, + teamId: 1, + resourceName: 1, + groupId: 1 + }, + { + unique: true, + partialFilterExpression: { + groupId: { + $exists: true + }, + resourceName: { + $exists: true + } + } + } + ); + + ResourcePermissionSchema.index( + { + resourceType: 1, + teamId: 1, + resourceName: 1, + orgId: 1 + }, + { + unique: true, + partialFilterExpression: { + orgId: { + $exists: true + }, + resourceName: { + $exists: true + } + } + } + ); + + ResourcePermissionSchema.index( + { + resourceType: 1, + teamId: 1, + resourceName: 1, + tmbId: 1 + }, + { + unique: true, + partialFilterExpression: { + tmbId: { + $exists: true + }, + resourceName: { + $exists: true + } + } + } + ); + + // General index for resourceName-based resources + ResourcePermissionSchema.index( + { + resourceType: 1, + teamId: 1, + resourceName: 1 + }, + { + partialFilterExpression: { + resourceName: { + $exists: true + } + } + } + ); } catch (error) { console.log(error); } diff --git a/packages/service/support/permission/teamLimit.ts b/packages/service/support/permission/teamLimit.ts index 145d0d90c..3ae9287b1 100644 --- a/packages/service/support/permission/teamLimit.ts +++ b/packages/service/support/permission/teamLimit.ts @@ -46,7 +46,13 @@ export const checkTeamAppLimit = async (teamId: string, amount = 1) => { MongoApp.countDocuments({ teamId, type: { - $in: [AppTypeEnum.simple, AppTypeEnum.workflow, AppTypeEnum.plugin, AppTypeEnum.toolSet] + $in: [ + AppTypeEnum.simple, + AppTypeEnum.workflow, + AppTypeEnum.plugin, + AppTypeEnum.toolSet, + AppTypeEnum.httpToolSet + ] } }) ]); diff --git a/packages/service/support/user/audit/util.ts b/packages/service/support/user/audit/util.ts index 9e04d2a45..cefeb9fb7 100644 --- a/packages/service/support/user/audit/util.ts +++ b/packages/service/support/user/audit/util.ts @@ -16,6 +16,7 @@ export function getI18nAppType(type: AppTypeEnum): string { if (type === AppTypeEnum.workflow) return i18nT('account_team:type.Workflow bot'); if (type === AppTypeEnum.plugin) return i18nT('account_team:type.Plugin'); if (type === AppTypeEnum.httpPlugin) return i18nT('account_team:type.Http plugin'); + if (type === AppTypeEnum.httpToolSet) return i18nT('account_team:type.Http tool set'); if (type === AppTypeEnum.toolSet) return i18nT('account_team:type.Tool set'); if (type === AppTypeEnum.tool) return i18nT('account_team:type.Tool'); return i18nT('common:UnKnow'); diff --git a/packages/service/support/user/team/utils.ts b/packages/service/support/user/team/utils.ts index eccdffac4..c6745a80f 100644 --- a/packages/service/support/user/team/utils.ts +++ b/packages/service/support/user/team/utils.ts @@ -33,3 +33,28 @@ export async function getRunningUserInfoByTmbId(tmbId: string) { return Promise.reject(TeamErrEnum.notUser); } + +export async function getUserChatInfo(tmbId: string) { + const tmb = await MongoTeamMember.findById(tmbId, 'userId teamId') + .populate<{ user: UserModelSchema; team: TeamSchema }>([ + { + path: 'user', + select: 'timezone' + }, + { + path: 'team', + select: 'openaiAccount externalWorkflowVariables' + } + ]) + .lean(); + + if (!tmb) return Promise.reject(TeamErrEnum.notUser); + + return { + timezone: tmb.user.timezone, + externalProvider: { + openaiAccount: tmb.team.openaiAccount, + externalWorkflowVariables: tmb.team.externalWorkflowVariables + } + }; +} diff --git a/packages/service/support/wallet/usage/constants.ts b/packages/service/support/wallet/usage/constants.ts new file mode 100644 index 000000000..2f9d9bd65 --- /dev/null +++ b/packages/service/support/wallet/usage/constants.ts @@ -0,0 +1,2 @@ +export const UsageCollectionName = 'usages'; +export const UsageItemCollectionName = 'usage_items'; diff --git a/packages/service/support/wallet/usage/controller.ts b/packages/service/support/wallet/usage/controller.ts index 1fa22ba3d..7b1392820 100644 --- a/packages/service/support/wallet/usage/controller.ts +++ b/packages/service/support/wallet/usage/controller.ts @@ -1,19 +1,21 @@ -import { UsageSourceEnum } from '@fastgpt/global/support/wallet/usage/constants'; +import { UsageItemTypeEnum, UsageSourceEnum } from '@fastgpt/global/support/wallet/usage/constants'; import { MongoUsage } from './schema'; import { type ClientSession } from '../../../common/mongo'; import { addLog } from '../../../common/system/log'; import { type ChatNodeUsageType } from '@fastgpt/global/support/wallet/bill/type'; -import { - type ConcatUsageProps, - type CreateUsageProps +import type { + PushUsageItemsProps, + ConcatUsageProps, + CreateUsageProps } from '@fastgpt/global/support/wallet/usage/api'; import { i18nT } from '../../../../web/i18n/utils'; import { formatModelChars2Points } from './utils'; -import { ModelTypeEnum } from '@fastgpt/global/core/ai/model'; +import { mongoSessionRun } from '../../../common/mongo/sessionRun'; +import { MongoUsageItem } from './usageItemSchema'; export async function createUsage(data: CreateUsageProps) { try { - await global.createUsageHandler(data); + return await global.createUsageHandler(data); } catch (error) { addLog.error('createUsage error', error); } @@ -25,15 +27,94 @@ export async function concatUsage(data: ConcatUsageProps) { addLog.error('concatUsage error', error); } } +export async function pushUsageItems(data: PushUsageItemsProps) { + try { + await global.pushUsageItemsHandler(data); + } catch (error) { + addLog.error('pushUsageItems error', error); + } +} -export const createChatUsage = ({ +export const createPdfParseUsage = async ({ + teamId, + tmbId, + pages, + usageId +}: { + teamId: string; + tmbId: string; + pages: number; + usageId?: string; +}) => { + const unitPrice = global.systemEnv?.customPdfParse?.price || 0; + const totalPoints = pages * unitPrice; + + if (usageId) { + pushUsageItems({ + teamId, + usageId, + list: [{ moduleName: i18nT('account_usage:pdf_enhanced_parse'), amount: totalPoints, pages }] + }); + } else { + createUsage({ + teamId, + tmbId, + appName: i18nT('account_usage:pdf_enhanced_parse'), + totalPoints, + source: UsageSourceEnum.pdfParse, + list: [ + { + moduleName: i18nT('account_usage:pdf_enhanced_parse'), + amount: totalPoints, + pages + } + ] + }); + } +}; +export const pushLLMTrainingUsage = async ({ + teamId, + model, + inputTokens, + outputTokens, + usageId, + type +}: { + teamId: string; + model: string; + inputTokens: number; + outputTokens: number; + usageId: string; + type: UsageItemTypeEnum; +}) => { + // Compute points + const { totalPoints } = formatModelChars2Points({ + model, + inputTokens, + outputTokens + }); + + concatUsage({ + usageId, + teamId, + itemType: type, + totalPoints, + inputTokens, + outputTokens + }); + + return { totalPoints }; +}; + +/* Create usage, and return usageId */ +// Chat +export const createChatUsageRecord = async ({ appName, appId, pluginId, teamId, tmbId, - source, - flowUsages + source }: { appName: string; appId?: string; @@ -41,42 +122,46 @@ export const createChatUsage = ({ teamId: string; tmbId: string; source: UsageSourceEnum; - flowUsages: ChatNodeUsageType[]; }) => { - const totalPoints = flowUsages.reduce((sum, item) => sum + (item.totalPoints || 0), 0); - - createUsage({ + const [{ _id: usageId }] = await MongoUsage.create( + [ + { + teamId, + tmbId, + appId, + pluginId, + appName, + source, + totalPoints: 0 + } + ], + { ordered: true } + ); + return String(usageId); +}; +export const pushChatItemUsage = ({ + teamId, + usageId, + nodeUsages +}: { + teamId: string; + usageId: string; + nodeUsages: ChatNodeUsageType[]; +}) => { + pushUsageItems({ teamId, - tmbId, - appName, - appId, - pluginId, - totalPoints, - source, - list: flowUsages.map((item) => ({ + usageId, + list: nodeUsages.map((item) => ({ moduleName: item.moduleName, - amount: item.totalPoints || 0, + amount: item.totalPoints, model: item.model, inputTokens: item.inputTokens, outputTokens: item.outputTokens })) }); - addLog.debug(`Create chat usage`, { - source, - teamId, - totalPoints - }); - return { totalPoints }; }; -export type DatasetTrainingMode = 'paragraph' | 'qa' | 'autoIndex' | 'imageIndex' | 'imageParse'; -export const datasetTrainingUsageIndexMap: Record = { - paragraph: 1, - qa: 2, - autoIndex: 3, - imageIndex: 4, - imageParse: 5 -}; +// Dataset training export const createTrainingUsage = async ({ teamId, tmbId, @@ -91,189 +176,161 @@ export const createTrainingUsage = async ({ tmbId: string; appName: string; billSource: UsageSourceEnum; - vectorModel?: string; + + vectorModel: string; agentModel?: string; vllmModel?: string; session?: ClientSession; }) => { - const [{ _id }] = await MongoUsage.create( - [ + const create = async (session: ClientSession) => { + const [result] = await MongoUsage.create( + [ + { + teamId, + tmbId, + source: billSource, + appName, + totalPoints: 0 + } + ], + { session, ordered: true } + ); + await MongoUsageItem.create( + [ + { + teamId, + usageId: result._id, + itemType: UsageItemTypeEnum.training_vector, + name: i18nT('account_usage:embedding_index'), + model: vectorModel, + amount: 0, + inputTokens: 0 + }, + ...(agentModel + ? [ + { + teamId, + usageId: result._id, + itemType: UsageItemTypeEnum.training_paragraph, + name: i18nT('account_usage:llm_paragraph'), + model: agentModel, + amount: 0, + inputTokens: 0, + outputTokens: 0 + }, + { + teamId, + usageId: result._id, + itemType: UsageItemTypeEnum.training_qa, + name: i18nT('account_usage:qa'), + model: agentModel, + amount: 0, + inputTokens: 0, + outputTokens: 0 + }, + { + teamId, + usageId: result._id, + itemType: UsageItemTypeEnum.training_autoIndex, + name: i18nT('account_usage:auto_index'), + model: agentModel, + amount: 0, + inputTokens: 0, + outputTokens: 0 + } + ] + : []), + ...(vllmModel + ? [ + { + teamId, + usageId: result._id, + itemType: UsageItemTypeEnum.training_imageIndex, + name: i18nT('account_usage:image_index'), + model: vllmModel, + amount: 0, + inputTokens: 0, + outputTokens: 0 + }, + { + teamId, + usageId: result._id, + itemType: UsageItemTypeEnum.training_imageParse, + name: i18nT('account_usage:image_parse'), + model: vllmModel, + amount: 0, + inputTokens: 0, + outputTokens: 0 + } + ] + : []) + ], { - teamId, - tmbId, - appName, - source: billSource, - totalPoints: 0, - list: [ - ...(vectorModel - ? [ - { - moduleName: i18nT('account_usage:embedding_index'), - model: vectorModel, - amount: 0, - inputTokens: 0, - outputTokens: 0 - } - ] - : []), - ...(agentModel - ? [ - { - moduleName: i18nT('account_usage:llm_paragraph'), - model: agentModel, - amount: 0, - inputTokens: 0, - outputTokens: 0 - }, - { - moduleName: i18nT('account_usage:qa'), - model: agentModel, - amount: 0, - inputTokens: 0, - outputTokens: 0 - }, - { - moduleName: i18nT('account_usage:auto_index'), - model: agentModel, - amount: 0, - inputTokens: 0, - outputTokens: 0 - } - ] - : []), - ...(vllmModel - ? [ - { - moduleName: i18nT('account_usage:image_index'), - model: vllmModel, - amount: 0, - inputTokens: 0, - outputTokens: 0 - }, - { - moduleName: i18nT('account_usage:image_parse'), - model: vllmModel, - amount: 0, - inputTokens: 0, - outputTokens: 0 - } - ] - : []) - ] + session, + ordered: true } - ], - { session, ordered: true } - ); + ); - return { billId: String(_id) }; -}; - -export const createPdfParseUsage = async ({ - teamId, - tmbId, - pages -}: { - teamId: string; - tmbId: string; - pages: number; -}) => { - const unitPrice = global.systemEnv?.customPdfParse?.price || 0; - const totalPoints = pages * unitPrice; - - createUsage({ - teamId, - tmbId, - appName: i18nT('account_usage:pdf_enhanced_parse'), - totalPoints, - source: UsageSourceEnum.pdfParse, - list: [ - { - moduleName: i18nT('account_usage:pdf_enhanced_parse'), - amount: totalPoints, - pages - } - ] - }); -}; - -export const pushLLMTrainingUsage = async ({ - teamId, - tmbId, - model, - inputTokens, - outputTokens, - billId, - mode -}: { - teamId: string; - tmbId: string; - model: string; - inputTokens: number; - outputTokens: number; - billId: string; - mode: DatasetTrainingMode; -}) => { - const index = datasetTrainingUsageIndexMap[mode]; - - // Compute points - const { totalPoints } = formatModelChars2Points({ - model, - inputTokens, - outputTokens - }); - - concatUsage({ - billId, - teamId, - tmbId, - totalPoints, - inputTokens, - outputTokens, - listIndex: index - }); - - return { totalPoints }; + return { usageId: String(result._id) }; + }; + if (session) return create(session); + return mongoSessionRun(create); }; +// Evaluation export const createEvaluationUsage = async ({ teamId, tmbId, appName, - model, - session + model }: { teamId: string; tmbId: string; appName: string; model: string; - session?: ClientSession; }) => { - const [{ _id: usageId }] = await MongoUsage.create( - [ + const { usageId } = await mongoSessionRun(async (session) => { + const [{ _id: usageId }] = await MongoUsage.create( + [ + { + teamId, + tmbId, + appName, + source: UsageSourceEnum.evaluation, + totalPoints: 0 + } + ], + { session, ordered: true } + ); + await MongoUsageItem.create( + [ + { + teamId, + usageId, + itemType: UsageItemTypeEnum.evaluation_generateAnswer, + name: i18nT('account_usage:generate_answer'), + amount: 0, + count: 0 + }, + { + teamId, + usageId, + itemType: UsageItemTypeEnum.evaluation_answerAccuracy, + name: i18nT('account_usage:answer_accuracy'), + amount: 0, + inputTokens: 0, + outputTokens: 0, + model + } + ], { - teamId, - tmbId, - appName, - source: UsageSourceEnum.evaluation, - totalPoints: 0, - list: [ - { - moduleName: i18nT('account_usage:generate_answer'), - amount: 0, - count: 0 - }, - { - moduleName: i18nT('account_usage:answer_accuracy'), - amount: 0, - inputTokens: 0, - outputTokens: 0, - model - } - ] + session, + ordered: true } - ], - { session, ordered: true } - ); + ); + + return { usageId: String(usageId) }; + }); return { usageId }; }; diff --git a/packages/service/support/wallet/usage/schema.ts b/packages/service/support/wallet/usage/schema.ts index 16ae19047..db644447f 100644 --- a/packages/service/support/wallet/usage/schema.ts +++ b/packages/service/support/wallet/usage/schema.ts @@ -1,4 +1,4 @@ -import { connectionMongo, getMongoModel, type Model } from '../../../common/mongo'; +import { connectionMongo, getMongoModel } from '../../../common/mongo'; const { Schema } = connectionMongo; import { type UsageSchemaType } from '@fastgpt/global/support/wallet/usage/type'; import { UsageSourceEnum } from '@fastgpt/global/support/wallet/usage/constants'; @@ -6,8 +6,7 @@ import { TeamCollectionName, TeamMemberCollectionName } from '@fastgpt/global/support/user/team/constant'; - -export const UsageCollectionName = 'usages'; +import { UsageCollectionName, UsageItemCollectionName } from './constants'; const UsageSchema = new Schema({ teamId: { @@ -30,6 +29,11 @@ const UsageSchema = new Schema({ type: String, default: '' }, + totalPoints: { + // total points + type: Number, + required: true + }, appId: { type: Schema.Types.ObjectId, ref: 'apps', @@ -44,26 +48,21 @@ const UsageSchema = new Schema({ type: Date, default: () => new Date() }, - totalPoints: { - // total points - type: Number, - required: true - }, - // total: { - // // total points - // type: Number, - // required: true - // }, + + // @description It will not be used again in the future. list: { - type: Array, - default: [] + type: Array } }); +UsageSchema.virtual('usageItems', { + ref: UsageItemCollectionName, + localField: '_id', + foreignField: 'usageId' +}); + try { UsageSchema.index({ teamId: 1, tmbId: 1, source: 1, time: 1, appName: 1, _id: -1 }); - // timer task. clear dead team - // UsageSchema.index({ teamId: 1, time: -1 }); UsageSchema.index({ time: 1 }, { expireAfterSeconds: 360 * 24 * 60 * 60 }); } catch (error) { diff --git a/packages/service/support/wallet/usage/type.d.ts b/packages/service/support/wallet/usage/type.d.ts index 947b1041a..80e82629f 100644 --- a/packages/service/support/wallet/usage/type.d.ts +++ b/packages/service/support/wallet/usage/type.d.ts @@ -1,16 +1,6 @@ -export type ConcatBillQueueItemType = { - billId: string; // usageId - listIndex?: number; - totalPoints: number; - - // Model usage - inputTokens?: number; - outputTokens?: number; - // Times - count?: number; -}; +import type { ConcatUsageProps } from '@fastgpt/global/support/wallet/usage/api'; declare global { var reduceAiPointsQueue: { teamId: string; totalPoints: number }[]; - var concatBillQueue: ConcatBillQueueItemType[]; + var concatBillQueue: ConcatUsageProps[]; } diff --git a/packages/service/support/wallet/usage/usageItemSchema.ts b/packages/service/support/wallet/usage/usageItemSchema.ts new file mode 100644 index 000000000..b9d018814 --- /dev/null +++ b/packages/service/support/wallet/usage/usageItemSchema.ts @@ -0,0 +1,53 @@ +import { connectionMongo, getMongoModel } from '../../../common/mongo'; +const { Schema } = connectionMongo; +import type { UsageItemSchemaType } from '@fastgpt/global/support/wallet/usage/type'; +import { UsageCollectionName, UsageItemCollectionName } from './constants'; +import { TeamCollectionName } from '@fastgpt/global/support/user/team/constant'; + +const UsageItemSchema = new Schema({ + teamId: { + type: Schema.Types.ObjectId, + ref: TeamCollectionName, + required: true + }, + usageId: { + type: Schema.Types.ObjectId, + ref: UsageCollectionName, + required: true + }, + name: { + // usage name + type: String, + required: true + }, + amount: { + type: Number, + default: 0 + }, + itemType: Number, + time: { + type: Date, + default: () => new Date() + }, + + // Params + inputTokens: Number, + outputTokens: Number, + charsLength: Number, + duration: Number, + pages: Number, + count: Number, + model: String +}); + +try { + UsageItemSchema.index({ usageId: 'hashed' }); + UsageItemSchema.index({ time: 1 }, { expireAfterSeconds: 360 * 24 * 60 * 60 }); +} catch (error) { + console.log(error); +} + +export const MongoUsageItem = getMongoModel( + UsageItemCollectionName, + UsageItemSchema +); diff --git a/packages/service/thirdProvider/fastgptPlugin/index.ts b/packages/service/thirdProvider/fastgptPlugin/index.ts index e720eaeb9..c38d9509f 100644 --- a/packages/service/thirdProvider/fastgptPlugin/index.ts +++ b/packages/service/thirdProvider/fastgptPlugin/index.ts @@ -1,9 +1,9 @@ import { createClient } from '@fastgpt/global/sdk/fastgpt-plugin'; -export const BASE_URL = process.env.PLUGIN_BASE_URL || ''; -export const TOKEN = process.env.PLUGIN_TOKEN || ''; +export const PLUGIN_BASE_URL = process.env.PLUGIN_BASE_URL || ''; +export const PLUGIN_TOKEN = process.env.PLUGIN_TOKEN || ''; export const pluginClient = createClient({ - baseUrl: BASE_URL, - token: TOKEN + baseUrl: PLUGIN_BASE_URL, + token: PLUGIN_TOKEN }); diff --git a/packages/service/worker/readFile/parseOffice.ts b/packages/service/worker/readFile/parseOffice.ts index d4de58f26..3b16dc770 100644 --- a/packages/service/worker/readFile/parseOffice.ts +++ b/packages/service/worker/readFile/parseOffice.ts @@ -43,9 +43,18 @@ const parsePowerPoint = async ({ return Promise.reject('解析 PPT 失败'); } + // Sort files by slide number to ensure correct order + const sortedFiles = files.sort((a, b) => { + const getSlideNumber = (path: string) => { + const match = path.match(/\d+/); + return match ? parseInt(match[0]) : 0; + }; + return getSlideNumber(a.path) - getSlideNumber(b.path); + }); + // Returning an array of all the xml contents read using fs.readFileSync const xmlContentArray = await Promise.all( - files.map(async (file) => { + sortedFiles.map(async (file) => { try { return await fs.promises.readFile(`${decompressPath}/${file.path}`, encoding); } catch (err) { diff --git a/packages/web/components/common/DateRangePicker/index.tsx b/packages/web/components/common/DateRangePicker/index.tsx index f21a4fa5b..335a76327 100644 --- a/packages/web/components/common/DateRangePicker/index.tsx +++ b/packages/web/components/common/DateRangePicker/index.tsx @@ -1,6 +1,6 @@ import React, { useState, useMemo, useRef, useEffect } from 'react'; import type { BoxProps } from '@chakra-ui/react'; -import { Box, Card, Flex, useOutsideClick, Button } from '@chakra-ui/react'; +import { Box, Card, Flex, useTheme, useOutsideClick, Button } from '@chakra-ui/react'; import { addDays, format } from 'date-fns'; import { DayPicker } from 'react-day-picker'; import 'react-day-picker/dist/style.css'; diff --git a/packages/web/components/common/Icon/constants.ts b/packages/web/components/common/Icon/constants.ts index 053042726..1dec87576 100644 --- a/packages/web/components/common/Icon/constants.ts +++ b/packages/web/components/common/Icon/constants.ts @@ -13,6 +13,7 @@ export const iconPaths = { close: () => import('./icons/close.svg'), closeSolid: () => import('./icons/closeSolid.svg'), code: () => import('./icons/code.svg'), + codeCopilot: () => import('./icons/codeCopilot.svg'), collectionLight: () => import('./icons/collectionLight.svg'), collectionSolid: () => import('./icons/collectionSolid.svg'), comment: () => import('./icons/comment.svg'), diff --git a/packages/web/components/common/Icon/icons/codeCopilot.svg b/packages/web/components/common/Icon/icons/codeCopilot.svg new file mode 100644 index 000000000..7c253362c --- /dev/null +++ b/packages/web/components/common/Icon/icons/codeCopilot.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/web/components/common/MyMenu/index.tsx b/packages/web/components/common/MyMenu/index.tsx index 220589d19..6be822b44 100644 --- a/packages/web/components/common/MyMenu/index.tsx +++ b/packages/web/components/common/MyMenu/index.tsx @@ -225,7 +225,7 @@ const MyMenu = ({ autoSelect={false} direction={'ltr'} isLazy - lazyBehavior={'keepMounted'} + lazyBehavior={'unmount'} placement={placement} computePositionOnMount > diff --git a/packages/web/components/common/MyPopover/PopoverConfirm.tsx b/packages/web/components/common/MyPopover/PopoverConfirm.tsx index 1e4f4e434..a4b9eea8d 100644 --- a/packages/web/components/common/MyPopover/PopoverConfirm.tsx +++ b/packages/web/components/common/MyPopover/PopoverConfirm.tsx @@ -73,7 +73,7 @@ const PopoverConfirm = ({ openDelay={100} closeDelay={100} isLazy - lazyBehavior="keepMounted" + lazyBehavior="unmount" arrowSize={10} strategy={'fixed'} computePositionOnMount={true} diff --git a/packages/web/components/common/MyPopover/index.tsx b/packages/web/components/common/MyPopover/index.tsx index 24ed31a9c..5a9d07950 100644 --- a/packages/web/components/common/MyPopover/index.tsx +++ b/packages/web/components/common/MyPopover/index.tsx @@ -60,7 +60,7 @@ const MyPopover = ({ openDelay={100} closeDelay={100} isLazy - lazyBehavior="keepMounted" + lazyBehavior="unmount" autoFocus={false} > {Trigger} diff --git a/packages/web/components/common/MySelect/MultipleSelect.tsx b/packages/web/components/common/MySelect/MultipleSelect.tsx index c95ee045c..4ba33c691 100644 --- a/packages/web/components/common/MySelect/MultipleSelect.tsx +++ b/packages/web/components/common/MySelect/MultipleSelect.tsx @@ -1,7 +1,6 @@ import type { FlexProps } from '@chakra-ui/react'; import { Box, - Button, type ButtonProps, Checkbox, Flex, diff --git a/packages/web/components/common/Textarea/PromptEditor/Editor.tsx b/packages/web/components/common/Textarea/PromptEditor/Editor.tsx index f11a8ff34..daaebedc4 100644 --- a/packages/web/components/common/Textarea/PromptEditor/Editor.tsx +++ b/packages/web/components/common/Textarea/PromptEditor/Editor.tsx @@ -6,6 +6,7 @@ * */ +import type { CSSProperties } from 'react'; import { useMemo, useState, useTransition } from 'react'; import { LexicalComposer } from '@lexical/react/LexicalComposer'; import { PlainTextPlugin } from '@lexical/react/LexicalPlainTextPlugin'; @@ -40,18 +41,17 @@ import { useDeepCompareEffect } from 'ahooks'; import VariablePickerPlugin from './plugins/VariablePickerPlugin'; import MarkdownPlugin from './plugins/MarkdownPlugin'; import MyIcon from '../../Icon'; -import TabToSpacesPlugin from './plugins/TabToSpacesPlugin'; import ListExitPlugin from './plugins/ListExitPlugin'; +import KeyDownPlugin from './plugins/KeyDownPlugin'; -const Placeholder = ({ children }: { children: React.ReactNode }) => ( +const Placeholder = ({ children, padding }: { children: React.ReactNode; padding: string }) => ( @@ -78,12 +78,14 @@ export type EditorProps = { maxH?: number; maxLength?: number; placeholder?: string; + placeholderPadding?: string; isInvalid?: boolean; - + onKeyDown?: (e: React.KeyboardEvent) => void; ExtensionPopover?: ((e: { onChangeText: (text: string) => void; iconButtonStyle: Record; }) => React.ReactNode)[]; + boxStyle?: CSSProperties; }; export default function Editor({ @@ -100,10 +102,12 @@ export default function Editor({ onBlur, value, placeholder = '', + placeholderPadding = '12px 14px', bg = 'white', isInvalid, - - ExtensionPopover + onKeyDown, + ExtensionPopover, + boxStyle }: EditorProps & FormPropsType & { onOpenModal?: () => void; @@ -180,13 +184,14 @@ export default function Editor({ className={`${isInvalid ? styles.contentEditable_invalid : styles.contentEditable} ${styles.richText}`} style={{ minHeight: `${minH}px`, - maxHeight: `${maxH}px` + maxHeight: `${maxH}px`, + ...boxStyle }} onFocus={() => setFocus(true)} onBlur={() => setFocus(false)} /> } - placeholder={{placeholder}} + placeholder={{placeholder}} ErrorBoundary={LexicalErrorBoundary} /> ) : ( @@ -196,11 +201,12 @@ export default function Editor({ className={isInvalid ? styles.contentEditable_invalid : styles.contentEditable} style={{ minHeight: `${minH}px`, - maxHeight: `${maxH}px` + maxHeight: `${maxH}px`, + ...boxStyle }} /> } - placeholder={{placeholder}} + placeholder={{placeholder}} ErrorBoundary={LexicalErrorBoundary} /> )} @@ -210,6 +216,7 @@ export default function Editor({ + {variableLabels.length > 0 && ( diff --git a/packages/web/components/common/Textarea/PromptEditor/index.tsx b/packages/web/components/common/Textarea/PromptEditor/index.tsx index a968540ef..ae462e3df 100644 --- a/packages/web/components/common/Textarea/PromptEditor/index.tsx +++ b/packages/web/components/common/Textarea/PromptEditor/index.tsx @@ -13,6 +13,7 @@ const PromptEditor = ({ value, onChange, onBlur, + onKeyDown, title, isDisabled, ...props @@ -67,6 +68,7 @@ const PromptEditor = ({ onChange={onChangeInput} onChangeText={onChange} onBlur={onBlurInput} + onKeyDown={onKeyDown} /> {isDisabled && ( diff --git a/packages/web/components/common/Textarea/PromptEditor/plugins/KeyDownPlugin/index.tsx b/packages/web/components/common/Textarea/PromptEditor/plugins/KeyDownPlugin/index.tsx new file mode 100644 index 000000000..45aec718a --- /dev/null +++ b/packages/web/components/common/Textarea/PromptEditor/plugins/KeyDownPlugin/index.tsx @@ -0,0 +1,38 @@ +import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'; +import { KEY_DOWN_COMMAND, COMMAND_PRIORITY_HIGH } from 'lexical'; +import { useEffect } from 'react'; + +export default function KeyDownPlugin({ + onKeyDown +}: { + onKeyDown?: (e: React.KeyboardEvent) => void; +}) { + const [editor] = useLexicalComposerContext(); + + useEffect(() => { + if (!onKeyDown) return; + + return editor.registerCommand( + KEY_DOWN_COMMAND, + (event: KeyboardEvent) => { + const syntheticEvent = { + key: event.key, + shiftKey: event.shiftKey, + ctrlKey: event.ctrlKey, + metaKey: event.metaKey, + altKey: event.altKey, + preventDefault: () => event.preventDefault(), + stopPropagation: () => event.stopPropagation(), + nativeEvent: event + } as React.KeyboardEvent; + + onKeyDown(syntheticEvent); + + return event.defaultPrevented; + }, + COMMAND_PRIORITY_HIGH + ); + }, [editor, onKeyDown]); + + return null; +} diff --git a/packages/web/components/common/Textarea/PromptEditor/plugins/VariableLabelPlugin/index.tsx b/packages/web/components/common/Textarea/PromptEditor/plugins/VariableLabelPlugin/index.tsx index 56dc3b5af..55eaa7390 100644 --- a/packages/web/components/common/Textarea/PromptEditor/plugins/VariableLabelPlugin/index.tsx +++ b/packages/web/components/common/Textarea/PromptEditor/plugins/VariableLabelPlugin/index.tsx @@ -22,15 +22,22 @@ export default function VariableLabelPlugin({ throw new Error('VariableLabelPlugin: VariableLabelPlugin not registered on editor'); }, [editor]); - const createVariableLabelPlugin = useCallback((textNode: TextNode): VariableLabelNode => { - const [parentKey, childrenKey] = textNode.getTextContent().slice(3, -3).split('.'); - const currentVariable = variables.find( - (item) => item.parent.id === parentKey && item.key === childrenKey - ); - const variableLabel = `${currentVariable && t(currentVariable.parent?.label as any)}.${currentVariable?.label}`; - const nodeAvatar = currentVariable?.parent?.avatar || ''; - return $createVariableLabelNode(textNode.getTextContent(), variableLabel, nodeAvatar); - }, []); + const createVariableLabelPlugin = useCallback( + (textNode: TextNode): VariableLabelNode => { + const content = textNode.getTextContent().slice(3, -3); // Remove {{$ and $}} + const dotIndex = content.indexOf('.'); + const parentKey = content.slice(0, dotIndex); + const childrenKey = content.slice(dotIndex + 1); + + const currentVariable = variables.find( + (item) => item.parent.id === parentKey && item.key === childrenKey + ); + const variableLabel = `${currentVariable && t(currentVariable.parent?.label as any)}.${currentVariable?.label}`; + const nodeAvatar = currentVariable?.parent?.avatar || ''; + return $createVariableLabelNode(textNode.getTextContent(), variableLabel, nodeAvatar); + }, + [t] + ); const getVariableMatch = useCallback((text: string) => { const matches = REGEX.exec(text); diff --git a/packages/web/core/workflow/constants.ts b/packages/web/core/workflow/constants.ts index 59737bdee..bc1227bef 100644 --- a/packages/web/core/workflow/constants.ts +++ b/packages/web/core/workflow/constants.ts @@ -34,7 +34,7 @@ export const workflowSystemNodeTemplateList: { export const defaultGroup: SystemToolGroupSchemaType = { groupId: 'systemPlugin', groupAvatar: 'core/app/type/pluginLight', - groupName: i18nT('common:core.module.template.System Plugin'), + groupName: i18nT('app:core.module.template.System Tools'), groupOrder: 0, groupTypes: [] // from getPluginGroups }; diff --git a/packages/web/hooks/useMemoEnhance.ts b/packages/web/hooks/useMemoEnhance.ts new file mode 100644 index 000000000..e8403f030 --- /dev/null +++ b/packages/web/hooks/useMemoEnhance.ts @@ -0,0 +1,27 @@ +import { isEqual } from 'lodash'; +import { useRef } from 'react'; +import type { DependencyList } from 'react'; + +/** + * Enhanced memo hook that provides more stable references than useMemo + * Similar to ahooks useCreation, ensures factory function is only called when dependencies change + * @param factory - Function that returns the value to be memoized + * @param deps - Dependency array to determine when to re-execute factory + * @returns The memoized value + */ +export function useMemoEnhance(factory: () => T, deps: DependencyList): T { + const { current } = useRef({ + obj: undefined as undefined | T, + initialized: false, + deps: deps as DependencyList + }); + + // Check if this is the first render or if dependencies have changed + if (!current.initialized || !isEqual(current.deps, deps)) { + current.obj = factory(); + current.initialized = true; + current.deps = deps; + } + + return current.obj as T; +} diff --git a/packages/web/hooks/useTableMultipleSelect.tsx b/packages/web/hooks/useTableMultipleSelect.tsx index 84d2540e2..7d47a0d9d 100644 --- a/packages/web/hooks/useTableMultipleSelect.tsx +++ b/packages/web/hooks/useTableMultipleSelect.tsx @@ -63,10 +63,20 @@ export const useTableMultipleSelect = ({ ({ children, Controler, + activedStyles, ...props - }: { children: ReactNode; Controler: ReactNode } & FlexProps) => { - return ( - + }: { children?: ReactNode; activedStyles?: FlexProps; Controler: ReactNode } & FlexProps) => { + return hasSelections ? ( + {hasSelections && ( <> @@ -80,7 +90,7 @@ export const useTableMultipleSelect = ({ )} {children} - ); + ) : null; }, [hasSelections, isSelecteAll, selectAllTrigger, selectedCount, t] ); diff --git a/packages/web/i18n/en/account_model.json b/packages/web/i18n/en/account_model.json index 7e03ece02..631a9842c 100644 --- a/packages/web/i18n/en/account_model.json +++ b/packages/web/i18n/en/account_model.json @@ -89,5 +89,6 @@ "vlm_model": "Vlm", "vlm_model_tip": "Used to generate additional indexing of images in a document in the knowledge base", "volunme_of_failed_calls": "Error amount", - "waiting_test": "Waiting for testing" + "waiting_test": "Waiting for testing", + "model_permission_config_hint": "If no collaborators are added, all members are available by default" } diff --git a/packages/web/i18n/en/account_team.json b/packages/web/i18n/en/account_team.json index 36b54af9e..a79e7c89d 100644 --- a/packages/web/i18n/en/account_team.json +++ b/packages/web/i18n/en/account_team.json @@ -56,10 +56,10 @@ "create_invoice": "Issuing invoices", "create_org": "Create organization", "create_sub_org": "Create sub-organization", - "dataset.api_file": "API Import", + "dataset.api_file": "API Knowledge Base", "dataset.common_dataset": "Dataset", "dataset.external_file": "External File", - "dataset.feishu_dataset": "Feishu Spreadsheet", + "dataset.feishu_dataset": "Feishu Cloud Documentation", "dataset.folder_dataset": "Folder", "dataset.website_dataset": "Website Sync", "dataset.yuque_dataset": "Yuque Knowledge Base", diff --git a/packages/web/i18n/en/account_usage.json b/packages/web/i18n/en/account_usage.json index 6415a45bd..4c810e2c1 100644 --- a/packages/web/i18n/en/account_usage.json +++ b/packages/web/i18n/en/account_usage.json @@ -41,6 +41,8 @@ "points": "Points", "project_name": "Project name", "qa": "QA", + "rerank": "Rerank", + "search_test": "Search test", "select_member_and_source_first": "Please select members and types first", "share": "Share Link", "source": "source", diff --git a/packages/web/i18n/en/app.json b/packages/web/i18n/en/app.json index 8e682bfce..39bb925a8 100644 --- a/packages/web/i18n/en/app.json +++ b/packages/web/i18n/en/app.json @@ -2,6 +2,7 @@ "AutoOptimize": "Automatic optimization", "Click_to_delete_this_field": "Click to delete this field", "Filed_is_deprecated": "This field is deprecated", + "HTTP_tools_list_with_number": "Tool list: {{total}}", "Index": "Index", "MCP_tools_debug": "debug", "MCP_tools_detail": "check the details", @@ -22,10 +23,12 @@ "Optimizer_Reoptimize": "Re-optimize", "Optimizer_Replace": "replace", "Optimizer_Tooltip": "AI optimization prompt words", + "Params_config": "Params Config", "Role_setting": "Permission", "Run": "Execute", "Search_dataset": "Search dataset", "Selected": "Selected", + "Start_config": "Start configuration", "Team_Tags": "Team tags", "ai_point_price": "Billing", "ai_settings": "AI Configuration", @@ -42,6 +45,8 @@ "app.version_past": "Previously Published", "app.version_publish_tips": "This version will be saved to the team cloud, synchronized with the entire team, and update the app version on all release channels.", "app_detail": "Application Details", + "apply_code": "Apply", + "apply_code_failed": "Failed to apply code", "auto_execute": "Automatic execution", "auto_execute_default_prompt_placeholder": "Default questions sent when executing automatically", "auto_execute_tip": "After turning it on, the workflow will be automatically triggered when the user enters the conversation interface. \nExecution order: 1. Dialogue starter; 2. Global variables; 3. Automatic execution.", @@ -49,22 +54,28 @@ "chat_debug": "Chat Preview", "chat_logs": "Logs", "chat_logs_tips": "Logs will record the online, shared, and API (requires chatId) conversation records of this app.", - "common.day": "day", + "code_applied_successfully": "Code applied successfully", + "code_function_describe": "Describe your code function, enter \"/\" to select the variable", "config_ai_model_params": "Click to configure AI model related properties", "config_file_upload": "Click to Configure File Upload Rules", "config_question_guide": "Configuration guess you want to ask", "confirm_copy_app_tip": "The system will create an app with the same configuration for you, but permissions will not be copied. Please confirm!", "confirm_del_app_tip": "Are you sure you want to delete 【{{name}}】 and all of its chat history?", "confirm_delete_folder_tip": "Confirm to delete this folder? All apps and corresponding conversation records under it will be deleted. Please confirm!", + "copilot_config_message": "Current Node Configuration Information: \n Code Type: {{codeType}} \n Current Code: \\\\`\\\\`\\\\`{{codeType}} \n{{code}} \\\\`\\\\`\\\\` \n Input Parameters: {{inputs}} \n Output Parameters: {{outputs}}", + "copilot_confirm_message": "The original configuration has been received to understand the current code structure and input and output parameters. \nPlease explain your optimization requirements.", "copy_one_app": "Create Duplicate", "core.app.QG.Switch": "Enable guess what you want to ask", "core.dataset.import.Custom prompt": "Custom Prompt", + "core.module.template.System Tools": "System Tools", + "core.workflow.Copilot": "AI Generation", "create_by_curl": "By CURL", "create_by_template": "By template", "create_copy_success": "Duplicate Created Successfully", "create_empty_app": "Create Default App", "create_empty_plugin": "Create Default Plugin", "create_empty_workflow": "Create Default Workflow", + "create_http_toolset": "Create HTTP Toolset", "cron.every_day": "Run Daily", "cron.every_month": "Run Monthly", "cron.every_week": "Run Weekly", @@ -213,6 +224,8 @@ "publish_success": "Publish Successful", "question_guide_tip": "After the conversation, 3 guiding questions will be generated for you.", "reasoning_response": "Output thinking", + "reference_variable": "Reference variables", + "request_headers": "Request header", "response_format": "Response format", "save_team_app_log_keys": "Save as team configuration", "saved_success": "Saved successfully! \nTo use this version externally, click Save and Publish", @@ -252,6 +265,12 @@ "template_market": "Templates", "template_market_description": "Explore more features in the template market, with configuration tutorials and usage guides to help you understand and get started with various applications.", "template_market_empty_data": "No suitable templates found", + "test_all_passed": "All tests passed", + "test_code": "Test", + "test_code_incomplete": "The code parsing is incomplete and cannot be tested", + "test_execution_failed": "Test execution failed", + "test_failed_with_progress": "Test failed {{passed}}/{{total}}", + "this_tool_requires_no_input": "This tool does not require input", "time_granularity": "Time granularity", "time_range_limit": "Time range limit", "time_type": "Time Type", @@ -265,6 +284,7 @@ "tool_input_param_tip": "This plugin requires configuration of related information to run properly.", "tool_not_active": "This tool has not been activated yet", "tool_run_free": "This tool runs without points consumption", + "tool_tip": "When executed as a tool, is this field used as a tool response result?", "tool_type_tools": "tool", "tools_no_description": "This tool has not been introduced ~", "transition_to_workflow": "Convert to Workflow", @@ -283,7 +303,13 @@ "type.Create workflow bot": "Create Workflow", "type.Create workflow tip": "Build complex multi-turn dialogue AI applications through low-code methods, recommended for advanced users.", "type.Folder": "Folder", + "type.Http batch": "Bulk creation", + "type.Http batch tip": "Bulk creation tool with OpenAPI Schema", + "type.Http manual": "Create manually", + "type.Http manual tip": "Create a single tool by curl or manually filling in parameters", "type.Http plugin": "HTTP Plugin", + "type.Http plugin_deprecated": "The HTTP plug-in is deprecated. To configure Openapi Schema, use the HTTP tool set", + "type.Http tool set": "HTTP Tool Set", "type.Import from json": "Import JSON", "type.Import from json tip": "Create applications directly through JSON configuration files", "type.Import from json_error": "Failed to get workflow data, please check the URL or manually paste the JSON data", diff --git a/packages/web/i18n/en/common.json b/packages/web/i18n/en/common.json index df4a2bd8d..0a11bc546 100644 --- a/packages/web/i18n/en/common.json +++ b/packages/web/i18n/en/common.json @@ -416,7 +416,6 @@ "core.chat.response.module query": "Question/Search Term", "core.chat.response.module similarity": "Similarity", "core.chat.response.module temperature": "Temperature", - "core.chat.response.module time": "Run Time", "core.chat.response.plugin output": "Plugin Output Value", "core.chat.response.search using reRank": "Result Re-Rank", "core.chat.response.text output": "Text Output", @@ -619,6 +618,7 @@ "core.module.extract.Required Description": "Even if the field cannot be extracted, it will be returned using the default value", "core.module.extract.Target field": "Target Field", "core.module.http.Add props": "Add Parameter", + "core.module.http.Add_props_value": "Add parameter values", "core.module.http.AppId": "App ID", "core.module.http.ChatId": "Current Chat ID", "core.module.http.Current time": "Current Time", @@ -663,7 +663,6 @@ "core.module.template.AI support tool tip": "Models that support function calls can better use tool calls.", "core.module.template.Basic Node": "Basic", "core.module.template.Query extension": "Question Optimization", - "core.module.template.System Plugin": "System Plugin", "core.module.template.System input module": "System Input", "core.module.template.Team app": "Team", "core.module.template.UnKnow Module": "Unknown Module", @@ -984,10 +983,8 @@ "plugin.App": "Select App", "plugin.Currentapp": "Current App", "plugin.Description": "Description", - "plugin.Edit Http Plugin": "Edit HTTP Plugin", "plugin.Enter PAT": "Enter Personal Access Token (PAT)", "plugin.Get Plugin Module Detail Failed": "Failed to Retrieve Plugin Information", - "plugin.Import Plugin": "Import HTTP Plugin", "plugin.Import from URL": "Import from URL. https://xxxx", "plugin.Intro": "Plugin Introduction", "plugin.Invalid Env": "Invalid Laf Environment", @@ -1214,6 +1211,7 @@ "support.wallet.usage.App name": "App Name", "support.wallet.usage.Audio Speech": "Voice Playback", "support.wallet.usage.Bill Module": "Billing Module", + "support.wallet.usage.Code Copilot": "Code Copilot", "support.wallet.usage.Duration": "Duration (seconds)", "support.wallet.usage.Module name": "Module Name", "support.wallet.usage.Optimize Prompt": "Prompt word optimization", @@ -1225,6 +1223,7 @@ "support.wallet.usage.Total points": "AI Points Consumption", "support.wallet.usage.Usage Detail": "Usage Details", "support.wallet.usage.Whisper": "Voice Input", + "sure_delete_tool_cannot_undo": "Are you sure to delete the tool? \nThis operation cannot be withdrawn", "sync_link": "Sync Link", "sync_success": "Synced Successfully", "system.Concat us": "Contact Us", diff --git a/packages/web/i18n/en/file.json b/packages/web/i18n/en/file.json index d53d0a88c..172b7b0bd 100644 --- a/packages/web/i18n/en/file.json +++ b/packages/web/i18n/en/file.json @@ -13,12 +13,14 @@ "Only_support_uploading_one_image": "Only support uploading one image", "Please select the image to upload": "Please select the image to upload", "Please wait for all files to upload": "Please wait for all files to be uploaded to complete", + "common.upload_system_tools": "Upload system tools", "bucket_chat": "Conversation Files", "bucket_file": "Dataset Documents", "bucket_image": "picture", "click_to_view_raw_source": "Click to View Original Source", "common.Some images failed to process": "Some images failed to process", "common.dataset_data_input_image_support_format": "Support .jpg, .jpeg, .png, .gif, .webp formats", + "common.import_update": "Import/Update", "count.core.dataset.collection.Create Success": "{{count}} picture successfully imported", "delete_image": "Delete pictures", "file_name": "Filename", diff --git a/packages/web/i18n/zh-CN/account_model.json b/packages/web/i18n/zh-CN/account_model.json index 6d97ac6ef..52d1c3d99 100644 --- a/packages/web/i18n/zh-CN/account_model.json +++ b/packages/web/i18n/zh-CN/account_model.json @@ -89,5 +89,6 @@ "vlm_model": "图片理解模型", "vlm_model_tip": "用于知识库中对文档中的图片进行额外的索引生成", "volunme_of_failed_calls": "调用失败量", - "waiting_test": "等待测试" + "waiting_test": "等待测试", + "model_permission_config_hint": "若无协作者,默认全部成员可用" } diff --git a/packages/web/i18n/zh-CN/account_team.json b/packages/web/i18n/zh-CN/account_team.json index 67f3c37bd..e99dc78ff 100644 --- a/packages/web/i18n/zh-CN/account_team.json +++ b/packages/web/i18n/zh-CN/account_team.json @@ -57,10 +57,10 @@ "create_invoice": "开发票", "create_org": "创建部门", "create_sub_org": "创建子部门", - "dataset.api_file": "API导入", + "dataset.api_file": "API 知识库", "dataset.common_dataset": "知识库", "dataset.external_file": "外部文件", - "dataset.feishu_dataset": "飞书多维表格", + "dataset.feishu_dataset": "飞书云文档", "dataset.folder_dataset": "文件夹", "dataset.website_dataset": "网站同步", "dataset.yuque_dataset": "语雀知识库", @@ -249,6 +249,7 @@ "transfer_ownership": "转让所有者", "type.Folder": "文件夹", "type.Http plugin": "HTTP 插件", + "type.Http tool set": "HTTP 工具集", "type.Plugin": "插件", "type.Simple bot": "简易应用", "type.Tool": "工具", diff --git a/packages/web/i18n/zh-CN/account_usage.json b/packages/web/i18n/zh-CN/account_usage.json index 7ebb628f1..9dcebe0c9 100644 --- a/packages/web/i18n/zh-CN/account_usage.json +++ b/packages/web/i18n/zh-CN/account_usage.json @@ -43,6 +43,8 @@ "points": "积分", "project_name": "项目名", "qa": "问答对提取", + "rerank": "结果重排", + "search_test": "搜索测试", "select_member_and_source_first": "请先选中成员和类型", "share": "分享链接", "source": "来源", diff --git a/packages/web/i18n/zh-CN/app.json b/packages/web/i18n/zh-CN/app.json index cea7ed34d..d3e79c34e 100644 --- a/packages/web/i18n/zh-CN/app.json +++ b/packages/web/i18n/zh-CN/app.json @@ -2,6 +2,8 @@ "AutoOptimize": "自动优化", "Click_to_delete_this_field": "点击删除该字段", "Filed_is_deprecated": "该字段已弃用", + "HTTP_tools_detail": "查看详情", + "HTTP_tools_list_with_number": "工具列表: {{total}}", "Index": "索引", "MCP_tools_debug": "调试", "MCP_tools_detail": "查看详情", @@ -22,10 +24,12 @@ "Optimizer_Reoptimize": "重新优化", "Optimizer_Replace": "替换", "Optimizer_Tooltip": "AI 优化提示词", + "Params_config": "参数配置", "Role_setting": "权限设置", "Run": "运行", "Search_dataset": "搜索知识库", "Selected": "已选择", + "Start_config": "开始配置", "Team_Tags": "团队标签", "ai_point_price": "AI积分计费", "ai_settings": "AI 配置", @@ -42,6 +46,8 @@ "app.version_past": "发布过", "app.version_publish_tips": "该版本将被保存至团队云端,同步给整个团队,同时更新所有发布渠道的应用版本", "app_detail": "应用详情", + "apply_code": "应用", + "apply_code_failed": "应用代码失败", "auto_execute": "自动执行", "auto_execute_default_prompt_placeholder": "自动执行时,发送的默认问题", "auto_execute_tip": "开启后,用户进入对话界面将自动触发工作流。执行顺序:1、对话开场白;2、全局变量;3、自动执行。", @@ -49,22 +55,28 @@ "chat_debug": "调试预览", "chat_logs": "对话日志", "chat_logs_tips": "日志会记录该应用的在线、分享和 API(需填写 chatId)对话记录", - "common.day": "日", + "code_applied_successfully": "代码应用成功", + "code_function_describe": "描述你的代码功能,输入“/”可选择变量", "config_ai_model_params": "点击配置 AI 模型相关属性", "config_file_upload": "点击配置文件上传规则", "config_question_guide": "配置猜你想问", "confirm_copy_app_tip": "系统将为您创建一个相同配置应用,但权限不会进行复制,请确认!", "confirm_del_app_tip": "确认删除 【{{name}}】 及其所有聊天记录?", "confirm_delete_folder_tip": "确认删除该文件夹?将会删除它下面所有应用及对应的聊天记录,请确认!", + "copilot_config_message": "`当前节点配置信息: \n代码类型:{{codeType}} \n当前代码: \\`\\`\\`{{codeType}} \n{{code}} \\`\\`\\` \n输入参数: {{inputs}} \n输出参数: {{outputs}}`", + "copilot_confirm_message": "已接收到原始配置,了解当前代码结构和输入输出参数。请说明您的优化需求。", "copy_one_app": "创建副本", "core.app.QG.Switch": "启用猜你想问", "core.dataset.import.Custom prompt": "自定义提示词", + "core.module.template.System Tools": "系统工具", + "core.workflow.Copilot": "AI 生成", "create_by_curl": "从 CURL 创建", - "create_by_template": "从模板创建", + "create_by_template": "从模板选择", "create_copy_success": "创建副本成功", "create_empty_app": "创建空白应用", "create_empty_plugin": "创建空白插件", "create_empty_workflow": "创建空白工作流", + "create_http_toolset": "创建 HTTP 工具集", "cron.every_day": "每天执行", "cron.every_month": "每月执行", "cron.every_week": "每周执行", @@ -222,6 +234,8 @@ "publish_success": "发布成功", "question_guide_tip": "对话结束后,会为你生成 3 个引导性问题。", "reasoning_response": "输出思考", + "reference_variable": "引用变量", + "request_headers": "请求头", "response_format": "回复格式", "save_team_app_log_keys": "保存为团队配置", "saved_success": "保存成功!如需在外部使用该版本,请点击“保存并发布”", @@ -237,6 +251,7 @@ "stop_sign_placeholder": "多个序列号通过 | 隔开,例如:aaa|stop", "stream_response": "流输出", "stream_response_tip": "关闭该开关,可以强制模型使用非流模式,并且不会直接进行内容输出。可以在 AI 回复的输出中,获取本次模型输出的内容进行二次处理。", + "support.wallet.usage.Code Copilot": "代码助手", "sync_log_keys_popover_text": "当前字段配置仅对个人生效,是否需要保存至团队配置?", "sync_team_app_log_keys": "还原成团队配置", "system_secret": "系统密钥", @@ -261,6 +276,13 @@ "template_market": "模板市场", "template_market_description": "在模板市场探索更多玩法,配置教程与使用引导,带你理解并上手各种应用", "template_market_empty_data": "找不到合适的模板", + "test_all_passed": "测试全部通过", + "test_code": "测试", + "test_code_incomplete": "代码解析不完整,无法进行测试", + "test_execution_failed": "测试执行失败", + "test_failed_with_progress": "测试失败 {{passed}}/{{total}}", + "testing": "测试中", + "this_tool_requires_no_input": "该工具无需输入", "time_granularity": "时间粒度", "time_range_end": "结束时间", "time_range_limit": "时间范围限制", @@ -276,6 +298,7 @@ "tool_input_param_tip": "该插件正常运行需要配置相关信息", "tool_not_active": "该工具尚未激活", "tool_run_free": "该工具运行无积分消耗", + "tool_tip": "作为工具执行时,该字段是否作为工具响应结果", "tool_type_tools": "工具", "tools_no_description": "这个工具没有介绍~", "transition_to_workflow": "转成工作流", @@ -285,7 +308,8 @@ "tts_browser": "浏览器自带(免费)", "tts_close": "关闭", "type.All": "全部", - "type.Create http plugin tip": "通过 OpenAPI Schema 批量创建插件,兼容 GPTs 格式", + "type.Create http plugin tip": "通过 OpenAPI Schema 批量创建工具(兼容GPTs)、通过curl或手动创建工具", + "type.Create http toolset tip": "通过 OpenAPI Schema 批量创建工具(兼容GPTs)", "type.Create mcp tools tip": "通过输入 MCP 地址,自动解析并批量创建可调用的 MCP 工具", "type.Create one plugin tip": "可以自定义输入和输出的工作流,通常用于封装重复使用的工作流", "type.Create plugin bot": "创建插件", @@ -294,7 +318,13 @@ "type.Create workflow bot": "创建工作流", "type.Create workflow tip": "通过低代码的方式,构建逻辑复杂的多轮对话 AI 应用,推荐高级玩家使用", "type.Folder": "文件夹", + "type.Http batch": "批量创建", + "type.Http batch tip": "通过 OpenAPI Schema 批量创建工具", + "type.Http manual": "手动创建", + "type.Http manual tip": "通过 curl 或手动填写参数创建单个工具", "type.Http plugin": "HTTP 插件", + "type.Http plugin_deprecated": "HTTP 插件已废弃,如需配置 Openapi Schema,请使用 HTTP 工具集", + "type.Http tool set": "HTTP 工具集", "type.Import from json": "导入 JSON 配置", "type.Import from json tip": "通过 JSON 配置文件,直接创建应用", "type.Import from json_error": "获取工作流数据失败,请检查URL或手动粘贴JSON数据", diff --git a/packages/web/i18n/zh-CN/common.json b/packages/web/i18n/zh-CN/common.json index f0f867f23..9d5590285 100644 --- a/packages/web/i18n/zh-CN/common.json +++ b/packages/web/i18n/zh-CN/common.json @@ -416,7 +416,6 @@ "core.chat.response.module query": "问题/检索词", "core.chat.response.module similarity": "相似度", "core.chat.response.module temperature": "温度", - "core.chat.response.module time": "运行时长", "core.chat.response.plugin output": "插件输出值", "core.chat.response.search using reRank": "结果重排", "core.chat.response.text output": "文本输出", @@ -619,6 +618,7 @@ "core.module.extract.Required Description": "即使无法提取该字段,也会使用默认值进行返回", "core.module.extract.Target field": "目标字段", "core.module.http.Add props": "添加参数", + "core.module.http.Add_props_value": "添加参数值", "core.module.http.AppId": "应用 ID", "core.module.http.ChatId": "当前对话 ID", "core.module.http.Current time": "当前时间", @@ -663,7 +663,6 @@ "core.module.template.AI support tool tip": "支持函数调用的模型,可以更好的使用工具调用。", "core.module.template.Basic Node": "基础功能", "core.module.template.Query extension": "问题优化", - "core.module.template.System Plugin": "系统插件", "core.module.template.System input module": "系统输入", "core.module.template.Team app": "团队应用", "core.module.template.UnKnow Module": "未知模块", @@ -985,10 +984,8 @@ "plugin.App": "选择应用", "plugin.Currentapp": "当前应用", "plugin.Description": "描述", - "plugin.Edit Http Plugin": "编辑 HTTP 插件", "plugin.Enter PAT": "请输入访问凭证(PAT)", "plugin.Get Plugin Module Detail Failed": "获取插件信息异常", - "plugin.Import Plugin": "导入 HTTP 插件", "plugin.Import from URL": "从 URL 导入。https://xxxx", "plugin.Intro": "插件介绍", "plugin.Invalid Env": "laf 环境错误", @@ -1216,6 +1213,7 @@ "support.wallet.usage.App name": "应用名", "support.wallet.usage.Audio Speech": "语音播放", "support.wallet.usage.Bill Module": "扣费模块", + "support.wallet.usage.Code Copilot": "代码助手", "support.wallet.usage.Duration": "时长(秒)", "support.wallet.usage.Module name": "模块名", "support.wallet.usage.Optimize Prompt": "提示词优化", @@ -1227,6 +1225,7 @@ "support.wallet.usage.Total points": "AI 积分消耗", "support.wallet.usage.Usage Detail": "使用详情", "support.wallet.usage.Whisper": "语音输入", + "sure_delete_tool_cannot_undo": "是否确认删除该工具?该操作无法撤回", "sync_link": "同步链接", "sync_success": "同步成功", "system.Concat us": "联系我们", diff --git a/packages/web/i18n/zh-CN/file.json b/packages/web/i18n/zh-CN/file.json index bfd7df19c..02b6f7dcf 100644 --- a/packages/web/i18n/zh-CN/file.json +++ b/packages/web/i18n/zh-CN/file.json @@ -19,6 +19,8 @@ "click_to_view_raw_source": "点击查看来源", "common.Some images failed to process": "部分图片处理失败", "common.dataset_data_input_image_support_format": "支持 .jpg, .jpeg, .png, .gif, .webp 格式", + "common.import_update": "导入/更新", + "common.upload_system_tools": "上传系统工具", "count.core.dataset.collection.Create Success": "成功导入 {{count}} 张图片", "delete_image": "删除图片", "file_name": "文件名", diff --git a/packages/web/i18n/zh-Hant/account_model.json b/packages/web/i18n/zh-Hant/account_model.json index 04047acba..bd82dbef5 100644 --- a/packages/web/i18n/zh-Hant/account_model.json +++ b/packages/web/i18n/zh-Hant/account_model.json @@ -89,5 +89,6 @@ "vlm_model": "圖片理解模型", "vlm_model_tip": "用於知識庫中對文件中的圖片進行額外的索引生成", "volunme_of_failed_calls": "調用失敗量", - "waiting_test": "等待測試" + "waiting_test": "等待測試", + "model_permission_config_hint": "若無協作者,默認全部成員可用" } diff --git a/packages/web/i18n/zh-Hant/account_team.json b/packages/web/i18n/zh-Hant/account_team.json index b5268075b..a29ea1ae3 100644 --- a/packages/web/i18n/zh-Hant/account_team.json +++ b/packages/web/i18n/zh-Hant/account_team.json @@ -56,10 +56,10 @@ "create_invoice": "開發票", "create_org": "建立部門", "create_sub_org": "建立子部門", - "dataset.api_file": "API 匯入", + "dataset.api_file": "API 知識庫", "dataset.common_dataset": "知識庫", "dataset.external_file": "外部文件", - "dataset.feishu_dataset": "飛書多維表格", + "dataset.feishu_dataset": "飛書云文檔", "dataset.folder_dataset": "資料夾", "dataset.website_dataset": "網站同步", "dataset.yuque_dataset": "語雀知識庫", diff --git a/packages/web/i18n/zh-Hant/account_usage.json b/packages/web/i18n/zh-Hant/account_usage.json index 799080d8f..b786d8628 100644 --- a/packages/web/i18n/zh-Hant/account_usage.json +++ b/packages/web/i18n/zh-Hant/account_usage.json @@ -41,6 +41,8 @@ "points": "積分", "project_name": "專案名", "qa": "問答對提取", + "rerank": "結果重排", + "search_test": "搜索測試", "select_member_and_source_first": "請先選取成員和類型", "share": "分享連結", "source": "來源", diff --git a/packages/web/i18n/zh-Hant/app.json b/packages/web/i18n/zh-Hant/app.json index 25b9a1c8b..5267f65c8 100644 --- a/packages/web/i18n/zh-Hant/app.json +++ b/packages/web/i18n/zh-Hant/app.json @@ -2,6 +2,7 @@ "AutoOptimize": "自動優化", "Click_to_delete_this_field": "點擊刪除該字段", "Filed_is_deprecated": "該字段已棄用", + "HTTP_tools_list_with_number": "工具列表: {{total}}", "Index": "索引", "MCP_tools_debug": "偵錯", "MCP_tools_detail": "查看詳情", @@ -22,10 +23,12 @@ "Optimizer_Reoptimize": "重新優化", "Optimizer_Replace": "替換", "Optimizer_Tooltip": "AI 優化提示詞", + "Params_config": "參數配置", "Role_setting": "權限設定", "Run": "執行", "Search_dataset": "搜尋知識庫", "Selected": "已選擇", + "Start_config": "開始配置", "Team_Tags": "團隊標籤", "ai_point_price": "AI 積分計費", "ai_settings": "AI 設定", @@ -42,6 +45,8 @@ "app.version_past": "已發布過", "app.version_publish_tips": "此版本將儲存至團隊雲端,同步給整個團隊,同時更新所有發布通道的應用程式版本", "app_detail": "應用程式詳細資訊", + "apply_code": "應用", + "apply_code_failed": "應用代碼失敗", "auto_execute": "自動執行", "auto_execute_default_prompt_placeholder": "自動執行時,傳送的預設問題", "auto_execute_tip": "開啟後,使用者進入對話式介面將自動觸發工作流程。\n執行順序:1、對話開場白;2、全域變數;3、自動執行。", @@ -49,21 +54,28 @@ "chat_debug": "聊天預覽", "chat_logs": "對話紀錄", "chat_logs_tips": "紀錄會記錄此應用程式的線上、分享和 API(需填寫 chatId)對話紀錄", + "code_applied_successfully": "代碼應用成功", + "code_function_describe": "描述你的代碼功能,輸入“/”可選擇變量", "config_ai_model_params": "點選設定 AI 模型相關屬性", "config_file_upload": "點選設定檔案上傳規則", "config_question_guide": "設定猜你想問", "confirm_copy_app_tip": "系統將為您建立一個相同設定的應用程式,但權限不會複製,請確認!", "confirm_del_app_tip": "確認刪除【{{name}}】及其所有聊天紀錄?", "confirm_delete_folder_tip": "確認刪除這個資料夾?將會刪除它底下所有應用程式及對應的對話紀錄,請確認!", + "copilot_config_message": "當前節點配置信息: \n代碼類型:{{codeType}} \n當前代碼: \\\\`\\\\`\\\\`{{codeType}} \n{{code}} \\\\`\\\\`\\\\` \n輸入參數: {{inputs}} \n輸出參數: {{outputs}}", + "copilot_confirm_message": "已接收到原始配置,了解當前代碼結構和輸入輸出參數。\n請說明您的優化需求。", "copy_one_app": "建立副本", "core.app.QG.Switch": "啟用猜你想問", "core.dataset.import.Custom prompt": "自訂提示詞", + "core.module.template.System Tools": "系統工具", + "core.workflow.Copilot": "AI 生成", "create_by_curl": "從 CURL 建立", "create_by_template": "從範本建立", "create_copy_success": "建立副本成功", "create_empty_app": "建立空白應用程式", "create_empty_plugin": "建立空白外掛", "create_empty_workflow": "建立空白工作流程", + "create_http_toolset": "創建 HTTP 工具集", "cron.every_day": "每天執行", "cron.every_month": "每月執行", "cron.every_week": "每週執行", @@ -212,6 +224,8 @@ "publish_success": "發布成功", "question_guide_tip": "對話結束後,會為你產生 3 個引導性問題。", "reasoning_response": "輸出思考", + "reference_variable": "引用變量", + "request_headers": "請求頭", "response_format": "回覆格式", "save_team_app_log_keys": "保存為團隊配置", "saved_success": "儲存成功!\n如需在外部使用該版本,請點選“儲存並發布”", @@ -251,6 +265,12 @@ "template_market": "範本市集", "template_market_description": "在範本市集探索更多玩法,設定教學與使用指引,帶您理解並上手各種應用程式", "template_market_empty_data": "找不到合適的範本", + "test_all_passed": "測試全部通過", + "test_code": "測試", + "test_code_incomplete": "代碼解析不完整,無法進行測試", + "test_execution_failed": "測試執行失敗", + "test_failed_with_progress": "測試失敗 {{passed}}/{{total}}", + "this_tool_requires_no_input": "該工具無需輸入", "time_granularity": "時間粒度", "time_range_limit": "時間範圍限制", "time_type": "時間類型", @@ -264,6 +284,7 @@ "tool_input_param_tip": "這個外掛正常執行需要設定相關資訊", "tool_not_active": "該工具尚未激活", "tool_run_free": "該工具運行無積分消耗", + "tool_tip": "作為工具執行時,該字段是否作為工具響應結果", "tool_type_tools": "工具", "tools_no_description": "這個工具沒有介紹~", "transition_to_workflow": "轉換成工作流程", @@ -282,7 +303,13 @@ "type.Create workflow bot": "建立工作流程", "type.Create workflow tip": "透過低程式碼的方式,建立邏輯複雜的多輪對話 AI 應用程式,建議進階使用者使用", "type.Folder": "資料夾", + "type.Http batch": "批量創建", + "type.Http batch tip": "通過 OpenAPI Schema 批量創建工具", + "type.Http manual": "手動創建", + "type.Http manual tip": "通過 curl 或手動填寫參數創建單個工具", "type.Http plugin": "HTTP 外掛", + "type.Http plugin_deprecated": "HTTP 插件已廢棄,如需配置 Openapi Schema,請使用 HTTP 工具集", + "type.Http tool set": "HTTP 工具集", "type.Import from json": "匯入 JSON 設定", "type.Import from json tip": "透過 JSON 設定文件,直接建立應用", "type.Import from json_error": "獲取工作流數據失敗,請檢查URL或手動粘貼JSON數據", diff --git a/packages/web/i18n/zh-Hant/common.json b/packages/web/i18n/zh-Hant/common.json index ef9c3fba4..0a3ee744a 100644 --- a/packages/web/i18n/zh-Hant/common.json +++ b/packages/web/i18n/zh-Hant/common.json @@ -416,7 +416,6 @@ "core.chat.response.module query": "問題/搜尋詞", "core.chat.response.module similarity": "相似度", "core.chat.response.module temperature": "溫度", - "core.chat.response.module time": "執行時長", "core.chat.response.plugin output": "外掛程式輸出值", "core.chat.response.search using reRank": "結果重新排名", "core.chat.response.text output": "文字輸出", @@ -618,6 +617,7 @@ "core.module.extract.Required Description": "即使無法提取該欄位,也會使用預設值進行回傳", "core.module.extract.Target field": "目標欄位", "core.module.http.Add props": "新增參數", + "core.module.http.Add_props_value": "添加參數值", "core.module.http.AppId": "應用程式 ID", "core.module.http.ChatId": "目前對話 ID", "core.module.http.Current time": "目前時間", @@ -662,7 +662,6 @@ "core.module.template.AI support tool tip": "支援函式呼叫的模型可以更好地使用工具呼叫。", "core.module.template.Basic Node": "基本功能", "core.module.template.Query extension": "問題最佳化", - "core.module.template.System Plugin": "系統外掛", "core.module.template.System input module": "系統輸入模組", "core.module.template.Team app": "團隊應用程式", "core.module.template.UnKnow Module": "未知模組", @@ -983,10 +982,8 @@ "plugin.App": "選擇應用程式", "plugin.Currentapp": "目前應用程式", "plugin.Description": "描述", - "plugin.Edit Http Plugin": "編輯 HTTP 外掛程式", "plugin.Enter PAT": "請輸入個人存取權杖(PAT)", "plugin.Get Plugin Module Detail Failed": "取得外掛程式資訊失敗", - "plugin.Import Plugin": "匯入 HTTP 外掛程式", "plugin.Import from URL": "從網址匯入。https://xxxx", "plugin.Intro": "外掛程式介紹", "plugin.Invalid Env": "無效的 LAF 環境", @@ -1213,6 +1210,7 @@ "support.wallet.usage.App name": "應用程式名稱", "support.wallet.usage.Audio Speech": "語音播放", "support.wallet.usage.Bill Module": "計費模組", + "support.wallet.usage.Code Copilot": "代碼助手", "support.wallet.usage.Duration": "時長(秒)", "support.wallet.usage.Module name": "模組名稱", "support.wallet.usage.Optimize Prompt": "提示詞優化", @@ -1224,6 +1222,7 @@ "support.wallet.usage.Total points": "AI 點數消耗", "support.wallet.usage.Usage Detail": "使用詳細資訊", "support.wallet.usage.Whisper": "語音輸入", + "sure_delete_tool_cannot_undo": "是否確認刪除該工具?\n該操作無法撤回", "sync_link": "同步連結", "sync_success": "同步成功", "system.Concat us": "聯絡我們", diff --git a/packages/web/i18n/zh-Hant/file.json b/packages/web/i18n/zh-Hant/file.json index 8445cf42e..577e454cb 100644 --- a/packages/web/i18n/zh-Hant/file.json +++ b/packages/web/i18n/zh-Hant/file.json @@ -13,12 +13,14 @@ "Only_support_uploading_one_image": "僅支持上傳一張圖片", "Please select the image to upload": "請選擇要上傳的圖片", "Please wait for all files to upload": "請等待所有文件上傳完成", + "common.upload_system_tools": "上傳系統工具", "bucket_chat": "對話檔案", "bucket_file": "知識庫檔案", "bucket_image": "圖片", "click_to_view_raw_source": "點選檢視原始來源", "common.Some images failed to process": "部分圖片處理失敗", "common.dataset_data_input_image_support_format": "支持 .jpg, .jpeg, .png, .gif, .webp 格式", + "common.import_update": "導入/更新", "count.core.dataset.collection.Create Success": "成功導入 {{count}} 張圖片", "delete_image": "刪除圖片", "file_name": "檔案名稱", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc3a31fa1..b014590f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -72,8 +72,8 @@ importers: specifier: ^1.2.8 version: 1.2.8 '@fastgpt-sdk/plugin': - specifier: ^0.1.16 - version: 0.1.16(@types/node@20.14.0) + specifier: ^0.1.19 + version: 0.1.19(@types/node@20.14.0) axios: specifier: ^1.12.1 version: 1.12.1 @@ -198,6 +198,12 @@ importers: form-data: specifier: ^4.0.4 version: 4.0.4 + http-proxy-agent: + specifier: ^7.0.2 + version: 7.0.2 + https-proxy-agent: + specifier: ^7.0.6 + version: 7.0.6 iconv-lite: specifier: ^0.6.3 version: 0.6.3 @@ -222,6 +228,9 @@ importers: mammoth: specifier: ^1.6.0 version: 1.9.0 + minio: + specifier: ^8.0.5 + version: 8.0.5 mongoose: specifier: ^8.10.1 version: 8.12.1(socks@2.8.4) @@ -548,6 +557,9 @@ importers: mermaid: specifier: ^10.9.4 version: 10.9.4 + minio: + specifier: ^8.0.5 + version: 8.0.5 nanoid: specifier: ^5.1.3 version: 5.1.3 @@ -1982,8 +1994,8 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@fastgpt-sdk/plugin@0.1.16': - resolution: {integrity: sha512-HGoq0jy3YrY8RAJvn8b0u13uqOjjNe5OE4w2dySQc4dgUjHpsmMl9hfGzAhi9bpuUrtptpGohtf0ealNeAAfDQ==} + '@fastgpt-sdk/plugin@0.1.19': + resolution: {integrity: sha512-1UY7fcTy9Ve/SoH8dxeYOX+0uyvqVLwQDrQGpqRt8QbCdCsnH7ohqBbgZLITuq2UbgF4s9EN0BUNGtTEtEmNCw==} '@fastify/accept-negotiator@1.1.0': resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} @@ -3847,6 +3859,9 @@ packages: '@zilliz/milvus2-sdk-node@2.4.10': resolution: {integrity: sha512-KeXRFePLGoAMFQRM2w+oyH0X+R1uaj+Pt1o0rAdgQfGTV9aGdEx2zOJAt3XPWKovbphvF6ANmCGw2bbk7alNxQ==} + '@zxing/text-encoding@0.9.0': + resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} + abbrev@2.0.0: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -4190,6 +4205,9 @@ packages: bl@5.1.0: resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + block-stream2@2.1.0: + resolution: {integrity: sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==} + bluebird@3.4.7: resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} @@ -4218,6 +4236,9 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + browser-or-node@2.1.1: + resolution: {integrity: sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==} + browserslist@4.24.4: resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -4243,6 +4264,10 @@ packages: buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -4930,6 +4955,10 @@ packages: decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -5532,6 +5561,10 @@ packages: fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-xml-parser@4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} + hasBin: true + fastify-plugin@4.5.1: resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} @@ -5595,6 +5628,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + finalhandler@1.3.1: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} @@ -6108,6 +6145,10 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + is-absolute-url@4.0.1: resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6124,6 +6165,10 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -7250,6 +7295,10 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minio@8.0.5: + resolution: {integrity: sha512-/vAze1uyrK2R/DSkVutE4cjVoAowvIQ18RAwn7HrqnLecLlMazFnY0oNBqfuoAWvu7mZIGX75AzpuV05TJeoHg==} + engines: {node: ^16 || ^18 || >=20} + minipass-collect@2.0.1: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} engines: {node: '>=16 || 14 >=14.17'} @@ -8063,6 +8112,10 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -8524,6 +8577,9 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} @@ -8716,6 +8772,10 @@ packages: sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -8771,6 +8831,12 @@ packages: resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + stream-chain@2.2.5: + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} + + stream-json@1.9.1: + resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -8778,6 +8844,10 @@ packages: streamx@2.22.0: resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -8868,6 +8938,9 @@ packages: strip-literal@2.1.1: resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + strtok3@9.1.1: resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} engines: {node: '>=16'} @@ -8900,7 +8973,7 @@ packages: superagent@8.1.2: resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} engines: {node: '>=6.4.0 <13 || >=14'} - deprecated: Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net + deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net supertest@6.3.4: resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} @@ -9001,6 +9074,9 @@ packages: thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -9453,6 +9529,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -9658,6 +9737,9 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-encoding@1.1.5: + resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -9782,10 +9864,18 @@ packages: engines: {node: '>=0.8'} hasBin: true + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + xmlbuilder@10.1.1: resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==} engines: {node: '>=4.0'} + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -9976,7 +10066,7 @@ snapshots: '@babel/traverse': 7.26.10 '@babel/types': 7.26.10 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -10732,7 +10822,7 @@ snapshots: '@babel/parser': 7.26.10 '@babel/template': 7.26.9 '@babel/types': 7.26.10 - debug: 4.4.0 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -11220,7 +11310,7 @@ snapshots: '@eslint/js@8.57.1': {} - '@fastgpt-sdk/plugin@0.1.16(@types/node@20.14.0)': + '@fastgpt-sdk/plugin@0.1.19(@types/node@20.14.0)': dependencies: '@fortaine/fetch-event-source': 3.0.6 '@ts-rest/core': 3.52.1(@types/node@20.14.0)(zod@3.25.51) @@ -11301,7 +11391,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -13425,6 +13515,9 @@ snapshots: protobufjs: 7.4.0 winston: 3.17.0 + '@zxing/text-encoding@0.9.0': + optional: true + abbrev@2.0.0: {} abort-controller@3.0.0: @@ -13825,6 +13918,10 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + block-stream2@2.1.0: + dependencies: + readable-stream: 3.6.2 + bluebird@3.4.7: {} body-parser@1.20.3: @@ -13848,7 +13945,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.0 + debug: 4.4.1 http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 @@ -13884,6 +13981,8 @@ snapshots: dependencies: fill-range: 7.1.1 + browser-or-node@2.1.1: {} + browserslist@4.24.4: dependencies: caniuse-lite: 1.0.30001704 @@ -13910,6 +14009,8 @@ snapshots: buffer-crc32@0.2.13: {} + buffer-crc32@1.0.0: {} + buffer-equal-constant-time@1.0.1: {} buffer-fill@1.0.0: {} @@ -14637,6 +14738,8 @@ snapshots: dependencies: character-entities: 2.0.2 + decode-uri-component@0.2.2: {} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -15140,7 +15243,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.0(eslint-plugin-import@2.31.0)(eslint@8.56.0))(eslint@8.56.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.0)(eslint@8.56.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -15151,7 +15254,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.0)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -15173,7 +15276,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.0(eslint-plugin-import@2.31.0)(eslint@8.56.0))(eslint@8.56.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.0)(eslint@8.56.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -15202,7 +15305,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.0)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -15630,6 +15733,10 @@ snapshots: fast-uri@3.0.6: {} + fast-xml-parser@4.5.3: + dependencies: + strnum: 1.1.2 + fastify-plugin@4.5.1: {} fastify@4.28.1: @@ -15721,6 +15828,8 @@ snapshots: dependencies: to-regex-range: 5.0.1 + filter-obj@1.1.0: {} + finalhandler@1.3.1: dependencies: debug: 2.6.9 @@ -15735,7 +15844,7 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.0 + debug: 4.4.1 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -16202,7 +16311,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -16349,6 +16458,8 @@ snapshots: ipaddr.js@1.9.1: {} + ipaddr.js@2.2.0: {} + is-absolute-url@4.0.1: {} is-alphabetical@1.0.4: {} @@ -16365,6 +16476,11 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -17979,6 +18095,23 @@ snapshots: minimist@1.2.8: {} + minio@8.0.5: + dependencies: + async: 3.2.6 + block-stream2: 2.1.0 + browser-or-node: 2.1.1 + buffer-crc32: 1.0.0 + eventemitter3: 5.0.1 + fast-xml-parser: 4.5.3 + ipaddr.js: 2.2.0 + lodash: 4.17.21 + mime-types: 2.1.35 + query-string: 7.1.3 + stream-json: 1.9.1 + through2: 4.0.2 + web-encoding: 1.1.5 + xml2js: 0.6.2 + minipass-collect@2.0.1: dependencies: minipass: 7.1.2 @@ -18189,7 +18322,7 @@ snapshots: new-find-package-json@2.0.0: dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -18879,6 +19012,13 @@ snapshots: dependencies: side-channel: 1.1.0 + query-string@7.1.3: + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + queue-microtask@1.2.3: {} quick-format-unescaped@4.0.4: {} @@ -19404,7 +19544,7 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.0 + debug: 4.4.1 depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -19473,6 +19613,8 @@ snapshots: optionalDependencies: '@parcel/watcher': 2.5.1 + sax@1.4.1: {} + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -19528,7 +19670,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.0 + debug: 4.4.1 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -19706,6 +19848,8 @@ snapshots: dependencies: memory-pager: 1.5.0 + split-on-first@1.1.0: {} + split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -19744,6 +19888,12 @@ snapshots: dependencies: bl: 5.1.0 + stream-chain@2.2.5: {} + + stream-json@1.9.1: + dependencies: + stream-chain: 2.2.5 + streamsearch@1.1.0: {} streamx@2.22.0: @@ -19753,6 +19903,8 @@ snapshots: optionalDependencies: bare-events: 2.5.4 + strict-uri-encode@2.0.0: {} + string-argv@0.3.2: {} string-length@4.0.2: @@ -19869,6 +20021,8 @@ snapshots: dependencies: js-tokens: 9.0.1 + strnum@1.1.2: {} + strtok3@9.1.1: dependencies: '@tokenizer/token': 0.3.0 @@ -19897,7 +20051,7 @@ snapshots: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.4.0 + debug: 4.4.1 fast-safe-stringify: 2.1.1 form-data: 4.0.4 formidable: 2.1.2 @@ -20027,6 +20181,10 @@ snapshots: dependencies: real-require: 0.2.0 + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + through@2.3.8: {} tiktoken@1.0.17: {} @@ -20466,6 +20624,14 @@ snapshots: util-deprecate@1.0.2: {} + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.19 + utils-merge@1.0.1: {} uuid@8.3.2: {} @@ -20538,7 +20704,7 @@ snapshots: vite-node@1.6.1(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0): dependencies: cac: 6.7.14 - debug: 4.4.0 + debug: 4.4.1 pathe: 1.1.2 picocolors: 1.1.1 vite: 5.4.14(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0) @@ -20694,6 +20860,12 @@ snapshots: dependencies: defaults: 1.0.4 + web-encoding@1.1.5: + dependencies: + util: 0.12.5 + optionalDependencies: + '@zxing/text-encoding': 0.9.0 + web-namespaces@2.0.1: {} web-streams-polyfill@4.0.0-beta.3: {} @@ -20866,8 +21038,15 @@ snapshots: xlsx@https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz: {} + xml2js@0.6.2: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + xmlbuilder@10.1.1: {} + xmlbuilder@11.0.1: {} + xtend@4.0.2: {} y18n@4.0.3: {} diff --git a/projects/app/.env.template b/projects/app/.env.template index 5bc671fb2..2098eda47 100644 --- a/projects/app/.env.template +++ b/projects/app/.env.template @@ -34,6 +34,14 @@ AIPROXY_API_TOKEN=xxxxx OPENAI_BASE_URL=https://api.openai.com/v1 CHAT_API_KEY=sk-xxxx +# S3 Config +S3_EXTERNAL_BASE_URL= +S3_ENDPOINT=localhost +S3_PORT=9000 +S3_USE_SSL=false +S3_ACCESS_KEY=minioadmin +S3_SECRET_KEY=minioadmin +S3_PLUGIN_BUCKET=fastgpt-plugin # 插件文件存储bucket # Redis URL REDIS_URL=redis://default:password@127.0.0.1:6379 # mongo 数据库连接参数,本地开发连接远程数据库时,可能需要增加 directConnection=true 参数,才能连接上。 @@ -98,6 +106,4 @@ CONFIG_JSON_PATH= # # 日志推送间隔 # CHAT_LOG_INTERVAL=10000 # # 日志来源ID前缀 -# CHAT_LOG_SOURCE_ID_PREFIX=fastgpt- - - +# CHAT_LOG_SOURCE_ID_PREFIX=fastgpt- \ No newline at end of file diff --git a/projects/app/data/config.json b/projects/app/data/config.json index 1d0303370..5bfd98710 100644 --- a/projects/app/data/config.json +++ b/projects/app/data/config.json @@ -5,6 +5,7 @@ "mcpServerProxyEndpoint": "" // mcp server 代理地址,例如: http://localhost:3005 }, "systemEnv": { + "datasetParseMaxProcess": 10, // 知识库文件解析最大线程数量 "vectorMaxProcess": 10, // 向量处理线程数量 "qaMaxProcess": 10, // 问答拆分线程数量 "vlmMaxProcess": 10, // 图片理解模型最大处理进程 diff --git a/projects/app/package.json b/projects/app/package.json index 26fe8b21e..6d5826183 100644 --- a/projects/app/package.json +++ b/projects/app/package.json @@ -64,7 +64,8 @@ "request-ip": "^3.3.0", "sass": "^1.58.3", "use-context-selector": "^1.4.4", - "zod": "^3.24.2" + "zod": "^3.24.2", + "minio": "^8.0.5" }, "devDependencies": { "@svgr/webpack": "^6.5.1", diff --git a/projects/app/src/components/Select/AIModelSelector.tsx b/projects/app/src/components/Select/AIModelSelector.tsx index 983c74ca5..8a21e2bd1 100644 --- a/projects/app/src/components/Select/AIModelSelector.tsx +++ b/projects/app/src/components/Select/AIModelSelector.tsx @@ -1,14 +1,14 @@ -import React, { useCallback, useMemo, useState } from 'react'; - -import { useTranslation } from 'next-i18next'; import { useSystemStore } from '@/web/common/system/useSystemStore'; -import MySelect, { type SelectProps } from '@fastgpt/web/components/common/MySelect'; -import { HUGGING_FACE_ICON } from '@fastgpt/global/common/system/constants'; import { Box, Flex } from '@chakra-ui/react'; -import Avatar from '@fastgpt/web/components/common/Avatar'; -import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; -import MultipleRowSelect from '@fastgpt/web/components/common/MySelect/MultipleRowSelect'; import type { ResponsiveValue } from '@chakra-ui/system'; +import { HUGGING_FACE_ICON } from '@fastgpt/global/common/system/constants'; +import Avatar from '@fastgpt/web/components/common/Avatar'; +import MySelect, { type SelectProps } from '@fastgpt/web/components/common/MySelect'; +import MultipleRowSelect from '@fastgpt/web/components/common/MySelect/MultipleRowSelect'; +import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; +import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; +import { useTranslation } from 'next-i18next'; +import React, { useCallback, useMemo, useState } from 'react'; type Props = SelectProps & { disableTip?: string; @@ -23,9 +23,21 @@ const OneRowSelector = ({ list, onChange, disableTip, noOfLines, ...props }: Pro ttsModelList, sttModelList, reRankModelList, - getModelProvider + getModelProvider, + getMyModelList } = useSystemStore(); + const { data: myModels } = useRequest2( + async () => { + const set = await getMyModelList(); + set.add(props.value); + return set; + }, + { + manual: false + } + ); + const avatarSize = useMemo(() => { const size = { sm: '1rem', @@ -50,7 +62,9 @@ const OneRowSelector = ({ list, onChange, disableTip, noOfLines, ...props }: Pro if (!modelData) return; const avatar = getModelProvider(modelData.provider)?.avatar; - + if (!myModels?.has(modelData.model)) { + return; + } return { value: item.value, label: ( @@ -81,7 +95,8 @@ const OneRowSelector = ({ list, onChange, disableTip, noOfLines, ...props }: Pro list, getModelProvider, avatarSize, - noOfLines + noOfLines, + myModels ]); return ( @@ -125,8 +140,14 @@ const MultipleRowSelector = ({ sttModelList, reRankModelList, getModelProvider, - getModelProviders + getModelProviders, + getMyModelList } = useSystemStore(); + + const { data: myModels } = useRequest2(getMyModelList, { + manual: false + }); + const modelList = useMemo(() => { const allModels = [ ...llmModelList, @@ -138,8 +159,16 @@ const MultipleRowSelector = ({ return list .map((item) => allModels.find((model) => model.model === item.value)) - .filter(Boolean); - }, [llmModelList, embeddingModelList, ttsModelList, sttModelList, reRankModelList, list]); + .filter((item) => !!item && !!myModels?.has(item.model)); + }, [ + llmModelList, + embeddingModelList, + ttsModelList, + sttModelList, + reRankModelList, + list, + myModels + ]); const [value, setValue] = useState([]); diff --git a/projects/app/src/pageComponents/dataset/detail/components/FileSelector.tsx b/projects/app/src/components/Select/FileSelectorBox.tsx similarity index 100% rename from projects/app/src/pageComponents/dataset/detail/components/FileSelector.tsx rename to projects/app/src/components/Select/FileSelectorBox.tsx diff --git a/projects/app/src/components/common/secret/HeaderAuthConfig.tsx b/projects/app/src/components/common/secret/HeaderAuthConfig.tsx index 3f1ff4a33..5b891d00e 100644 --- a/projects/app/src/components/common/secret/HeaderAuthConfig.tsx +++ b/projects/app/src/components/common/secret/HeaderAuthConfig.tsx @@ -1,25 +1,15 @@ import type { ButtonProps } from '@chakra-ui/react'; -import { - Box, - Button, - Flex, - FormControl, - IconButton, - Input, - ModalBody, - ModalFooter, - useDisclosure -} from '@chakra-ui/react'; +import { Box, Button, Flex, ModalBody, ModalFooter, useDisclosure } from '@chakra-ui/react'; import { HeaderSecretTypeEnum } from '@fastgpt/global/common/secret/constants'; import type { SecretValueType, StoreSecretValueType } from '@fastgpt/global/common/secret/type'; -import React, { useEffect, useMemo, useState } from 'react'; -import { useFieldArray, useForm, type UseFormRegister } from 'react-hook-form'; +import React, { useMemo } from 'react'; +import { useForm } from 'react-hook-form'; import { useTranslation } from 'next-i18next'; import MyIcon from '@fastgpt/web/components/common/Icon'; import MyModal from '@fastgpt/web/components/common/MyModal'; -import MySelect from '@fastgpt/web/components/common/MySelect'; +import HeaderAuthForm, { getSecretType } from './HeaderAuthForm'; -type HeaderSecretConfigType = { +export type HeaderSecretConfigType = { Bearer?: SecretValueType; Basic?: SecretValueType; customs?: { @@ -28,95 +18,59 @@ type HeaderSecretConfigType = { }[]; }; -const getShowInput = ({ - secretValue, - editingIndex, - index -}: { - secretValue?: SecretValueType; - editingIndex?: number; - index: number; -}) => { - const hasSecret = !!secretValue?.secret; - const hasValue = !!secretValue?.value; - const isEditing = editingIndex === index; - - return !hasSecret || hasValue || isEditing; -}; - -const AuthValueDisplay = ({ - showInput, - fieldName, - index = 0, - onEdit, - register -}: { - showInput: boolean; - fieldName: string; - index?: number; - onEdit: (index?: number) => void; - register: UseFormRegister; -}) => { - const { t } = useTranslation(); - - return ( - - {showInput ? ( - - onEdit(index)} - onBlur={() => onEdit(undefined)} - /> - - ) : ( - - - - {t('common:had_auth_value')} - - - )} - {!showInput && ( - } - size="sm" - variant="ghost" - color={'myGray.500'} - _hover={{ color: 'primary.600' }} - onClick={() => onEdit(index)} - /> - )} - - ); -}; - -const getSecretType = (config: HeaderSecretConfigType): HeaderSecretTypeEnum => { - if (config.Bearer) { - return HeaderSecretTypeEnum.Bearer; - } else if (config.Basic) { - return HeaderSecretTypeEnum.Basic; - } else if (config.customs && config.customs.length > 0) { - return HeaderSecretTypeEnum.Custom; +export const storeHeader2HeaderValue = ( + storeHeaderSecretConfig?: StoreSecretValueType +): HeaderSecretConfigType => { + if (!storeHeaderSecretConfig || Object.keys(storeHeaderSecretConfig).length === 0) { + return {}; } - return HeaderSecretTypeEnum.None; + + const entries = Object.entries(storeHeaderSecretConfig); + const [key, value] = entries[0]; + + if ( + entries.length === 1 && + (key === HeaderSecretTypeEnum.Bearer || key === HeaderSecretTypeEnum.Basic) + ) { + return { + [key]: { + secret: value.secret, + value: value.value + } + }; + } + + return { + customs: entries.map(([key, value]) => ({ + key, + value: { + secret: value.secret, + value: value.value + } + })) + }; +}; +export const headerValue2StoreHeader = (data: HeaderSecretConfigType): StoreSecretValueType => { + const storeData: StoreSecretValueType = {}; + const currentAuthType = getSecretType(data); + + if (currentAuthType === HeaderSecretTypeEnum.Bearer) { + storeData.Bearer = { + value: data.Bearer?.value || '', + secret: data.Bearer?.secret || '' + }; + } else if (currentAuthType === HeaderSecretTypeEnum.Basic) { + storeData.Basic = { + value: data.Basic?.value || '', + secret: data.Basic?.secret || '' + }; + } else if (currentAuthType === HeaderSecretTypeEnum.Custom) { + data.customs?.forEach((item) => { + storeData[item.key] = item.value; + }); + } + + return storeData; }; const HeaderAuthConfig = ({ @@ -129,109 +83,26 @@ const HeaderAuthConfig = ({ buttonProps?: ButtonProps; }) => { const { t } = useTranslation(); - const headerSecretList = [ - { - label: t('common:auth_type.None'), - value: HeaderSecretTypeEnum.None - }, - { - label: 'Bearer', - value: HeaderSecretTypeEnum.Bearer - }, - { - label: 'Basic', - value: HeaderSecretTypeEnum.Basic - }, - { - label: t('common:auth_type.Custom'), - value: HeaderSecretTypeEnum.Custom - } - ]; const { isOpen, onOpen, onClose } = useDisclosure(); const headerSecretValue: HeaderSecretConfigType = useMemo(() => { - if (!storeHeaderSecretConfig || Object.keys(storeHeaderSecretConfig).length === 0) { - return {}; - } - - const entries = Object.entries(storeHeaderSecretConfig); - const [key, value] = entries[0]; - - if ( - entries.length === 1 && - (key === HeaderSecretTypeEnum.Bearer || key === HeaderSecretTypeEnum.Basic) - ) { - return { - [key]: { - secret: value.secret, - value: value.value - } - }; - } - - return { - customs: entries.map(([key, value]) => ({ - key, - value: { - secret: value.secret, - value: value.value - } - })) - }; + return storeHeader2HeaderValue(storeHeaderSecretConfig); }, [storeHeaderSecretConfig]); - const [currentAuthType, setCurrentAuthType] = useState( - getSecretType(headerSecretValue) - ); - - const [editingIndex, setEditingIndex] = useState(); - const { control, register, watch, handleSubmit, reset } = useForm({ + const { handleSubmit, reset, getValues } = useForm({ defaultValues: { Basic: headerSecretValue?.Basic || { secret: '', value: '' }, Bearer: headerSecretValue?.Bearer || { secret: '', value: '' }, customs: headerSecretValue?.customs || [] } }); - const { - fields: customHeaders, - append: appendHeader, - remove: removeHeader - } = useFieldArray({ - control, - name: 'customs' - }); - const BearerValue = watch('Bearer'); - const BasicValue = watch('Basic'); - - // Add default custom - useEffect(() => { - if (currentAuthType === HeaderSecretTypeEnum.Custom && customHeaders.length === 0) { - appendHeader({ key: '', value: { secret: '', value: '' } }); - } - }, [currentAuthType, customHeaders.length, appendHeader]); + const currentValue = getValues(); const onSubmit = async (data: HeaderSecretConfigType) => { if (!headerSecretValue) return; - const storeData: StoreSecretValueType = {}; - - if (currentAuthType === HeaderSecretTypeEnum.Bearer) { - storeData.Bearer = { - value: data.Bearer?.value || '', - secret: data.Bearer?.secret || '' - }; - } else if (currentAuthType === HeaderSecretTypeEnum.Basic) { - storeData.Basic = { - value: data.Basic?.value || '', - secret: data.Basic?.secret || '' - }; - } else if (currentAuthType === HeaderSecretTypeEnum.Custom) { - data.customs?.forEach((item) => { - storeData[item.key] = item.value; - }); - } - + const storeData = headerValue2StoreHeader(data); onUpdate(storeData); onClose(); }; @@ -258,102 +129,7 @@ const HeaderAuthConfig = ({ w={480} > - - - {t('common:auth_type')} - - - - - {currentAuthType !== HeaderSecretTypeEnum.None && ( - - {currentAuthType === HeaderSecretTypeEnum.Custom && ( - {t('common:key')} - )} - {t('common:value')} - - )} - - {currentAuthType !== HeaderSecretTypeEnum.None && ( - <> - {currentAuthType === HeaderSecretTypeEnum.Bearer || - currentAuthType === HeaderSecretTypeEnum.Basic ? ( - - ) : ( - - {customHeaders.map((item, index) => { - const headerValue = watch(`customs.${index}.value`); - - return ( - - - - - - {customHeaders.length > 1 && ( - } - size="sm" - variant="ghost" - color={'myGray.500'} - _hover={{ color: 'red.500' }} - isDisabled={customHeaders.length <= 1} - onClick={() => removeHeader(index)} - /> - )} - - ); - })} - - - - )} - - )} + reset(data)} /> diff --git a/projects/app/src/components/common/secret/HeaderAuthForm.tsx b/projects/app/src/components/common/secret/HeaderAuthForm.tsx new file mode 100644 index 000000000..0ad1277a5 --- /dev/null +++ b/projects/app/src/components/common/secret/HeaderAuthForm.tsx @@ -0,0 +1,279 @@ +import type { SecretValueType } from '@fastgpt/global/common/secret/type'; +import React, { useMemo, useState } from 'react'; +import { useTranslation } from 'next-i18next'; +import { Box, Button, Flex, IconButton, Input } from '@chakra-ui/react'; +import MyIcon from '@fastgpt/web/components/common/Icon'; +import type { HeaderSecretConfigType } from './HeaderAuthConfig'; +import { HeaderSecretTypeEnum } from '@fastgpt/global/common/secret/constants'; +import MySelect from '@fastgpt/web/components/common/MySelect'; + +const getShowInput = ({ + secretValue, + editingIndex, + index +}: { + secretValue?: SecretValueType; + editingIndex?: number; + index: number; +}) => { + const hasSecret = !!secretValue?.secret; + const hasValue = !!secretValue?.value; + const isEditing = editingIndex === index; + + return !hasSecret || hasValue || isEditing; +}; + +const AuthValueDisplay = ({ + showInput, + index = 0, + onEdit, + value, + onChange +}: { + showInput: boolean; + index?: number; + onEdit: (index?: number) => void; + value: string; + onChange: (value: string) => void; +}) => { + const { t } = useTranslation(); + + return ( + + {showInput ? ( + onEdit(index)} + onBlur={() => onEdit(undefined)} + value={value} + onChange={(e) => onChange(e.target.value)} + /> + ) : ( + + + + {t('common:had_auth_value')} + + + )} + {!showInput && ( + } + size="sm" + variant="ghost" + color={'myGray.500'} + _hover={{ color: 'primary.600' }} + onClick={() => onEdit(index)} + /> + )} + + ); +}; + +export const getSecretType = (config: HeaderSecretConfigType): HeaderSecretTypeEnum => { + if (config.Bearer) { + return HeaderSecretTypeEnum.Bearer; + } else if (config.Basic) { + return HeaderSecretTypeEnum.Basic; + } else if (config.customs && config.customs.length > 0) { + return HeaderSecretTypeEnum.Custom; + } + return HeaderSecretTypeEnum.None; +}; + +const HeaderAuthForm = ({ + headerSecretValue, + onChange, + fontWeight = 'medium' +}: { + headerSecretValue: HeaderSecretConfigType; + onChange: (secret: HeaderSecretConfigType) => void; + fontWeight?: string; +}) => { + const { t } = useTranslation(); + const headerSecretList = [ + { + label: t('common:auth_type.None'), + value: HeaderSecretTypeEnum.None + }, + { + label: 'Bearer', + value: HeaderSecretTypeEnum.Bearer + }, + { + label: 'Basic', + value: HeaderSecretTypeEnum.Basic + }, + { + label: t('common:auth_type.Custom'), + value: HeaderSecretTypeEnum.Custom + } + ]; + const currentAuthType = useMemo(() => { + return getSecretType(headerSecretValue); + }, [headerSecretValue]); + const [editingIndex, setEditingIndex] = useState(); + + const BearerValue = headerSecretValue.Bearer; + const BasicValue = headerSecretValue.Basic; + const customHeaders = headerSecretValue.customs; + + return ( + <> + + {t('common:auth_type')} + + { + if (val === HeaderSecretTypeEnum.None) { + onChange({}); + } else if (val === HeaderSecretTypeEnum.Custom) { + onChange({ + customs: headerSecretValue.customs || [{ key: '', value: { secret: '', value: '' } }] + }); + } else { + onChange({ + [val]: headerSecretValue[val] || { secret: '', value: '' } + }); + } + }} + list={headerSecretList} + /> + {currentAuthType !== HeaderSecretTypeEnum.None && ( + + {currentAuthType === HeaderSecretTypeEnum.Custom && ( + {t('common:key')} + )} + {t('common:value')} + + )} + {currentAuthType !== HeaderSecretTypeEnum.None && ( + <> + {currentAuthType === HeaderSecretTypeEnum.Bearer || + currentAuthType === HeaderSecretTypeEnum.Basic ? ( + { + if (currentAuthType === HeaderSecretTypeEnum.Bearer) { + onChange({ + Bearer: { secret: BearerValue?.secret || '', value } + }); + } else if (currentAuthType === HeaderSecretTypeEnum.Basic) { + onChange({ + Basic: { secret: BasicValue?.secret || '', value } + }); + } + }} + /> + ) : ( + + {customHeaders?.map((item, index) => { + return ( + + { + onChange({ + customs: headerSecretValue.customs?.map((header, i) => + i === index ? { ...header, key: e.target.value } : header + ) + }); + }} + /> + + { + onChange({ + customs: headerSecretValue.customs?.map((header, i) => + i === index ? { ...header, value: { secret: '', value } } : header + ) + }); + }} + index={index} + onEdit={setEditingIndex} + /> + + {customHeaders.length > 1 && ( + } + size="sm" + variant="ghost" + color={'myGray.500'} + _hover={{ color: 'red.500' }} + isDisabled={customHeaders.length <= 1} + onClick={() => { + onChange({ + customs: headerSecretValue.customs?.filter((_, i) => i !== index) + }); + }} + /> + )} + + ); + })} + + + + )} + + )} + + ); +}; + +export default React.memo(HeaderAuthForm); diff --git a/projects/app/src/components/core/ai/ModelTable/index.tsx b/projects/app/src/components/core/ai/ModelTable/index.tsx index 57bb48def..104f16205 100644 --- a/projects/app/src/components/core/ai/ModelTable/index.tsx +++ b/projects/app/src/components/core/ai/ModelTable/index.tsx @@ -1,4 +1,5 @@ import { + Button, Box, Flex, HStack, @@ -10,7 +11,8 @@ import { Th, Thead, Tr, - useDisclosure + useDisclosure, + Checkbox } from '@chakra-ui/react'; import { useTranslation } from 'next-i18next'; import React, { useMemo, useRef, useState } from 'react'; @@ -22,16 +24,24 @@ import Avatar from '@fastgpt/web/components/common/Avatar'; import MyTag from '@fastgpt/web/components/common/Tag/index'; import dynamic from 'next/dynamic'; import CopyBox from '@fastgpt/web/components/common/String/CopyBox'; +import MyIconButton from '@fastgpt/web/components/common/Icon/button'; +import { useTableMultipleSelect } from '@fastgpt/web/hooks/useTableMultipleSelect'; +import CollaboratorContextProvider from '@/components/support/permission/MemberManager/context'; +import { ReadRoleVal } from '@fastgpt/global/support/permission/constant'; +import { getModelCollaborators, updateModelCollaborators } from '@/web/common/system/api'; +import { useUserStore } from '@/web/support/user/useUserStore'; + const MyModal = dynamic(() => import('@fastgpt/web/components/common/MyModal')); const ModelTable = () => { const { t, i18n } = useTranslation(); const { getModelProviders, getModelProvider } = useSystemStore(); + const { userInfo } = useUserStore(); const [provider, setProvider] = useState(''); const providerList = useRef<{ label: any; value: string | '' }[]>([ { label: t('common:All'), value: '' }, - ...getModelProviders(i18n.language).map((item) => ({ + ...(getModelProviders(i18n.language).map((item) => ({ label: ( @@ -39,7 +49,7 @@ const ModelTable = () => { ), value: item.id - })) + })) as any) ]); const [modelType, setModelType] = useState(''); @@ -160,6 +170,7 @@ const ModelTable = () => { const formatList = list.map((item) => { const provider = getModelProvider(item.provider, i18n.language); return { + model: item.model, name: item.name, avatar: provider.avatar, providerId: provider.id, @@ -210,6 +221,18 @@ const ModelTable = () => { ); }, [ttsModelList, llmModelList, embeddingModelList, sttModelList, reRankModelList]); + const { + selectedItems, + toggleSelect, + isSelected, + FloatingActionBar, + isSelecteAll, + selectAllTrigger + } = useTableMultipleSelect({ + list: modelList, + getItemId: (e) => e.name + }); + return ( @@ -251,9 +274,23 @@ const ModelTable = () => { - + + {userInfo?.team.permission.hasManagePer && ( + + )} @@ -261,6 +298,13 @@ const ModelTable = () => { + {userInfo?.team.permission.hasManagePer && ( + + )} ))}
{t('common:model.name')} + + {userInfo?.team.permission.hasManagePer && ( + + )} + {t('common:model.name')} + + {t('common:model.model_type')} {t('common:model.billing')}{t('common:permission.Permission config')}
+ {userInfo?.team.permission.hasManagePer && ( + toggleSelect(item)} + > + )} {item.name} @@ -271,11 +315,71 @@ const ModelTable = () => { {item.typeLabel} {item.priceLabel} + getModelCollaborators(item.model)} + onUpdateCollaborators={({ collaborators }) => + updateModelCollaborators({ + collaborators, + models: [item.model] + }) + } + permission={userInfo?.team.permission!} + > + {({ onOpenManageModal }) => ( + { + onOpenManageModal(); + }} + /> + )} + +
+ + + Promise.resolve({ + clbs: [] + }) + } + onUpdateCollaborators={({ collaborators }) => + updateModelCollaborators({ + collaborators, + models: selectedItems.map((i) => i.model) + }) + } + permission={userInfo?.team.permission!} + > + {({ onOpenManageModal }) => ( + + )} + + } + >
); }; diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx index 0fbe55fc4..e09ff0f34 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx @@ -597,7 +597,7 @@ const ChatBox = ({ // tts audio autoTTSResponse && splitText2Audio(responseText, true); } catch (err: any) { - console.log(err); + console.log('Chat error', err); toast({ title: t(getErrText(err, t('common:core.chat.error.Chat error') as any)), status: 'error', @@ -605,12 +605,6 @@ const ChatBox = ({ isClosable: true }); - if (!err?.responseText) { - resetInputVal({ text, files }); - // 这里的 newChatList 没包含用户交互输入的内容,所以重置后刚好是正确的。 - setChatRecords(newChatList.slice(0, newChatList.length - 2)); - } - // set finish status setChatRecords((state) => state.map((item, index) => { @@ -622,6 +616,12 @@ const ChatBox = ({ }; }) ); + + if (!err?.responseText) { + resetInputVal({ text, files }); + // 这里的 newChatList 没包含用户交互输入的内容,所以重置后刚好是正确的。 + setChatRecords(newChatList.slice(0, newChatList.length - 2)); + } } autoTTSResponse && finishSegmentedAudio(); diff --git a/projects/app/src/components/core/chat/ChatContainer/PluginRunBox/components/RenderOutput.tsx b/projects/app/src/components/core/chat/ChatContainer/PluginRunBox/components/RenderOutput.tsx index 19993d9ed..d5bfe5157 100644 --- a/projects/app/src/components/core/chat/ChatContainer/PluginRunBox/components/RenderOutput.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/PluginRunBox/components/RenderOutput.tsx @@ -8,6 +8,7 @@ import AIResponseBox from '../../../components/AIResponseBox'; import { useTranslation } from 'next-i18next'; import ComplianceTip from '@/components/common/ComplianceTip/index'; import { ChatRecordContext } from '@/web/core/chat/context/chatRecordContext'; + const RenderOutput = () => { const { t } = useTranslation(); diff --git a/projects/app/src/components/core/chat/components/WholeResponseModal.tsx b/projects/app/src/components/core/chat/components/WholeResponseModal.tsx index b76cf10f5..31240d672 100644 --- a/projects/app/src/components/core/chat/components/WholeResponseModal.tsx +++ b/projects/app/src/components/core/chat/components/WholeResponseModal.tsx @@ -152,10 +152,6 @@ export const WholeResponseContent = ({ value={formatNumber(activeModule.childTotalPoints)} /> )} - {activeModule?.tokens && ( diff --git a/projects/app/src/components/support/permission/MemberManager/MemberModal.tsx b/projects/app/src/components/support/permission/MemberManager/MemberModal.tsx index 514021d2e..c2d56d494 100644 --- a/projects/app/src/components/support/permission/MemberManager/MemberModal.tsx +++ b/projects/app/src/components/support/permission/MemberManager/MemberModal.tsx @@ -3,7 +3,7 @@ import { getTeamMembers } from '@/web/support/user/team/api'; import { getGroupList } from '@/web/support/user/team/group/api'; import useOrg from '@/web/support/user/team/org/hooks/useOrg'; import { useUserStore } from '@/web/support/user/useUserStore'; -import { Box, Button, Flex, Grid, HStack, ModalBody, ModalFooter } from '@chakra-ui/react'; +import { Box, Button, Flex, Grid, HStack, ModalBody, ModalFooter, Tooltip } from '@chakra-ui/react'; import { DEFAULT_ORG_AVATAR, DEFAULT_TEAM_AVATAR, @@ -30,19 +30,23 @@ import type { RoleValueType } from '@fastgpt/global/support/permission/type'; import { Permission } from '@fastgpt/global/support/permission/controller'; import { checkRoleUpdateConflict, - getCollaboratorId, - mergeCollaboratorList + getCollaboratorId } from '@fastgpt/global/support/permission/utils'; import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; import { ManageRoleVal, OwnerRoleVal } from '@fastgpt/global/support/permission/constant'; -import { isObjectIdOrHexString } from 'mongoose'; const HoverBoxStyle = { bgColor: 'myGray.50', cursor: 'pointer' }; -function MemberModal({ onClose }: { onClose: () => void }) { +function MemberModal({ + onClose, + SelectedTip +}: { + onClose: () => void; + SelectedTip?: React.ReactNode; +}) { const { t } = useTranslation(); const { userInfo } = useUserStore(); const collaboratorDetailList = useContextSelector(CollaboratorContext, (v) => v.collaboratorList); @@ -417,7 +421,10 @@ function MemberModal({ onClose }: { onClose: () => void }) {
- {`${t('common:chosen')}: ${editCollaborators.length}`} + + {`${t('common:chosen')}: ${editCollaborators.length}`} + {SelectedTip ? {SelectedTip} : null} + {editCollaborators.map((clb) => { const onDelete = () => { diff --git a/projects/app/src/components/support/permission/MemberManager/context.tsx b/projects/app/src/components/support/permission/MemberManager/context.tsx index 5dd70f341..0325ec853 100644 --- a/projects/app/src/components/support/permission/MemberManager/context.tsx +++ b/projects/app/src/components/support/permission/MemberManager/context.tsx @@ -17,11 +17,11 @@ import dynamic from 'next/dynamic'; import MemberListCard, { type MemberListCardProps } from './MemberListCard'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { useSystemStore } from '@/web/common/system/useSystemStore'; -import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; import type { RequireOnlyOne } from '@fastgpt/global/common/type/utils'; import { useTranslation } from 'next-i18next'; import { CommonRoleList, NullRoleVal } from '@fastgpt/global/support/permission/constant'; import { useUserStore } from '@/web/support/user/useUserStore'; +import LightTip from '@fastgpt/web/components/common/LightTip'; const MemberModal = dynamic(() => import('./MemberModal')); @@ -31,7 +31,7 @@ export type MemberManagerInputPropsType = { onGetCollaboratorList: () => Promise; roleList?: RoleListType; onUpdateCollaborators: (props: UpdateClbPermissionProps) => Promise; - onDelOneCollaborator: ( + onDelOneCollaborator?: ( props: RequireOnlyOne<{ tmbId: string; groupId: string; orgId: string }> ) => Promise; refreshDeps?: any[]; @@ -88,13 +88,15 @@ const CollaboratorContextProvider = ({ refetchResource, refreshDeps = [], defaultRole, - isInheritPermission + isInheritPermission, + selectedHint }: MemberManagerInputPropsType & { children: (props: ChildrenProps) => ReactNode; refetchResource?: () => void; isInheritPermission?: boolean; hasParent?: boolean; addPermissionOnly?: boolean; + selectedHint?: string; }) => { const { t } = useTranslation(); const onUpdateCollaboratorsThen = async (props: UpdateClbPermissionProps) => { @@ -104,8 +106,10 @@ const CollaboratorContextProvider = ({ const onDelOneCollaboratorThen = async ( props: RequireOnlyOne<{ tmbId: string; groupId: string; orgId: string }> ) => { - await onDelOneCollaborator(props); - refetchCollaboratorList(); + if (onDelOneCollaborator) { + await onDelOneCollaborator(props); + refetchCollaboratorList(); + } }; const { feConfigs } = useSystemStore(); @@ -218,6 +222,7 @@ const CollaboratorContextProvider = ({ onCloseManageModal(); refetchResource?.(); }} + SelectedTip={selectedHint ? : undefined} /> )} diff --git a/projects/app/src/global/core/workflow/api.d.ts b/projects/app/src/global/core/workflow/api.d.ts index d81f06b98..c622a7ff8 100644 --- a/projects/app/src/global/core/workflow/api.d.ts +++ b/projects/app/src/global/core/workflow/api.d.ts @@ -16,8 +16,10 @@ export type PostWorkflowDebugProps = { query?: UserChatItemValueItemType[]; history?: ChatItemType[]; chatConfig?: AppSchema['chatConfig']; + usageId?: string; }; export type PostWorkflowDebugResponse = WorkflowDebugResponse & { newVariables: Record; + usageId: string; }; diff --git a/projects/app/src/pageComponents/account/team/PermissionManage/index.tsx b/projects/app/src/pageComponents/account/team/PermissionManage/index.tsx index d2304a278..205415f35 100644 --- a/projects/app/src/pageComponents/account/team/PermissionManage/index.tsx +++ b/projects/app/src/pageComponents/account/team/PermissionManage/index.tsx @@ -141,8 +141,14 @@ function PermissionManage({ } ); - const { runAsync: onDeleteMemberPermission, loading: deleteLoading } = - useRequest2(onDelOneCollaborator); + const { runAsync: onDeleteMemberPermission, loading: deleteLoading } = useRequest2( + async (props) => { + if (onDelOneCollaborator) { + return await onDelOneCollaborator(props); + } + return Promise.resolve(); + } + ); const userManage = userInfo?.permission.hasManagePer; const hasDeletePer = (per: Permission) => { diff --git a/projects/app/src/pageComponents/account/team/SelectMember.tsx b/projects/app/src/pageComponents/account/team/SelectMember.tsx deleted file mode 100644 index 1efd781c2..000000000 --- a/projects/app/src/pageComponents/account/team/SelectMember.tsx +++ /dev/null @@ -1,266 +0,0 @@ -import React, { useMemo, useState } from 'react'; -import { Box, Checkbox, Flex, Grid, HStack } from '@chakra-ui/react'; -import MyIcon from '@fastgpt/web/components/common/Icon'; -import Avatar from '@fastgpt/web/components/common/Avatar'; -import { useTranslation } from 'next-i18next'; -import { type Control, Controller } from 'react-hook-form'; -import { type RequireAtLeastOne } from '@fastgpt/global/common/type/utils'; -import { useUserStore } from '@/web/support/user/useUserStore'; -import { DefaultGroupName } from '@fastgpt/global/support/user/team/group/constant'; -import SearchInput from '@fastgpt/web/components/common/Input/SearchInput'; - -type memberType = { - type: 'member'; - tmbId: string; - memberName: string; - avatar: string; -}; - -type groupType = { - type: 'group'; - _id: string; - name: string; - avatar: string; -}; - -type selectedType = { - member: string[]; - group: string[]; -}; - -function SelectMember({ - allMembers, - selected = { member: [], group: [] }, - setSelected - // mode = 'both' -}: { - allMembers: { - member: memberType[]; - group: groupType[]; - }; - selected?: selectedType; - setSelected: React.Dispatch>; - mode?: 'member' | 'group' | 'both'; -}) { - const [searchKey, setSearchKey] = useState(''); - const { t } = useTranslation(); - const { userInfo } = useUserStore(); - - const filtered = useMemo(() => { - return [ - ...allMembers.member.filter((member) => { - if (member.memberName.toLowerCase().includes(searchKey.toLowerCase())) return true; - return false; - }), - ...allMembers.group.filter((member) => { - if (member.name.toLowerCase().includes(searchKey.toLowerCase())) return true; - return false; - }) - ]; - }, [searchKey, allMembers]); - - const selectedFlated = useMemo(() => { - return [ - ...allMembers.member.filter((member) => { - return selected.member?.includes(member.tmbId); - }), - ...allMembers.group.filter((member) => { - return selected.group?.includes(member._id); - }) - ]; - }, [selected, allMembers]); - - const handleToggleSelect = (member: memberType | groupType) => { - if (member.type == 'member') { - if (selected.member?.indexOf(member.tmbId) == -1) { - setSelected({ - member: [...selected.member, member.tmbId], - group: [...selected.group] - }); - } else { - setSelected({ - member: [...selected.member.filter((item) => item != member.tmbId)], - group: [...selected.group] - }); - } - } else { - if (selected.group?.indexOf(member._id) == -1) { - setSelected({ member: [...selected.member], group: [...selected.group, member._id] }); - } else { - setSelected({ - member: [...selected.member], - group: [...selected.group.filter((item) => item != member._id)] - }); - } - } - }; - - const isSelected = (member: memberType | groupType) => { - if (member.type == 'member') { - return selected.member?.includes(member.tmbId); - } else { - return selected.group?.includes(member._id); - } - }; - - return ( - - - { - setSearchKey(e.target.value); - }} - /> - - {filtered.map((member) => { - return ( - handleToggleSelect(member)} - > - } - /> - - - {member.type == 'member' - ? member.memberName - : member.name === DefaultGroupName - ? userInfo?.team.teamName - : member.name} - - - ); - })} - - - - - {t('common:chosen') + ': ' + Number(selected.member.length + selected.group.length)}{' '} - - - {selectedFlated.map((member) => { - return ( - - - - {member.type == 'member' - ? member.memberName - : member.name === DefaultGroupName - ? userInfo?.team.teamName - : member.name} - - handleToggleSelect(member)} - /> - - ); - })} - - - - ); -} - -// This function is for using with react-hook-form -function ControllerWrapper({ - control, - allMembers, - mode = 'both', - name = 'members' -}: { - control: Control; - allMembers: RequireAtLeastOne<{ member?: memberType[]; group?: groupType[] }>; - mode?: 'member' | 'group' | 'both'; - name?: string; -}) { - return ( - ( - { - switch (mode) { - case 'member': - return { member: allMembers.member, group: [] }; - case 'group': - return { member: [], group: allMembers.group }; - case 'both': - return { member: allMembers.member, group: allMembers.group }; - } - })() as Required - } - selected={(() => { - switch (mode) { - case 'member': - return { member: selected, group: [] }; - case 'group': - return { member: [], group: selected }; - case 'both': - return { member: selected.member, group: selected.group }; - } - })()} - setSelected={ - (({ member, group }: selectedType, _prevState: selectedType) => { - switch (mode) { - case 'member': - onChange(member); - return; - case 'group': - onChange(group); - return; - case 'both': - onChange({ member, group }); - return; - } - }) as any // hack: we do not need to handle prevState - } - /> - )} - /> - ); -} -export const UnControlledSelectMember = SelectMember; -export default ControllerWrapper; diff --git a/projects/app/src/pageComponents/account/usage/UsageDetail.tsx b/projects/app/src/pageComponents/account/usage/UsageDetail.tsx index ca9b28780..c3f8b6af4 100644 --- a/projects/app/src/pageComponents/account/usage/UsageDetail.tsx +++ b/projects/app/src/pageComponents/account/usage/UsageDetail.tsx @@ -11,7 +11,7 @@ import { Td, TableContainer } from '@chakra-ui/react'; -import { type UsageItemType } from '@fastgpt/global/support/wallet/usage/type.d'; +import { type UsageListItemType } from '@fastgpt/global/support/wallet/usage/type.d'; import dayjs from 'dayjs'; import { UsageSourceMap } from '@fastgpt/global/support/wallet/usage/constants'; import MyModal from '@fastgpt/web/components/common/MyModal'; @@ -19,7 +19,7 @@ import { formatNumber } from '@fastgpt/global/common/math/tools'; import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel'; import { useSafeTranslation } from '@fastgpt/web/hooks/useSafeTranslation'; -const UsageDetail = ({ usage, onClose }: { usage: UsageItemType; onClose: () => void }) => { +const UsageDetail = ({ usage, onClose }: { usage: UsageListItemType; onClose: () => void }) => { const { t } = useSafeTranslation(); const filterBillList = useMemo( () => usage.list.filter((item) => item && item.moduleName), diff --git a/projects/app/src/pageComponents/account/usage/UsageTable.tsx b/projects/app/src/pageComponents/account/usage/UsageTable.tsx index 45dc90407..3dc5a8a09 100644 --- a/projects/app/src/pageComponents/account/usage/UsageTable.tsx +++ b/projects/app/src/pageComponents/account/usage/UsageTable.tsx @@ -12,7 +12,7 @@ import { } from '@chakra-ui/react'; import { formatNumber } from '@fastgpt/global/common/math/tools'; import { UsageSourceMap } from '@fastgpt/global/support/wallet/usage/constants'; -import { type UsageItemType } from '@fastgpt/global/support/wallet/usage/type'; +import { type UsageListItemType } from '@fastgpt/global/support/wallet/usage/type'; import EmptyTip from '@fastgpt/web/components/common/EmptyTip'; import MyBox from '@fastgpt/web/components/common/MyBox'; import dayjs from 'dayjs'; @@ -73,7 +73,7 @@ const UsageTableList = ({ refreshDeps: [requestParams] }); - const [usageDetail, setUsageDetail] = useState(); + const [usageDetail, setUsageDetail] = useState(); const { runAsync: exportUsage } = useRequest2( async () => { diff --git a/projects/app/src/pageComponents/app/detail/HTTPTools/AppCard.tsx b/projects/app/src/pageComponents/app/detail/HTTPTools/AppCard.tsx new file mode 100644 index 000000000..bba85b73b --- /dev/null +++ b/projects/app/src/pageComponents/app/detail/HTTPTools/AppCard.tsx @@ -0,0 +1,86 @@ +import { Box, Button, Flex, HStack, IconButton } from '@chakra-ui/react'; +import React, { useState } from 'react'; +import { AppContext } from '../context'; +import { useContextSelector } from 'use-context-selector'; +import Avatar from '@fastgpt/web/components/common/Avatar'; +import { useTranslation } from 'next-i18next'; +import MyIcon from '@fastgpt/web/components/common/Icon'; +import MyMenu from '@fastgpt/web/components/common/MyMenu'; +import { type AppSchema } from '@fastgpt/global/core/app/type'; +import TagsEditModal from '../TagsEditModal'; + +const AppCard = () => { + const { t } = useTranslation(); + + const appDetail = useContextSelector(AppContext, (v) => v.appDetail); + const onOpenInfoEdit = useContextSelector(AppContext, (v) => v.onOpenInfoEdit); + const onDelApp = useContextSelector(AppContext, (v) => v.onDelApp); + + const [TeamTagsSet, setTeamTagsSet] = useState(); + + return ( + <> + + + + + {appDetail.name} + + + + {appDetail.intro || t('common:core.app.tip.Add a intro to app')} + + + {appDetail.permission.hasManagePer && ( + + )} + {appDetail.permission.isOwner && ( + } + aria-label={''} + /> + } + menuList={[ + { + children: [ + { + icon: 'delete', + type: 'danger', + label: t('common:Delete'), + onClick: onDelApp + } + ] + } + ]} + /> + )} + + + + {TeamTagsSet && setTeamTagsSet(undefined)} />} + + ); +}; + +export default React.memo(AppCard); diff --git a/projects/app/src/pageComponents/app/detail/HTTPTools/ChatTest.tsx b/projects/app/src/pageComponents/app/detail/HTTPTools/ChatTest.tsx new file mode 100644 index 000000000..30d866a7c --- /dev/null +++ b/projects/app/src/pageComponents/app/detail/HTTPTools/ChatTest.tsx @@ -0,0 +1,212 @@ +import { useChatStore } from '@/web/core/chat/context/useChatStore'; +import React, { useEffect, useMemo, useState } from 'react'; +import { useContextSelector } from 'use-context-selector'; +import { AppContext } from '../context'; +import ChatItemContextProvider from '@/web/core/chat/context/chatItemContext'; +import ChatRecordContextProvider from '@/web/core/chat/context/chatRecordContext'; +import { Box, Button, Flex, HStack } from '@chakra-ui/react'; +import { cardStyles } from '../constants'; +import { useTranslation } from 'next-i18next'; +import { type HttpToolConfigType } from '@fastgpt/global/core/app/type'; +import { useForm } from 'react-hook-form'; +import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; +import Markdown from '@/components/Markdown'; +import { postRunHTTPTool } from '@/web/core/app/api/plugin'; +import { type StoreSecretValueType } from '@fastgpt/global/common/secret/type'; +import { valueTypeToInputType } from '@/components/core/app/formRender/utils'; +import { getNodeInputTypeFromSchemaInputType } from '@fastgpt/global/core/app/jsonschema'; +import LabelAndFormRender from '@/components/core/app/formRender/LabelAndForm'; +import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel'; +import ValueTypeLabel from '../WorkflowComponents/Flow/nodes/render/ValueTypeLabel'; +import LightRowTabs from '@fastgpt/web/components/common/Tabs/LightRowTabs'; + +const ChatTest = ({ + currentTool, + baseUrl, + headerSecret, + customHeaders +}: { + currentTool?: HttpToolConfigType; + baseUrl: string; + headerSecret: StoreSecretValueType; + customHeaders: Record; +}) => { + const { t } = useTranslation(); + + const [output, setOutput] = useState(''); + + const form = useForm(); + const { handleSubmit, reset } = form; + const [activeTab, setActiveTab] = useState<'input' | 'output'>('input'); + + const tabList = [ + { label: t('common:Input'), value: 'input' as const }, + { label: t('common:Output'), value: 'output' as const } + ]; + + useEffect(() => { + reset({}); + setOutput(''); + }, [currentTool, reset]); + + const { runAsync: runTool, loading: isRunning } = useRequest2( + async (data: Record) => { + if (!currentTool) return; + + return await postRunHTTPTool({ + baseUrl, + params: data, + headerSecret, + toolPath: currentTool.path, + method: currentTool.method, + customHeaders: customHeaders + }); + }, + { + onSuccess: (res) => { + try { + const resStr = JSON.stringify(res, null, 2); + setOutput(resStr); + setActiveTab('output'); + } catch (error) { + console.error(error); + } + } + } + ); + + return ( + + + + + {t('app:chat_debug')} + + + + + + { + setActiveTab(value); + }} + /> + + + {activeTab === 'input' ? ( + + {Object.keys(currentTool?.inputSchema.properties || {}).length > 0 ? ( + <> + + {Object.entries(currentTool?.inputSchema.properties || {}).map( + ([paramName, paramInfo]) => { + const inputType = valueTypeToInputType( + getNodeInputTypeFromSchemaInputType({ type: paramInfo.type }) + ); + const required = currentTool?.inputSchema.required?.includes(paramName); + + return ( + + {paramName} + + + } + required={required} + key={paramName} + inputType={inputType} + fieldName={paramName} + form={form} + placeholder={paramName} + /> + ); + } + )} + + + ) : ( + + {t('app:this_tool_requires_no_input')} + + )} + + + + ) : ( + + {output && ( + + + + )} + + )} + + + ); +}; + +const Render = ({ + currentTool, + baseUrl, + headerSecret, + customHeaders +}: { + currentTool?: HttpToolConfigType; + baseUrl: string; + headerSecret: StoreSecretValueType; + customHeaders: Record; +}) => { + const { chatId } = useChatStore(); + const { appDetail } = useContextSelector(AppContext, (v) => v); + + const chatRecordProviderParams = useMemo( + () => ({ + chatId: chatId, + appId: appDetail._id + }), + [appDetail._id, chatId] + ); + + return ( + + + + + + ); +}; + +export default React.memo(Render); diff --git a/projects/app/src/pageComponents/app/detail/HTTPTools/ConfigModal.tsx b/projects/app/src/pageComponents/app/detail/HTTPTools/ConfigModal.tsx new file mode 100644 index 000000000..a99903e1c --- /dev/null +++ b/projects/app/src/pageComponents/app/detail/HTTPTools/ConfigModal.tsx @@ -0,0 +1,333 @@ +import MyModal from '@fastgpt/web/components/common/MyModal'; +import React, { useEffect, useMemo, useState } from 'react'; +import { useTranslation } from 'next-i18next'; +import { + Box, + Button, + Flex, + Input, + ModalBody, + ModalFooter, + Table, + TableContainer, + Tbody, + Td, + Textarea, + Th, + Thead, + Tr +} from '@chakra-ui/react'; +import { useToast } from '@fastgpt/web/hooks/useToast'; +import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; +import { getApiSchemaByUrl, putUpdateHttpPlugin } from '@/web/core/app/api/plugin'; +import { useForm } from 'react-hook-form'; +import type { HttpToolsType } from '@/pageComponents/dashboard/apps/HttpToolsCreateModal'; +import { useContextSelector } from 'use-context-selector'; +import { AppContext } from '../context'; +import HttpInput from '@fastgpt/web/components/common/Input/HttpInput'; +import MyIcon from '@fastgpt/web/components/common/Icon'; +import type { OpenApiJsonSchema } from '@fastgpt/global/core/app/httpTools/type'; +import { pathData2ToolList } from '@fastgpt/global/core/app/httpTools/utils'; +import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; +import { str2OpenApiSchema } from '@fastgpt/global/core/app/jsonschema'; +import { + headerValue2StoreHeader, + storeHeader2HeaderValue +} from '@/components/common/secret/HeaderAuthConfig'; +import HeaderAuthForm from '@/components/common/secret/HeaderAuthForm'; + +const ConfigModal = ({ onClose }: { onClose: () => void }) => { + const { t } = useTranslation(); + const { toast } = useToast(); + + const [schemaUrl, setSchemaUrl] = useState(''); + const [updateTrigger, setUpdateTrigger] = useState(false); + + const appDetail = useContextSelector(AppContext, (v) => v.appDetail); + const reloadApp = useContextSelector(AppContext, (v) => v.reloadApp); + + const toolSetData = useMemo(() => { + const toolSetNode = appDetail.modules.find( + (item) => item.flowNodeType === FlowNodeTypeEnum.toolSet + ); + return toolSetNode?.toolConfig?.httpToolSet; + }, [appDetail.modules]); + + const { register, setValue, handleSubmit, watch } = useForm({ + defaultValues: { + avatar: '', + name: appDetail?.name || '', + intro: '', + baseUrl: toolSetData?.baseUrl || '', + apiSchemaStr: toolSetData?.apiSchemaStr || '', + customHeaders: toolSetData?.customHeaders || '{"Authorization":"Bearer"}', + headerSecret: toolSetData?.headerSecret || {} + } + }); + + const watchedCustomHeaders = watch('customHeaders'); + const [customHeaders, setCustomHeaders] = useState<{ key: string; value: string }[]>(() => { + try { + const keyValue = JSON.parse(watchedCustomHeaders || '{}'); + return Object.keys(keyValue).map((key) => ({ key, value: keyValue[key] })); + } catch (error) { + console.error('Error parsing custom headers', error); + return []; + } + }); + const headerSecret = watch('headerSecret'); + const apiSchemaStr = watch('apiSchemaStr'); + + const { runAsync: onClickUrlLoadApi, loading: isLoadingUrlApi } = useRequest2( + async () => { + if (!schemaUrl || (!schemaUrl.startsWith('https://') && !schemaUrl.startsWith('http://'))) { + return toast({ + title: t('common:plugin.Invalid URL'), + status: 'warning' + }); + } + + const schema = await getApiSchemaByUrl(schemaUrl); + setValue('apiSchemaStr', JSON.stringify(schema, null, 2)); + }, + { + manual: true, + errorToast: t('common:plugin.Invalid Schema') + } + ); + const { runAsync: onUpdateHttpTool, loading: isUpdatingHttpTool } = useRequest2( + async (data: HttpToolsType) => { + const apiData = await str2OpenApiSchema(data.apiSchemaStr || ''); + const toolList = await pathData2ToolList(apiData.pathData); + + return putUpdateHttpPlugin({ + appId: appDetail._id, + baseUrl: apiData.serverPath, + toolList, + apiSchemaStr: data.apiSchemaStr || '', + headerSecret: data.headerSecret || {}, + customHeaders: data.customHeaders || '{}' + }); + }, + { + onSuccess: () => { + toast({ + title: t('common:update_success'), + status: 'success' + }); + onClose(); + reloadApp(); + }, + onError: (err) => { + toast({ + status: 'warning', + title: t('common:plugin.Invalid Schema') + }); + } + } + ); + + return ( + + + + + + OpenAPI Schema + + + + + setSchemaUrl(e.target.value)} + /> + + + + +