@nocobase/plugin-ai 2.1.0-beta.37 → 2.1.0-beta.38
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/api/cli/app/index.md +4 -4
- package/dist/ai/docs/nocobase/api/cli/app/restart.md +4 -2
- package/dist/ai/docs/nocobase/api/cli/app/start.md +6 -2
- package/dist/ai/docs/nocobase/api/cli/app/stop.md +2 -2
- package/dist/ai/docs/nocobase/api/cli/app/upgrade.md +27 -6
- package/dist/ai/docs/nocobase/api/cli/license/plugins/sync.md +4 -0
- package/dist/ai/docs/nocobase/file-manager/file-preview/index.md +17 -0
- package/dist/client/559.a0f2f1cc2be3c039.js +10 -0
- package/dist/client/index.js +1 -1
- package/dist/externalVersion.js +20 -20
- package/dist/node_modules/@langchain/xai/dist/index.cjs +16 -2
- 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.d.ts +2 -1
- package/dist/server/ai-employees/ai-employee.js +3 -1
- package/dist/server/llm-providers/provider.js +6 -2
- package/dist/server/utils.d.ts +1 -1
- package/dist/server/workflow/nodes/employee/constants.d.ts +23 -0
- package/dist/server/workflow/nodes/employee/constants.js +50 -0
- package/dist/server/workflow/nodes/employee/handler.js +23 -2
- package/dist/server/workflow/nodes/employee/index.d.ts +1 -0
- package/dist/server/workflow/nodes/employee/index.js +83 -25
- package/dist/server/workflow/nodes/employee/tools.d.ts +2 -2
- package/dist/server/workflow/nodes/employee/tools.js +26 -5
- package/dist/server/workflow/nodes/employee/types.d.ts +2 -1
- package/dist/server/workflow/nodes/llm/index.js +31 -9
- package/package.json +7 -7
- package/dist/client/559.585f80c3bcea0bed.js +0 -10
|
@@ -30,6 +30,7 @@ __export(tools_exports, {
|
|
|
30
30
|
});
|
|
31
31
|
module.exports = __toCommonJS(tools_exports);
|
|
32
32
|
var import_plugin_workflow = require("@nocobase/plugin-workflow");
|
|
33
|
+
var import_constants = require("./constants");
|
|
33
34
|
const getWorkflowTasks = (plugin) => async (register, filter) => {
|
|
34
35
|
if (!(filter == null ? void 0 : filter.sessionId)) {
|
|
35
36
|
return;
|
|
@@ -68,7 +69,7 @@ const getWorkflowTasks = (plugin) => async (register, filter) => {
|
|
|
68
69
|
},
|
|
69
70
|
additionalProperties: false
|
|
70
71
|
};
|
|
71
|
-
if (config.requiresApproval ===
|
|
72
|
+
if (config.requiresApproval === import_constants.REQUIRES_APPROVAL.AI_DECISION) {
|
|
72
73
|
schema.properties.requiresApproval = {
|
|
73
74
|
type: "boolean",
|
|
74
75
|
description: `This field is mandatory.
|
|
@@ -83,7 +84,7 @@ const getWorkflowTasks = (plugin) => async (register, filter) => {
|
|
|
83
84
|
}
|
|
84
85
|
register.registerTools({
|
|
85
86
|
scope: "SPECIFIED",
|
|
86
|
-
defaultPermission: config.requiresApproval !==
|
|
87
|
+
defaultPermission: config.requiresApproval !== import_constants.REQUIRES_APPROVAL.NO_REQUIRED ? "ASK" : "ALLOW",
|
|
87
88
|
from: "workflow",
|
|
88
89
|
definition: {
|
|
89
90
|
name: "aiEmployeeWorkflowTaskOutput",
|
|
@@ -93,6 +94,26 @@ const getWorkflowTasks = (plugin) => async (register, filter) => {
|
|
|
93
94
|
schema
|
|
94
95
|
},
|
|
95
96
|
invoke: async (_ctx, args) => {
|
|
97
|
+
const executionExpired = await workflowPlugin.abortExecutionIfExpired(execution);
|
|
98
|
+
const latestExecution = executionExpired ? execution : await plugin.db.getRepository("executions").findByTargetKey(task.executionId);
|
|
99
|
+
if (executionExpired) {
|
|
100
|
+
await plugin.db.getRepository("aiWorkflowTasks").update({
|
|
101
|
+
values: {
|
|
102
|
+
status: import_constants.AI_WORKFLOW_TASK_STATUS.ABORTED
|
|
103
|
+
},
|
|
104
|
+
filter: {
|
|
105
|
+
id: task.id,
|
|
106
|
+
status: {
|
|
107
|
+
$in: [import_constants.AI_WORKFLOW_TASK_STATUS.PROCESSING, import_constants.AI_WORKFLOW_TASK_STATUS.PENDING_ACCEPTANCE]
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
if (executionExpired || !latestExecution || latestExecution.status !== import_plugin_workflow.EXECUTION_STATUS.STARTED) {
|
|
113
|
+
return {
|
|
114
|
+
status: "success"
|
|
115
|
+
};
|
|
116
|
+
}
|
|
96
117
|
const job = await plugin.db.getModel("jobs").findByPk(task.jobId);
|
|
97
118
|
if (!job) {
|
|
98
119
|
return {
|
|
@@ -100,19 +121,19 @@ const getWorkflowTasks = (plugin) => async (register, filter) => {
|
|
|
100
121
|
message: "job not existed"
|
|
101
122
|
};
|
|
102
123
|
}
|
|
103
|
-
if (job.status
|
|
124
|
+
if (job.status !== import_plugin_workflow.JOB_STATUS.PENDING) {
|
|
104
125
|
return {
|
|
105
126
|
status: "success"
|
|
106
127
|
};
|
|
107
128
|
}
|
|
108
129
|
await plugin.db.getRepository("aiWorkflowTasks").update({
|
|
109
130
|
values: {
|
|
110
|
-
status:
|
|
131
|
+
status: import_constants.AI_WORKFLOW_TASK_STATUS.APPROVED
|
|
111
132
|
},
|
|
112
133
|
filter: {
|
|
113
134
|
id: task.id,
|
|
114
135
|
status: {
|
|
115
|
-
$ne:
|
|
136
|
+
$ne: import_constants.AI_WORKFLOW_TASK_STATUS.ABORTED
|
|
116
137
|
}
|
|
117
138
|
}
|
|
118
139
|
});
|
|
@@ -6,6 +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 { RequiresApproval } from './constants';
|
|
9
10
|
export type AIEmployeeInstructionConfig = {
|
|
10
11
|
username: string;
|
|
11
12
|
message: {
|
|
@@ -24,7 +25,7 @@ export type AIEmployeeInstructionConfig = {
|
|
|
24
25
|
llmService: string;
|
|
25
26
|
model: string;
|
|
26
27
|
};
|
|
27
|
-
requiresApproval?:
|
|
28
|
+
requiresApproval?: RequiresApproval;
|
|
28
29
|
assignees?: string[];
|
|
29
30
|
userId: string;
|
|
30
31
|
files: AIEmployeeInstructionFiles[];
|
|
@@ -80,15 +80,26 @@ class LLMInstruction extends import_plugin_workflow.Instruction {
|
|
|
80
80
|
upstreamId: (input == null ? void 0 : input.id) ?? null
|
|
81
81
|
});
|
|
82
82
|
const parsedMessages = await (0, import_parse_messages.parseMessages)(messages);
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
83
|
+
const abortHandle = processor.createBackgroundAbortHandle();
|
|
84
|
+
provider.invoke(
|
|
85
|
+
{
|
|
86
|
+
messages: parsedMessages,
|
|
87
|
+
structuredOutput
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
signal: abortHandle.signal
|
|
91
|
+
}
|
|
92
|
+
).then(async (aiMsg) => {
|
|
93
|
+
abortHandle.throwIfAborted();
|
|
87
94
|
let raw = aiMsg;
|
|
88
95
|
if (aiMsg.raw) {
|
|
89
96
|
raw = aiMsg.raw;
|
|
90
97
|
}
|
|
91
|
-
job.
|
|
98
|
+
const pendingJob = await processor.findPendingJob(job.id);
|
|
99
|
+
if (!pendingJob) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
pendingJob.set({
|
|
92
103
|
status: import_plugin_workflow.JOB_STATUS.RESOLVED,
|
|
93
104
|
result: {
|
|
94
105
|
id: raw.id,
|
|
@@ -99,20 +110,31 @@ class LLMInstruction extends import_plugin_workflow.Instruction {
|
|
|
99
110
|
structuredContent: aiMsg.parsed
|
|
100
111
|
}
|
|
101
112
|
});
|
|
102
|
-
|
|
113
|
+
setImmediate(() => {
|
|
114
|
+
this.workflow.resume(pendingJob);
|
|
115
|
+
});
|
|
116
|
+
}).catch(async (e) => {
|
|
117
|
+
if ((0, import_plugin_workflow.isWorkflowTimeoutError)(e) || abortHandle.signal.aborted) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
103
120
|
processor.logger.error(`llm invoke failed, ${e.message}`, {
|
|
104
121
|
node: node.id,
|
|
105
122
|
stack: e.stack,
|
|
106
123
|
chatOptions: import_lodash.default.omit(chatOptions, "messages")
|
|
107
124
|
});
|
|
108
|
-
job.
|
|
125
|
+
const pendingJob = await processor.findPendingJob(job.id);
|
|
126
|
+
if (!pendingJob) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
pendingJob.set({
|
|
109
130
|
status: import_plugin_workflow.JOB_STATUS.ERROR,
|
|
110
131
|
result: e.message
|
|
111
132
|
});
|
|
112
|
-
}).finally(() => {
|
|
113
133
|
setImmediate(() => {
|
|
114
|
-
this.workflow.resume(
|
|
134
|
+
this.workflow.resume(pendingJob);
|
|
115
135
|
});
|
|
136
|
+
}).finally(() => {
|
|
137
|
+
abortHandle.dispose();
|
|
116
138
|
});
|
|
117
139
|
processor.logger.trace(`llm invoke, waiting for response...`, {
|
|
118
140
|
node: node.id
|
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.1.0-beta.
|
|
9
|
+
"version": "2.1.0-beta.38",
|
|
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",
|
|
@@ -34,13 +34,13 @@
|
|
|
34
34
|
"@dicebear/core": "^9.2.3",
|
|
35
35
|
"@dicebear/notionists": "^9.2.3",
|
|
36
36
|
"@langchain/anthropic": "^1.3.17",
|
|
37
|
-
"@langchain/community": "
|
|
38
|
-
"@langchain/core": "
|
|
37
|
+
"@langchain/community": "~1.1.18",
|
|
38
|
+
"@langchain/core": "~1.1.27",
|
|
39
39
|
"@langchain/deepseek": "^1.0.11",
|
|
40
40
|
"@langchain/google-genai": "^2.1.18",
|
|
41
|
-
"@langchain/langgraph": "
|
|
41
|
+
"@langchain/langgraph": "~1.1.4",
|
|
42
42
|
"@langchain/langgraph-checkpoint": "^1.0.0",
|
|
43
|
-
"@langchain/ollama": "
|
|
43
|
+
"@langchain/ollama": "~1.2.7",
|
|
44
44
|
"@langchain/openai": "^1.2.7",
|
|
45
45
|
"@langchain/xai": "1.3.3",
|
|
46
46
|
"@nocobase/ai-employee-avatars": "^1.0.2",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"elkjs": "^0.10.0",
|
|
52
52
|
"jsonrepair": "3.13.1",
|
|
53
53
|
"just-bash": "^2.14.3",
|
|
54
|
-
"langchain": "
|
|
54
|
+
"langchain": "~1.2.24",
|
|
55
55
|
"nodejs-snowflake": "^2.0.1",
|
|
56
56
|
"react-markdown": "^10.1.0",
|
|
57
57
|
"react-syntax-highlighter": "^15.6.1",
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
"keywords": [
|
|
65
65
|
"AI"
|
|
66
66
|
],
|
|
67
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "d1c585108ff6e51c17b0b52bacb1a2d621d9c119"
|
|
68
68
|
}
|
|
@@ -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 G},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":"Input","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":"Input","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 I=(0,o.createContext)({autoOpen:!1,setAutoOpen:function(){}}),L=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])}},j=function(){var e=(0,r.useActionContext)().setVisible;return{type:"default",onClick:function(){e(!1)}}},T=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]}})})()}})},K=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]}})})()}})},U=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)(I),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:L,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}))},G=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=G(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(I.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:U,Settings:_,LLMTestFlight:b.e,EnabledModelsSelect:x.uQ,ProviderDisplay:V,ModelOptionsSettings:g,EnabledSwitch:N},scope:{t:e,providers:n,useEditFormProps:F,useCancelActionProps:j,useCreateActionProps:T,useEditActionProps:D,useDestroyActionProps:$,useBulkDestroyActionProps:K}}))))}},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}}}]);
|