@nocobase/plugin-ai 2.3.0-alpha.1 → 2.3.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/docs/nocobase/ai-dev/watermark-plugin.md +2 -0
- package/dist/ai/docs/nocobase/ai-employees/block/ai-chat-box.md +133 -0
- package/dist/ai/docs/nocobase/ai-employees/knowledge-base/knowledge-base/documents.md +1 -1
- package/dist/ai/docs/nocobase/ai-employees/knowledge-base/knowledge-base/index.md +11 -7
- package/dist/ai/docs/nocobase/ai-employees/knowledge-base/knowledge-base/settings.md +12 -8
- package/dist/ai/docs/nocobase/ai-employees/knowledge-base/rag.md +43 -13
- package/dist/ai/docs/nocobase/ai-employees/knowledge-base/vector-database.md +3 -3
- package/dist/ai/docs/nocobase/ai-employees/workflow/nodes/knowledge/create-document.md +1 -1
- package/dist/ai/docs/nocobase/api/app/env.md +2 -0
- package/dist/ai/docs/nocobase/api/cli/api/resource/create.md +4 -3
- package/dist/ai/docs/nocobase/building-tips/ai-fill-js-block-form.md +1092 -0
- package/dist/ai/docs/nocobase/data-sources/calendar/calendar-collection.md +100 -3
- package/dist/ai/docs/nocobase/data-sources/collection-comment/index.md +92 -39
- package/dist/ai/docs/nocobase/data-sources/collection-sql/index.md +150 -29
- package/dist/ai/docs/nocobase/data-sources/collection-tree/index.md +93 -5
- package/dist/ai/docs/nocobase/data-sources/collection-view/index.md +226 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/china-region.md +122 -5
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/collection-select.md +105 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/json.md +102 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/nano-id.md +104 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/snowflake-id.md +108 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/sort.md +3 -19
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/uuid.md +104 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/associations/index.md +44 -8
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/color.md +102 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/email.md +104 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/icon.md +102 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/input.md +112 -8
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/integer.md +103 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/number.md +103 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/password.md +102 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/percent.md +104 -5
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/phone.md +104 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/textarea.md +99 -8
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/url.md +103 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/choices/checkbox-group.md +105 -3
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/choices/checkbox.md +102 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/choices/china-region.md +108 -5
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/choices/multiple-select.md +103 -5
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/choices/radio-group.md +106 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/choices/select.md +103 -5
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/datetime/date.md +102 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/datetime/datetime-without-tz.md +103 -5
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/datetime/datetime.md +103 -5
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/datetime/index.md +53 -47
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/datetime/time.md +102 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/datetime/unix-timestamp.md +103 -5
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/geometric/circle.md +102 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/geometric/line.md +103 -5
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/geometric/point.md +102 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/geometric/polygon.md +102 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/index.md +62 -16
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/media/markdown.md +104 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/media/rich-text.md +105 -5
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/system-info/created-at.md +105 -5
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/system-info/created-by.md +103 -5
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/system-info/space.md +100 -6
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/system-info/table-oid.md +102 -4
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/system-info/updated-at.md +104 -5
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/system-info/updated-by.md +104 -6
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/validation.md +68 -58
- package/dist/ai/docs/nocobase/data-sources/data-modeling/collection.md +32 -13
- package/dist/ai/docs/nocobase/data-sources/data-modeling/index.md +41 -33
- package/dist/ai/docs/nocobase/data-sources/data-source-external-mariadb/index.md +114 -6
- package/dist/ai/docs/nocobase/data-sources/data-source-external-mssql/index.md +117 -6
- package/dist/ai/docs/nocobase/data-sources/data-source-external-mysql/index.md +103 -6
- package/dist/ai/docs/nocobase/data-sources/data-source-external-nocobase/index.md +75 -73
- package/dist/ai/docs/nocobase/data-sources/data-source-external-oracle/index.md +129 -11
- package/dist/ai/docs/nocobase/data-sources/data-source-external-postgres/index.md +110 -6
- package/dist/ai/docs/nocobase/data-sources/data-source-kingbase/index.md +75 -49
- package/dist/ai/docs/nocobase/data-sources/data-source-main/general-collection.md +116 -15
- package/dist/ai/docs/nocobase/data-sources/data-source-main/index.md +92 -62
- package/dist/ai/docs/nocobase/data-sources/data-source-main/inheritance-collection.md +97 -10
- package/dist/ai/docs/nocobase/data-sources/data-source-manager/external-database.md +97 -58
- package/dist/ai/docs/nocobase/data-sources/data-source-manager/index.md +32 -24
- package/dist/ai/docs/nocobase/data-sources/data-source-rest-api/index.md +115 -153
- package/dist/ai/docs/nocobase/data-sources/external/clickhouse.md +124 -0
- package/dist/ai/docs/nocobase/data-sources/external/doris.md +130 -0
- package/dist/ai/docs/nocobase/data-sources/external/index.md +140 -0
- package/dist/ai/docs/nocobase/data-sources/external/kingbase.md +129 -0
- package/dist/ai/docs/nocobase/data-sources/external/mariadb.md +126 -0
- package/dist/ai/docs/nocobase/data-sources/external/mssql.md +129 -0
- package/dist/ai/docs/nocobase/data-sources/external/mysql.md +115 -0
- package/dist/ai/docs/nocobase/data-sources/external/nocobase.md +159 -0
- package/dist/ai/docs/nocobase/data-sources/external/oceanbase.md +126 -0
- package/dist/ai/docs/nocobase/data-sources/external/oracle.md +158 -0
- package/dist/ai/docs/nocobase/data-sources/external/postgresql.md +122 -0
- package/dist/ai/docs/nocobase/data-sources/external/rest-api.md +245 -0
- package/dist/ai/docs/nocobase/data-sources/field-attachment-url/index.md +100 -12
- package/dist/ai/docs/nocobase/data-sources/field-encryption/index.md +48 -47
- package/dist/ai/docs/nocobase/data-sources/field-formula/index.md +99 -5
- package/dist/ai/docs/nocobase/data-sources/field-markdown-vditor/index.md +105 -5
- package/dist/ai/docs/nocobase/data-sources/field-sequence/index.md +102 -5
- package/dist/ai/docs/nocobase/data-sources/field-signature/index.md +18 -16
- package/dist/ai/docs/nocobase/data-sources/field-sort/index.md +76 -73
- package/dist/ai/docs/nocobase/data-sources/file-manager/field-attachment.md +101 -7
- package/dist/ai/docs/nocobase/data-sources/file-manager/file-collection.md +101 -14
- package/dist/ai/docs/nocobase/data-sources/index.md +49 -33
- package/dist/ai/docs/nocobase/data-sources/main/index.md +130 -0
- package/dist/ai/docs/nocobase/data-sources/main/kingbase.md +147 -0
- package/dist/ai/docs/nocobase/data-sources/main/mariadb.md +59 -0
- package/dist/ai/docs/nocobase/data-sources/main/mysql.md +59 -0
- package/dist/ai/docs/nocobase/data-sources/main/oceanbase.md +62 -0
- package/dist/ai/docs/nocobase/data-sources/main/postgresql.md +61 -0
- package/dist/ai/docs/nocobase/file-manager/file-preview/index.md +44 -3
- package/dist/ai/docs/nocobase/file-manager/stable-url.md +1 -1
- package/dist/ai/docs/nocobase/file-manager/storage/aliyun-oss.md +100 -3
- package/dist/ai/docs/nocobase/file-manager/storage/index.md +76 -26
- package/dist/ai/docs/nocobase/file-manager/storage/local.md +4 -2
- package/dist/ai/docs/nocobase/file-manager/storage/s3-pro.md +58 -7
- package/dist/ai/docs/nocobase/get-started/installation/docker-nginx.mdx +4 -1
- package/dist/ai/docs/nocobase/get-started/installation/docker.mdx +2 -0
- package/dist/ai/docs/nocobase/get-started/installation/env.md +13 -1
- package/dist/ai/docs/nocobase/nocobase-cli/production/reverse-proxy/caddy.md +28 -5
- package/dist/ai/docs/nocobase/nocobase-cli/production/reverse-proxy/nginx.md +25 -0
- package/dist/ai/docs/nocobase/ops-management/migration-manager/built-in-tables.md +1 -2
- package/dist/ai/docs/nocobase/plugin-development/build.md +10 -4
- package/dist/ai/docs/nocobase/plugin-development/client/appendix/faq.md +1 -1
- package/dist/ai/docs/nocobase/plugin-development/client/examples/custom-action.md +2 -0
- package/dist/ai/docs/nocobase/plugin-development/client/examples/custom-block.md +2 -0
- package/dist/ai/docs/nocobase/plugin-development/client/examples/custom-field.md +2 -0
- package/dist/ai/docs/nocobase/plugin-development/client/examples/fullstack-plugin.md +2 -0
- package/dist/ai/docs/nocobase/plugin-development/client/examples/settings-page.md +2 -0
- package/dist/ai/docs/nocobase/plugin-development/common/i18n.md +3 -3
- package/dist/ai/docs/nocobase/plugin-development/server/cache.md +1 -1
- package/dist/ai/docs/nocobase/plugin-development/server/collections.md +0 -6
- package/dist/ai/docs/nocobase/plugin-development/server/command.md +2 -2
- package/dist/ai/docs/nocobase/plugin-development/server/context.md +2 -2
- package/dist/ai/docs/nocobase/plugin-development/server/i18n.md +4 -4
- package/dist/ai/docs/nocobase/plugin-development/write-your-first-plugin.md +91 -43
- package/dist/ai/docs/nocobase/runjs/context/ai.md +194 -4
- package/dist/ai/docs/nocobase/security/guide.md +17 -2
- package/dist/ai/docs/nocobase/users-permissions/sync/index.md +8 -1
- package/dist/ai/docs/nocobase/users-permissions/sync/sources/dingtalk.md +138 -0
- package/dist/ai/docs/nocobase/users-permissions/sync/sources/ldap.md +87 -0
- package/dist/ai/docs/nocobase/workflow/nodes/javascript.md +21 -1
- package/dist/ai/tools/executeFrontendTool.d.ts +10 -0
- package/dist/ai/tools/executeFrontendTool.js +86 -0
- package/dist/ai/tools/getSkill.js +1 -1
- package/dist/ai/tools/knowledge-base-retrieve.js +3 -1
- package/dist/ai/tools/loadFrontendTool.d.ts +10 -0
- package/dist/ai/tools/loadFrontendTool.js +99 -0
- package/dist/client/244.aeb24ce76c510b34.js +10 -0
- package/dist/client/{525.203778500aca5d05.js → 525.94dd4136c1361477.js} +1 -1
- package/dist/client/681.6ffbc9329b9ac242.js +10 -0
- package/dist/client/705.1d735e63c25f66a8.js +10 -0
- package/dist/client/index.d.ts +1 -3
- package/dist/client/index.js +8 -8
- package/dist/client-v2/244.ee9ec45eac0eb99f.js +10 -0
- package/dist/client-v2/420.a5b929a5e7f330be.js +10 -0
- package/dist/client-v2/681.6890caa389564ff7.js +10 -0
- package/dist/client-v2/705.00c101bef403fb44.js +10 -0
- package/dist/client-v2/ai-employees/AIEmployeeShortcut.d.ts +2 -0
- package/dist/client-v2/ai-employees/AddContextButton.d.ts +2 -0
- package/dist/client-v2/ai-employees/chatbox/components/AIEmployeeSwitcher.d.ts +1 -0
- package/dist/client-v2/ai-employees/chatbox/components/ChatBoxUnreadBadge.d.ts +17 -0
- package/dist/client-v2/ai-employees/chatbox/components/Conversations.d.ts +9 -1
- package/dist/client-v2/ai-employees/chatbox/components/MessageRenderers.d.ts +1 -1
- package/dist/client-v2/ai-employees/chatbox/components/Messages.d.ts +5 -1
- package/dist/client-v2/ai-employees/chatbox/components/ModelSwitcher.d.ts +4 -0
- package/dist/client-v2/ai-employees/chatbox/components/Sender.d.ts +33 -1
- package/dist/client-v2/ai-employees/chatbox/components/index.d.ts +1 -0
- package/dist/client-v2/ai-employees/chatbox/hooks/reasoning-stream.d.ts +10 -0
- package/dist/client-v2/ai-employees/chatbox/hooks/useChat.d.ts +8 -5
- package/dist/client-v2/ai-employees/chatbox/hooks/useChatBoxActions.d.ts +3 -2
- package/dist/client-v2/ai-employees/chatbox/hooks/useChatBoxEffect.d.ts +2 -1
- package/dist/client-v2/ai-employees/chatbox/hooks/useChatConversationActions.d.ts +3 -2
- package/dist/client-v2/ai-employees/chatbox/hooks/useChatMessageActions.d.ts +4 -2
- package/dist/client-v2/ai-employees/chatbox/hooks/useToolCallActions.d.ts +3 -1
- package/dist/client-v2/ai-employees/chatbox/hooks/useUploadFiles.d.ts +13 -3
- package/dist/client-v2/ai-employees/chatbox/hooks/useWorkflowTasks.d.ts +3 -2
- package/dist/client-v2/ai-employees/chatbox/index.d.ts +17 -0
- package/dist/client-v2/ai-employees/chatbox/roles.d.ts +2 -153
- package/dist/client-v2/ai-employees/chatbox/stores/chat-box.d.ts +46 -33
- package/dist/client-v2/ai-employees/chatbox/stores/chat-conversations.d.ts +7 -7
- package/dist/client-v2/ai-employees/chatbox/stores/chat-messages.d.ts +23 -18
- package/dist/client-v2/ai-employees/chatbox/stores/chat-sender.d.ts +43 -0
- package/dist/client-v2/ai-employees/chatbox/stores/chat-tool-call.d.ts +6 -5
- package/dist/client-v2/ai-employees/chatbox/stores/chat-tools.d.ts +11 -5
- package/dist/client-v2/ai-employees/chatbox/stores/mounted-chat-boxes.d.ts +20 -0
- package/dist/client-v2/ai-employees/chatbox/stores/runtime.d.ts +43 -0
- package/dist/client-v2/ai-employees/chatbox/stores/workflow-tasks.d.ts +22 -10
- package/dist/client-v2/ai-employees/chatbox/upload.d.ts +19 -0
- package/dist/client-v2/ai-employees/chatbox/utils.d.ts +28 -4
- package/dist/client-v2/ai-employees/frontend-tools.d.ts +11 -0
- package/dist/client-v2/ai-employees/tools/SuggestionsOptionsCard.d.ts +1 -1
- package/dist/client-v2/ai-employees/tools/WorkflowTaskOutputCard.d.ts +1 -1
- package/dist/client-v2/ai-employees/types.d.ts +30 -0
- package/dist/client-v2/block/ai-chat-box/AIChatBoxBlockModel.d.ts +21 -0
- package/dist/client-v2/block/ai-chat-box/AIChatBoxCoreModel.d.ts +13 -0
- package/dist/client-v2/{ai-employees/chatbox/components/DebugPanel.d.ts → block/ai-chat-box/components/AIChatBoxCoreView.d.ts} +1 -1
- package/dist/client-v2/block/ai-chat-box/components/AIChatBoxView.d.ts +12 -0
- package/dist/client-v2/block/ai-chat-box/index.d.ts +14 -0
- package/dist/client-v2/block/ai-chat-box/settings.d.ts +12 -0
- package/dist/client-v2/block/ai-chat-box/sub-models.d.ts +26 -0
- package/dist/client-v2/block/ai-chat-box/types.d.ts +38 -0
- package/dist/client-v2/block/ai-chat-box/utils.d.ts +26 -0
- package/dist/client-v2/index.d.ts +3 -5
- package/dist/client-v2/index.js +3 -3
- package/dist/client-v2/llm-providers/forms.d.ts +2 -0
- package/dist/client-v2/llm-providers/index.d.ts +1 -0
- package/dist/client-v2/llm-services/model-select.d.ts +33 -0
- package/dist/client-v2/llm-services/utils.d.ts +1 -0
- package/dist/client-v2/manager/ai-manager.d.ts +10 -3
- package/dist/client-v2/manager/frontend-tool-registry.d.ts +30 -0
- package/dist/client-v2/models/ai-employees/AIEmployeeActionModel.d.ts +4 -1
- package/dist/client-v2/models/ai-employees/AIEmployeeShortcutModel.d.ts +8 -0
- package/dist/client-v2/pages/EmployeesPage.d.ts +12 -0
- package/dist/client-v2/pages/LLMServicesPage.d.ts +9 -4
- package/dist/client-v2/repositories/AIConfigRepository.d.ts +2 -0
- package/dist/client-v2/runjs/registerAIEmployeeRunJSFacade.d.ts +1 -0
- package/dist/client-v2/workflow/types.d.ts +1 -0
- package/dist/collections/ai-employees.d.ts +1 -0
- package/dist/collections/ai-employees.js +1 -0
- package/dist/common/ai-employee-validation.d.ts +17 -0
- package/dist/common/ai-employee-validation.js +67 -0
- package/dist/common/error-codes.d.ts +14 -0
- package/dist/common/error-codes.js +51 -0
- package/dist/common/frontend-tools.d.ts +26 -0
- package/dist/common/frontend-tools.js +57 -0
- package/dist/common/llm-service-models.d.ts +16 -0
- package/dist/common/llm-service-models.js +84 -0
- package/dist/externalVersion.js +19 -17
- package/dist/locale/de-DE.json +2 -1
- package/dist/locale/en-US.json +87 -5
- package/dist/locale/es-ES.json +2 -1
- package/dist/locale/fr-FR.json +2 -1
- package/dist/locale/hu-HU.json +2 -1
- package/dist/locale/id-ID.json +2 -1
- package/dist/locale/it-IT.json +2 -1
- package/dist/locale/ja-JP.json +2 -1
- package/dist/locale/ko-KR.json +2 -1
- package/dist/locale/nl-NL.json +2 -1
- package/dist/locale/pt-BR.json +2 -1
- package/dist/locale/ru-RU.json +2 -1
- package/dist/locale/tr-TR.json +2 -1
- package/dist/locale/uk-UA.json +2 -1
- package/dist/locale/vi-VN.json +2 -1
- package/dist/locale/zh-CN.json +87 -5
- package/dist/locale/zh-TW.json +2 -1
- package/dist/node_modules/@langchain/mistralai/package.json +1 -1
- package/dist/node_modules/@langchain/xai/package.json +1 -1
- package/dist/node_modules/fs-extra/package.json +1 -1
- package/dist/node_modules/jsonrepair/package.json +1 -1
- package/dist/node_modules/just-bash/package.json +1 -1
- package/dist/node_modules/nodejs-snowflake/package.json +1 -1
- package/dist/node_modules/openai/package.json +1 -1
- package/dist/node_modules/zod/package.json +1 -1
- package/dist/server/ai-employees/ai-conversations.d.ts +4 -1
- package/dist/server/ai-employees/ai-conversations.js +2 -0
- package/dist/server/ai-employees/ai-employee.d.ts +32 -2
- package/dist/server/ai-employees/ai-employee.js +367 -79
- package/dist/server/ai-employees/ai-knowledge-base.d.ts +21 -1
- package/dist/server/ai-employees/ai-knowledge-base.js +87 -12
- package/dist/server/ai-employees/middleware/conversation.js +28 -22
- package/dist/server/ai-employees/middleware/index.d.ts +1 -0
- package/dist/server/ai-employees/middleware/index.js +2 -0
- package/dist/server/ai-employees/middleware/tool-result-integrity.d.ts +22 -0
- package/dist/server/ai-employees/middleware/tool-result-integrity.js +211 -0
- package/dist/server/ai-employees/reasoning-stream-state.d.ts +23 -0
- package/dist/server/ai-employees/reasoning-stream-state.js +63 -0
- package/dist/server/collections/ai-conversations.js +5 -0
- package/dist/server/document-loader/constants.js +1 -1
- package/dist/server/features/knowledge-base.d.ts +2 -0
- package/dist/server/frontend-tools.d.ts +25 -0
- package/dist/server/frontend-tools.js +171 -0
- package/dist/server/llm-providers/common/reasoning.js +18 -10
- package/dist/server/llm-providers/deepseek/index.d.ts +10 -0
- package/dist/server/llm-providers/deepseek/index.js +32 -0
- package/dist/server/llm-providers/deepseek/provider.d.ts +57 -0
- package/dist/server/llm-providers/deepseek/provider.js +320 -0
- package/dist/server/llm-providers/deepseek/reasoning.d.ts +83 -0
- package/dist/server/llm-providers/deepseek/reasoning.js +285 -0
- package/dist/server/llm-providers/mistral.d.ts +1 -1
- package/dist/server/llm-providers/provider.d.ts +1 -0
- package/dist/server/llm-providers/provider.js +3 -0
- package/dist/server/llm-providers/shengsuanyun.d.ts +29 -0
- package/dist/server/llm-providers/shengsuanyun.js +114 -0
- package/dist/server/manager/ai-feature-manager.js +1 -1
- package/dist/server/manager/ai-manager.d.ts +3 -0
- package/dist/server/manager/ai-manager.js +7 -2
- package/dist/server/manager/work-context-handler.js +10 -3
- package/dist/server/migrations/20260501000000-ai-employee-knowledge-base-retrieval-strategy.d.ts +14 -0
- package/dist/server/migrations/20260501000000-ai-employee-knowledge-base-retrieval-strategy.js +49 -0
- package/dist/server/plugin.d.ts +1 -0
- package/dist/server/plugin.js +31 -0
- package/dist/server/resource/aiConversations.d.ts +2 -0
- package/dist/server/resource/aiConversations.js +33 -3
- package/dist/server/resource/aiEmployees.d.ts +2 -0
- package/dist/server/resource/aiEmployees.js +96 -0
- package/dist/server/resource/aiWorkflowTasks.js +9 -1
- package/dist/server/resource/llmServices.d.ts +11 -0
- package/dist/server/resource/llmServices.js +85 -0
- package/dist/server/types/ai-message.type.d.ts +4 -0
- package/dist/server/types/knowledge-base.type.d.ts +8 -3
- package/dist/server/workflow/nodes/employee/files.d.ts +1 -1
- package/dist/server/workflow/nodes/employee/files.js +48 -1
- package/dist/server/workflow/nodes/employee/index.js +7 -2
- package/dist/server/workflow/nodes/employee/types.d.ts +1 -0
- package/dist/swagger/common.d.ts +143 -0
- package/dist/swagger/common.js +144 -0
- package/dist/swagger/employees.d.ts +301 -0
- package/dist/swagger/employees.js +131 -0
- package/dist/swagger/index.d.ts +1617 -0
- package/dist/swagger/index.js +62 -0
- package/dist/swagger/llm.d.ts +563 -0
- package/dist/swagger/llm.js +255 -0
- package/dist/swagger/schemas.d.ts +757 -0
- package/dist/swagger/schemas.js +392 -0
- package/package.json +2 -2
- package/dist/ai/docs/nocobase/ai-employees/knowledge-base/vector-store.md +0 -24
- package/dist/ai/docs/nocobase/data-sources/development/index.md +0 -6
- package/dist/client/372.40eb52905e3f3049.js +0 -10
- package/dist/client/681.399948c18d753667.js +0 -10
- package/dist/client/705.380279da896021fb.js +0 -10
- package/dist/client-v2/372.8cc3fde09c9bec77.js +0 -10
- package/dist/client-v2/406.341be51205c674e0.js +0 -10
- package/dist/client-v2/681.082f4f1c7b841983.js +0 -10
- package/dist/client-v2/705.1d10027ff8cfdf79.js +0 -10
- package/dist/client-v2/ai-employees/chatbox/stores/create-selectors.d.ts +0 -46
- package/dist/client-v2/ai-employees/chatbox/utils/normalizeTriggerTaskOptions.d.ts +0 -19
- package/dist/client-v2/debug-logger.d.ts +0 -52
- package/dist/server/llm-providers/deepseek.d.ts +0 -40
- package/dist/server/llm-providers/deepseek.js +0 -174
|
@@ -8,15 +8,35 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { AIEmployee } from '../../collections/ai-employees';
|
|
10
10
|
import type PluginAIServer from '../plugin';
|
|
11
|
+
export declare const KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES: readonly ["always", "onDemand"];
|
|
12
|
+
export type KnowledgeBaseRetrievalStrategy = (typeof KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES)[number];
|
|
13
|
+
export declare const isKnowledgeBaseRetrievalStrategy: (value: unknown) => value is "always" | "onDemand";
|
|
14
|
+
export declare const normalizeKnowledgeBaseRetrievalStrategy: (value: unknown) => KnowledgeBaseRetrievalStrategy;
|
|
15
|
+
export declare const withDefaultKnowledgeBaseRetrievalStrategy: (knowledgeBase: unknown) => Record<string, unknown>;
|
|
16
|
+
export declare const getCurrentRoleNames: (state: unknown) => string[];
|
|
17
|
+
export declare const KNOWLEDGE_BASE_ON_DEMAND_PROMPT: string;
|
|
18
|
+
export declare const KNOWLEDGE_BASE_PRE_RETRIEVED_PROMPT: string;
|
|
19
|
+
export declare const KNOWLEDGE_BASE_NO_ACCESS_PROMPT: string;
|
|
20
|
+
export declare const getKnowledgeBaseBackgroundPrompt: ({ accessDenied, onDemand, preRetrieved, }: {
|
|
21
|
+
accessDenied: boolean;
|
|
22
|
+
onDemand: boolean;
|
|
23
|
+
preRetrieved: boolean;
|
|
24
|
+
}) => string | undefined;
|
|
11
25
|
export type KnowledgeBaseRetrieveOptions = {
|
|
12
26
|
username?: string;
|
|
13
27
|
employee?: AIEmployee;
|
|
14
28
|
query: string;
|
|
29
|
+
roleNames?: string[];
|
|
30
|
+
};
|
|
31
|
+
export type KnowledgeBaseAccessOptions = {
|
|
32
|
+
employee: AIEmployee;
|
|
33
|
+
roleNames: string[];
|
|
15
34
|
};
|
|
16
35
|
export declare class KnowledgeBaseManager {
|
|
17
36
|
private readonly plugin;
|
|
18
37
|
constructor(plugin: PluginAIServer);
|
|
19
|
-
retrievePrompt({ username, employee, query }: KnowledgeBaseRetrieveOptions): Promise<string>;
|
|
38
|
+
retrievePrompt({ username, employee, query, roleNames }: KnowledgeBaseRetrieveOptions): Promise<string>;
|
|
39
|
+
hasAccessibleKnowledgeBase({ employee, roleNames }: KnowledgeBaseAccessOptions): Promise<boolean>;
|
|
20
40
|
isEnabledKnowledgeBase(username: string): Promise<boolean>;
|
|
21
41
|
isEnabledKnowledgeBase(employee: AIEmployee): Promise<boolean>;
|
|
22
42
|
private getEmployee;
|
|
@@ -36,12 +36,65 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
36
36
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
37
37
|
var ai_knowledge_base_exports = {};
|
|
38
38
|
__export(ai_knowledge_base_exports, {
|
|
39
|
-
|
|
39
|
+
KNOWLEDGE_BASE_NO_ACCESS_PROMPT: () => KNOWLEDGE_BASE_NO_ACCESS_PROMPT,
|
|
40
|
+
KNOWLEDGE_BASE_ON_DEMAND_PROMPT: () => KNOWLEDGE_BASE_ON_DEMAND_PROMPT,
|
|
41
|
+
KNOWLEDGE_BASE_PRE_RETRIEVED_PROMPT: () => KNOWLEDGE_BASE_PRE_RETRIEVED_PROMPT,
|
|
42
|
+
KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES: () => KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES,
|
|
43
|
+
KnowledgeBaseManager: () => KnowledgeBaseManager,
|
|
44
|
+
getCurrentRoleNames: () => getCurrentRoleNames,
|
|
45
|
+
getKnowledgeBaseBackgroundPrompt: () => getKnowledgeBaseBackgroundPrompt,
|
|
46
|
+
isKnowledgeBaseRetrievalStrategy: () => isKnowledgeBaseRetrievalStrategy,
|
|
47
|
+
normalizeKnowledgeBaseRetrievalStrategy: () => normalizeKnowledgeBaseRetrievalStrategy,
|
|
48
|
+
withDefaultKnowledgeBaseRetrievalStrategy: () => withDefaultKnowledgeBaseRetrievalStrategy
|
|
40
49
|
});
|
|
41
50
|
module.exports = __toCommonJS(ai_knowledge_base_exports);
|
|
42
51
|
var import_prompts = require("@langchain/core/prompts");
|
|
43
52
|
var import_ai_feature_manager = require("../manager/ai-feature-manager");
|
|
44
53
|
var import_lodash = __toESM(require("lodash"));
|
|
54
|
+
var import_ai_employee_validation = require("../../common/ai-employee-validation");
|
|
55
|
+
const KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES = ["always", "onDemand"];
|
|
56
|
+
const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
57
|
+
const getRoleNames = (roles) => Array.isArray(roles) ? Array.from(
|
|
58
|
+
new Set(
|
|
59
|
+
roles.map((role) => isRecord(role) ? role.name : role).filter((role) => typeof role === "string" && role.length > 0)
|
|
60
|
+
)
|
|
61
|
+
) : [];
|
|
62
|
+
const isKnowledgeBaseRetrievalStrategy = (value) => typeof value === "string" && KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES.includes(value);
|
|
63
|
+
const normalizeKnowledgeBaseRetrievalStrategy = (value) => isKnowledgeBaseRetrievalStrategy(value) ? value : "always";
|
|
64
|
+
const withDefaultKnowledgeBaseRetrievalStrategy = (knowledgeBase) => {
|
|
65
|
+
const settings = isRecord(knowledgeBase) ? { ...knowledgeBase } : {};
|
|
66
|
+
if (!isKnowledgeBaseRetrievalStrategy(settings.retrievalStrategy)) {
|
|
67
|
+
settings.retrievalStrategy = "onDemand";
|
|
68
|
+
}
|
|
69
|
+
return settings;
|
|
70
|
+
};
|
|
71
|
+
const getCurrentRoleNames = (state) => {
|
|
72
|
+
const { currentRole, currentRoles, currentUser } = isRecord(state) ? state : {};
|
|
73
|
+
const currentUserRoleNames = getRoleNames(isRecord(currentUser) ? currentUser.roles : void 0);
|
|
74
|
+
if (currentUserRoleNames.length) {
|
|
75
|
+
return currentUserRoleNames;
|
|
76
|
+
}
|
|
77
|
+
if (Array.isArray(currentRoles)) {
|
|
78
|
+
return getRoleNames(currentRoles);
|
|
79
|
+
}
|
|
80
|
+
return typeof currentRole === "string" && currentRole.length > 0 ? [currentRole] : [];
|
|
81
|
+
};
|
|
82
|
+
const KNOWLEDGE_BASE_ON_DEMAND_PROMPT = "Use the knowledge base retrieval tool only when the request needs internal knowledge, uploaded documents, or knowledge-base facts. Do not call it for requests that clearly do not need those sources.";
|
|
83
|
+
const KNOWLEDGE_BASE_PRE_RETRIEVED_PROMPT = "The <knowledgeBase> content was retrieved in advance for the current user request. Use it directly when it is sufficient to answer; do not call the knowledge base retrieval tool again unless additional or different knowledge-base information is genuinely needed.";
|
|
84
|
+
const KNOWLEDGE_BASE_NO_ACCESS_PROMPT = "The current user does not have permission to access any knowledge base in this AI employee's configured scope. First answer the user's question as helpfully as possible using only information available without knowledge-base content; do not replace or interrupt the answer with a permission notice, and do not fabricate unavailable facts. Only after completing the answer, append a brief notice in the user's language stating that this response did not use knowledge-base content because the current user does not have permission to access these knowledge bases. Format this notice as a visually prominent Markdown reminder, using a blockquote with a bold warning or reminder heading so that it is easy to notice. If knowledge-base access is needed, advise the user to contact an administrator. Do not claim to have searched or used knowledge-base content.";
|
|
85
|
+
const getKnowledgeBaseBackgroundPrompt = ({
|
|
86
|
+
accessDenied,
|
|
87
|
+
onDemand,
|
|
88
|
+
preRetrieved
|
|
89
|
+
}) => {
|
|
90
|
+
if (accessDenied) {
|
|
91
|
+
return KNOWLEDGE_BASE_NO_ACCESS_PROMPT;
|
|
92
|
+
}
|
|
93
|
+
if (onDemand) {
|
|
94
|
+
return KNOWLEDGE_BASE_ON_DEMAND_PROMPT;
|
|
95
|
+
}
|
|
96
|
+
return preRetrieved ? KNOWLEDGE_BASE_PRE_RETRIEVED_PROMPT : void 0;
|
|
97
|
+
};
|
|
45
98
|
const normalizeMatchedQuestions = (value) => {
|
|
46
99
|
if (!Array.isArray(value)) {
|
|
47
100
|
return [];
|
|
@@ -62,24 +115,37 @@ class KnowledgeBaseManager {
|
|
|
62
115
|
constructor(plugin) {
|
|
63
116
|
this.plugin = plugin;
|
|
64
117
|
}
|
|
65
|
-
async retrievePrompt({ username, employee, query }) {
|
|
118
|
+
async retrievePrompt({ username, employee, query, roleNames }) {
|
|
66
119
|
employee = employee ?? (username ? await this.getEmployee(username) : null);
|
|
67
120
|
if (!employee) {
|
|
68
121
|
return "Specified knowledge base not existed";
|
|
69
122
|
}
|
|
70
|
-
const { knowledgeBaseKeys, topK, score } = employee.knowledgeBase ?? {};
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
const promptTemplate = import_prompts.ChatPromptTemplate.fromTemplate(employee.knowledgeBasePrompt ?? "{knowledgeBaseData}");
|
|
75
|
-
const docs = await this.plugin.features.knowledgeBase.search({ knowledgeBaseKeys, query, topK, score });
|
|
123
|
+
const { knowledgeBaseKeys = [], topK, score } = employee.knowledgeBase ?? {};
|
|
124
|
+
const knowledgeBasePrompt = employee.knowledgeBasePrompt ?? "{knowledgeBaseData}";
|
|
125
|
+
const docs = await this.plugin.features.knowledgeBase.search({ knowledgeBaseKeys, query, topK, score, roleNames });
|
|
76
126
|
if (!(docs == null ? void 0 : docs.length)) {
|
|
77
127
|
return "No document match in knowledge base";
|
|
78
128
|
}
|
|
79
129
|
const knowledgeBaseData = docs.map((doc) => buildKnowledgeBaseContent(doc.content, doc.metadata)).join("\n");
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
130
|
+
if (import_lodash.default.isEmpty(knowledgeBaseData)) {
|
|
131
|
+
return "No document match in knowledge base";
|
|
132
|
+
}
|
|
133
|
+
if (!(0, import_ai_employee_validation.hasKnowledgeBaseDataPlaceholder)(knowledgeBasePrompt)) {
|
|
134
|
+
return `${knowledgeBasePrompt}
|
|
135
|
+
|
|
136
|
+
${knowledgeBaseData}`;
|
|
137
|
+
}
|
|
138
|
+
return import_prompts.ChatPromptTemplate.fromTemplate(knowledgeBasePrompt).format({ knowledgeBaseData });
|
|
139
|
+
}
|
|
140
|
+
async hasAccessibleKnowledgeBase({ employee, roleNames }) {
|
|
141
|
+
var _a;
|
|
142
|
+
const knowledgeBaseKeys = ((_a = employee.knowledgeBase) == null ? void 0 : _a.knowledgeBaseKeys) ?? [];
|
|
143
|
+
const knowledgeBaseFeature = this.plugin.features.knowledgeBase;
|
|
144
|
+
if (!knowledgeBaseFeature.getAccessibleKnowledgeBaseKeys) {
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
const accessibleKeys = await knowledgeBaseFeature.getAccessibleKnowledgeBaseKeys({ knowledgeBaseKeys, roleNames });
|
|
148
|
+
return accessibleKeys.length > 0;
|
|
83
149
|
}
|
|
84
150
|
async isEnabledKnowledgeBase(usernameOrEmployee) {
|
|
85
151
|
const featureEnabled = this.plugin.features.isFeaturesEnabled(Object.values(import_ai_feature_manager.EEFeatures));
|
|
@@ -96,5 +162,14 @@ class KnowledgeBaseManager {
|
|
|
96
162
|
}
|
|
97
163
|
// Annotate the CommonJS export names for ESM import in node:
|
|
98
164
|
0 && (module.exports = {
|
|
99
|
-
|
|
165
|
+
KNOWLEDGE_BASE_NO_ACCESS_PROMPT,
|
|
166
|
+
KNOWLEDGE_BASE_ON_DEMAND_PROMPT,
|
|
167
|
+
KNOWLEDGE_BASE_PRE_RETRIEVED_PROMPT,
|
|
168
|
+
KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES,
|
|
169
|
+
KnowledgeBaseManager,
|
|
170
|
+
getCurrentRoleNames,
|
|
171
|
+
getKnowledgeBaseBackgroundPrompt,
|
|
172
|
+
isKnowledgeBaseRetrievalStrategy,
|
|
173
|
+
normalizeKnowledgeBaseRetrievalStrategy,
|
|
174
|
+
withDefaultKnowledgeBaseRetrievalStrategy
|
|
100
175
|
});
|
|
@@ -98,8 +98,9 @@ const conversationMiddleware = (aiEmployee, options) => {
|
|
|
98
98
|
})
|
|
99
99
|
}),
|
|
100
100
|
beforeAgent: async (state) => {
|
|
101
|
-
const
|
|
102
|
-
const
|
|
101
|
+
const humanMessages = state.messages.filter((x) => x.type === "human");
|
|
102
|
+
const currentHumanMessageIndex = humanMessages.length;
|
|
103
|
+
const userMessages = (aiEmployee.userMessageCount ? humanMessages.slice(-aiEmployee.userMessageCount) : []).map((x) => x).map(convertHumanMessage);
|
|
103
104
|
await aiEmployee.aiChatConversation.withTransaction(async (conversation, transaction) => {
|
|
104
105
|
if (agentThread) {
|
|
105
106
|
await aiEmployee.updateThread(transaction, agentThread);
|
|
@@ -111,6 +112,12 @@ const conversationMiddleware = (aiEmployee, options) => {
|
|
|
111
112
|
await conversation.addMessages(userMessages);
|
|
112
113
|
}
|
|
113
114
|
});
|
|
115
|
+
return {
|
|
116
|
+
lastMessageIndex: {
|
|
117
|
+
...state.lastMessageIndex,
|
|
118
|
+
lastHumanMessageIndex: currentHumanMessageIndex
|
|
119
|
+
}
|
|
120
|
+
};
|
|
114
121
|
},
|
|
115
122
|
afterAgent: async () => {
|
|
116
123
|
aiEmployee.removeAbortController();
|
|
@@ -172,31 +179,30 @@ const conversationMiddleware = (aiEmployee, options) => {
|
|
|
172
179
|
const toolCalls = aiMessage.tool_calls;
|
|
173
180
|
const values = convertAIMessage(aiMessage);
|
|
174
181
|
if (values) {
|
|
175
|
-
await aiEmployee.
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const toolsMap = await aiEmployee.getToolsMap();
|
|
180
|
-
const initializedToolCalls = await aiEmployee.initToolCall(
|
|
181
|
-
transaction,
|
|
182
|
-
result.messageId,
|
|
183
|
-
toolCalls
|
|
184
|
-
);
|
|
185
|
-
fillToolCall(result, toolsMap, initializedToolCalls, toolCalls);
|
|
186
|
-
}
|
|
182
|
+
const result = await aiEmployee.persistAIMessage({
|
|
183
|
+
values,
|
|
184
|
+
langChainMessageId: aiMessage.id,
|
|
185
|
+
toolCalls: toolCalls ?? []
|
|
187
186
|
});
|
|
187
|
+
newState.messageId = result.message.messageId;
|
|
188
188
|
if (toolCalls == null ? void 0 : toolCalls.length) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
189
|
+
const toolsMap = await aiEmployee.getToolsMap();
|
|
190
|
+
fillToolCall(result.message, toolsMap, result.initializedToolCalls, toolCalls);
|
|
191
|
+
}
|
|
192
|
+
if (result.created) {
|
|
193
|
+
if (toolCalls == null ? void 0 : toolCalls.length) {
|
|
194
|
+
(_b = runtime.writer) == null ? void 0 : _b.call(runtime, {
|
|
195
|
+
action: "initToolCalls",
|
|
196
|
+
body: { toolCalls },
|
|
197
|
+
currentConversation
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
(_c = runtime.writer) == null ? void 0 : _c.call(runtime, {
|
|
201
|
+
action: "AfterAIMessageSaved",
|
|
202
|
+
body: { id: aiMessage.id, messageId: newState.messageId },
|
|
192
203
|
currentConversation
|
|
193
204
|
});
|
|
194
205
|
}
|
|
195
|
-
(_c = runtime.writer) == null ? void 0 : _c.call(runtime, {
|
|
196
|
-
action: "AfterAIMessageSaved",
|
|
197
|
-
body: { id: aiMessage.id, messageId: newState.messageId },
|
|
198
|
-
currentConversation
|
|
199
|
-
});
|
|
200
206
|
}
|
|
201
207
|
return newState;
|
|
202
208
|
} catch (e) {
|
|
@@ -26,6 +26,7 @@ module.exports = __toCommonJS(middleware_exports);
|
|
|
26
26
|
__reExport(middleware_exports, require("./conversation"), module.exports);
|
|
27
27
|
__reExport(middleware_exports, require("./skill-tools"), module.exports);
|
|
28
28
|
__reExport(middleware_exports, require("./tool-call-sanitizer"), module.exports);
|
|
29
|
+
__reExport(middleware_exports, require("./tool-result-integrity"), module.exports);
|
|
29
30
|
__reExport(middleware_exports, require("./tools"), module.exports);
|
|
30
31
|
__reExport(middleware_exports, require("./workflow-history"), module.exports);
|
|
31
32
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -33,6 +34,7 @@ __reExport(middleware_exports, require("./workflow-history"), module.exports);
|
|
|
33
34
|
...require("./conversation"),
|
|
34
35
|
...require("./skill-tools"),
|
|
35
36
|
...require("./tool-call-sanitizer"),
|
|
37
|
+
...require("./tool-result-integrity"),
|
|
36
38
|
...require("./tools"),
|
|
37
39
|
...require("./workflow-history")
|
|
38
40
|
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
import { BaseMessage } from '@langchain/core/messages';
|
|
10
|
+
import type { AIToolMessage } from '../../types/ai-message.type';
|
|
11
|
+
type ToolResultIntegrityLogger = {
|
|
12
|
+
warn: (message: string, meta?: Record<string, unknown>) => void;
|
|
13
|
+
};
|
|
14
|
+
export type NormalizeToolCallHistoryOptions = {
|
|
15
|
+
sessionId: string;
|
|
16
|
+
logger?: ToolResultIntegrityLogger;
|
|
17
|
+
loadToolResults: (toolCallIds: string[]) => Promise<Map<string, AIToolMessage>>;
|
|
18
|
+
};
|
|
19
|
+
export declare const isToolCallHistoryValid: (messages: readonly BaseMessage[]) => boolean;
|
|
20
|
+
export declare const normalizeToolCallHistory: (messages: readonly BaseMessage[], options: NormalizeToolCallHistoryOptions) => Promise<BaseMessage[]>;
|
|
21
|
+
export declare const toolResultIntegrityMiddleware: (options: NormalizeToolCallHistoryOptions) => import("langchain/dist/agents/middleware/types.cjs").AgentMiddleware<undefined, undefined, unknown, readonly (import("@langchain/core/dist/tools").ClientTool | import("@langchain/core/dist/tools").ServerTool)[]>;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var tool_result_integrity_exports = {};
|
|
28
|
+
__export(tool_result_integrity_exports, {
|
|
29
|
+
isToolCallHistoryValid: () => isToolCallHistoryValid,
|
|
30
|
+
normalizeToolCallHistory: () => normalizeToolCallHistory,
|
|
31
|
+
toolResultIntegrityMiddleware: () => toolResultIntegrityMiddleware
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(tool_result_integrity_exports);
|
|
34
|
+
var import_messages = require("@langchain/core/messages");
|
|
35
|
+
var import_langchain = require("langchain");
|
|
36
|
+
const SYNTHETIC_TOOL_RESULT_ERROR = "Tool execution was interrupted before a result was recorded.";
|
|
37
|
+
const getValidToolCalls = (message) => (message.tool_calls ?? []).filter((toolCall) => typeof toolCall.id === "string" && toolCall.id.length > 0);
|
|
38
|
+
const isToolCallHistoryValid = (messages) => {
|
|
39
|
+
for (let index = 0; index < messages.length; index++) {
|
|
40
|
+
const message = messages[index];
|
|
41
|
+
if (import_messages.ToolMessage.isInstance(message)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (!import_messages.AIMessage.isInstance(message)) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const toolCalls = getValidToolCalls(message);
|
|
48
|
+
if (!toolCalls.length) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const expectedToolCallIds = new Set(toolCalls.map((toolCall) => toolCall.id));
|
|
52
|
+
const seenToolResultIds = /* @__PURE__ */ new Set();
|
|
53
|
+
for (let resultIndex = 0; resultIndex < toolCalls.length; resultIndex++) {
|
|
54
|
+
index++;
|
|
55
|
+
if (index >= messages.length) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const result = messages[index];
|
|
59
|
+
if (!import_messages.ToolMessage.isInstance(result) || !expectedToolCallIds.has(result.tool_call_id) || seenToolResultIds.has(result.tool_call_id)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
seenToolResultIds.add(result.tool_call_id);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return true;
|
|
66
|
+
};
|
|
67
|
+
const serializeToolResultContent = (content) => {
|
|
68
|
+
if (typeof content === "string") {
|
|
69
|
+
return content;
|
|
70
|
+
}
|
|
71
|
+
return JSON.stringify(content ?? null);
|
|
72
|
+
};
|
|
73
|
+
const createSyntheticToolResult = (sessionId, toolCall) => new import_messages.ToolMessage({
|
|
74
|
+
id: `synthetic-tool-result:${sessionId}:${toolCall.id}`,
|
|
75
|
+
tool_call_id: toolCall.id,
|
|
76
|
+
name: toolCall.name,
|
|
77
|
+
status: "error",
|
|
78
|
+
content: JSON.stringify({
|
|
79
|
+
status: "error",
|
|
80
|
+
error: SYNTHETIC_TOOL_RESULT_ERROR
|
|
81
|
+
})
|
|
82
|
+
});
|
|
83
|
+
const createRestoredToolResult = (sessionId, toolCall, persisted) => {
|
|
84
|
+
if (!persisted || persisted.invokeStatus !== "confirmed" && persisted.invokeStatus !== "done") {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
return new import_messages.ToolMessage({
|
|
89
|
+
id: `restored-tool-result:${sessionId}:${toolCall.id}`,
|
|
90
|
+
tool_call_id: toolCall.id,
|
|
91
|
+
name: toolCall.name,
|
|
92
|
+
status: persisted.status === "error" ? "error" : "success",
|
|
93
|
+
content: serializeToolResultContent(persisted.content)
|
|
94
|
+
});
|
|
95
|
+
} catch {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const countMisplacedResults = (messages) => {
|
|
100
|
+
let misplacedResultCount = 0;
|
|
101
|
+
for (let index = 0; index < messages.length; index++) {
|
|
102
|
+
const message = messages[index];
|
|
103
|
+
if (!import_messages.AIMessage.isInstance(message)) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const toolCalls = getValidToolCalls(message);
|
|
107
|
+
if (!toolCalls.length) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const expectedToolCallIds = new Set(toolCalls.map((toolCall) => toolCall.id));
|
|
111
|
+
const contiguousResultIds = /* @__PURE__ */ new Set();
|
|
112
|
+
for (let offset = 1; offset <= toolCalls.length; offset++) {
|
|
113
|
+
const result = messages[index + offset];
|
|
114
|
+
if (!import_messages.ToolMessage.isInstance(result)) {
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
if (expectedToolCallIds.has(result.tool_call_id)) {
|
|
118
|
+
contiguousResultIds.add(result.tool_call_id);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
misplacedResultCount += expectedToolCallIds.size - contiguousResultIds.size;
|
|
122
|
+
}
|
|
123
|
+
return misplacedResultCount;
|
|
124
|
+
};
|
|
125
|
+
const normalizeToolCallHistory = async (messages, options) => {
|
|
126
|
+
var _a;
|
|
127
|
+
const toolResultsByCallId = /* @__PURE__ */ new Map();
|
|
128
|
+
const referencedToolCallIds = /* @__PURE__ */ new Set();
|
|
129
|
+
let toolCallCount = 0;
|
|
130
|
+
let toolResultCount = 0;
|
|
131
|
+
for (const message of messages) {
|
|
132
|
+
if (import_messages.AIMessage.isInstance(message)) {
|
|
133
|
+
for (const toolCall of getValidToolCalls(message)) {
|
|
134
|
+
toolCallCount++;
|
|
135
|
+
referencedToolCallIds.add(toolCall.id);
|
|
136
|
+
}
|
|
137
|
+
} else if (import_messages.ToolMessage.isInstance(message)) {
|
|
138
|
+
toolResultCount++;
|
|
139
|
+
if (message.tool_call_id) {
|
|
140
|
+
const results = toolResultsByCallId.get(message.tool_call_id) ?? [];
|
|
141
|
+
results.push(message);
|
|
142
|
+
toolResultsByCallId.set(message.tool_call_id, results);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const missingToolCallIds = Array.from(referencedToolCallIds).filter((id) => !toolResultsByCallId.has(id));
|
|
147
|
+
const persistedResults = missingToolCallIds.length ? await options.loadToolResults(missingToolCallIds) : /* @__PURE__ */ new Map();
|
|
148
|
+
const normalized = [];
|
|
149
|
+
const nextToolResultIndexByCallId = /* @__PURE__ */ new Map();
|
|
150
|
+
let restoredResultCount = 0;
|
|
151
|
+
let syntheticResultCount = 0;
|
|
152
|
+
let consumedExistingResultCount = 0;
|
|
153
|
+
for (const message of messages) {
|
|
154
|
+
if (import_messages.ToolMessage.isInstance(message)) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
normalized.push(message);
|
|
158
|
+
if (!import_messages.AIMessage.isInstance(message)) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
for (const toolCall of getValidToolCalls(message)) {
|
|
162
|
+
const existingResults = toolResultsByCallId.get(toolCall.id);
|
|
163
|
+
const existingResultIndex = nextToolResultIndexByCallId.get(toolCall.id) ?? 0;
|
|
164
|
+
const existingResult = existingResults == null ? void 0 : existingResults[existingResultIndex];
|
|
165
|
+
if (existingResult) {
|
|
166
|
+
nextToolResultIndexByCallId.set(toolCall.id, existingResultIndex + 1);
|
|
167
|
+
normalized.push(existingResult);
|
|
168
|
+
consumedExistingResultCount++;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
const restoredResult = createRestoredToolResult(options.sessionId, toolCall, persistedResults.get(toolCall.id));
|
|
172
|
+
if (restoredResult) {
|
|
173
|
+
normalized.push(restoredResult);
|
|
174
|
+
restoredResultCount++;
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
normalized.push(createSyntheticToolResult(options.sessionId, toolCall));
|
|
178
|
+
syntheticResultCount++;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const stats = {
|
|
182
|
+
messageCount: messages.length,
|
|
183
|
+
toolCallCount,
|
|
184
|
+
missingResultCount: missingToolCallIds.length,
|
|
185
|
+
misplacedResultCount: countMisplacedResults(messages),
|
|
186
|
+
orphanResultCount: toolResultCount - consumedExistingResultCount,
|
|
187
|
+
restoredResultCount,
|
|
188
|
+
syntheticResultCount
|
|
189
|
+
};
|
|
190
|
+
(_a = options.logger) == null ? void 0 : _a.warn("Normalize invalid tool call history before model call", {
|
|
191
|
+
sessionId: options.sessionId,
|
|
192
|
+
...stats
|
|
193
|
+
});
|
|
194
|
+
return normalized;
|
|
195
|
+
};
|
|
196
|
+
const toolResultIntegrityMiddleware = (options) => (0, import_langchain.createMiddleware)({
|
|
197
|
+
name: "ToolResultIntegrityMiddleware",
|
|
198
|
+
wrapModelCall: async (request, handler) => {
|
|
199
|
+
if (isToolCallHistoryValid(request.messages)) {
|
|
200
|
+
return handler(request);
|
|
201
|
+
}
|
|
202
|
+
request.messages = await normalizeToolCallHistory(request.messages, options);
|
|
203
|
+
return handler(request);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
207
|
+
0 && (module.exports = {
|
|
208
|
+
isToolCallHistoryValid,
|
|
209
|
+
normalizeToolCallHistory,
|
|
210
|
+
toolResultIntegrityMiddleware
|
|
211
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
export type StreamConversation = {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
from: string;
|
|
12
|
+
username: string;
|
|
13
|
+
};
|
|
14
|
+
export declare class ReasoningStreamState {
|
|
15
|
+
private readonly active;
|
|
16
|
+
start(conversation: StreamConversation): void;
|
|
17
|
+
stop(conversation: StreamConversation): boolean;
|
|
18
|
+
drain(): StreamConversation[];
|
|
19
|
+
}
|
|
20
|
+
export declare const isReasoningFinishChunk: (chunk: {
|
|
21
|
+
response_metadata?: Record<string, unknown>;
|
|
22
|
+
usage_metadata?: Record<string, unknown>;
|
|
23
|
+
}) => boolean;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var reasoning_stream_state_exports = {};
|
|
28
|
+
__export(reasoning_stream_state_exports, {
|
|
29
|
+
ReasoningStreamState: () => ReasoningStreamState,
|
|
30
|
+
isReasoningFinishChunk: () => isReasoningFinishChunk
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(reasoning_stream_state_exports);
|
|
33
|
+
const getConversationKey = (conversation) => `${conversation.from}:${conversation.sessionId}:${conversation.username}`;
|
|
34
|
+
class ReasoningStreamState {
|
|
35
|
+
active = /* @__PURE__ */ new Map();
|
|
36
|
+
start(conversation) {
|
|
37
|
+
this.active.set(getConversationKey(conversation), conversation);
|
|
38
|
+
}
|
|
39
|
+
stop(conversation) {
|
|
40
|
+
return this.active.delete(getConversationKey(conversation));
|
|
41
|
+
}
|
|
42
|
+
drain() {
|
|
43
|
+
const conversations = Array.from(this.active.values());
|
|
44
|
+
this.active.clear();
|
|
45
|
+
return conversations;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const isReasoningFinishChunk = (chunk) => {
|
|
49
|
+
const metadata = chunk.response_metadata;
|
|
50
|
+
if (!metadata) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
const finishReason = metadata.finish_reason ?? metadata.finishReason;
|
|
54
|
+
if (typeof finishReason === "string" && finishReason.length > 0) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return metadata.status === "completed" || metadata.status === "incomplete" || metadata.status === "failed";
|
|
58
|
+
};
|
|
59
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
60
|
+
0 && (module.exports = {
|
|
61
|
+
ReasoningStreamState,
|
|
62
|
+
isReasoningFinishChunk
|
|
63
|
+
});
|
|
@@ -33,12 +33,12 @@ module.exports = __toCommonJS(constants_exports);
|
|
|
33
33
|
const DOCUMENT_PARSE_META_KEY = "documentParse";
|
|
34
34
|
const SUPPORTED_DOCUMENT_EXTNAMES = [
|
|
35
35
|
".pdf",
|
|
36
|
-
".ppt",
|
|
37
36
|
".pptx",
|
|
38
37
|
".doc",
|
|
39
38
|
".docx",
|
|
40
39
|
".xls",
|
|
41
40
|
".xlsx",
|
|
41
|
+
".xlsm",
|
|
42
42
|
".txt",
|
|
43
43
|
".md",
|
|
44
44
|
".json",
|
|
@@ -7,8 +7,10 @@
|
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
9
|
import { DocumentSegmentedWithScore, KnowledgeBase, KnowledgeBaseGroup, SearchOptions } from '../types';
|
|
10
|
+
export type KnowledgeBaseAccessOptions = Pick<SearchOptions, 'knowledgeBaseKeys' | 'roleNames'>;
|
|
10
11
|
export interface KnowledgeBaseFeature {
|
|
11
12
|
getKnowledgeBase(knowledgeBaseKeys: string[]): Promise<KnowledgeBase[]>;
|
|
12
13
|
getKnowledgeBaseGroup(knowledgeBaseKeys: string[]): Promise<KnowledgeBaseGroup[]>;
|
|
14
|
+
getAccessibleKnowledgeBaseKeys(options: KnowledgeBaseAccessOptions): Promise<string[]>;
|
|
13
15
|
search(options: SearchOptions): Promise<DocumentSegmentedWithScore[]>;
|
|
14
16
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
import type { Context } from '@nocobase/actions';
|
|
10
|
+
import { type FrontendToolManifest } from '../common/frontend-tools';
|
|
11
|
+
import type { WorkContext } from './types/ai-message.type';
|
|
12
|
+
export declare const extractFrontendToolManifests: (workContext: WorkContext[]) => FrontendToolManifest[];
|
|
13
|
+
export declare const listCurrentFrontendTools: (ctx: Context, sessionId?: string) => Promise<FrontendToolManifest[]>;
|
|
14
|
+
export declare const findCurrentFrontendTool: (ctx: Context, toolId: string, sessionId?: string) => Promise<FrontendToolManifest | undefined>;
|
|
15
|
+
export declare const shouldAutoExecuteFrontendTool: (tools: FrontendToolManifest[], args: unknown) => boolean;
|
|
16
|
+
export declare const prepareToolsForFrontendConversation: <T extends {
|
|
17
|
+
definition: {
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
};
|
|
21
|
+
}>(tools: T[], frontendTools: FrontendToolManifest[]) => T[];
|
|
22
|
+
export declare const readFrontendToolResult: (ctx: Context, toolCallId: string) => {
|
|
23
|
+
provided: true;
|
|
24
|
+
value: unknown;
|
|
25
|
+
} | undefined;
|