@nocobase/plugin-ai 2.2.0-beta.17 → 2.2.0-beta.18
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/api/cli/api/resource/create.md +4 -3
- 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/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/client/{705.19b642db34de438a.js → 705.a4fe26945d175e8a.js} +1 -1
- package/dist/client/index.js +3 -3
- package/dist/client-v2/420.a5b929a5e7f330be.js +10 -0
- package/dist/client-v2/{705.8dc34d43f02f322c.js → 705.f2e1b26a3f000075.js} +1 -1
- package/dist/client-v2/ai-employees/chatbox/hooks/reasoning-stream.d.ts +10 -0
- package/dist/client-v2/ai-employees/chatbox/stores/chat-box.d.ts +0 -2
- 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/models/ai-employees/AIEmployeeShortcutModel.d.ts +1 -0
- package/dist/client-v2/repositories/AIConfigRepository.d.ts +2 -0
- package/dist/externalVersion.js +18 -16
- package/dist/locale/en-US.json +3 -4
- package/dist/locale/zh-CN.json +3 -4
- 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-employee.js +40 -24
- 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/llm-providers/common/reasoning.js +18 -10
- package/dist/{client-v2/ai-employees/chatbox/components/DebugPanel.d.ts → server/llm-providers/deepseek/index.d.ts} +2 -2
- 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-manager.d.ts +3 -0
- package/dist/server/manager/ai-manager.js +7 -2
- package/dist/server/plugin.js +2 -0
- package/dist/server/types/ai-message.type.d.ts +4 -0
- package/dist/swagger/index.d.ts +6 -0
- package/dist/swagger/schemas.d.ts +6 -0
- package/dist/swagger/schemas.js +6 -0
- package/package.json +2 -2
- package/dist/client-v2/420.b2aedb1ff71fca0e.js +0 -10
- 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
|
@@ -0,0 +1,285 @@
|
|
|
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_exports = {};
|
|
28
|
+
__export(reasoning_exports, {
|
|
29
|
+
DEEPSEEK_MODEL_CAPABILITIES: () => DEEPSEEK_MODEL_CAPABILITIES,
|
|
30
|
+
adaptDeepSeekResponsesStream: () => adaptDeepSeekResponsesStream,
|
|
31
|
+
extractDeepSeekReasoningText: () => extractDeepSeekReasoningText,
|
|
32
|
+
getDeepSeekModelCapabilities: () => getDeepSeekModelCapabilities,
|
|
33
|
+
getDeepSeekReasoningRequestParams: () => getDeepSeekReasoningRequestParams,
|
|
34
|
+
getDeepSeekResponsesReasoningItem: () => getDeepSeekResponsesReasoningItem,
|
|
35
|
+
normalizeDeepSeekChatRequest: () => normalizeDeepSeekChatRequest,
|
|
36
|
+
normalizeDeepSeekResponsesRequest: () => normalizeDeepSeekResponsesRequest,
|
|
37
|
+
resolveDeepSeekReasoningConfig: () => resolveDeepSeekReasoningConfig
|
|
38
|
+
});
|
|
39
|
+
module.exports = __toCommonJS(reasoning_exports);
|
|
40
|
+
const NO_EFFORTS = /* @__PURE__ */ new Set();
|
|
41
|
+
const V4_EFFORTS = /* @__PURE__ */ new Set(["low", "high", "max"]);
|
|
42
|
+
const THINKING_UNSUPPORTED_FIELDS = /* @__PURE__ */ new Set(["temperature", "top_p", "presence_penalty", "frequency_penalty"]);
|
|
43
|
+
const NO_UNSUPPORTED_FIELDS = /* @__PURE__ */ new Set();
|
|
44
|
+
const DEEPSEEK_MODEL_CAPABILITIES = {
|
|
45
|
+
"deepseek-v4-flash": {
|
|
46
|
+
protocol: "responses",
|
|
47
|
+
reasoning: "switchable",
|
|
48
|
+
defaultThinking: "enabled",
|
|
49
|
+
efforts: V4_EFFORTS,
|
|
50
|
+
supportsFunctionTools: true,
|
|
51
|
+
supportsStructuredOutput: true,
|
|
52
|
+
supportsWebSearch: true
|
|
53
|
+
},
|
|
54
|
+
"deepseek-v4-pro": {
|
|
55
|
+
protocol: "responses",
|
|
56
|
+
reasoning: "switchable",
|
|
57
|
+
defaultThinking: "enabled",
|
|
58
|
+
efforts: V4_EFFORTS,
|
|
59
|
+
supportsFunctionTools: true,
|
|
60
|
+
supportsStructuredOutput: true,
|
|
61
|
+
supportsWebSearch: true
|
|
62
|
+
},
|
|
63
|
+
"deepseek-chat": {
|
|
64
|
+
protocol: "chat-completions",
|
|
65
|
+
reasoning: "always-off",
|
|
66
|
+
defaultThinking: "disabled",
|
|
67
|
+
efforts: NO_EFFORTS,
|
|
68
|
+
supportsFunctionTools: true,
|
|
69
|
+
supportsStructuredOutput: true,
|
|
70
|
+
supportsWebSearch: false
|
|
71
|
+
},
|
|
72
|
+
"deepseek-reasoner": {
|
|
73
|
+
protocol: "chat-completions",
|
|
74
|
+
reasoning: "always-on",
|
|
75
|
+
defaultThinking: "enabled",
|
|
76
|
+
efforts: NO_EFFORTS,
|
|
77
|
+
supportsFunctionTools: true,
|
|
78
|
+
supportsStructuredOutput: true,
|
|
79
|
+
supportsWebSearch: false
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
83
|
+
const isOfficialDeepSeekModel = (model) => model in DEEPSEEK_MODEL_CAPABILITIES;
|
|
84
|
+
const getDeepSeekModelCapabilities = (model) => isOfficialDeepSeekModel(model) ? DEEPSEEK_MODEL_CAPABILITIES[model] : null;
|
|
85
|
+
const normalizeReasoningEffort = (mode) => {
|
|
86
|
+
if (mode === "minimal" || mode === "low") {
|
|
87
|
+
return "low";
|
|
88
|
+
}
|
|
89
|
+
if (mode === "xhigh") {
|
|
90
|
+
return "high";
|
|
91
|
+
}
|
|
92
|
+
return "high";
|
|
93
|
+
};
|
|
94
|
+
const resolveDeepSeekReasoningConfig = (model, reasoning) => {
|
|
95
|
+
const capabilities = getDeepSeekModelCapabilities(model);
|
|
96
|
+
if (!capabilities) {
|
|
97
|
+
return {
|
|
98
|
+
protocol: "chat-completions",
|
|
99
|
+
recognizedModel: false,
|
|
100
|
+
unsupportedRequestFields: NO_UNSUPPORTED_FIELDS
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const mode = (reasoning == null ? void 0 : reasoning.mode) ?? "default";
|
|
104
|
+
if (mode === "default") {
|
|
105
|
+
return {
|
|
106
|
+
protocol: capabilities.protocol,
|
|
107
|
+
recognizedModel: true,
|
|
108
|
+
unsupportedRequestFields: capabilities.defaultThinking === "enabled" ? THINKING_UNSUPPORTED_FIELDS : NO_UNSUPPORTED_FIELDS
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
if (mode === "off") {
|
|
112
|
+
if (capabilities.reasoning === "always-on") {
|
|
113
|
+
throw new Error(`DeepSeek model "${model}" does not support disabling reasoning`);
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
protocol: capabilities.protocol,
|
|
117
|
+
recognizedModel: true,
|
|
118
|
+
...capabilities.reasoning === "switchable" ? { thinking: "disabled" } : {},
|
|
119
|
+
unsupportedRequestFields: NO_UNSUPPORTED_FIELDS
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (capabilities.reasoning === "always-off") {
|
|
123
|
+
throw new Error(`DeepSeek model "${model}" does not support reasoning`);
|
|
124
|
+
}
|
|
125
|
+
const effort = normalizeReasoningEffort(mode);
|
|
126
|
+
return {
|
|
127
|
+
protocol: capabilities.protocol,
|
|
128
|
+
recognizedModel: true,
|
|
129
|
+
...capabilities.reasoning === "switchable" ? { thinking: "enabled" } : {},
|
|
130
|
+
...capabilities.efforts.has(effort) ? { effort } : {},
|
|
131
|
+
unsupportedRequestFields: THINKING_UNSUPPORTED_FIELDS
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
const getDeepSeekReasoningRequestParams = (config) => {
|
|
135
|
+
if (!config.recognizedModel) {
|
|
136
|
+
return {};
|
|
137
|
+
}
|
|
138
|
+
if (config.protocol === "responses") {
|
|
139
|
+
if (config.thinking === "disabled") {
|
|
140
|
+
return { reasoning: { effort: "none" } };
|
|
141
|
+
}
|
|
142
|
+
return config.effort ? { reasoning: { effort: config.effort } } : {};
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
...config.thinking ? { thinking: { type: config.thinking } } : {},
|
|
146
|
+
...config.effort ? { reasoning_effort: config.effort } : {}
|
|
147
|
+
};
|
|
148
|
+
};
|
|
149
|
+
const removeUnsupportedRequestFields = (request, fields) => {
|
|
150
|
+
for (const field of fields) {
|
|
151
|
+
delete request[field];
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const normalizeDeepSeekChatRequest = (request, config) => {
|
|
155
|
+
if (!config.recognizedModel) {
|
|
156
|
+
return request;
|
|
157
|
+
}
|
|
158
|
+
const mutableRequest = request;
|
|
159
|
+
delete mutableRequest.thinking;
|
|
160
|
+
delete mutableRequest.reasoning_effort;
|
|
161
|
+
Object.assign(mutableRequest, getDeepSeekReasoningRequestParams(config));
|
|
162
|
+
removeUnsupportedRequestFields(mutableRequest, config.unsupportedRequestFields);
|
|
163
|
+
return request;
|
|
164
|
+
};
|
|
165
|
+
const normalizeResponsesReasoningItems = (input) => {
|
|
166
|
+
if (!Array.isArray(input)) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
for (const item of input) {
|
|
170
|
+
if (!isRecord(item) || item.type !== "reasoning") {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const hasReasoningContent = Array.isArray(item.content) && item.content.some((part) => isRecord(part) && part.type === "reasoning_text" && typeof part.text === "string");
|
|
174
|
+
if (hasReasoningContent || !Array.isArray(item.summary)) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const text = item.summary.filter(isRecord).map((part) => part.text).filter((part) => typeof part === "string" && part.length > 0).join("");
|
|
178
|
+
if (text) {
|
|
179
|
+
item.content = [{ type: "reasoning_text", text }];
|
|
180
|
+
item.summary = [];
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
const normalizeDeepSeekResponsesRequest = (request, config) => {
|
|
185
|
+
if (!config.recognizedModel) {
|
|
186
|
+
return request;
|
|
187
|
+
}
|
|
188
|
+
const mutableRequest = request;
|
|
189
|
+
delete mutableRequest.reasoning;
|
|
190
|
+
Object.assign(mutableRequest, getDeepSeekReasoningRequestParams(config));
|
|
191
|
+
removeUnsupportedRequestFields(mutableRequest, config.unsupportedRequestFields);
|
|
192
|
+
normalizeResponsesReasoningItems(request.input);
|
|
193
|
+
return request;
|
|
194
|
+
};
|
|
195
|
+
const getReasoningItemText = (value) => {
|
|
196
|
+
if (!isRecord(value)) {
|
|
197
|
+
return "";
|
|
198
|
+
}
|
|
199
|
+
if (Array.isArray(value.content)) {
|
|
200
|
+
const content = value.content.filter(isRecord).filter((part) => part.type === "reasoning_text").map((part) => part.text).filter((text) => typeof text === "string" && text.length > 0).join("");
|
|
201
|
+
if (content) {
|
|
202
|
+
return content;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (Array.isArray(value.summary)) {
|
|
206
|
+
return value.summary.filter(isRecord).map((part) => part.text).filter((text) => typeof text === "string" && text.length > 0).join("");
|
|
207
|
+
}
|
|
208
|
+
return "";
|
|
209
|
+
};
|
|
210
|
+
const extractDeepSeekReasoningText = (source) => {
|
|
211
|
+
var _a, _b, _c;
|
|
212
|
+
const reasoningContent = (_a = source.additional_kwargs) == null ? void 0 : _a.reasoning_content;
|
|
213
|
+
if (typeof reasoningContent === "string" && reasoningContent.length > 0) {
|
|
214
|
+
return reasoningContent;
|
|
215
|
+
}
|
|
216
|
+
if (Array.isArray(source.content)) {
|
|
217
|
+
const contentBlockText = source.content.filter(isRecord).filter((block) => block.type === "reasoning").map((block) => typeof block.reasoning === "string" ? block.reasoning : "").filter(Boolean).join("");
|
|
218
|
+
if (contentBlockText) {
|
|
219
|
+
return contentBlockText;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const additionalReasoningText = getReasoningItemText((_b = source.additional_kwargs) == null ? void 0 : _b.reasoning);
|
|
223
|
+
if (additionalReasoningText) {
|
|
224
|
+
return additionalReasoningText;
|
|
225
|
+
}
|
|
226
|
+
const output = (_c = source.response_metadata) == null ? void 0 : _c.output;
|
|
227
|
+
if (Array.isArray(output)) {
|
|
228
|
+
const reasoningItem = output.find((item) => isRecord(item) && item.type === "reasoning");
|
|
229
|
+
return getReasoningItemText(reasoningItem);
|
|
230
|
+
}
|
|
231
|
+
return "";
|
|
232
|
+
};
|
|
233
|
+
const getDeepSeekResponsesReasoningItem = (source) => {
|
|
234
|
+
var _a, _b;
|
|
235
|
+
const output = (_a = source.response_metadata) == null ? void 0 : _a.output;
|
|
236
|
+
if (Array.isArray(output)) {
|
|
237
|
+
const reasoningItem = output.find((item) => isRecord(item) && item.type === "reasoning");
|
|
238
|
+
if (isRecord(reasoningItem)) {
|
|
239
|
+
return reasoningItem;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return isRecord((_b = source.additional_kwargs) == null ? void 0 : _b.reasoning) ? source.additional_kwargs.reasoning : null;
|
|
243
|
+
};
|
|
244
|
+
async function* adaptDeepSeekResponsesStream(stream) {
|
|
245
|
+
const emittedWebSearchItems = /* @__PURE__ */ new Set();
|
|
246
|
+
for await (const event of stream) {
|
|
247
|
+
if (event.type === "response.reasoning_text.delta") {
|
|
248
|
+
yield {
|
|
249
|
+
type: "response.reasoning_summary_text.delta",
|
|
250
|
+
delta: event.delta,
|
|
251
|
+
item_id: event.item_id,
|
|
252
|
+
output_index: event.output_index,
|
|
253
|
+
sequence_number: event.sequence_number,
|
|
254
|
+
summary_index: event.content_index
|
|
255
|
+
};
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if (event.type === "response.output_item.added" && event.item.type === "web_search_call" && isRecord(event.item.action) && typeof event.item.action.query === "string") {
|
|
259
|
+
emittedWebSearchItems.add(event.item.id);
|
|
260
|
+
yield {
|
|
261
|
+
type: "response.output_item.done",
|
|
262
|
+
item: event.item,
|
|
263
|
+
output_index: event.output_index,
|
|
264
|
+
sequence_number: event.sequence_number
|
|
265
|
+
};
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
if (event.type === "response.output_item.done" && event.item.type === "web_search_call" && emittedWebSearchItems.has(event.item.id)) {
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
yield event;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
275
|
+
0 && (module.exports = {
|
|
276
|
+
DEEPSEEK_MODEL_CAPABILITIES,
|
|
277
|
+
adaptDeepSeekResponsesStream,
|
|
278
|
+
extractDeepSeekReasoningText,
|
|
279
|
+
getDeepSeekModelCapabilities,
|
|
280
|
+
getDeepSeekReasoningRequestParams,
|
|
281
|
+
getDeepSeekResponsesReasoningItem,
|
|
282
|
+
normalizeDeepSeekChatRequest,
|
|
283
|
+
normalizeDeepSeekResponsesRequest,
|
|
284
|
+
resolveDeepSeekReasoningConfig
|
|
285
|
+
});
|
|
@@ -46,9 +46,9 @@ declare class ReasoningChatMistralAI extends ChatMistralAI {
|
|
|
46
46
|
presencePenalty?: number;
|
|
47
47
|
n?: number;
|
|
48
48
|
stop?: string | string[];
|
|
49
|
+
prediction?: import("@mistralai/mistralai/models/components/prediction").Prediction;
|
|
49
50
|
toolChoice?: import("@mistralai/mistralai/models/components/toolchoice").ToolChoice | import("@mistralai/mistralai/models/components/toolchoiceenum").ToolChoiceEnum;
|
|
50
51
|
randomSeed?: number;
|
|
51
|
-
prediction?: import("@mistralai/mistralai/models/components/prediction").Prediction;
|
|
52
52
|
parallelToolCalls?: boolean;
|
|
53
53
|
promptMode?: import("@mistralai/mistralai/models/components/mistralpromptmode").MistralPromptMode;
|
|
54
54
|
safePrompt?: boolean;
|
|
@@ -98,6 +98,7 @@ export declare abstract class LLMProvider {
|
|
|
98
98
|
} | null;
|
|
99
99
|
parseResponseMetadata(output: LLMResult): any;
|
|
100
100
|
parseResponseError(err: any): any;
|
|
101
|
+
prepareStoredAssistantAdditionalKwargs(additionalKwargs?: Record<string, unknown>): Record<string, unknown> | undefined;
|
|
101
102
|
reshapeAIMessage(_options: {
|
|
102
103
|
aiMessage: AIMessage;
|
|
103
104
|
values: AIMessageInput;
|
|
@@ -367,6 +367,9 @@ ${parsed.text}
|
|
|
367
367
|
parseResponseError(err) {
|
|
368
368
|
return (err == null ? void 0 : err.message) ?? "Unexpected LLM service error";
|
|
369
369
|
}
|
|
370
|
+
prepareStoredAssistantAdditionalKwargs(additionalKwargs) {
|
|
371
|
+
return additionalKwargs;
|
|
372
|
+
}
|
|
370
373
|
reshapeAIMessage(_options) {
|
|
371
374
|
}
|
|
372
375
|
get documentLoader() {
|
|
@@ -0,0 +1,29 @@
|
|
|
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 { ChatOpenAI } from '@langchain/openai';
|
|
10
|
+
import { LLMProviderMeta } from '../manager/ai-manager';
|
|
11
|
+
import { LLMProvider } from './provider';
|
|
12
|
+
export type ShengSuanYunModel = {
|
|
13
|
+
id: string;
|
|
14
|
+
support_apis?: string[];
|
|
15
|
+
};
|
|
16
|
+
export declare function supportsChatCompletions(model: ShengSuanYunModel): boolean;
|
|
17
|
+
export declare class ShengSuanYunProvider extends LLMProvider {
|
|
18
|
+
chatModel: ChatOpenAI;
|
|
19
|
+
get baseURL(): string;
|
|
20
|
+
createModel(): ChatOpenAI<import("@langchain/openai/dist/chat_models/index.cjs").ChatOpenAICallOptions>;
|
|
21
|
+
listModels(): Promise<{
|
|
22
|
+
models?: {
|
|
23
|
+
id: string;
|
|
24
|
+
}[];
|
|
25
|
+
code?: number;
|
|
26
|
+
errMsg?: string;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
29
|
+
export declare const shengsuanyunProviderOptions: LLMProviderMeta;
|
|
@@ -0,0 +1,114 @@
|
|
|
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 shengsuanyun_exports = {};
|
|
28
|
+
__export(shengsuanyun_exports, {
|
|
29
|
+
ShengSuanYunProvider: () => ShengSuanYunProvider,
|
|
30
|
+
shengsuanyunProviderOptions: () => shengsuanyunProviderOptions,
|
|
31
|
+
supportsChatCompletions: () => supportsChatCompletions
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(shengsuanyun_exports);
|
|
34
|
+
var import_openai = require("@langchain/openai");
|
|
35
|
+
var import_utils = require("@nocobase/utils");
|
|
36
|
+
var import_ai_manager = require("../manager/ai-manager");
|
|
37
|
+
var import_provider = require("./provider");
|
|
38
|
+
const CHAT_COMPLETIONS_API = "/v1/chat/completions";
|
|
39
|
+
function supportsChatCompletions(model) {
|
|
40
|
+
return !Array.isArray(model.support_apis) || model.support_apis.includes(CHAT_COMPLETIONS_API);
|
|
41
|
+
}
|
|
42
|
+
class ShengSuanYunProvider extends import_provider.LLMProvider {
|
|
43
|
+
get baseURL() {
|
|
44
|
+
return "https://router.shengsuanyun.com/api/v1";
|
|
45
|
+
}
|
|
46
|
+
createModel() {
|
|
47
|
+
const { apiKey, xTitle } = this.serviceOptions || {};
|
|
48
|
+
const { responseFormat, structuredOutput } = this.modelOptions || {};
|
|
49
|
+
const { name, schema } = structuredOutput || {};
|
|
50
|
+
const responseFormatOptions = {
|
|
51
|
+
type: responseFormat ?? "text"
|
|
52
|
+
};
|
|
53
|
+
if (responseFormat === "json_schema" && schema) {
|
|
54
|
+
responseFormatOptions.json_schema = {
|
|
55
|
+
schema,
|
|
56
|
+
name: name ?? "schema"
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return new import_openai.ChatOpenAI({
|
|
60
|
+
apiKey,
|
|
61
|
+
...this.modelOptions,
|
|
62
|
+
modelKwargs: {
|
|
63
|
+
response_format: responseFormatOptions
|
|
64
|
+
},
|
|
65
|
+
configuration: {
|
|
66
|
+
baseURL: this.getResolvedBaseURL(),
|
|
67
|
+
...xTitle ? { defaultHeaders: { "X-Title": xTitle } } : {}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
async listModels() {
|
|
72
|
+
var _a;
|
|
73
|
+
const { apiKey, xTitle } = this.serviceOptions || {};
|
|
74
|
+
let url;
|
|
75
|
+
try {
|
|
76
|
+
url = this.buildRequestURL("models");
|
|
77
|
+
} catch (error) {
|
|
78
|
+
return { code: 400, errMsg: error instanceof Error ? error.message : String(error) };
|
|
79
|
+
}
|
|
80
|
+
if (!apiKey) {
|
|
81
|
+
return { code: 400, errMsg: "API Key required" };
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const response = await (0, import_utils.serverRequest)({
|
|
85
|
+
method: "GET",
|
|
86
|
+
url,
|
|
87
|
+
headers: {
|
|
88
|
+
Authorization: `Bearer ${apiKey}`,
|
|
89
|
+
...xTitle ? { "X-Title": xTitle } : {}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
const models = Array.isArray((_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) ? response.data.data : [];
|
|
93
|
+
return {
|
|
94
|
+
models: models.filter(supportsChatCompletions).map(({ id }) => ({ id }))
|
|
95
|
+
};
|
|
96
|
+
} catch (error) {
|
|
97
|
+
return {
|
|
98
|
+
code: 500,
|
|
99
|
+
errMsg: error instanceof Error ? error.message : String(error)
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const shengsuanyunProviderOptions = {
|
|
105
|
+
title: "SSYCloud",
|
|
106
|
+
supportedModel: [import_ai_manager.SupportedModel.LLM],
|
|
107
|
+
provider: ShengSuanYunProvider
|
|
108
|
+
};
|
|
109
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
110
|
+
0 && (module.exports = {
|
|
111
|
+
ShengSuanYunProvider,
|
|
112
|
+
shengsuanyunProviderOptions,
|
|
113
|
+
supportsChatCompletions
|
|
114
|
+
});
|
|
@@ -16,6 +16,7 @@ export type LLMProviderMeta = {
|
|
|
16
16
|
provider: new (opts: LLMProviderOptions) => LLMProvider;
|
|
17
17
|
embedding?: new (opts: EmbeddingProviderOptions) => EmbeddingProvider;
|
|
18
18
|
supportWebSearch?: boolean;
|
|
19
|
+
webSearchModels?: string[];
|
|
19
20
|
};
|
|
20
21
|
export declare enum SupportedModel {
|
|
21
22
|
LLM = "LLM",
|
|
@@ -38,6 +39,7 @@ export type EnabledLLMService = {
|
|
|
38
39
|
providerTitle?: string;
|
|
39
40
|
enabledModels: EnabledLLMModel[];
|
|
40
41
|
supportWebSearch: boolean;
|
|
42
|
+
webSearchModels?: string[];
|
|
41
43
|
isToolConflict: boolean;
|
|
42
44
|
};
|
|
43
45
|
export declare class AIManager {
|
|
@@ -51,6 +53,7 @@ export declare class AIManager {
|
|
|
51
53
|
title: string;
|
|
52
54
|
supportedModel: SupportedModel[];
|
|
53
55
|
supportWebSearch: boolean;
|
|
56
|
+
webSearchModels: string[];
|
|
54
57
|
}[];
|
|
55
58
|
getSupportedProvider(model: SupportedModel): string[];
|
|
56
59
|
listAllEnabledModels(): Promise<EnabledLLMService[]>;
|
|
@@ -48,11 +48,12 @@ class AIManager {
|
|
|
48
48
|
}
|
|
49
49
|
listLLMProviders() {
|
|
50
50
|
const providers = this.llmProviders.entries();
|
|
51
|
-
return Array.from(providers).map(([name, { title, supportedModel, supportWebSearch }]) => ({
|
|
51
|
+
return Array.from(providers).map(([name, { title, supportedModel, supportWebSearch, webSearchModels }]) => ({
|
|
52
52
|
name,
|
|
53
53
|
title,
|
|
54
54
|
supportedModel: supportedModel ?? ["LLM" /* LLM */],
|
|
55
|
-
supportWebSearch: supportWebSearch ?? false
|
|
55
|
+
supportWebSearch: supportWebSearch ?? false,
|
|
56
|
+
webSearchModels
|
|
56
57
|
}));
|
|
57
58
|
}
|
|
58
59
|
getSupportedProvider(model) {
|
|
@@ -98,6 +99,7 @@ class AIManager {
|
|
|
98
99
|
providerTitle: providerMeta.title,
|
|
99
100
|
enabledModels,
|
|
100
101
|
supportWebSearch: providerMeta.supportWebSearch ?? false,
|
|
102
|
+
webSearchModels: providerMeta.webSearchModels,
|
|
101
103
|
isToolConflict: providerClient.isToolConflict()
|
|
102
104
|
};
|
|
103
105
|
}
|
|
@@ -149,6 +151,9 @@ class AIManager {
|
|
|
149
151
|
if (!providerOptions) {
|
|
150
152
|
throw new Error("LLM service provider not found");
|
|
151
153
|
}
|
|
154
|
+
if (webSearch === true && providerOptions.webSearchModels && !providerOptions.webSearchModels.includes(model)) {
|
|
155
|
+
throw new Error(`Web search is not supported by model "${model}"`);
|
|
156
|
+
}
|
|
152
157
|
const Provider = providerOptions.provider;
|
|
153
158
|
const provider = new Provider({
|
|
154
159
|
app: this.plugin.app,
|
package/dist/server/plugin.js
CHANGED
|
@@ -77,6 +77,7 @@ var import_checkpoints = require("./ai-employees/checkpoints");
|
|
|
77
77
|
var import_mimo = require("./llm-providers/mimo");
|
|
78
78
|
var import_mistral = require("./llm-providers/mistral");
|
|
79
79
|
var import_orcarouter = require("./llm-providers/orcarouter");
|
|
80
|
+
var import_shengsuanyun = require("./llm-providers/shengsuanyun");
|
|
80
81
|
var import_sub_agents = require("./ai-employees/sub-agents");
|
|
81
82
|
var import_employee = require("./workflow/nodes/employee");
|
|
82
83
|
var import_ai_knowledge_base = require("./ai-employees/ai-knowledge-base");
|
|
@@ -191,6 +192,7 @@ class PluginAIServer extends import_server.Plugin {
|
|
|
191
192
|
this.aiManager.registerLLMProvider("kimi", import_kimi.kimiProviderOptions);
|
|
192
193
|
this.aiManager.registerLLMProvider("xai", import_xai.xaiProviderOptions);
|
|
193
194
|
this.aiManager.registerLLMProvider("orcarouter", import_orcarouter.orcarouterProviderOptions);
|
|
195
|
+
this.aiManager.registerLLMProvider("shengsuanyun", import_shengsuanyun.shengsuanyunProviderOptions);
|
|
194
196
|
}
|
|
195
197
|
registerTools() {
|
|
196
198
|
const toolsManager = this.ai.toolsManager;
|
package/dist/swagger/index.d.ts
CHANGED
package/dist/swagger/schemas.js
CHANGED
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.0-beta.
|
|
9
|
+
"version": "2.2.0-beta.18",
|
|
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": "
|
|
69
|
+
"gitHead": "b74c962f7d35aa12012d908d16bd74fe6ac20a3d"
|
|
70
70
|
}
|
|
@@ -1,10 +0,0 @@
|
|
|
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
|
-
"use strict";(self.webpackChunk_nocobase_plugin_ai_client_v2=self.webpackChunk_nocobase_plugin_ai_client_v2||[]).push([["420"],{5887:function(e,t,r){r.r(t),r.d(t,{normalizeShortcutTasksSkillSettings:function(){return o.im},AIEmployeeActionModel:function(){return k},AIEmployeeButtonModel:function(){return o.uq},AIEmployeeShortcutModel:function(){return o.wq},AIEmployeeShortcutListModel:function(){return s},WorkContext:function(){return o.Zz},normalizeShortcutTaskSkillSettings:function(){return o.xi}});var o=r(7317),n=r(9155),l=r.n(n),c=r(2059),i=r(7694);function u(e){return(u=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function a(e,t){return(a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function f(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(f=function(){return!!e})()}var s=function(e){var t;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function r(){var e,t,o,n;if(!(this instanceof r))throw TypeError("Cannot call a class as a function");return t=r,o=arguments,t=u(t),e=function(e,t){var r;if(t&&("object"==((r=t)&&"u">typeof Symbol&&r.constructor===Symbol?"symbol":typeof r)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,f()?Reflect.construct(t,o||[],u(this).constructor):t.apply(this,o)),(n="isNewModel")in e?Object.defineProperty(e,n,{value:!1,enumerable:!0,configurable:!0,writable:!0}):e[n]=!1,e}return r.prototype=Object.create(e&&e.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),e&&a(r,e),t=[{key:"render",value:function(){return l().createElement(c.Flex,{gap:"small"},l().createElement(i.DndProvider,null,this.mapSubModels("shortcuts",function(e){var t;return l().createElement(i.Droppable,{model:e,key:e.uid},l().createElement(i.FlowModelRenderer,{key:e.uid,model:e,showFlowSettings:!(null==(t=e.props)?void 0:t.builtIn),extraToolbarItems:[{key:"drag-handler",component:i.DragHandler,sort:1}]}))})))}}],function(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}(r.prototype,t),r}(i.FlowModel),p=r(3485),y=r(7176),b=r(4196),d=r(9488);function m(e,t,r,o,n,l,c){try{var i=e[l](c),u=i.value}catch(e){r(e);return}i.done?t(u):Promise.resolve(u).then(o,n)}function v(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function h(e){return(h=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function O(e,t){return(O=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function g(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(g=function(){return!!e})()}var w=function(e){var t=e.aiEmployee,r=c.theme.useToken().token;return l().createElement(c.Popover,{content:l().createElement(y.g,{aiEmployee:t}),placement:"leftTop"},l().createElement(c.Flex,{align:"center",style:{padding:"4px 2px"},gap:8},l().createElement(c.Avatar,{shape:"circle",size:36,src:(0,b.H)(t.avatar)}),l().createElement(c.Flex,{vertical:!0},l().createElement("div",{style:{fontSize:r.fontSizeSM,color:r.colorText,lineHeight:1.4}},t.nickname),l().createElement("div",{style:{fontSize:r.fontSizeSM,color:r.colorTextSecondary,lineHeight:1.4}},t.position))))},E="AIChatBoxBlockModel",j=function(e){for(var t,r=e;r;){if((null==(t=r)?void 0:t.use)===E||(null==t?void 0:t.constructor.name)===E)return r.uid;r=r.parent}},S=function(e){var t=j(e);return t?{defaultTaskChatBoxUid:t,tasks:[{chatBoxUid:t}]}:{}},k=function(e){var t;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function r(){var e,t;if(!(this instanceof r))throw TypeError("Cannot call a class as a function");return e=r,t=arguments,e=h(e),function(e,t){var r;if(t&&("object"==((r=t)&&"u">typeof Symbol&&r.constructor===Symbol?"symbol":typeof r)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,g()?Reflect.construct(e,t||[],h(this).constructor):e.apply(this,t))}return r.prototype=Object.create(e&&e.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),e&&O(r,e),t=[{key:"defineChildren",value:function(e){var t;return(t=function(){var t,r;return function(e,t){var r,o,n,l={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]},c=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(c,"next",{value:u(0)}),i(c,"throw",{value:u(1)}),i(c,"return",{value:u(2)}),"function"==typeof Symbol&&i(c,Symbol.iterator,{value:function(){return this}}),c;function u(i){return function(u){var a=[i,u];if(r)throw TypeError("Generator is already executing.");for(;c&&(c=0,a[0]&&(l=0)),l;)try{if(r=1,o&&(n=2&a[0]?o.return:a[0]?o.throw||((n=o.return)&&n.call(o),0):o.next)&&!(n=n.call(o,a[1])).done)return n;switch(o=0,n&&(a=[2&a[0],n.value]),a[0]){case 0:case 1:n=a;break;case 4:return l.label++,{value:a[1],done:!1};case 5:l.label++,o=a[1],a=[0];continue;case 7:a=l.ops.pop(),l.trys.pop();continue;default:if(!(n=(n=l.trys).length>0&&n[n.length-1])&&(6===a[0]||2===a[0])){l=0;continue}if(3===a[0]&&(!n||a[1]>n[0]&&a[1]<n[3])){l.label=a[1];break}if(6===a[0]&&l.label<n[1]){l.label=n[1],n=a;break}if(n&&l.label<n[2]){l.label=n[2],l.ops.push(a);break}n[2]&&l.ops.pop(),l.trys.pop();continue}a=t.call(e,l)}catch(e){a=[6,e],o=0}finally{r=n=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}}}(this,function(o){switch(o.label){case 0:return[4,e.aiConfigRepository.getAIEmployees()];case 1:return t=o.sent(),r=S(e.model),[2,null==t?void 0:t.filter(function(e){return(null==e?void 0:e.deprecated)!==!0&&(null==e?void 0:e.category)!=="developer"}).map(function(t){var o,n;return{key:t.username,label:l().createElement(w,{aiEmployee:t}),createModelOptions:{use:"AIEmployeeButtonModel",props:(o=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},o=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(o=o.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),o.forEach(function(t){v(e,t,r[t])})}return e}({aiEmployee:{username:t.username},context:{workContext:[{type:"flow-model",uid:e.model.uid}]}},r),n=n={auto:!1},Object.getOwnPropertyDescriptors?Object.defineProperties(o,Object.getOwnPropertyDescriptors(n)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t.push.apply(t,r)}return t})(Object(n)).forEach(function(e){Object.defineProperty(o,e,Object.getOwnPropertyDescriptor(n,e))}),o)}}})]}})},function(){var e=this,r=arguments;return new Promise(function(o,n){var l=t.apply(e,r);function c(e){m(l,o,n,c,i,"next",e)}function i(e){m(l,o,n,c,i,"throw",e)}c(void 0)})})()}}],function(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}(r,t),r}(p.ActionModel);v(k,"scene",p.ActionSceneEnum.all),k.define({label:(0,d.MZ)("AI employees"),sort:8e3}),p.CollectionActionGroupModel.registerActionModels({AIEmployeeActionModel:k}),p.RecordActionGroupModel.registerActionModels({AIEmployeeActionModel:k}),p.FormActionGroupModel.registerActionModels({AIEmployeeActionModel:k}),p.PopupSubTableFormActionGroupModel.registerActionModels({AIEmployeeActionModel:k})}}]);
|