@nocobase/plugin-ai 2.2.18 → 2.2.20

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 (146) hide show
  1. package/dist/ai/tools/knowledge-base-retrieve.js +13 -2
  2. package/dist/ai/tools/subAgentWebSearch.js +10 -6
  3. package/dist/client/index.js +1 -1
  4. package/dist/client-v2/index.js +1 -1
  5. package/dist/externalVersion.js +16 -16
  6. package/dist/node_modules/@langchain/mistralai/dist/index.cjs +2 -2
  7. package/dist/node_modules/@langchain/mistralai/package.json +1 -1
  8. package/dist/node_modules/@langchain/xai/dist/index.cjs +2 -2
  9. package/dist/node_modules/@langchain/xai/package.json +1 -1
  10. package/dist/node_modules/fs-extra/package.json +1 -1
  11. package/dist/node_modules/jsonrepair/package.json +1 -1
  12. package/dist/node_modules/just-bash/dist/bundle/index.cjs +239 -239
  13. package/dist/node_modules/just-bash/node_modules/sprintf-js/dist/.gitattributes +4 -0
  14. package/dist/node_modules/just-bash/node_modules/sprintf-js/dist/angular-sprintf.min.js +3 -0
  15. package/dist/node_modules/just-bash/node_modules/sprintf-js/dist/sprintf.min.js +3 -0
  16. package/dist/node_modules/just-bash/node_modules/sprintf-js/package.json +35 -0
  17. package/dist/node_modules/just-bash/node_modules/sprintf-js/src/angular-sprintf.js +24 -0
  18. package/dist/node_modules/just-bash/node_modules/sprintf-js/src/sprintf.js +231 -0
  19. package/dist/node_modules/just-bash/package.json +1 -1
  20. package/dist/node_modules/nodejs-snowflake/package.json +1 -1
  21. package/dist/node_modules/openai/package.json +1 -1
  22. package/dist/node_modules/zod/package.json +1 -1
  23. package/dist/server/ai-employees/ai-employee.d.ts +15 -1
  24. package/dist/server/ai-employees/ai-employee.js +125 -47
  25. package/dist/server/ai-employees/ai-knowledge-base.d.ts +7 -1
  26. package/dist/server/ai-employees/ai-knowledge-base.js +30 -7
  27. package/dist/server/features/knowledge-base.d.ts +2 -1
  28. package/dist/server/index.d.ts +1 -1
  29. package/dist/server/index.js +2 -0
  30. package/dist/server/llm-providers/anthropic.js +4 -0
  31. package/dist/server/llm-providers/dashscope.js +2 -1
  32. package/dist/server/llm-providers/deepseek/provider.d.ts +2 -1
  33. package/dist/server/llm-providers/deepseek/provider.js +16 -6
  34. package/dist/server/llm-providers/deepseek/reasoning.d.ts +36 -1
  35. package/dist/server/llm-providers/deepseek/reasoning.js +41 -4
  36. package/dist/server/llm-providers/google-genai.js +4 -2
  37. package/dist/server/llm-providers/kimi/provider.js +2 -1
  38. package/dist/server/llm-providers/mimo.js +2 -1
  39. package/dist/server/llm-providers/mistral.d.ts +1 -0
  40. package/dist/server/llm-providers/mistral.js +17 -1
  41. package/dist/server/llm-providers/ollama.js +3 -1
  42. package/dist/server/llm-providers/openai/completions.js +2 -1
  43. package/dist/server/llm-providers/openai/responses.js +2 -1
  44. package/dist/server/llm-providers/orcarouter.js +2 -2
  45. package/dist/server/llm-providers/provider.d.ts +10 -0
  46. package/dist/server/llm-providers/provider.js +34 -1
  47. package/dist/server/llm-providers/shengsuanyun.js +5 -1
  48. package/dist/server/llm-providers/xai.js +6 -1
  49. package/dist/server/manager/ai-manager.d.ts +2 -2
  50. package/dist/server/manager/ai-manager.js +3 -2
  51. package/dist/server/resource/ai.js +4 -0
  52. package/dist/server/types/knowledge-base.type.d.ts +6 -0
  53. package/dist/server/workflow/nodes/llm/index.d.ts +2 -2
  54. package/dist/server/workflow/nodes/llm/index.js +10 -3
  55. package/package.json +2 -2
  56. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/bin/uuid +0 -2
  57. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/index.js +0 -104
  58. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/max.js +0 -7
  59. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/md5.js +0 -200
  60. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/native.js +0 -10
  61. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/nil.js +0 -7
  62. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/parse.js +0 -44
  63. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/regex.js +0 -7
  64. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/rng.js +0 -23
  65. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/sha1.js +0 -82
  66. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/stringify.js +0 -38
  67. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/v1.js +0 -131
  68. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/v1ToV6.js +0 -26
  69. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/v3.js +0 -11
  70. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/v35.js +0 -63
  71. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/v4.js +0 -32
  72. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/v5.js +0 -11
  73. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/v6.js +0 -42
  74. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/v6ToV1.js +0 -26
  75. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/v7.js +0 -152
  76. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/validate.js +0 -12
  77. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/commonjs-browser/version.js +0 -15
  78. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/index.js +0 -14
  79. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/max.js +0 -1
  80. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/md5.js +0 -194
  81. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/native.js +0 -4
  82. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/nil.js +0 -1
  83. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/parse.js +0 -37
  84. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/regex.js +0 -1
  85. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/rng.js +0 -17
  86. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/sha1.js +0 -76
  87. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/stringify.js +0 -31
  88. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/v1.js +0 -125
  89. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/v1ToV6.js +0 -20
  90. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/v3.js +0 -4
  91. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/v35.js +0 -55
  92. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/v4.js +0 -25
  93. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/v5.js +0 -4
  94. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/v6.js +0 -36
  95. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/v6ToV1.js +0 -20
  96. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/v7.js +0 -146
  97. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/validate.js +0 -5
  98. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-browser/version.js +0 -8
  99. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/index.js +0 -14
  100. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/max.js +0 -1
  101. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/md5.js +0 -10
  102. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/native.js +0 -4
  103. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/nil.js +0 -1
  104. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/parse.js +0 -37
  105. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/regex.js +0 -1
  106. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/rng.js +0 -10
  107. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/sha1.js +0 -10
  108. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/stringify.js +0 -31
  109. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/v1.js +0 -125
  110. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/v1ToV6.js +0 -20
  111. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/v3.js +0 -4
  112. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/v35.js +0 -55
  113. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/v4.js +0 -25
  114. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/v5.js +0 -4
  115. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/v6.js +0 -32
  116. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/v6ToV1.js +0 -20
  117. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/v7.js +0 -146
  118. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/validate.js +0 -5
  119. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/esm-node/version.js +0 -8
  120. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/index.js +0 -104
  121. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/max.js +0 -7
  122. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/md5-browser.js +0 -200
  123. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/md5.js +0 -17
  124. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/native-browser.js +0 -10
  125. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/native.js +0 -11
  126. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/nil.js +0 -7
  127. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/parse.js +0 -44
  128. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/regex.js +0 -7
  129. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/rng-browser.js +0 -23
  130. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/rng.js +0 -17
  131. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/sha1-browser.js +0 -82
  132. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/sha1.js +0 -17
  133. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/stringify.js +0 -38
  134. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/uuid-bin.js +0 -75
  135. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/v1.js +0 -131
  136. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/v1ToV6.js +0 -26
  137. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/v3.js +0 -11
  138. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/v35.js +0 -63
  139. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/v4.js +0 -32
  140. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/v5.js +0 -11
  141. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/v6.js +0 -38
  142. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/v6ToV1.js +0 -26
  143. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/v7.js +0 -152
  144. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/validate.js +0 -12
  145. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/dist/version.js +0 -15
  146. package/dist/node_modules/@langchain/mistralai/node_modules/uuid/package.json +0 -142
