@nocobase/plugin-ai 2.1.0-alpha.12 → 2.1.0-alpha.14

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.
Files changed (75) hide show
  1. package/dist/ai/ai-employees/atlas/index.d.ts +10 -0
  2. package/dist/ai/ai-employees/atlas/index.js +56 -0
  3. package/dist/ai/ai-employees/atlas/prompt.md +84 -0
  4. package/dist/ai/ai-employees/vera.js +1 -1
  5. package/dist/ai/tools/chartGenerator.js +1 -0
  6. package/dist/ai/tools/getSkill.js +1 -1
  7. package/dist/ai/tools/sub-agents/dispatch-sub-agent-task.d.ts +10 -0
  8. package/dist/ai/tools/sub-agents/dispatch-sub-agent-task.js +108 -0
  9. package/dist/ai/tools/sub-agents/get-ai-employee.d.ts +10 -0
  10. package/dist/ai/tools/sub-agents/get-ai-employee.js +67 -0
  11. package/dist/ai/tools/sub-agents/list-ai-employees.d.ts +10 -0
  12. package/dist/ai/tools/sub-agents/list-ai-employees.js +64 -0
  13. package/dist/ai/tools/sub-agents/shared.d.ts +33 -0
  14. package/dist/ai/tools/sub-agents/shared.js +169 -0
  15. package/dist/ai/tools/suggestions.js +2 -2
  16. package/dist/client/7237366e104efa7a.js +10 -0
  17. package/dist/client/748fbb87c1013c6e.js +10 -0
  18. package/dist/client/ai-employees/built-in/utils.d.ts +1 -0
  19. package/dist/client/ai-employees/chatbox/AIEmployeeSwitch.d.ts +0 -1
  20. package/dist/client/ai-employees/chatbox/hooks/useChatBoxActions.d.ts +5 -3
  21. package/dist/client/ai-employees/chatbox/roles.d.ts +1 -0
  22. package/dist/client/ai-employees/chatbox/stores/chat-messages.d.ts +8 -0
  23. package/dist/client/ai-employees/chatbox/utils.d.ts +15 -1
  24. package/dist/client/ai-employees/sub-agents/tools/index.d.ts +10 -0
  25. package/dist/client/ai-employees/sub-agents/ui/SubAgentDispatchCard.d.ts +21 -0
  26. package/dist/client/ai-employees/types.d.ts +19 -0
  27. package/dist/client/index.js +7 -7
  28. package/dist/externalVersion.js +16 -15
  29. package/dist/locale/en-US.json +10 -1
  30. package/dist/locale/zh-CN.json +10 -1
  31. package/dist/node_modules/fast-glob/package.json +1 -1
  32. package/dist/node_modules/flexsearch/package.json +1 -1
  33. package/dist/node_modules/fs-extra/package.json +1 -1
  34. package/dist/node_modules/nodejs-snowflake/package.json +1 -1
  35. package/dist/node_modules/openai/package.json +1 -1
  36. package/dist/node_modules/zod/package.json +1 -1
  37. package/dist/server/ai-employees/ai-conversations.d.ts +64 -0
  38. package/dist/server/ai-employees/ai-conversations.js +285 -0
  39. package/dist/server/ai-employees/ai-employee.d.ts +85 -9
  40. package/dist/server/ai-employees/ai-employee.js +264 -149
  41. package/dist/server/ai-employees/middleware/conversation.d.ts +2 -0
  42. package/dist/server/ai-employees/middleware/conversation.js +38 -5
  43. package/dist/server/ai-employees/middleware/tools.js +37 -10
  44. package/dist/server/ai-employees/prompts.d.ts +9 -1
  45. package/dist/server/ai-employees/prompts.js +24 -2
  46. package/dist/server/ai-employees/sub-agents/dispatcher.d.ts +36 -0
  47. package/dist/server/ai-employees/sub-agents/dispatcher.js +225 -0
  48. package/dist/server/ai-employees/sub-agents/index.d.ts +9 -0
  49. package/dist/server/ai-employees/sub-agents/index.js +36 -0
  50. package/dist/server/collections/ai-conversations.js +6 -0
  51. package/dist/server/llm-providers/anthropic.d.ts +1 -0
  52. package/dist/server/llm-providers/anthropic.js +2 -1
  53. package/dist/server/llm-providers/dashscope.d.ts +3 -0
  54. package/dist/server/llm-providers/dashscope.js +16 -2
  55. package/dist/server/llm-providers/deepseek.d.ts +1 -0
  56. package/dist/server/llm-providers/deepseek.js +5 -2
  57. package/dist/server/llm-providers/google-genai.d.ts +1 -0
  58. package/dist/server/llm-providers/google-genai.js +2 -1
  59. package/dist/server/llm-providers/kimi/provider.d.ts +1 -0
  60. package/dist/server/llm-providers/openai/responses.d.ts +1 -0
  61. package/dist/server/llm-providers/openai/responses.js +2 -1
  62. package/dist/server/llm-providers/provider.d.ts +1 -10
  63. package/dist/server/llm-providers/provider.js +3 -34
  64. package/dist/server/migrations/20260319000000-add-ai-conversations-from.d.ts +14 -0
  65. package/dist/server/migrations/20260319000000-add-ai-conversations-from.js +63 -0
  66. package/dist/server/plugin.d.ts +4 -0
  67. package/dist/server/plugin.js +4 -0
  68. package/dist/server/resource/aiConversations.d.ts +3 -3
  69. package/dist/server/resource/aiConversations.js +125 -159
  70. package/dist/server/types/ai-chat-conversation.type.d.ts +8 -2
  71. package/dist/server/types/ai-message.type.d.ts +7 -0
  72. package/dist/server/utils.d.ts +3 -0
  73. package/dist/server/utils.js +25 -1
  74. package/package.json +4 -2
  75. package/dist/client/27539a4356faebb1.js +0 -10
