@nocobase/plugin-ai 2.2.0-alpha.2 → 2.2.0-alpha.4

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 (53) hide show
  1. package/dist/ai/docs/nocobase/api/cli/env/auth.md +53 -5
  2. package/dist/ai/docs/nocobase/ops-management/version-control/index.md +1 -0
  3. package/dist/client/559.9f97ebcdb0bd6231.js +10 -0
  4. package/dist/client/{604.de96f3ec4d471afd.js → 604.89c674f35b52b4ef.js} +1 -1
  5. package/dist/client/index.js +3 -3
  6. package/dist/client/llm-providers/mistral/ModelSettings.d.ts +10 -0
  7. package/dist/client/llm-providers/mistral/index.d.ts +10 -0
  8. package/dist/client/llm-services/utils.d.ts +5 -0
  9. package/dist/externalVersion.js +16 -16
  10. package/dist/locale/en-US.json +1 -0
  11. package/dist/locale/zh-CN.json +1 -0
  12. package/dist/node_modules/@langchain/mistralai/LICENSE +21 -0
  13. package/dist/node_modules/@langchain/mistralai/dist/_virtual/rolldown_runtime.cjs +25 -0
  14. package/dist/node_modules/@langchain/mistralai/dist/chat_models.cjs +859 -0
  15. package/dist/node_modules/@langchain/mistralai/dist/chat_models.d.cts +541 -0
  16. package/dist/node_modules/@langchain/mistralai/dist/chat_models.d.ts +541 -0
  17. package/dist/node_modules/@langchain/mistralai/dist/chat_models.js +857 -0
  18. package/dist/node_modules/@langchain/mistralai/dist/embeddings.cjs +140 -0
  19. package/dist/node_modules/@langchain/mistralai/dist/embeddings.d.cts +116 -0
  20. package/dist/node_modules/@langchain/mistralai/dist/embeddings.d.ts +116 -0
  21. package/dist/node_modules/@langchain/mistralai/dist/embeddings.js +139 -0
  22. package/dist/node_modules/@langchain/mistralai/dist/index.cjs +21 -0
  23. package/dist/node_modules/@langchain/mistralai/dist/index.d.cts +4 -0
  24. package/dist/node_modules/@langchain/mistralai/dist/index.d.ts +4 -0
  25. package/dist/node_modules/@langchain/mistralai/dist/index.js +5 -0
  26. package/dist/node_modules/@langchain/mistralai/dist/llms.cjs +275 -0
  27. package/dist/node_modules/@langchain/mistralai/dist/llms.d.cts +147 -0
  28. package/dist/node_modules/@langchain/mistralai/dist/llms.d.ts +147 -0
  29. package/dist/node_modules/@langchain/mistralai/dist/llms.js +274 -0
  30. package/dist/node_modules/@langchain/mistralai/dist/utils.cjs +61 -0
  31. package/dist/node_modules/@langchain/mistralai/dist/utils.js +59 -0
  32. package/dist/node_modules/@langchain/mistralai/package.json +1 -0
  33. package/dist/node_modules/@langchain/xai/dist/index.cjs +2 -2
  34. package/dist/node_modules/@langchain/xai/package.json +1 -1
  35. package/dist/node_modules/fs-extra/package.json +1 -1
  36. package/dist/node_modules/jsonrepair/package.json +1 -1
  37. package/dist/node_modules/just-bash/package.json +1 -1
  38. package/dist/node_modules/nodejs-snowflake/package.json +1 -1
  39. package/dist/node_modules/openai/package.json +1 -1
  40. package/dist/node_modules/zod/package.json +1 -1
  41. package/dist/server/ai-employees/ai-employee.js +7 -5
  42. package/dist/server/ai-employees/middleware/conversation.d.ts +2 -0
  43. package/dist/server/ai-employees/middleware/conversation.js +2 -1
  44. package/dist/server/ai-employees/utils.d.ts +3 -1
  45. package/dist/server/ai-employees/utils.js +2 -0
  46. package/dist/server/llm-providers/mistral.d.ts +62 -0
  47. package/dist/server/llm-providers/mistral.js +265 -0
  48. package/dist/server/llm-providers/provider.d.ts +6 -2
  49. package/dist/server/llm-providers/provider.js +27 -14
  50. package/dist/server/plugin.js +2 -0
  51. package/dist/server/workflow/nodes/employee/index.js +91 -45
  52. package/package.json +3 -2
  53. package/dist/client/559.a0f2f1cc2be3c039.js +0 -10