@@ -42,6 +42,17 @@ const V4_EFFORTS = /* @__PURE__ */ new Set(["low", "high", "max"]);
42
42
  const THINKING_UNSUPPORTED_FIELDS = /* @__PURE__ */ new Set(["temperature", "top_p", "presence_penalty", "frequency_penalty"]);
43
43
  const NO_UNSUPPORTED_FIELDS = /* @__PURE__ */ new Set();
44
44
  const DEEPSEEK_MODEL_CAPABILITIES = {
45
+ "deepseek-flash": {
46
+ protocol: "responses",
47
+ reasoning: "switchable",
48
+ defaultThinking: "enabled",
49
+ efforts: V4_EFFORTS,
50
+ supportsFunctionTools: true,
51
+ supportsStructuredOutput: true,
52
+ supportsWebSearch: false,
53
+ supportsImageInput: true
54
+ },
55
+ // Legacy name, now served by the same DeepSeek-V4.1-Flash model as `deepseek-flash`
45
56
  "deepseek-v4-flash": {
46
57
  protocol: "responses",
47
58
  reasoning: "switchable",
@@ -49,7 +60,30 @@ const DEEPSEEK_MODEL_CAPABILITIES = {
49
60
  efforts: V4_EFFORTS,
50
61
  supportsFunctionTools: true,
51
62
  supportsStructuredOutput: true,
52
- supportsWebSearch: true
63
+ supportsWebSearch: false,
64
+ supportsImageInput: true
65
+ },
66
+ // Legacy vision name, also routed to DeepSeek-V4.1-Flash
67
+ "deepseek-v4-flash-vision-exp": {
68
+ protocol: "responses",
69
+ reasoning: "switchable",
70
+ defaultThinking: "enabled",
71
+ efforts: V4_EFFORTS,
72
+ supportsFunctionTools: true,
73
+ supportsStructuredOutput: true,
74
+ supportsWebSearch: false,
75
+ supportsImageInput: true
76
+ },
77
+ // OpenCode Go alias of DeepSeek-V4.1-Flash; DeepSeek's own API does not expose this name
78
+ "deepseek-v4.1-flash": {
79
+ protocol: "responses",
80
+ reasoning: "switchable",
81
+ defaultThinking: "enabled",
82
+ efforts: V4_EFFORTS,
83
+ supportsFunctionTools: true,
84
+ supportsStructuredOutput: true,
85
+ supportsWebSearch: false,
86
+ supportsImageInput: true
53
87
  },
54
88
  "deepseek-v4-pro": {
55
89
  protocol: "responses",
@@ -58,7 +92,8 @@ const DEEPSEEK_MODEL_CAPABILITIES = {
58
92
  efforts: V4_EFFORTS,
59
93
  supportsFunctionTools: true,
60
94
  supportsStructuredOutput: true,
61
- supportsWebSearch: true
95
+ supportsWebSearch: true,
96
+ supportsImageInput: false
62
97
  },
63
98
  "deepseek-chat": {
64
99
  protocol: "chat-completions",
@@ -67,7 +102,8 @@ const DEEPSEEK_MODEL_CAPABILITIES = {
67
102
  efforts: NO_EFFORTS,
68
103
  supportsFunctionTools: true,
69
104
  supportsStructuredOutput: true,
70
- supportsWebSearch: false
105
+ supportsWebSearch: false,
106
+ supportsImageInput: false
71
107
  },
72
108
  "deepseek-reasoner": {
73
109
  protocol: "chat-completions",
@@ -76,7 +112,8 @@ const DEEPSEEK_MODEL_CAPABILITIES = {
76
112
  efforts: NO_EFFORTS,
77
113
  supportsFunctionTools: true,
78
114
  supportsStructuredOutput: true,
79
- supportsWebSearch: false
115
+ supportsWebSearch: false,
116
+ supportsImageInput: false
80
117
  }
81
118
  };
82
119
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
@@ -48,7 +48,8 @@ class GoogleGenAIProvider extends import_provider.LLMProvider {
48
48
  ...this.modelOptions,
49
49
  model,
50
50
  json: responseFormat === "json",
51
- baseUrl: this.getResolvedBaseURL()
51
+ baseUrl: this.getResolvedBaseURL(),
52
+ customHeaders: this.getDefaultHeaders()
52
53
  });
53
54
  }
54
55
  async listModels() {
@@ -70,7 +71,8 @@ class GoogleGenAIProvider extends import_provider.LLMProvider {
70
71
  try {
71
72
  const res = await (0, import_utils.serverRequest)({
72
73
  method: "GET",
73
- url
74
+ url,
75
+ headers: this.getDefaultHeaders()
74
76
  });
75
77
  return {
76
78
  models: (_a = res == null ? void 0 : res.data) == null ? void 0 : _a.models.map((model) => ({
@@ -72,7 +72,8 @@ class KimiProvider extends import_provider.LLMProvider {
72
72
  },
73
73
  ...reasoningOptions.modelRequestParams || {},
74
74
  configuration: {
75
- baseURL: this.getResolvedBaseURL()
75
+ baseURL: this.getResolvedBaseURL(),
76
+ defaultHeaders: this.getDefaultHeaders()
76
77
  }
77
78
  });
78
79
  }
@@ -67,7 +67,8 @@ class MiMoProvider extends import_provider.LLMProvider {
67
67
  response_format: responseFormatOptions
68
68
  },
69
69
  configuration: {
70
- baseURL: this.getResolvedBaseURL()
70
+ baseURL: this.getResolvedBaseURL(),
71
+ defaultHeaders: this.getDefaultHeaders()
71
72
  },
72
73
  verbose: true
73
74
  });
@@ -24,6 +24,7 @@ type MistralBeforeRequestHook = (request: Request) => Request | void | Promise<R
24
24
  type ReasoningChatMistralAIFields = ConstructorParameters<typeof ChatMistralAI>[0] & {
25
25
  [MISTRAL_REASONING_MODE_KEY]?: ReasoningMode;
26
26
  };
27
+ export declare const createMistralHeadersHook: (defaultHeaders: Record<string, string>) => MistralBeforeRequestHook;
27
28
  export declare const injectMistralReasoningEffort: MistralBeforeRequestHook;
28
29
  declare class ReasoningChatMistralAI extends ChatMistralAI {
29
30
  private readonly reasoningMode?;
@@ -28,6 +28,7 @@ var mistral_exports = {};
28
28
  __export(mistral_exports, {
29
29
  MistralEmbeddingProvider: () => MistralEmbeddingProvider,
30
30
  MistralProvider: () => MistralProvider,
31
+ createMistralHeadersHook: () => createMistralHeadersHook,
31
32
  injectMistralReasoningEffort: () => injectMistralReasoningEffort,
32
33
  mistralProviderOptions: () => mistralProviderOptions
33
34
  });
@@ -63,6 +64,18 @@ function extractThinkingChunks(content) {
63
64
  }
64
65
  return content.filter((chunk) => chunk && typeof chunk === "object").filter((chunk) => chunk.type === "thinking" && Array.isArray(chunk.thinking)).map((chunk) => extractTextChunks(chunk.thinking)).join("");
65
66
  }
67
+ const createMistralHeadersHook = (defaultHeaders) => {
68
+ return (request) => {
69
+ if (!Object.keys(defaultHeaders).length) {
70
+ return;
71
+ }
72
+ const headers = new Headers(request.headers);
73
+ for (const [key, value] of Object.entries(defaultHeaders)) {
74
+ headers.set(key, value);
75
+ }
76
+ return new Request(request, { headers });
77
+ };
78
+ };
66
79
  const injectMistralReasoningEffort = async (request) => {
67
80
  if (request.method !== "POST") {
68
81
  return;
@@ -139,7 +152,8 @@ class MistralProvider extends import_provider.LLMProvider {
139
152
  const { apiKey } = this.serviceOptions || {};
140
153
  const { responseFormat, structuredOutput, ...modelOptions } = this.modelOptions || {};
141
154
  omitDisabledNumberOptions(modelOptions);
142
- const beforeRequestHooks = Array.isArray(modelOptions.beforeRequestHooks) ? [injectMistralReasoningEffort, ...modelOptions.beforeRequestHooks] : [injectMistralReasoningEffort];
155
+ const defaultHooks = [createMistralHeadersHook(this.getDefaultHeaders()), injectMistralReasoningEffort];
156
+ const beforeRequestHooks = Array.isArray(modelOptions.beforeRequestHooks) ? [...defaultHooks, ...modelOptions.beforeRequestHooks] : defaultHooks;
143
157
  const reasoningOptions = this.resolveReasoningOptions(this.modelReasoningOptions);
144
158
  return new ReasoningChatMistralAI({
145
159
  apiKey,
@@ -187,6 +201,7 @@ class MistralProvider extends import_provider.LLMProvider {
187
201
  method: "GET",
188
202
  url,
189
203
  headers: {
204
+ ...this.getDefaultHeaders(),
190
205
  Authorization: `Bearer ${apiKey}`
191
206
  }
192
207
  });
@@ -320,6 +335,7 @@ const mistralProviderOptions = {
320
335
  0 && (module.exports = {
321
336
  MistralEmbeddingProvider,
322
337
  MistralProvider,
338
+ createMistralHeadersHook,
323
339
  injectMistralReasoningEffort,
324
340
  mistralProviderOptions
325
341
  });
@@ -50,6 +50,7 @@ class OllamaProvider extends import_provider.LLMProvider {
50
50
  topK,
51
51
  numPredict,
52
52
  ...rest,
53
+ headers: this.getDefaultHeaders(),
53
54
  verbose: false,
54
55
  format: void 0,
55
56
  keepAlive: "5m"
@@ -69,7 +70,8 @@ class OllamaProvider extends import_provider.LLMProvider {
69
70
  try {
70
71
  const res = await (0, import_utils.serverRequest)({
71
72
  method: "GET",
72
- url
73
+ url,
74
+ headers: this.getDefaultHeaders()
73
75
  });
74
76
  const models = ((_a = res == null ? void 0 : res.data) == null ? void 0 : _a.models) || [];
75
77
  return {
@@ -55,7 +55,8 @@ class OpenAICompletionsProvider extends import_provider.LLMProvider {
55
55
  ...reasoningOptions.modelKwargs || {}
56
56
  },
57
57
  configuration: {
58
- baseURL: this.getResolvedBaseURL()
58
+ baseURL: this.getResolvedBaseURL(),
59
+ defaultHeaders: this.getDefaultHeaders()
59
60
  }
60
61
  });
61
62
  }
@@ -63,7 +63,8 @@ class OpenAIResponsesProvider extends import_provider.LLMProvider {
63
63
  ...reasoningOptions.modelKwargs || {}
64
64
  },
65
65
  configuration: {
66
- baseURL: this.getResolvedBaseURL()
66
+ baseURL: this.getResolvedBaseURL(),
67
+ defaultHeaders: this.getDefaultHeaders()
67
68
  },
68
69
  verbose: false,
69
70
  useResponsesApi: true
@@ -60,7 +60,7 @@ class OrcaRouterProvider extends import_provider.LLMProvider {
60
60
  if (responseFormat === "json_schema" && schema) {
61
61
  responseFormatOptions["json_schema"] = { schema, name: name ?? "schema" };
62
62
  }
63
- const defaultHeaders = {};
63
+ const defaultHeaders = this.getDefaultHeaders();
64
64
  if (httpReferer) {
65
65
  defaultHeaders["HTTP-Referer"] = httpReferer;
66
66
  }
@@ -75,7 +75,7 @@ class OrcaRouterProvider extends import_provider.LLMProvider {
75
75
  },
76
76
  configuration: {
77
77
  baseURL: this.getResolvedBaseURL(),
78
- ...Object.keys(defaultHeaders).length ? { defaultHeaders } : {}
78
+ defaultHeaders
79
79
  }
80
80
  });
81
81
  }
@@ -40,10 +40,14 @@ export type LLMModelRequestBuilder = (input: {
40
40
  context: AIChatContext;
41
41
  options?: LLMProviderInvokeOptions;
42
42
  }) => LLMModelRequestBuilderResult;
43
+ export type LLMProviderRequestContext = {
44
+ sessionId?: string;
45
+ };
43
46
  export interface LLMProviderOptions {
44
47
  app: Application;
45
48
  serviceOptions?: Record<string, any>;
46
49
  modelOptions?: Record<string, any>;
50
+ requestContext?: LLMProviderRequestContext;
47
51
  }
48
52
  export declare abstract class LLMProvider {
49
53
  app: Application;
@@ -51,6 +55,7 @@ export declare abstract class LLMProvider {
51
55
  modelOptions: Record<string, any> | undefined;
52
56
  chatModel: any;
53
57
  protected modelReasoningOptions: ReasoningOptions | undefined;
58
+ protected requestContext: LLMProviderRequestContext;
54
59
  abstract createModel(): BaseChatModel | any;
55
60
  get baseURL(): string | null;
56
61
  constructor(opts: LLMProviderOptions);
@@ -105,6 +110,11 @@ export declare abstract class LLMProvider {
105
110
  }): void;
106
111
  protected get documentLoader(): CachedDocumentLoader;
107
112
  protected getResolvedBaseURL(): string;
113
+ /**
114
+ * Headers every provider must merge into its model client. Decided by the resolved baseURL; returns an empty object
115
+ * when the target service needs no extra headers.
116
+ */
117
+ protected getDefaultHeaders(): Record<string, string>;
108
118
  protected buildRequestURL(pathname: string): string;
109
119
  protected get aiPlugin(): PluginAIServer;
110
120
  }
@@ -46,6 +46,14 @@ var import_stream = require("@langchain/core/utils/stream");
46
46
  var import_document_loader = require("../document-loader");
47
47
  var import_node_path = __toESM(require("node:path"));
48
48
  var import_reasoning = require("./common/reasoning");
49
+ function isOpenCodeBaseURL(baseURL) {
50
+ try {
51
+ const { hostname } = new URL(baseURL);
52
+ return hostname === "opencode.ai" || hostname.endsWith(".opencode.ai");
53
+ } catch {
54
+ return false;
55
+ }
56
+ }
49
57
  function assertBaseURLString(baseURL) {
50
58
  if (typeof baseURL !== "string") {
51
59
  throw new Error("baseURL must be a string");
@@ -85,13 +93,15 @@ class LLMProvider {
85
93
  modelOptions;
86
94
  chatModel;
87
95
  modelReasoningOptions;
96
+ requestContext;
88
97
  get baseURL() {
89
98
  return null;
90
99
  }
91
100
  constructor(opts) {
92
- const { app, serviceOptions, modelOptions } = opts;
101
+ const { app, serviceOptions, modelOptions, requestContext } = opts;
93
102
  this.app = app;
94
103
  this.serviceOptions = resolveServiceOptions(serviceOptions, app);
104
+ this.requestContext = requestContext ?? {};
95
105
  if (modelOptions) {
96
106
  const { _reasoning, ...restModelOptions } = modelOptions;
97
107
  this.modelReasoningOptions = _reasoning;
@@ -171,6 +181,7 @@ class LLMProvider {
171
181
  method: "GET",
172
182
  url,
173
183
  headers: {
184
+ ...this.getDefaultHeaders(),
174
185
  Authorization: `Bearer ${apiKey}`
175
186
  }
176
187
  });
@@ -382,6 +393,28 @@ ${parsed.text}
382
393
  }
383
394
  return normalizeBaseURL(baseURL);
384
395
  }
396
+ /**
397
+ * Headers every provider must merge into its model client. Decided by the resolved baseURL; returns an empty object
398
+ * when the target service needs no extra headers.
399
+ */
400
+ getDefaultHeaders() {
401
+ let baseURL;
402
+ try {
403
+ baseURL = this.getResolvedBaseURL();
404
+ } catch {
405
+ return {};
406
+ }
407
+ if (!isOpenCodeBaseURL(baseURL)) {
408
+ return {};
409
+ }
410
+ const headers = {
411
+ "User-Agent": `NocoBase/${this.app.getVersion()}`
412
+ };
413
+ if (this.requestContext.sessionId) {
414
+ headers["x-opencode-session"] = this.requestContext.sessionId;
415
+ }
416
+ return headers;
417
+ }
385
418
  buildRequestURL(pathname) {
386
419
  const url = new URL(pathname.replace(/^\/+/, ""), `${this.getResolvedBaseURL()}/`).toString();
387
420
  (0, import_utils.checkUrlAgainstWhitelist)(url);
@@ -64,7 +64,10 @@ class ShengSuanYunProvider extends import_provider.LLMProvider {
64
64
  },
65
65
  configuration: {
66
66
  baseURL: this.getResolvedBaseURL(),
67
- ...xTitle ? { defaultHeaders: { "X-Title": xTitle } } : {}
67
+ defaultHeaders: {
68
+ ...this.getDefaultHeaders(),
69
+ ...xTitle ? { "X-Title": xTitle } : {}
70
+ }
68
71
  }
69
72
  });
70
73
  }
@@ -85,6 +88,7 @@ class ShengSuanYunProvider extends import_provider.LLMProvider {
85
88
  method: "GET",
86
89
  url,
87
90
  headers: {
91
+ ...this.getDefaultHeaders(),
88
92
  Authorization: `Bearer ${apiKey}`,
89
93
  ...xTitle ? { "X-Title": xTitle } : {}
90
94
  }
@@ -47,7 +47,7 @@ class XAIProvider extends import_provider.LLMProvider {
47
47
  if (responseFormat === "json_schema" && schema) {
48
48
  responseFormatOptions["json_schema"] = schema;
49
49
  }
50
- return new import_xai.ChatXAI({
50
+ const model = new import_xai.ChatXAI({
51
51
  apiKey,
52
52
  ...restModelOptions,
53
53
  baseURL: this.getResolvedBaseURL(),
@@ -55,6 +55,11 @@ class XAIProvider extends import_provider.LLMProvider {
55
55
  response_format: responseFormatOptions
56
56
  }
57
57
  });
58
+ model.clientConfig = {
59
+ ...model.clientConfig,
60
+ defaultHeaders: this.getDefaultHeaders()
61
+ };
62
+ return model;
58
63
  }
59
64
  }
60
65
  const xaiProviderOptions = {
@@ -6,7 +6,7 @@
6
6
  * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
- import { LLMProvider, LLMProviderOptions, EmbeddingProvider, EmbeddingProviderOptions, ReasoningOptions } from '../llm-providers/provider';
9
+ import { LLMProvider, LLMProviderOptions, LLMProviderRequestContext, EmbeddingProvider, EmbeddingProviderOptions, ReasoningOptions } from '../llm-providers/provider';
10
10
  import PluginAIServer from '../plugin';
11
11
  import { ToolManager } from './tool-manager';
12
12
  export type LLMProviderMeta = {
@@ -60,7 +60,7 @@ export declare class AIManager {
60
60
  resolveModel(model?: LLMModelOptions | null): Promise<LLMModelOptions>;
61
61
  private toEnabledLLMService;
62
62
  private getEnabledModels;
63
- getLLMService(options: LLMModelOptions): Promise<{
63
+ getLLMService(options: LLMModelOptions, requestContext?: LLMProviderRequestContext): Promise<{
64
64
  provider: LLMProvider;
65
65
  model: string;
66
66
  service: any;
@@ -124,7 +124,7 @@ class AIManager {
124
124
  }
125
125
  return (0, import_recommended_models.getRecommendedModels)(provider);
126
126
  }
127
- async getLLMService(options) {
127
+ async getLLMService(options, requestContext) {
128
128
  const { llmService, model, webSearch, reasoning } = options ?? {};
129
129
  if (!llmService || !model) {
130
130
  throw new Error("LLM service not configured");
@@ -158,7 +158,8 @@ class AIManager {
158
158
  const provider = new Provider({
159
159
  app: this.plugin.app,
160
160
  serviceOptions: service.options,
161
- modelOptions
161
+ modelOptions,
162
+ requestContext
162
163
  });
163
164
  return { provider, model, service };
164
165
  }
@@ -41,6 +41,7 @@ __export(ai_exports, {
41
41
  module.exports = __toCommonJS(ai_exports);
42
42
  var import_package = require("../../../package.json");
43
43
  var import_lodash = __toESM(require("lodash"));
44
+ var import_node_crypto = require("node:crypto");
44
45
  const getModelsListFailedMessage = "Get models list failed, you can enter a model name manually.";
45
46
  const testFlightFailedMessage = "LLM service test failed. Please check the service configuration.";
46
47
  const aiResource = {
@@ -146,6 +147,9 @@ const aiResource = {
146
147
  modelOptions: {
147
148
  model,
148
149
  responseFormat: "text"
150
+ },
151
+ requestContext: {
152
+ sessionId: `test-flight-${(0, import_node_crypto.randomUUID)()}`
149
153
  }
150
154
  });
151
155
  const result = await providerClient.testFlight();
@@ -51,3 +51,9 @@ export type SearchOptions = {
51
51
  score?: string;
52
52
  roleNames?: string[];
53
53
  };
54
+ export type KnowledgeBaseReference = {
55
+ id: number | string;
56
+ title: string;
57
+ extname: string;
58
+ url: string;
59
+ };
@@ -7,9 +7,9 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
  import { FlowNodeModel, Instruction, Processor } from '@nocobase/plugin-workflow';
10
- import { LLMProvider } from '../../../llm-providers/provider';
10
+ import { LLMProvider, LLMProviderRequestContext } from '../../../llm-providers/provider';
11
11
  export declare class LLMInstruction extends Instruction {
12
- getLLMProvider(llmService: string, modelOptions: any): Promise<LLMProvider>;
12
+ getLLMProvider(llmService: string, modelOptions: any, requestContext?: LLMProviderRequestContext): Promise<LLMProvider>;
13
13
  run(node: FlowNodeModel, input: any, processor: Processor): Promise<any>;
14
14
  resume(node: FlowNodeModel, job: any, processor: Processor): any;
15
15
  }
@@ -43,7 +43,7 @@ var import_plugin_workflow = require("@nocobase/plugin-workflow");
43
43
  var import_lodash = __toESM(require("lodash"));
44
44
  var import_parse_messages = require("./parse-messages");
45
45
  class LLMInstruction extends import_plugin_workflow.Instruction {
46
- async getLLMProvider(llmService, modelOptions) {
46
+ async getLLMProvider(llmService, modelOptions, requestContext) {
47
47
  const service = await this.workflow.db.getRepository("llmServices").findOne({
48
48
  filter: {
49
49
  name: llmService
@@ -58,7 +58,12 @@ class LLMInstruction extends import_plugin_workflow.Instruction {
58
58
  throw new Error("invalid llm provider");
59
59
  }
60
60
  const Provider = providerOptions.provider;
61
- const provider = new Provider({ app: this.workflow.app, serviceOptions: service.options, modelOptions });
61
+ const provider = new Provider({
62
+ app: this.workflow.app,
63
+ serviceOptions: service.options,
64
+ modelOptions,
65
+ requestContext
66
+ });
62
67
  return provider;
63
68
  }
64
69
  async run(node, input, processor) {
@@ -69,7 +74,9 @@ class LLMInstruction extends import_plugin_workflow.Instruction {
69
74
  }
70
75
  let provider;
71
76
  try {
72
- provider = await this.getLLMProvider(llmService, modelOptions);
77
+ provider = await this.getLLMProvider(llmService, modelOptions, {
78
+ sessionId: `workflow-${processor.execution.id}-${node.id}`
79
+ });
73
80
  } catch (e) {
74
81
  return {
75
82
  status: import_plugin_workflow.JOB_STATUS.ERROR,
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "description": "Create AI employees with diverse skills to collaborate with humans, build systems, and handle business operations.",
7
7
  "description.ru-RU": "Поддержка интеграции с AI-сервисами: предоставляются AI-узлы для рабочих процессов, расширяя возможности бизнес-обработки.",
8
8
  "description.zh-CN": "创建各种技能的 AI 员工,与人类协同,搭建系统,处理业务。",
9
- "version": "2.2.18",
9
+ "version": "2.2.20",
10
10
  "main": "dist/server/index.js",
11
11
  "homepage": "https://docs.nocobase.com/handbook/action-ai",
12
12
  "homepage.ru-RU": "https://docs-ru.nocobase.com/handbook/action-ai",
@@ -66,5 +66,5 @@
66
66
  "keywords": [
67
67
  "AI"
68
68
  ],
69
- "gitHead": "0c464cd27b2c1ccdf10b00d339bf6599b18bee22"
69
+ "gitHead": "d9c3d45cdca9571f6cef8781e0a2d86566dce11b"
70
70
  }
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- require('../uuid-bin');
@@ -1,104 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "MAX", {
7
- enumerable: true,
8
- get: function get() {
9
- return _max.default;
10
- }
11
- });
12
- Object.defineProperty(exports, "NIL", {
13
- enumerable: true,
14
- get: function get() {
15
- return _nil.default;
16
- }
17
- });
18
- Object.defineProperty(exports, "parse", {
19
- enumerable: true,
20
- get: function get() {
21
- return _parse.default;
22
- }
23
- });
24
- Object.defineProperty(exports, "stringify", {
25
- enumerable: true,
26
- get: function get() {
27
- return _stringify.default;
28
- }
29
- });
30
- Object.defineProperty(exports, "v1", {
31
- enumerable: true,
32
- get: function get() {
33
- return _v.default;
34
- }
35
- });
36
- Object.defineProperty(exports, "v1ToV6", {
37
- enumerable: true,
38
- get: function get() {
39
- return _v1ToV.default;
40
- }
41
- });
42
- Object.defineProperty(exports, "v3", {
43
- enumerable: true,
44
- get: function get() {
45
- return _v2.default;
46
- }
47
- });
48
- Object.defineProperty(exports, "v4", {
49
- enumerable: true,
50
- get: function get() {
51
- return _v3.default;
52
- }
53
- });
54
- Object.defineProperty(exports, "v5", {
55
- enumerable: true,
56
- get: function get() {
57
- return _v4.default;
58
- }
59
- });
60
- Object.defineProperty(exports, "v6", {
61
- enumerable: true,
62
- get: function get() {
63
- return _v5.default;
64
- }
65
- });
66
- Object.defineProperty(exports, "v6ToV1", {
67
- enumerable: true,
68
- get: function get() {
69
- return _v6ToV.default;
70
- }
71
- });
72
- Object.defineProperty(exports, "v7", {
73
- enumerable: true,
74
- get: function get() {
75
- return _v6.default;
76
- }
77
- });
78
- Object.defineProperty(exports, "validate", {
79
- enumerable: true,
80
- get: function get() {
81
- return _validate.default;
82
- }
83
- });
84
- Object.defineProperty(exports, "version", {
85
- enumerable: true,
86
- get: function get() {
87
- return _version.default;
88
- }
89
- });
90
- var _max = _interopRequireDefault(require("./max.js"));
91
- var _nil = _interopRequireDefault(require("./nil.js"));
92
- var _parse = _interopRequireDefault(require("./parse.js"));
93
- var _stringify = _interopRequireDefault(require("./stringify.js"));
94
- var _v = _interopRequireDefault(require("./v1.js"));
95
- var _v1ToV = _interopRequireDefault(require("./v1ToV6.js"));
96
- var _v2 = _interopRequireDefault(require("./v3.js"));
97
- var _v3 = _interopRequireDefault(require("./v4.js"));
98
- var _v4 = _interopRequireDefault(require("./v5.js"));
99
- var _v5 = _interopRequireDefault(require("./v6.js"));
100
- var _v6ToV = _interopRequireDefault(require("./v6ToV1.js"));
101
- var _v6 = _interopRequireDefault(require("./v7.js"));
102
- var _validate = _interopRequireDefault(require("./validate.js"));
103
- var _version = _interopRequireDefault(require("./version.js"));
104
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -1,7 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _default = exports.default = 'ffffffff-ffff-ffff-ffff-ffffffffffff';