@@ -124,11 +124,14 @@ class DeepSeekProvider extends import_provider.LLMProvider {
124
124
  return null;
125
125
  }
126
126
  async parseAttachment(ctx, attachment) {
127
+ const safeFilename = attachment.filename ? import_node_path.default.basename(attachment.filename) : "document";
127
128
  if (!(attachment == null ? void 0 : attachment.mimetype) || attachment.mimetype.startsWith("image/")) {
128
- return super.parseAttachment(ctx, attachment);
129
+ return {
130
+ placement: "system",
131
+ content: `The user has uploaded a ${attachment.mimetype} file (filename: ${safeFilename}). Please inform the user directly that you do not support parsing image content.`
132
+ };
129
133
  }
130
134
  const parsed = await this.aiPlugin.documentLoaders.cached.load(attachment);
131
- const safeFilename = attachment.filename ? import_node_path.default.basename(attachment.filename) : "document";
132
135
  if (!parsed.supported) {
133
136
  return {
134
137
  placement: "system",
@@ -27,6 +27,7 @@ export declare class GoogleGenAIProvider extends LLMProvider {
27
27
  }>;
28
28
  parseResponseMessage(message: Model): {
29
29
  key: any;
30
+ createdAt: any;
30
31
  content: any;
31
32
  role: any;
32
33
  };
@@ -89,7 +89,7 @@ class GoogleGenAIProvider extends import_provider.LLMProvider {
89
89
  }
90
90
  parseResponseMessage(message) {
91
91
  var _a, _b, _c, _d, _e;
92
- const { content: rawContent, messageId, metadata, role, toolCalls, attachments, workContext } = message;
92
+ const { content: rawContent, messageId, metadata, role, toolCalls, attachments, workContext, createdAt } = message;
93
93
  const content = {
94
94
  ...rawContent,
95
95
  messageId,
@@ -118,6 +118,7 @@ class GoogleGenAIProvider extends import_provider.LLMProvider {
118
118
  }
119
119
  return {
120
120
  key: messageId,
121
+ createdAt,
121
122
  content,
122
123
  role
123
124
  };
@@ -19,6 +19,7 @@ export declare class KimiProvider extends LLMProvider {
19
19
  createModel(): ReasoningChatOpenAI;
20
20
  parseResponseMessage(message: Model): {
21
21
  key: any;
22
+ createdAt: any;
22
23
  content: any;
23
24
  role: any;
24
25
  };
@@ -17,6 +17,7 @@ export declare class OpenAIResponsesProvider extends LLMProvider {
17
17
  parseResponseChunk(chunk: any): string;
18
18
  parseResponseMessage(message: Model): {
19
19
  key: any;
20
+ createdAt: any;
20
21
  content: any;
21
22
  role: any;
22
23
  };
@@ -72,7 +72,7 @@ class OpenAIResponsesProvider extends import_provider.LLMProvider {
72
72
  }
73
73
  parseResponseMessage(message) {
74
74
  var _a, _b, _c, _d;
75
- const { content: rawContent, messageId, metadata, role, toolCalls, attachments, workContext } = message;
75
+ const { content: rawContent, messageId, metadata, role, toolCalls, attachments, workContext, createdAt } = message;
76
76
  const content = {
77
77
  ...rawContent,
78
78
  messageId,
@@ -111,6 +111,7 @@ class OpenAIResponsesProvider extends import_provider.LLMProvider {
111
111
  }
112
112
  return {
113
113
  key: messageId,
114
+ createdAt,
114
115
  content,
115
116
  role
116
117
  };
@@ -44,6 +44,7 @@ export declare abstract class LLMProvider {
44
44
  }>;
45
45
  parseResponseMessage(message: Model): {
46
46
  key: any;
47
+ createdAt: any;
47
48
  content: any;
48
49
  role: any;
49
50
  };
@@ -86,13 +87,3 @@ export declare abstract class EmbeddingProvider {
86
87
  protected get baseURL(): any;
87
88
  protected get model(): any;
88
89
  }
89
- type FromType = 'ToolsEntry';
90
- export declare class ToolDefinition<T> {
91
- private from;
92
- private _tool;
93
- constructor(from: FromType, _tool: T);
94
- static from(from: FromType): (tool: any) => import("@langchain/core/dist/tools").DynamicTool<any>;
95
- get tool(): import("@langchain/core/dist/tools").DynamicTool<any>;
96
- private convertToolOptions;
97
- }
98
- export {};
@@ -37,13 +37,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
37
37
  var provider_exports = {};
38
38
  __export(provider_exports, {
39
39
  EmbeddingProvider: () => EmbeddingProvider,
40
- LLMProvider: () => LLMProvider,
41
- ToolDefinition: () => ToolDefinition
40
+ LLMProvider: () => LLMProvider
42
41
  });
43
42
  module.exports = __toCommonJS(provider_exports);
44
43
  var import_axios = __toESM(require("axios"));
45
44
  var import_utils = require("../utils");
46
- var import_langchain = require("langchain");
47
45
  var import_stream = require("@langchain/core/utils/stream");
48
46
  class LLMProvider {
49
47
  app;
@@ -65,7 +63,7 @@ class LLMProvider {
65
63
  prepareChain(context) {
66
64
  var _a, _b, _c, _d;
67
65
  let chain = this.chatModel;
68
- const toolDefinitions = (_a = context.tools) == null ? void 0 : _a.map(ToolDefinition.from("ToolsEntry"));
66
+ const toolDefinitions = (_a = context.tools) == null ? void 0 : _a.map(import_utils.buildTool);
69
67
  if ((_b = this.builtInTools()) == null ? void 0 : _b.length) {
70
68
  const tools = [...this.builtInTools()];
71
69
  if (!this.isToolConflict() && (toolDefinitions == null ? void 0 : toolDefinitions.length)) {
@@ -255,37 +253,8 @@ class EmbeddingProvider {
255
253
  return model;
256
254
  }
257
255
  }
258
- class ToolDefinition {
259
- constructor(from, _tool) {
260
- this.from = from;
261
- this._tool = _tool;
262
- }
263
- static from(from) {
264
- return (tool2) => new ToolDefinition(from, tool2).tool;
265
- }
266
- get tool() {
267
- if (this.from === "ToolsEntry") {
268
- return this.convertToolOptions();
269
- } else {
270
- throw new Error("not supported tool definitions");
271
- }
272
- }
273
- convertToolOptions() {
274
- const {
275
- invoke,
276
- definition: { name, description, schema }
277
- } = this._tool;
278
- return (0, import_langchain.tool)((input, { toolCall, context }) => invoke(context.ctx, input, toolCall.id), {
279
- name,
280
- description,
281
- schema,
282
- returnDirect: false
283
- });
284
- }
285
- }
286
256
  // Annotate the CommonJS export names for ESM import in node:
287
257
  0 && (module.exports = {
288
258
  EmbeddingProvider,
289
- LLMProvider,
290
- ToolDefinition
259
+ LLMProvider
291
260
  });
@@ -0,0 +1,14 @@
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 { Migration } from '@nocobase/server';
10
+ export default class extends Migration {
11
+ on: string;
12
+ appVersion: string;
13
+ up(): Promise<void>;
14
+ }
@@ -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 add_ai_conversations_from_exports = {};
28
+ __export(add_ai_conversations_from_exports, {
29
+ default: () => add_ai_conversations_from_default
30
+ });
31
+ module.exports = __toCommonJS(add_ai_conversations_from_exports);
32
+ var import_server = require("@nocobase/server");
33
+ class add_ai_conversations_from_default extends import_server.Migration {
34
+ on = "afterLoad";
35
+ appVersion = "<2.1.0";
36
+ async up() {
37
+ var _a;
38
+ const collection = this.db.getCollection("aiConversations");
39
+ if (!collection) {
40
+ return;
41
+ }
42
+ const field = collection.getField("from");
43
+ if (!field) {
44
+ await collection.sync();
45
+ }
46
+ const repo = this.db.getRepository("aiConversations");
47
+ const rows = await repo.find({});
48
+ let updated = 0;
49
+ for (const row of rows) {
50
+ const value = ((_a = row.get) == null ? void 0 : _a.call(row, "from")) ?? row.from;
51
+ if (value) {
52
+ continue;
53
+ }
54
+ await row.update({
55
+ from: "main-agent"
56
+ });
57
+ updated += 1;
58
+ }
59
+ if (updated > 0) {
60
+ this.app.logger.info(`Migrated aiConversations.from to main-agent (${updated})`);
61
+ }
62
+ }
63
+ }
@@ -10,21 +10,25 @@ import { Plugin } from '@nocobase/server';
10
10
  import { AIManager } from './manager/ai-manager';
11
11
  import { AIPluginFeatureManagerImpl } from './manager/ai-feature-manager';
12
12
  import { AIEmployeesManager } from './ai-employees/ai-employees-manager';
13
+ import { AIConversationsManager } from './ai-employees/ai-conversations';
13
14
  import Snowflake from './snowflake';
14
15
  import { BuiltInManager } from './manager/built-in-manager';
15
16
  import { AIContextDatasourceManager } from './manager/ai-context-datasource-manager';
16
17
  import { AICodingManager } from './manager/ai-coding-manager';
17
18
  import { DocumentLoaders } from './document-loader';
18
19
  import type PluginFileManagerServer from '@nocobase/plugin-file-manager';
20
+ import { SubAgentsDispatcher } from './ai-employees/sub-agents';
19
21
  export declare class PluginAIServer extends Plugin {
20
22
  features: AIPluginFeatureManagerImpl;
21
23
  aiManager: AIManager;
22
24
  aiEmployeesManager: AIEmployeesManager;
25
+ aiConversationsManager: AIConversationsManager;
23
26
  builtInManager: BuiltInManager;
24
27
  aiContextDatasourceManager: AIContextDatasourceManager;
25
28
  aiCodingManager: AICodingManager;
26
29
  workContextHandler: import("./types").WorkContextHandler;
27
30
  documentLoaders: DocumentLoaders;
31
+ subAgentsDispatcher: SubAgentsDispatcher;
28
32
  snowflake: Snowflake;
29
33
  /**
30
34
  * Check if the AI employee is a builder/admin-only type (e.g., Nathan, Orin).
@@ -52,6 +52,7 @@ var import_aiConversations = __toESM(require("./resource/aiConversations"));
52
52
  var import_aiTools = __toESM(require("./resource/aiTools"));
53
53
  var import_aiSkills = __toESM(require("./resource/aiSkills"));
54
54
  var import_ai_employees_manager = require("./ai-employees/ai-employees-manager");
55
+ var import_ai_conversations = require("./ai-employees/ai-conversations");
55
56
  var import_snowflake = __toESM(require("./snowflake"));
56
57
  var aiEmployeeActions = __toESM(require("./resource/aiEmployees"));
57
58
  var import_google_genai = require("./llm-providers/google-genai");
@@ -70,15 +71,18 @@ var import_ai_coding_manager = require("./manager/ai-coding-manager");
70
71
  var import_kimi = require("./llm-providers/kimi");
71
72
  var import_document_loader = require("./document-loader");
72
73
  var import_checkpoints = require("./ai-employees/checkpoints");
74
+ var import_sub_agents = require("./ai-employees/sub-agents");
73
75
  class PluginAIServer extends import_server.Plugin {
74
76
  features = new import_ai_feature_manager.AIPluginFeatureManagerImpl();
75
77
  aiManager = new import_ai_manager.AIManager(this);
76
78
  aiEmployeesManager = new import_ai_employees_manager.AIEmployeesManager(this);
79
+ aiConversationsManager = new import_ai_conversations.AIConversationsManager(this);
77
80
  builtInManager = new import_built_in_manager.BuiltInManager(this);
78
81
  aiContextDatasourceManager = new import_ai_context_datasource_manager.AIContextDatasourceManager(this);
79
82
  aiCodingManager = new import_ai_coding_manager.AICodingManager(this);
80
83
  workContextHandler = (0, import_work_context_handler.createWorkContextHandler)(this);
81
84
  documentLoaders = new import_document_loader.DocumentLoaders(this);
85
+ subAgentsDispatcher = new import_sub_agents.SubAgentsDispatcher(this);
82
86
  snowflake;
83
87
  /**
84
88
  * Check if the AI employee is a builder/admin-only type (e.g., Nathan, Orin).
@@ -11,14 +11,14 @@ declare const _default: {
11
11
  name: string;
12
12
  actions: {
13
13
  list(ctx: Context, next: Next): Promise<void>;
14
- create(ctx: Context, next: Next): Promise<void>;
15
- update(ctx: Context, next: Next): Promise<void>;
14
+ create(ctx: Context, next: Next): Promise<never>;
15
+ update(ctx: Context, next: Next): Promise<never>;
16
16
  updateOptions(ctx: Context, next: Next): Promise<never>;
17
17
  destroy(ctx: Context, next: Next): Promise<void>;
18
18
  getMessages(ctx: Context, next: Next): Promise<never>;
19
19
  updateToolArgs(ctx: Context, next: Next): Promise<any>;
20
20
  sendMessages(ctx: Context, next: Next): Promise<any>;
21
- abort(ctx: Context, next: Next): Promise<void>;
21
+ abort(ctx: Context, next: Next): Promise<never>;
22
22
  resendMessages(ctx: Context, next: Next): Promise<any>;
23
23
  updateUserDecision(ctx: Context, next: Next): Promise<never>;
24
24
  resumeToolCall(ctx: Context, next: Next): Promise<any>;