@@ -46,15 +46,34 @@ 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 assertBaseURLString(baseURL) {
50
+ if (typeof baseURL !== "string") {
51
+ throw new Error("baseURL must be a string");
52
+ }
53
+ }
49
54
  function normalizeBaseURL(baseURL) {
50
- (0, import_utils.checkUrlAgainstWhitelist)(baseURL);
51
- return new URL(baseURL).toString().replace(/\/$/, "");
55
+ assertBaseURLString(baseURL);
56
+ const trimmedBaseURL = baseURL.trim();
57
+ (0, import_utils.checkUrlAgainstWhitelist)(trimmedBaseURL);
58
+ return new URL(trimmedBaseURL).toString().replace(/\/$/, "");
59
+ }
60
+ function isBlankBaseURL(baseURL) {
61
+ return baseURL.trim() === "";
62
+ }
63
+ function getServiceBaseURL(serviceOptions) {
64
+ const baseURL = serviceOptions == null ? void 0 : serviceOptions.baseURL;
65
+ if (typeof baseURL === "string" && isBlankBaseURL(baseURL)) {
66
+ return null;
67
+ }
68
+ return baseURL;
52
69
  }
53
70
  function resolveServiceOptions(serviceOptions, app) {
54
71
  const rendered = app.environment.renderJsonTemplate(serviceOptions ?? {});
55
72
  if ((rendered == null ? void 0 : rendered.baseURL) != null) {
56
- if (typeof rendered.baseURL !== "string") {
57
- throw new Error("baseURL must be a string");
73
+ assertBaseURLString(rendered.baseURL);
74
+ if (isBlankBaseURL(rendered.baseURL)) {
75
+ delete rendered.baseURL;
76
+ return rendered;
58
77
  }
59
78
  rendered.baseURL = normalizeBaseURL(rendered.baseURL);
60
79
  }
@@ -319,18 +338,16 @@ ${parsed.text}
319
338
  parseResponseError(err) {
320
339
  return (err == null ? void 0 : err.message) ?? "Unexpected LLM service error";
321
340
  }
341
+ reshapeAIMessage(_options) {
342
+ }
322
343
  get documentLoader() {
323
344
  return this.aiPlugin.documentLoaders.cached;
324
345
  }
325
346
  getResolvedBaseURL() {
326
- var _a;
327
- const baseURL = ((_a = this.serviceOptions) == null ? void 0 : _a.baseURL) ?? this.baseURL;
347
+ const baseURL = getServiceBaseURL(this.serviceOptions) ?? this.baseURL;
328
348
  if (!baseURL) {
329
349
  throw new Error("baseURL is required");
330
350
  }
331
- if (typeof baseURL !== "string") {
332
- throw new Error("baseURL must be a string");
333
- }
334
351
  return normalizeBaseURL(baseURL);
335
352
  }
336
353
  buildRequestURL(pathname) {
@@ -361,14 +378,10 @@ class EmbeddingProvider {
361
378
  return apiKey;
362
379
  }
363
380
  get baseURL() {
364
- var _a;
365
- const baseURL = ((_a = this.serviceOptions) == null ? void 0 : _a.baseURL) ?? this.getDefaultUrl();
381
+ const baseURL = getServiceBaseURL(this.serviceOptions) ?? this.getDefaultUrl();
366
382
  if (!baseURL) {
367
383
  throw new Error("baseURL is required");
368
384
  }
369
- if (typeof baseURL !== "string") {
370
- throw new Error("baseURL must be a string");
371
- }
372
385
  return normalizeBaseURL(baseURL);
373
386
  }
374
387
  get model() {
@@ -74,6 +74,7 @@ var import_xai = require("./llm-providers/xai");
74
74
  var import_document_loader = require("./document-loader");
75
75
  var import_checkpoints = require("./ai-employees/checkpoints");
76
76
  var import_mimo = require("./llm-providers/mimo");
77
+ var import_mistral = require("./llm-providers/mistral");
77
78
  var import_sub_agents = require("./ai-employees/sub-agents");
78
79
  var import_employee = require("./workflow/nodes/employee");
79
80
  var import_ai_knowledge_base = require("./ai-employees/ai-knowledge-base");
@@ -180,6 +181,7 @@ class PluginAIServer extends import_server.Plugin {
180
181
  this.aiManager.registerLLMProvider("dashscope", import_dashscope.dashscopeProviderOptions);
181
182
  this.aiManager.registerLLMProvider("kimi", import_kimi.kimiProviderOptions);
182
183
  this.aiManager.registerLLMProvider("mimo", import_mimo.mimoProviderOptions);
184
+ this.aiManager.registerLLMProvider("mistral", import_mistral.mistralProviderOptions);
183
185
  this.aiManager.registerLLMProvider("ollama", import_ollama.ollamaProviderOptions);
184
186
  this.aiManager.registerLLMProvider("openai-completions", import_openai2.openaiCompletionsProviderOptions);
185
187
  this.aiManager.registerLLMProvider("kimi", import_kimi.kimiProviderOptions);
@@ -120,27 +120,29 @@ ${typeof message.system === "object" ? JSON.stringify(message.system) : message.
120
120
  });
121
121
  const plugin = this.workflow.app.pm.get("ai");
122
122
  const resolvedModel = await plugin.aiEmployeesManager.resolveModel(employee, model);
123
- const aiEmployee = new import_ai_employee.AIEmployee({
124
- ctx: {
125
- app: this.workflow.app,
126
- db: this.workflow.app.db,
127
- log: this.workflow.app.log,
128
- logger: this.workflow.app.log,
129
- state: { currentRoles },
130
- auth: {
131
- user: {
132
- id: ((_e = (_d = input == null ? void 0 : input.result) == null ? void 0 : _d.user) == null ? void 0 : _e.id) ?? userId
133
- }
134
- },
135
- action: {
136
- params: {
137
- values: {
138
- sessionId: conversation.sessionId,
139
- model: resolvedModel
140
- }
141
- }
123
+ const aiEmployeeContext = {
124
+ app: this.workflow.app,
125
+ db: this.workflow.app.db,
126
+ log: this.workflow.app.log,
127
+ logger: this.workflow.app.log,
128
+ state: { currentRoles },
129
+ auth: {
130
+ user: {
131
+ id: ((_e = (_d = input == null ? void 0 : input.result) == null ? void 0 : _d.user) == null ? void 0 : _e.id) ?? userId
142
132
  }
143
133
  },
134
+ action: {
135
+ params: {
136
+ values: {
137
+ sessionId: conversation.sessionId,
138
+ model: resolvedModel
139
+ }
140
+ }
141
+ }
142
+ };
143
+ const aiEmployeeActionValues = aiEmployeeContext.action.params.values;
144
+ const aiEmployee = new import_ai_employee.AIEmployee({
145
+ ctx: aiEmployeeContext,
144
146
  employee,
145
147
  sessionId: conversation.sessionId,
146
148
  systemMessage,
@@ -158,6 +160,7 @@ ${typeof message.system === "object" ? JSON.stringify(message.system) : message.
158
160
  }
159
161
  let result;
160
162
  let isToolInvoke = false;
163
+ let recoveredFromGraphRecursion = false;
161
164
  let retry = 0;
162
165
  do {
163
166
  const userMessages = [
@@ -170,36 +173,76 @@ ${typeof message.system === "object" ? JSON.stringify(message.system) : message.
170
173
  ...attachmentPart
171
174
  }
172
175
  ];
173
- if (retry > 0) {
174
- if (retry < 2) {
175
- abortHandle.throwIfAborted();
176
- const firstUserMessage = await this.workflow.db.getRepository("aiConversations.messages", conversation.sessionId).findOne({
177
- filter: {
178
- role: "user"
179
- },
180
- sort: ["messageId"]
181
- });
182
- const messageId = firstUserMessage == null ? void 0 : firstUserMessage.messageId;
183
- result = await aiEmployee.invoke({ messageId, userMessages, signal: abortHandle.signal });
184
- } else {
185
- result = await aiEmployee.invoke({
186
- signal: abortHandle.signal,
187
- userMessages: [
188
- {
189
- role: "user",
190
- content: {
191
- type: "text",
192
- content: `You failed to call the required tool "${import_ai.SYSTEM_TOOLS.WORK_FLOW_TASK_OUTPUT}" in your previous response.
193
- Call "${import_ai.SYSTEM_TOOLS.WORK_FLOW_TASK_OUTPUT}" now to submit the workflow outcome.
176
+ try {
177
+ if (retry > 0) {
178
+ if (retry < 2) {
179
+ abortHandle.throwIfAborted();
180
+ const firstUserMessage = await this.workflow.db.getRepository("aiConversations.messages", conversation.sessionId).findOne({
181
+ filter: {
182
+ role: "user"
183
+ },
184
+ sort: ["messageId"]
185
+ });
186
+ const messageId = firstUserMessage == null ? void 0 : firstUserMessage.messageId;
187
+ result = await aiEmployee.invoke({ messageId, userMessages, signal: abortHandle.signal });
188
+ } else {
189
+ result = await aiEmployee.invoke({
190
+ signal: abortHandle.signal,
191
+ userMessages: [
192
+ {
193
+ role: "user",
194
+ content: {
195
+ type: "text",
196
+ content: `You failed to call the required tool "${toolName}" in your previous response.
197
+ Call "${toolName}" now to submit the workflow outcome.
194
198
  Do not send another normal assistant response without invoking it.
195
199
  `
200
+ }
196
201
  }
197
- }
198
- ]
199
- });
202
+ ]
203
+ });
204
+ }
205
+ } else {
206
+ result = await aiEmployee.invoke({ userMessages, signal: abortHandle.signal });
200
207
  }
201
- } else {
202
- result = await aiEmployee.invoke({ userMessages, signal: abortHandle.signal });
208
+ } catch (error) {
209
+ if (!isGraphRecursionError(error) || recoveredFromGraphRecursion) {
210
+ throw error;
211
+ }
212
+ recoveredFromGraphRecursion = true;
213
+ processor.logger.warn(`ai employee invoke reached graph recursion limit, trying workflow output recovery`, {
214
+ node: node.id,
215
+ stack: error.stack,
216
+ chatOptions: node.config
217
+ });
218
+ const latestMessage = await this.workflow.db.getRepository("aiConversations.messages", conversation.sessionId).findOne({
219
+ sort: ["-messageId"]
220
+ });
221
+ const recoveryAIEmployee = new import_ai_employee.AIEmployee({
222
+ ctx: {
223
+ ...aiEmployeeContext,
224
+ action: {
225
+ params: {
226
+ values: {
227
+ ...aiEmployeeActionValues,
228
+ important: "GraphRecursionError"
229
+ }
230
+ }
231
+ }
232
+ },
233
+ employee,
234
+ sessionId: conversation.sessionId,
235
+ systemMessage,
236
+ skillSettings,
237
+ webSearch,
238
+ model: resolvedModel,
239
+ tools: [{ name: toolName }]
240
+ });
241
+ abortHandle.throwIfAborted();
242
+ result = await recoveryAIEmployee.invoke({
243
+ messageId: latestMessage == null ? void 0 : latestMessage.messageId,
244
+ signal: abortHandle.signal
245
+ });
203
246
  }
204
247
  abortHandle.throwIfAborted();
205
248
  isToolInvoke = result.messages.filter((it) => it.type === "ai").flatMap((it) => it.tool_calls).some((it) => it.name === toolName);
@@ -464,6 +507,9 @@ async function parseAssignees(node, processor) {
464
507
  }
465
508
  return assignees;
466
509
  }
510
+ function isGraphRecursionError(error) {
511
+ return typeof error === "object" && error !== null && ("name" in error || "lc_error_code" in error) && (error.name === "GraphRecursionError" || error.lc_error_code === "GRAPH_RECURSION_LIMIT");
512
+ }
467
513
  // Annotate the CommonJS export names for ESM import in node:
468
514
  0 && (module.exports = {
469
515
  AIEmployeeInstruction,
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-alpha.2",
9
+ "version": "2.2.0-alpha.4",
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",
@@ -41,6 +41,7 @@
41
41
  "@langchain/google-genai": "2.1.18",
42
42
  "@langchain/langgraph": "1.4.4",
43
43
  "@langchain/langgraph-checkpoint": "1.1.2",
44
+ "@langchain/mistralai": "1.0.0",
44
45
  "@langchain/ollama": "1.2.7",
45
46
  "@langchain/openai": "1.4.7",
46
47
  "@langchain/xai": "1.3.19",
@@ -65,5 +66,5 @@
65
66
  "keywords": [
66
67
  "AI"
67
68
  ],
68
- "gitHead": "9dd5224bb8f6c1ac12d766b9f175bdc29bddd845"
69
+ "gitHead": "81bf8733db4bccf08a6bc5e6d97f274bce349161"
69
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=self.webpackChunk_nocobase_plugin_ai||[]).push([["559"],{6482:function(e,t,n){n.r(t),n.d(t,{Settings:function(){return _},useProviderSettingsForm:function(){return U},LLMServices:function(){return z},ProviderSelect:function(){return q}});var r=n(3342),o=n(9155),i=n.n(o),l=n(4442),a=n(3079),c=n(2059),s=n(7375),u={name:"llmServices",fields:[{name:"name",type:"uid",primaryKey:!0},{name:"title",type:"string",interface:"input",uiSchema:{title:'{{t("Title")}}',"x-component":"Input"}},{name:"provider",type:"string",interface:"select",uiSchema:{title:'{{t("Provider")}}',"x-component":"Select"}},{name:"options",type:"jsonb"},{name:"enabledModels",type:"json",defaultValue:{mode:"recommended",models:[]}},{name:"enabled",type:"boolean",defaultValue:!0},{name:"modelOptions",type:"jsonb",defaultValue:{temperature:1,topP:1,frequencyPenalty:0,presencePenalty:0}}]},p={type:"void",properties:{drawer:{type:"void",title:'{{ t("Add new") }}',"x-component":"Action.Drawer","x-decorator":"FormV2","x-use-decorator-props":"useCreateFormProps",properties:{provider:{type:"string","x-decorator":"FormItem",title:'{{ t("Provider") }}',"x-component":"ProviderSelect",required:!0},title:{type:"string","x-decorator":"FormItem",title:'{{ t("Title") }}',"x-component":"Input","x-reactions":{dependencies:["provider"],when:"{{!$self.modified}}",fulfill:{state:{value:"{{$getProviderLabel($deps[0])}}"},schema:{"x-visible":"{{!!$deps[0]}}"}}}},options:{type:"object","x-component":"Settings","x-reactions":{dependencies:["provider"],fulfill:{schema:{"x-visible":"{{!!$deps[0]}}"}}}},"options.baseURL":{type:"string","x-decorator":"FormItem",title:'{{ t("Base URL") }}',"x-component":"TextAreaWithGlobalScope","x-component-props":{placeholder:'{{ t("Base URL is optional, leave blank to use default (recommended)") }}'},"x-reactions":{dependencies:["provider"],fulfill:{schema:{"x-visible":"{{!!$deps[0]}}"}}}},enabledModels:{type:"object","x-decorator":"FormItem",title:'{{ t("Enabled Models") }}',"x-component":"EnabledModelsSelect","x-reactions":{dependencies:["provider"],fulfill:{schema:{"x-visible":"{{!!$deps[0]}}"}}}},footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{testFlight:{type:"void","x-component":"LLMTestFlight","x-reactions":{dependencies:["provider"],fulfill:{schema:{"x-visible":"{{!!$deps[0]}}"}}}},cancel:{title:'{{ t("Cancel") }}',"x-component":"Action","x-use-component-props":"useCancelActionProps"},submit:{title:'{{ t("Submit") }}',"x-component":"Action","x-component-props":{type:"primary"},"x-use-component-props":"useCreateActionProps"}}}}}}},d={type:"void",name:"llm-services",properties:{card:{type:"void","x-component":"CardItem","x-component-props":{heightMode:"fullHeight"},"x-decorator":"TableBlockProvider","x-decorator-props":{collection:"llmServices",action:"list",rowKey:"name",dragSort:!0,dragSortBy:"sort"},properties:{actions:{type:"void","x-component":"ActionBar","x-component-props":{style:{marginBottom:20}},properties:{refresh:{title:"{{t('Refresh')}}","x-component":"Action","x-use-component-props":"useRefreshActionProps","x-component-props":{icon:"ReloadOutlined"}},bulkDelete:{title:"{{t('Delete')}}","x-action":"destroy","x-component":"Action","x-use-component-props":"useBulkDestroyActionProps","x-component-props":{icon:"DeleteOutlined",confirm:{title:"{{t('Delete record')}}",content:"{{t('Are you sure you want to delete it?')}}"}}},add:{type:"void","x-component":"AddNew",title:"{{t('Add new')}}","x-align":"right"}}},table:{type:"array","x-component":"TableV2","x-use-component-props":"useTableBlockProps","x-component-props":{rowKey:"name",rowSelection:{type:"checkbox"}},properties:{column1:{type:"void",title:'{{ t("UID") }}',"x-component":"TableV2.Column",properties:{name:{type:"string","x-component":"Input","x-read-pretty":!0}}},column2:{type:"void",title:'{{ t("Title") }}',"x-component":"TableV2.Column",properties:{title:{type:"string","x-component":"Input","x-read-pretty":!0}}},column3:{type:"void",title:'{{ t("Provider") }}',"x-component":"TableV2.Column",properties:{provider:{type:"string","x-component":"Select","x-read-pretty":!0,enum:"{{ providers }}"}}},column4:{type:"void",title:'{{ t("Enabled") }}',"x-component":"TableV2.Column",properties:{enabled:{type:"boolean","x-component":"EnabledSwitch"}}},column5:{type:"void",title:'{{ t("Actions") }}',"x-decorator":"TableV2.Column.ActionBar","x-component":"TableV2.Column",properties:{actions:{type:"void","x-component":"Space","x-component-props":{split:"|"},properties:{edit:{type:"void",title:'{{ t("Edit") }}',"x-action":"update","x-component":"Action.Link","x-component-props":{openMode:"drawer"},properties:{drawer:{type:"void",title:'{{ t("Edit record") }}',"x-component":"Action.Drawer","x-decorator":"FormV2","x-use-decorator-props":"useEditFormProps",properties:{provider:{type:"string","x-decorator":"FormItem",title:'{{ t("Provider") }}',"x-component":"ProviderDisplay"},title:{type:"string","x-decorator":"FormItem",title:'{{ t("Title") }}',"x-component":"Input"},options:{type:"object","x-component":"Settings"},"options.baseURL":{type:"string","x-decorator":"FormItem",title:'{{ t("Base URL") }}',"x-component":"TextAreaWithGlobalScope","x-component-props":{placeholder:'{{ t("Base URL is optional, leave blank to use default (recommended)") }}'}},enabledModels:{type:"object","x-decorator":"FormItem",title:'{{ t("Enabled Models") }}',"x-component":"EnabledModelsSelect"},footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{testFlight:{type:"void","x-component":"LLMTestFlight"},cancel:{title:'{{ t("Cancel") }}',"x-component":"Action","x-use-component-props":"useCancelActionProps"},submit:{title:'{{ t("Submit") }}',"x-component":"Action","x-component-props":{type:"primary"},"x-use-component-props":"useEditActionProps"}}}}}}},destroy:{type:"void",title:'{{ t("Delete") }}',"x-action":"destroy","x-component":"Action.Link","x-use-component-props":"useDestroyActionProps","x-component-props":{confirm:{title:"{{t('Delete record')}}",content:"{{t('Are you sure you want to delete it?')}}"}}}}}}}}}}}}},m=n(284),f=n(5230),y=n(9452),v=n(166),b=n(6759),x=n(5555),h={type:"object",properties:{temperature:{type:"number",title:'{{t("Temperature")}}',description:'{{t("Temperature description")}}',"x-decorator":"FormItem","x-component":"Slider","x-component-props":{min:0,max:2,step:.1},default:1},maxTokens:{type:"number",title:'{{t("Max tokens")}}',description:'{{t("Max completion tokens description")}}',"x-decorator":"FormItem","x-component":"InputNumber","x-component-props":{min:1,max:128e3,placeholder:'{{t("Leave empty for no limit")}}'}},topP:{type:"number",title:'{{t("Top P")}}',description:'{{t("Top P description")}}',"x-decorator":"FormItem","x-component":"Slider","x-component-props":{min:0,max:1,step:.1},default:1},frequencyPenalty:{type:"number",title:'{{t("Frequency penalty")}}',description:'{{t("Frequency penalty description")}}',"x-decorator":"FormItem","x-component":"Slider","x-component-props":{min:-2,max:2,step:.1},default:0},presencePenalty:{type:"number",title:'{{t("Presence penalty")}}',description:'{{t("Presence penalty description")}}',"x-decorator":"FormItem","x-component":"Slider","x-component-props":{min:-2,max:2,step:.1},default:0}}},g=function(){var e=(0,a.kj)();return i().createElement(c.Collapse,{bordered:!1,size:"small",style:{marginTop:16},items:[{key:"modelOptions",label:e("Model options"),forceRender:!0,children:i().createElement(r.SchemaComponent,{schema:h,scope:{t:e}})}]})},P=n(7330);function S(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function A(e,t,n,r,o,i,l){try{var a=e[i](l),c=a.value}catch(e){n(e);return}a.done?t(c):Promise.resolve(c).then(r,o)}function w(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function l(e){A(i,r,o,l,a,"next",e)}function a(e){A(i,r,o,l,a,"throw",e)}l(void 0)})}}function k(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}function C(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t.push.apply(t,n)}return t})(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function E(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],l=!0,a=!1;try{for(o=o.call(e);!(l=(n=o.next()).done)&&(i.push(n.value),!t||i.length!==t);l=!0);}catch(e){a=!0,r=e}finally{try{l||null==o.return||o.return()}finally{if(a)throw r}}return i}}(e,t)||O(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function O(e,t){if(e){if("string"==typeof e)return S(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return S(e,t)}}function M(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},l=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),a=Object.defineProperty;return a(l,"next",{value:c(0)}),a(l,"throw",{value:c(1)}),a(l,"return",{value:c(2)}),"function"==typeof Symbol&&a(l,Symbol.iterator,{value:function(){return this}}),l;function c(a){return function(c){var s=[a,c];if(n)throw TypeError("Generator is already executing.");for(;l&&(l=0,s[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&s[0]?r.return:s[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,s[1])).done)return o;switch(r=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,r=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===s[0]||2===s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],r=0}finally{n=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}}}var L=(0,o.createContext)({autoOpen:!1,setAutoOpen:function(){}}),I=function(){return{form:(0,o.useMemo)(function(){return(0,y.createForm)({initialValues:{name:"v_".concat((0,v.uid)())}})},[])}},F=function(){var e=(0,r.useCollectionRecordData)();return{form:(0,o.useMemo)(function(){return(0,y.createForm)({initialValues:e})},[e])}},T=function(){var e=(0,r.useActionContext)().setVisible;return{type:"default",onClick:function(){e(!1)}}},j=function(){var e=(0,r.useActionContext)().setVisible,t=c.App.useApp().message,n=(0,f.useForm)(),o=(0,r.useDataBlockResource)(),i=(0,r.useDataBlockRequest)().refresh,l=(0,a.kj)(),s=(0,P.M)();return{type:"primary",onClick:function(){return w(function(){var r;return M(this,function(a){switch(a.label){case 0:return[4,n.submit()];case 1:return a.sent(),r=n.values,[4,o.create({values:r})];case 2:return a.sent(),i(),s.refreshLLMServices(),t.success(l("Saved successfully")),e(!1),[2]}})})()}}},D=function(){var e=(0,r.useActionContext)().setVisible,t=c.App.useApp().message,n=(0,f.useForm)(),o=(0,r.useDataBlockResource)(),i=(0,r.useDataBlockRequest)().refresh,l=(0,r.useCollection)().getFilterTargetKey(),s=(0,a.kj)(),u=(0,P.M)();return{type:"primary",onClick:function(){return w(function(){var r;return M(this,function(a){switch(a.label){case 0:return[4,n.submit()];case 1:return a.sent(),r=n.values,[4,o.update({values:r,filterByTk:r[l]})];case 2:return a.sent(),i(),u.refreshLLMServices(),t.success(s("Saved successfully")),e(!1),n.reset(),[2]}})})()}}},B={"google-genai":"Gemini",openai:"GPT","openai-completions":"Recommended for third-party OpenAI-compatible APIs (OpenRouter, Groq, Together AI, etc.)",anthropic:"Claude",deepseek:"DeepSeek",dashscope:"Qwen (Tongyi)",kimi:"Kimi",xai:"Grok models by xAI",ollama:"Local models",mimo:"Xiaomi MIMO"},R=["google-genai","openai","anthropic","deepseek","dashscope","kimi","openai-completions","ollama"],V=function(){var e=(0,f.useField)(),t=(0,m.Pq)().find(function(t){return t.value===e.value});return i().createElement("span",null,(null==t?void 0:t.label)||e.value)},q=function(){var e=c.theme.useToken().token,t=(0,f.useField)(),n=(0,m.Pq)(),r=(0,a.kj)(),o=((function(e){if(Array.isArray(e))return S(e)})(n)||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(n)||O(n)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()).sort(function(e,t){var n=R.indexOf(e.value),r=R.indexOf(t.value);return(n<0?1/0:n)-(r<0?1/0:r)}).map(function(t){var n=B[t.value],o=n?r(n):"",l=t.supportedModel||[],a=[l.includes("LLM")?"LLM":null,l.includes("EMBEDDING")?"EMBEDDING":null].filter(Boolean);return{value:t.value,label:i().createElement("div",null,i().createElement("div",{style:{fontWeight:500}},t.label),i().createElement("div",{style:{fontSize:e.fontSizeSM,color:e.colorTextTertiary,lineHeight:1.4,display:"flex",alignItems:"center",justifyContent:"space-between",gap:e.marginXS}},i().createElement("span",null,o),i().createElement("span",{style:{display:"inline-flex",alignItems:"center",gap:e.marginXXS,flexWrap:"wrap"}},a.map(function(e){return i().createElement(c.Tag,{key:e,bordered:!1,color:"default",style:{marginInlineEnd:0,paddingInline:6,lineHeight:"18px",height:18,fontSize:11}},e)})))),selectedLabel:t.label}});return i().createElement(c.Select,{value:t.value,onChange:function(e){return t.value=e},options:o,optionLabelProp:"selectedLabel",style:{width:"100%"},listHeight:400})},N=(0,f.observer)(function(){var e=(0,f.useField)(),t=(0,r.useCollectionRecordData)(),n=(0,r.useDataBlockResource)(),o=(0,r.useDataBlockRequest)().refresh,l=(0,r.useCollection)().getFilterTargetKey(),a=!1!==e.value,s=(0,P.M)();return i().createElement(c.Switch,{size:"small",checked:a,onChange:function(r){return w(function(){return M(this,function(i){switch(i.label){case 0:return e.value=r,[4,n.update({values:{enabled:r},filterByTk:t[l]})];case 1:return i.sent(),o(),s.refreshLLMServices(),[2]}})})()}})},{displayName:"EnabledSwitch"}),$=function(){var e=(0,r.useDestroyActionProps)(),t=(0,P.M)();return C(k({},e),{onClick:function(n,r){return w(function(){return M(this,function(o){switch(o.label){case 0:return[4,e.onClick(n,r)];case 1:return o.sent(),t.refreshLLMServices(),[2]}})})()}})},G=function(){var e=(0,r.useBulkDestroyActionProps)(),t=(0,P.M)();return C(k({},e),{onClick:function(n,r){return w(function(){return M(this,function(o){switch(o.label){case 0:return[4,e.onClick(n,r)];case 1:return o.sent(),t.refreshLLMServices(),[2]}})})()}})},K=function(){var e=(0,a.kj)(),t=E((0,o.useState)(!1),2),n=t[0],l=t[1],u=E((0,o.useState)(0),2),d=u[0],f=u[1],y=(0,m.Pq)(),v=(0,o.useContext)(L),h=v.autoOpen,P=v.setAutoOpen;return(0,o.useEffect)(function(){h&&(f(function(e){return e+1}),l(!0),P(!1),window.history.replaceState({},document.title))},[h,P]),i().createElement(r.ActionContextProvider,{value:{visible:n,setVisible:l}},i().createElement(c.Button,{icon:i().createElement(s.PlusOutlined,null),type:"primary",onClick:function(){f(function(e){return e+1}),l(!0)}},e("Add new")),i().createElement(r.SchemaComponent,{key:d,components:{LLMTestFlight:b.e,EnabledModelsSelect:x.uQ,ProviderSelect:q,ModelOptionsSettings:g},scope:{useCreateFormProps:I,providers:y,$getProviderLabel:function(e){var t=y.find(function(t){return t.value===e});return(null==t?void 0:t.label)||e}},schema:p}))},U=function(e){var t,n=(0,r.usePlugin)("ai").aiManager.llmProviders.get(e);return null==n||null==(t=n.components)?void 0:t.ProviderSettingsForm},_=(0,f.observer)(function(){var e=(0,f.useForm)(),t=(0,r.useCollectionRecordData)(),n=U(e.values.provider||t.provider);return n?i().createElement(n,null):null},{displayName:"LLMProviderSettings"}),z=function(){var e=(0,a.kj)(),t=E((0,o.useState)([]),2),n=t[0],c=t[1],s=(0,r.useAPIClient)(),p=(0,l.useLocation)(),y=E((0,o.useState)(!1),2),v=y[0],h=y[1];return(0,o.useEffect)(function(){var e=p.state;(null==e?void 0:e.autoOpenAddNew)&&h(!0)},[p.state]),(0,r.useRequest)(function(){return s.resource("ai").listLLMProviders().then(function(t){var n;return((null==t||null==(n=t.data)?void 0:n.data)||[]).map(function(t){return{key:t.name,label:f.Schema.compile(t.title||t.name,{t:e}),value:t.name,supportedModel:t.supportedModel}})})},{onSuccess:function(e){c(e)}}),i().createElement(L.Provider,{value:{autoOpen:v,setAutoOpen:h}},i().createElement(m.PL.Provider,{value:{providers:n}},i().createElement(r.ExtendCollectionsProvider,{collections:[u]},i().createElement(r.SchemaComponent,{schema:d,components:{AddNew:K,Settings:_,LLMTestFlight:b.e,EnabledModelsSelect:x.uQ,ProviderDisplay:V,ModelOptionsSettings:g,EnabledSwitch:N},scope:{t:e,providers:n,useEditFormProps:F,useCancelActionProps:T,useCreateActionProps:j,useEditActionProps:D,useDestroyActionProps:$,useBulkDestroyActionProps:G}}))))}},6759:function(e,t,n){n.d(t,{e:function(){return f}});var r=n(5230),o=n(3342),i=n(9155),l=n.n(i),a=n(2059),c=n(7375),s=n(1931),u=n(5555),p=n(3079);function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function m(e,t,n,r,o,i,l){try{var a=e[i](l),c=a.value}catch(e){n(e);return}a.done?t(c):Promise.resolve(c).then(r,o)}var f=(0,r.observer)(function(){var e,t=(0,p.kj)(),n=(0,r.useForm)(),f=(0,o.useAPIClient)(),y=a.App.useApp().message,v=function(e){if(Array.isArray(e))return e}(e=(0,i.useState)(!1))||function(e){var t,n,r=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var o=[],i=!0,l=!1;try{for(r=r.call(e);!(i=(t=r.next()).done)&&(o.push(t.value),2!==o.length);i=!0);}catch(e){l=!0,n=e}finally{try{i||null==r.return||r.return()}finally{if(l)throw n}}return o}}(e)||function(e){if(e){if("string"==typeof e)return d(e,2);var t=Object.prototype.toString.call(e).slice(8,-1);if("Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t)return Array.from(t);if("Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return d(e,2)}}(e)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),b=v[0],x=v[1];return l().createElement(a.Tooltip,{title:t("Test connection with the configured API Key")},l().createElement(a.Button,{icon:l().createElement(c.RocketOutlined,null),loading:b,onClick:function(){var e;return(e=function(){var e,r,o,i,l,a,c,p,d;return function(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},l=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),a=Object.defineProperty;return a(l,"next",{value:c(0)}),a(l,"throw",{value:c(1)}),a(l,"return",{value:c(2)}),"function"==typeof Symbol&&a(l,Symbol.iterator,{value:function(){return this}}),l;function c(a){return function(c){var s=[a,c];if(n)throw TypeError("Generator is already executing.");for(;l&&(l=0,s[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&s[0]?r.return:s[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,s[1])).done)return o;switch(r=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,r=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===s[0]||2===s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],r=0}finally{n=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}}}(this,function(m){switch(m.label){case 0:if(r=(e=n.values).provider,o=e.options,i=e.enabledModels,"ollama"!==r&&!(null==o?void 0:o.apiKey))return y.warning(t("Please fill in the API Key first")),[2];if("recommended"===(l=(0,u.lf)(i)).mode){if(0===(c=(0,s.sN)(r)).length)return y.warning(t("Please configure enabled models first")),[2];a=c[0].value}else{if(0===l.models.length)return y.warning(t("Please configure enabled models first")),[2];a=l.models[0].value}x(!0),m.label=1;case 1:return m.trys.push([1,3,4,5]),[4,f.resource("ai").testFlight({values:{provider:r,options:o,model:a}})];case 2:return 0!==(p=m.sent()).data.data.code?y.error(p.data.data.message||t("Failure")):y.success(t("Successful")),[3,5];case 3:return d=m.sent(),y.error(d.message||t("Failure")),[3,5];case 4:return x(!1),[7];case 5:return[2]}})},function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function l(e){m(i,r,o,l,a,"next",e)}function a(e){m(i,r,o,l,a,"throw",e)}l(void 0)})})()}},t("Test flight")))})},284:function(e,t,n){n.d(t,{PL:function(){return o},Pq:function(){return i}});var r=n(9155);(0,r.createContext)({provider:""}).displayName="LLMProvidersContext";var o=(0,r.createContext)({providers:[]});o.displayName="LLMProviderssContext";var i=function(){return(0,r.useContext)(o).providers}}}]);