@shenghuabi/workflow 1.1.4 → 1.1.6
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/index.d.ts +1 -0
- package/index.js +794 -918
- package/index.js.map +4 -4
- package/index.mjs +730 -851
- package/index.mjs.map +4 -4
- package/inline/inline.service.d.ts +1 -0
- package/inline/node/chat/main/index.d.ts +7 -12
- package/inline/node/chat/main/runner.d.ts +35 -0
- package/inline/node/chat/{chat.node.define.d.ts → node.define.d.ts} +3 -0
- package/inline/node/chat/util/useChat.d.ts +31 -0
- package/inline/node/index.browser.d.ts +2 -0
- package/inline/node/index.node.d.ts +2 -0
- package/inline/node/input-params/common.d.ts +2 -0
- package/inline/node/input-params/main/index.d.ts +29 -0
- package/inline/node/input-params/main/runner.d.ts +5 -0
- package/inline/node/input-params/node.define.d.ts +9 -0
- package/inline/node/input-params/webview/index.d.ts +2 -0
- package/inline/node/iteration/common.d.ts +2 -0
- package/inline/node/iteration/main/index.d.ts +29 -0
- package/inline/node/iteration/main/iteration-start.runner.d.ts +5 -0
- package/inline/node/iteration/main/runner.d.ts +6 -0
- package/inline/node/iteration/node.define.d.ts +11 -0
- package/inline/node/iteration/webview/index.d.ts +2 -0
- package/inline/node/text/main/index.d.ts +6 -11
- package/inline/node/text/main/runner.d.ts +14 -0
- package/inline/node/text/text.node.define.d.ts +2 -4
- package/module.d.ts +1 -3
- package/package.json +4 -3
- package/plugin/plugin.service.d.ts +1 -0
- package/preset/context-build.service.d.ts +2 -50
- package/runner/define.d.ts +3 -7
- package/runner/runner-item.d.ts +5 -20
- package/runner/workflow-runner.service.d.ts +9 -17
- package/share/common/const.d.ts +3 -2
- package/share/common/define.d.ts +3 -10
- package/share/const.d.ts +0 -1
- package/share/handle-node.d.ts +47 -18
- package/share/index.d.ts +0 -1
- package/share/index.js +27 -48
- package/share/index.js.map +4 -4
- package/share/index.mjs +25 -42
- package/share/index.mjs.map +3 -3
- package/share/type.d.ts +11 -29
- package/share/type2.d.ts +4 -8
- package/share/workflow.const.d.ts +1 -4
- package/test/util/chat-fixture.d.ts +44 -0
- package/test/util/text-input/common.d.ts +2 -0
- package/test/util/text-input/main/index.d.ts +25 -0
- package/test/util/text-input/main/runner.d.ts +6 -0
- package/test/util/text-input/text.node.define.d.ts +4 -0
- package/token.d.ts +8 -6
- package/type/type.d.ts +1 -1
- package/util/serialize-text-template.d.ts +16 -0
- package/webview/index.js +128 -41
- package/webview/index.js.map +4 -4
- package/webview/index.mjs +127 -43
- package/webview/index.mjs.map +4 -4
- package/workflow-exec.service.d.ts +14 -24
- package/workflow-parser.service.d.ts +0 -1
- package/inline/node/chat/main/llm.runner.d.ts +0 -41
- package/inline/node/text/main/textarea.runner.d.ts +0 -7
- package/preset/inline-build.service.d.ts +0 -11
- package/preset/inline-runner.service.d.ts +0 -16
- package/runner/inline-input-item.runner.d.ts +0 -8
- package/runner/input-params.runner.d.ts +0 -7
- package/runner/iteration-start.runner.d.ts +0 -7
- package/runner/iteration.runner.d.ts +0 -7
- package/runner/parameters.runner.d.ts +0 -10
- package/share/util.d.ts +0 -5
- package/test/chat.spec.d.ts +0 -1
- package/test/file.spec.d.ts +0 -1
- package/test/hello.spec.d.ts +0 -1
- package/test/plugin.spec.d.ts +0 -1
package/index.js
CHANGED
|
@@ -37,24 +37,22 @@ __export(workflow_exports, {
|
|
|
37
37
|
CurrentContextToken: () => CurrentContextToken,
|
|
38
38
|
CurrentNodeToken: () => CurrentNodeToken,
|
|
39
39
|
CurrentWorkflowToken: () => CurrentWorkflowToken,
|
|
40
|
-
DEFAULT_CHAT_SCHEMA_KEY: () => DEFAULT_CHAT_SCHEMA_KEY,
|
|
41
|
-
DEFAULT_INPUT_KEY: () => DEFAULT_INPUT_KEY,
|
|
42
40
|
EXAMPLES_DEFINE: () => EXAMPLES_DEFINE,
|
|
43
41
|
EnviromentParametersToken: () => EnviromentParametersToken,
|
|
44
42
|
HelpObj: () => HelpObj,
|
|
45
43
|
INLINE_Template: () => INLINE_Template,
|
|
46
44
|
INLINE_Template2: () => INLINE_Template2,
|
|
47
|
-
ITERATION_ITEM_SYMBOL: () => ITERATION_ITEM_SYMBOL,
|
|
48
45
|
InlineNodeService: () => InlineNodeService,
|
|
49
|
-
InputParamsToken: () => InputParamsToken,
|
|
50
46
|
InputsToken: () => InputsToken,
|
|
51
47
|
LLMDataDefine: () => LLMDataDefine,
|
|
52
48
|
ModelOptionsToken: () => ModelOptionsToken,
|
|
49
|
+
NodeContextToken: () => NodeContextToken,
|
|
50
|
+
NodeInputsToken: () => NodeInputsToken,
|
|
51
|
+
NodeParentMapToken: () => NodeParentMapToken,
|
|
53
52
|
NodeRunnerBase: () => NodeRunnerBase,
|
|
54
53
|
ParentContextToken: () => ParentContextToken,
|
|
55
|
-
|
|
54
|
+
RUNNER_ORIGIN_OUTPUT: () => RUNNER_ORIGIN_OUTPUT,
|
|
56
55
|
TemplateFormatService: () => TemplateFormatService,
|
|
57
|
-
UseInputToken: () => UseInputToken,
|
|
58
56
|
WORKFLOW_MODULE: () => WORKFLOW_MODULE,
|
|
59
57
|
WorkflowConfigToken: () => WorkflowConfigToken,
|
|
60
58
|
WorkflowEmitter: () => WorkflowEmitter,
|
|
@@ -69,14 +67,13 @@ __export(workflow_exports, {
|
|
|
69
67
|
createLLMData: () => createLLMData,
|
|
70
68
|
createResultData: () => createResultData,
|
|
71
69
|
flatFilterHandleList: () => flatFilterHandleList,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
llmModelConfig: () => llmModelConfig
|
|
70
|
+
llmModelConfig: () => llmModelConfig,
|
|
71
|
+
serializeLexicalTextarea: () => serializeLexicalTextarea
|
|
75
72
|
});
|
|
76
73
|
module.exports = __toCommonJS(workflow_exports);
|
|
77
74
|
|
|
78
75
|
// packages/workflow/workflow-parser.service.ts
|
|
79
|
-
var
|
|
76
|
+
var import_static_injector12 = require("static-injector");
|
|
80
77
|
var import_graphology = __toESM(require("graphology"), 1);
|
|
81
78
|
var import_react = require("@xyflow/react");
|
|
82
79
|
|
|
@@ -85,9 +82,6 @@ var WorkflowNodeType = /* @__PURE__ */ ((WorkflowNodeType2) => {
|
|
|
85
82
|
WorkflowNodeType2["iteration"] = "iteration";
|
|
86
83
|
WorkflowNodeType2["iterationStart"] = "iteration-start";
|
|
87
84
|
WorkflowNodeType2["inputParams"] = "input-params";
|
|
88
|
-
WorkflowNodeType2["serialize"] = "serialize";
|
|
89
|
-
WorkflowNodeType2["parameters"] = "parameters";
|
|
90
|
-
WorkflowNodeType2["inlineInputItem"] = "inlineInputItem";
|
|
91
85
|
return WorkflowNodeType2;
|
|
92
86
|
})(WorkflowNodeType || {});
|
|
93
87
|
|
|
@@ -126,6 +120,9 @@ var InlineNodeService = class {
|
|
|
126
120
|
getNodeRunner(type) {
|
|
127
121
|
return this.inlineList.find((item) => item.type === type)?.runner;
|
|
128
122
|
}
|
|
123
|
+
getNodeDefine(type) {
|
|
124
|
+
return this.inlineList.find((item) => item.type === type);
|
|
125
|
+
}
|
|
129
126
|
};
|
|
130
127
|
|
|
131
128
|
// packages/workflow/plugin/plugin.service.ts
|
|
@@ -148,29 +145,26 @@ var WorkflowPluginService = class {
|
|
|
148
145
|
getNodeRunner(type) {
|
|
149
146
|
return this.nodeList().find((item) => item.type === type).runner;
|
|
150
147
|
}
|
|
148
|
+
getNodeDefine(type) {
|
|
149
|
+
return this.nodeList().find((item) => item.type === type);
|
|
150
|
+
}
|
|
151
151
|
};
|
|
152
152
|
|
|
153
153
|
// packages/workflow/inline/node/index.node.ts
|
|
154
154
|
var index_node_exports = {};
|
|
155
155
|
__export(index_node_exports, {
|
|
156
156
|
ChatMainConfig: () => ChatMainConfig,
|
|
157
|
+
EntryMainConfig: () => EntryMainConfig,
|
|
158
|
+
IterationMainConfig: () => IterationMainConfig,
|
|
157
159
|
TextMainConfig: () => TextMainConfig
|
|
158
160
|
});
|
|
159
161
|
|
|
160
162
|
// packages/workflow/share/const.ts
|
|
161
|
-
var DEFAULT_INPUT_KEY = `[INPUT]`;
|
|
162
163
|
var HelpObj = {
|
|
163
164
|
templateVarLine: `- 变量定义格式: {{xx}},{{xx.yy}}`,
|
|
164
165
|
pathTodoLine: `- **TODO** 接收传入路径而不是指定`
|
|
165
166
|
};
|
|
166
167
|
|
|
167
|
-
// packages/workflow/share/util.ts
|
|
168
|
-
var import_uuid = require("uuid");
|
|
169
|
-
var UUID_NS = "404cfae8-94e7-41a6-acec-1037dd1fdaad";
|
|
170
|
-
function generateHandle(value, label = value) {
|
|
171
|
-
return { id: (0, import_uuid.v5)(value, UUID_NS), label, value };
|
|
172
|
-
}
|
|
173
|
-
|
|
174
168
|
// packages/workflow/share/common/examples.define.ts
|
|
175
169
|
var import_view_angular_core2 = require("@piying/view-angular-core");
|
|
176
170
|
var v = __toESM(require("valibot"), 1);
|
|
@@ -317,50 +311,48 @@ function llmModelConfig(item) {
|
|
|
317
311
|
}
|
|
318
312
|
|
|
319
313
|
// packages/workflow/share/common/const.ts
|
|
320
|
-
var
|
|
321
|
-
|
|
314
|
+
var RUNNER_ORIGIN_OUTPUT = [
|
|
315
|
+
{ id: "default", label: "默认", name: `default` }
|
|
316
|
+
];
|
|
322
317
|
|
|
323
318
|
// packages/workflow/share/type2.ts
|
|
324
|
-
var
|
|
325
|
-
var
|
|
326
|
-
var extraData =
|
|
327
|
-
references:
|
|
319
|
+
var import_uuid = require("uuid");
|
|
320
|
+
var v5 = __toESM(require("valibot"), 1);
|
|
321
|
+
var extraData = v5.looseObject({
|
|
322
|
+
references: v5.optional(v5.array(v5.custom(Boolean)))
|
|
328
323
|
});
|
|
329
|
-
var baseDataDefine =
|
|
330
|
-
node:
|
|
331
|
-
nodeResult:
|
|
332
|
-
dataId:
|
|
333
|
-
extra:
|
|
324
|
+
var baseDataDefine = v5.object({
|
|
325
|
+
node: v5.object({ type: v5.string(), id: v5.string() }),
|
|
326
|
+
nodeResult: v5.pipe(v5.optional(v5.boolean(), false)),
|
|
327
|
+
dataId: v5.optional(v5.string(), () => (0, import_uuid.v4)()),
|
|
328
|
+
extra: v5.optional(extraData)
|
|
334
329
|
});
|
|
335
|
-
var CommonDataDefine =
|
|
330
|
+
var CommonDataDefine = v5.object({
|
|
336
331
|
...baseDataDefine.entries,
|
|
337
|
-
value:
|
|
332
|
+
value: v5.any()
|
|
338
333
|
});
|
|
339
|
-
var LLMDataDefine =
|
|
334
|
+
var LLMDataDefine = v5.object({
|
|
340
335
|
...baseDataDefine.entries,
|
|
341
|
-
type:
|
|
336
|
+
type: v5.optional(v5.literal("chat-stream"), "chat-stream"),
|
|
342
337
|
// 用来进行普通查询
|
|
343
|
-
value:
|
|
344
|
-
extra:
|
|
338
|
+
value: v5.string(),
|
|
339
|
+
extra: v5.object({
|
|
345
340
|
...extraData.entries,
|
|
346
|
-
content:
|
|
347
|
-
thinkContent:
|
|
348
|
-
isThinking:
|
|
349
|
-
delta:
|
|
350
|
-
historyList:
|
|
341
|
+
content: v5.string(),
|
|
342
|
+
thinkContent: v5.optional(v5.string()),
|
|
343
|
+
isThinking: v5.optional(v5.boolean()),
|
|
344
|
+
delta: v5.string(),
|
|
345
|
+
historyList: v5.custom(Boolean)
|
|
351
346
|
})
|
|
352
347
|
});
|
|
353
348
|
function createLLMData(data) {
|
|
354
|
-
return
|
|
349
|
+
return v5.parse(LLMDataDefine, data);
|
|
355
350
|
}
|
|
356
351
|
function createResultData(data) {
|
|
357
|
-
const result =
|
|
352
|
+
const result = v5.parse(CommonDataDefine, data);
|
|
358
353
|
result.nodeResult = true;
|
|
359
354
|
return result;
|
|
360
355
|
}
|
|
361
|
-
function isChatStream(data) {
|
|
362
|
-
return !!data.extra && "content" in data.extra && "thinkContent" in data.extra;
|
|
363
|
-
}
|
|
364
356
|
|
|
365
357
|
// packages/workflow/share/workflow.emit.ts
|
|
366
358
|
var WorkflowEmitter = class {
|
|
@@ -405,31 +397,35 @@ var NODE_COMMON = {
|
|
|
405
397
|
"> 不清楚是否所有模型都遵循此规则,所以并没有限制输入"
|
|
406
398
|
].join("\n"),
|
|
407
399
|
// config: defineConfig,
|
|
408
|
-
inputs: [
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
],
|
|
419
|
-
outputs: [
|
|
400
|
+
// inputs: [
|
|
401
|
+
// [],
|
|
402
|
+
// [
|
|
403
|
+
// {
|
|
404
|
+
// label: 'JsonSchema',
|
|
405
|
+
// value: DEFAULT_CHAT_SCHEMA_KEY,
|
|
406
|
+
// inputType: 'schema',
|
|
407
|
+
// optional: true,
|
|
408
|
+
// },
|
|
409
|
+
// ],
|
|
410
|
+
// ],
|
|
411
|
+
outputs: [
|
|
412
|
+
RUNNER_ORIGIN_OUTPUT,
|
|
413
|
+
[{ id: "format", label: "格式化", name: "format" }]
|
|
414
|
+
]
|
|
420
415
|
};
|
|
421
416
|
|
|
422
|
-
// packages/workflow/inline/node/chat/
|
|
423
|
-
var
|
|
417
|
+
// packages/workflow/inline/node/chat/node.define.ts
|
|
418
|
+
var v6 = __toESM(require("valibot"), 1);
|
|
424
419
|
var import_view_angular_core5 = require("@piying/view-angular-core");
|
|
420
|
+
var import_util = require("@cyia/util");
|
|
425
421
|
var ResponseList = ["json", "markdown", "yaml"];
|
|
426
422
|
var ResponseFormat = ["text", "json_object", "json_schema"];
|
|
427
|
-
var CHAT_NODE_DEFINE =
|
|
428
|
-
|
|
429
|
-
llm:
|
|
423
|
+
var CHAT_NODE_DEFINE = v6.pipe(
|
|
424
|
+
v6.object({
|
|
425
|
+
llm: v6.optional(llmModelConfig()),
|
|
430
426
|
/** 处理时解析 */
|
|
431
|
-
responseFormat:
|
|
432
|
-
|
|
427
|
+
responseFormat: v6.pipe(
|
|
428
|
+
v6.optional(v6.picklist(ResponseFormat)),
|
|
433
429
|
import_view_angular_core5.actions.inputs.patch({
|
|
434
430
|
options: [
|
|
435
431
|
// 有输入json时
|
|
@@ -451,11 +447,11 @@ var CHAT_NODE_DEFINE = v7.pipe(
|
|
|
451
447
|
}
|
|
452
448
|
]
|
|
453
449
|
}),
|
|
454
|
-
|
|
450
|
+
v6.title("响应格式")
|
|
455
451
|
),
|
|
456
452
|
/** 处理后解析 */
|
|
457
|
-
parseBy:
|
|
458
|
-
|
|
453
|
+
parseBy: v6.pipe(
|
|
454
|
+
v6.optional(v6.picklist(ResponseList)),
|
|
459
455
|
import_view_angular_core5.actions.inputs.patch({
|
|
460
456
|
options: [
|
|
461
457
|
{ label: "直接返回", value: void 0 },
|
|
@@ -476,7 +472,7 @@ var CHAT_NODE_DEFINE = v7.pipe(
|
|
|
476
472
|
}
|
|
477
473
|
]
|
|
478
474
|
}),
|
|
479
|
-
|
|
475
|
+
v6.title("返回解析"),
|
|
480
476
|
(0, import_view_angular_core5.valueChange)((fn) => {
|
|
481
477
|
fn({ list: [["..", "responseFormat"]] }).subscribe(
|
|
482
478
|
({ list: [value], field }) => {
|
|
@@ -490,17 +486,29 @@ var CHAT_NODE_DEFINE = v7.pipe(
|
|
|
490
486
|
})
|
|
491
487
|
),
|
|
492
488
|
examples: EXAMPLES_DEFINE,
|
|
493
|
-
value:
|
|
494
|
-
|
|
489
|
+
value: v6.pipe(
|
|
490
|
+
v6.custom(Boolean),
|
|
495
491
|
(0, import_view_angular_core5.setComponent)("prompt-list")
|
|
492
|
+
),
|
|
493
|
+
jsonSchema: v6.pipe(
|
|
494
|
+
v6.optional(
|
|
495
|
+
v6.pipe(
|
|
496
|
+
v6.any(),
|
|
497
|
+
v6.check(
|
|
498
|
+
(value) => (0, import_util.isChatSchema)(value),
|
|
499
|
+
(issue) => `jsonSchema 格式异常:输入 ${issue.input};需要类型 {name:string,schema:object}`
|
|
500
|
+
)
|
|
501
|
+
)
|
|
502
|
+
),
|
|
503
|
+
(0, import_view_angular_core5.setComponent)("jsonSchema")
|
|
496
504
|
)
|
|
497
505
|
}),
|
|
498
506
|
import_view_angular_core5.actions.wrappers.patch(["div"]),
|
|
499
507
|
import_view_angular_core5.actions.class.top("grid auto-rows-auto gap-2")
|
|
500
508
|
);
|
|
501
509
|
|
|
502
|
-
// packages/workflow/inline/node/chat/main/
|
|
503
|
-
var
|
|
510
|
+
// packages/workflow/inline/node/chat/main/runner.ts
|
|
511
|
+
var import_static_injector6 = require("static-injector");
|
|
504
512
|
var import_yaml = require("yaml");
|
|
505
513
|
var import_es_toolkit3 = require("es-toolkit");
|
|
506
514
|
|
|
@@ -512,7 +520,7 @@ function createAssistantMessage(text = "") {
|
|
|
512
520
|
};
|
|
513
521
|
}
|
|
514
522
|
|
|
515
|
-
// packages/workflow/inline/node/chat/main/
|
|
523
|
+
// packages/workflow/inline/node/chat/main/runner.ts
|
|
516
524
|
var import_external_call = require("@cyia/external-call");
|
|
517
525
|
|
|
518
526
|
// packages/workflow/runner/runner-item.ts
|
|
@@ -523,7 +531,10 @@ var import_static_injector2 = require("static-injector");
|
|
|
523
531
|
var CurrentWorkflowToken = new import_static_injector2.InjectionToken(
|
|
524
532
|
"CurrentWorkflow"
|
|
525
533
|
);
|
|
526
|
-
var InputsToken = new import_static_injector2.InjectionToken("
|
|
534
|
+
var InputsToken = new import_static_injector2.InjectionToken("Inputs");
|
|
535
|
+
var NodeInputsToken = new import_static_injector2.InjectionToken("NodeInputs");
|
|
536
|
+
var NodeContextToken = new import_static_injector2.InjectionToken("NodeContext");
|
|
537
|
+
var NodeParentMapToken = new import_static_injector2.InjectionToken("NodeParentMap");
|
|
527
538
|
var CurrentNodeToken = new import_static_injector2.InjectionToken("CurrentNode");
|
|
528
539
|
var CurrentCallNodeToken = new import_static_injector2.InjectionToken(
|
|
529
540
|
"CurrentCallNode"
|
|
@@ -531,11 +542,7 @@ var CurrentCallNodeToken = new import_static_injector2.InjectionToken(
|
|
|
531
542
|
var CurrentContextToken = new import_static_injector2.InjectionToken(
|
|
532
543
|
"CurrentContext"
|
|
533
544
|
);
|
|
534
|
-
var InputParamsToken = new import_static_injector2.InjectionToken(
|
|
535
|
-
"InputParams"
|
|
536
|
-
);
|
|
537
545
|
var ParentContextToken = new import_static_injector2.InjectionToken("ParentContext");
|
|
538
|
-
var UseInputToken = new import_static_injector2.InjectionToken("UseInput");
|
|
539
546
|
var AbortSignalToken = new import_static_injector2.InjectionToken(
|
|
540
547
|
"AbortSignal"
|
|
541
548
|
);
|
|
@@ -547,99 +554,22 @@ var WorkflowConfigToken = new import_static_injector2.InjectionToken("WorkflowCo
|
|
|
547
554
|
var ChatServiceToken = new import_static_injector2.InjectionToken("ChatServiceToken");
|
|
548
555
|
|
|
549
556
|
// packages/workflow/runner/runner-item.ts
|
|
550
|
-
var
|
|
551
|
-
var import_util = require("@cyia/util");
|
|
557
|
+
var import_util2 = require("@cyia/util");
|
|
552
558
|
var import_es_toolkit = require("es-toolkit");
|
|
553
559
|
var import_compat = require("es-toolkit/compat");
|
|
554
560
|
var NodeRunnerBase = class {
|
|
555
561
|
node = (0, import_static_injector3.inject)(CurrentNodeToken);
|
|
556
|
-
callNode = (0, import_static_injector3.inject)(CurrentCallNodeToken);
|
|
562
|
+
callNode = (0, import_static_injector3.inject)(CurrentCallNodeToken, { optional: true }) ?? void 0;
|
|
557
563
|
context = (0, import_static_injector3.inject)(CurrentContextToken);
|
|
558
|
-
// protected useInput = inject(UseInputToken);
|
|
559
|
-
inputParams = (0, import_static_injector3.inject)(InputParamsToken);
|
|
560
564
|
injector = (0, import_static_injector3.inject)(import_static_injector3.Injector);
|
|
561
565
|
emitter = (0, import_static_injector3.inject)(WorkflowEmitter);
|
|
562
566
|
abortSignal = (0, import_static_injector3.inject)(AbortSignalToken);
|
|
567
|
+
inputs = (0, import_static_injector3.inject)(NodeInputsToken);
|
|
563
568
|
async run() {
|
|
564
569
|
throw new Error("待实现");
|
|
565
570
|
}
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
for (const input of this.node.inputs) {
|
|
569
|
-
if (!input.type) {
|
|
570
|
-
const data = this.inputParams.get(input.value);
|
|
571
|
-
if (!data) {
|
|
572
|
-
if (input.optional) {
|
|
573
|
-
continue;
|
|
574
|
-
} else {
|
|
575
|
-
throw new Error(`缺少输入参数: ${input.value}`);
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
obj[input.value] = data;
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
return obj;
|
|
582
|
-
});
|
|
583
|
-
inputValueObject$$ = (0, import_static_injector3.computed)(
|
|
584
|
-
() => Object.entries(this.inputs$$()).reduce(
|
|
585
|
-
(obj, item) => {
|
|
586
|
-
obj[item[0]] = item[1].value;
|
|
587
|
-
return obj;
|
|
588
|
-
},
|
|
589
|
-
{}
|
|
590
|
-
)
|
|
591
|
-
);
|
|
592
|
-
inputMetadataList$$ = (0, import_static_injector3.computed)(
|
|
593
|
-
() => Object.values(this.inputs$$()).map((item) => item.extra?.metadata)
|
|
594
|
-
);
|
|
595
|
-
getInputMetadata(input) {
|
|
596
|
-
return this.inputs$$()[input].extra?.metadata;
|
|
597
|
-
}
|
|
598
|
-
async getInputChat() {
|
|
599
|
-
const metadataList = [];
|
|
600
|
-
const obj = {};
|
|
601
|
-
const errorList = [];
|
|
602
|
-
for (const input of this.node.inputs) {
|
|
603
|
-
if (!input.type) {
|
|
604
|
-
const data = this.inputParams.get(input.value);
|
|
605
|
-
if (!data) {
|
|
606
|
-
if (input.optional) {
|
|
607
|
-
continue;
|
|
608
|
-
} else {
|
|
609
|
-
errorList.push(input.value);
|
|
610
|
-
continue;
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
if (input.inputType === "image") {
|
|
614
|
-
obj[input.value] = data?.value;
|
|
615
|
-
} else if ((0, import_util.isStringArray)(data?.value)) {
|
|
616
|
-
obj[input.value] = data.value.join("\n");
|
|
617
|
-
} else {
|
|
618
|
-
obj[input.value] = data?.value ?? "";
|
|
619
|
-
}
|
|
620
|
-
const extra = data?.extra;
|
|
621
|
-
if (extra) {
|
|
622
|
-
if (Array.isArray(extra)) {
|
|
623
|
-
for (const { metadata } of extra) {
|
|
624
|
-
if (!metadata) {
|
|
625
|
-
continue;
|
|
626
|
-
}
|
|
627
|
-
metadataList.push(metadata);
|
|
628
|
-
}
|
|
629
|
-
} else {
|
|
630
|
-
if (extra.metadata) {
|
|
631
|
-
metadataList.push(extra.metadata);
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
if (errorList.length) {
|
|
638
|
-
throw new Error(`缺少输入参数: ${errorList.join(",")}`);
|
|
639
|
-
}
|
|
640
|
-
return { metadataList, obj };
|
|
641
|
-
}
|
|
642
|
-
#modelConfig = (0, import_static_injector3.inject)(ModelOptionsToken);
|
|
571
|
+
#modelConfig = (0, import_static_injector3.inject)(ModelOptionsToken, { optional: true }) ?? void 0;
|
|
572
|
+
context$$ = (0, import_static_injector3.computed)(() => this.injector.get(NodeContextToken)());
|
|
643
573
|
mergeChatModel(input) {
|
|
644
574
|
const chatService = this.injector.get(ChatServiceToken);
|
|
645
575
|
let presetConfig = {};
|
|
@@ -652,21 +582,11 @@ var NodeRunnerBase = class {
|
|
|
652
582
|
model: input.model,
|
|
653
583
|
baseURL: input?.baseURL
|
|
654
584
|
},
|
|
655
|
-
|
|
585
|
+
import_util2.isEmptyInput
|
|
656
586
|
),
|
|
657
|
-
(0, import_es_toolkit.omitBy)(presetConfig,
|
|
658
|
-
(0, import_es_toolkit.omitBy)(this.#modelConfig ?? {},
|
|
659
|
-
) : this.#modelConfig;
|
|
660
|
-
}
|
|
661
|
-
getParsedNode(schema) {
|
|
662
|
-
const result = v8.safeParse(schema, this.node.data.config);
|
|
663
|
-
if (result.success) {
|
|
664
|
-
return result.output;
|
|
665
|
-
}
|
|
666
|
-
if (typeof PROD_ENV === "undefined" || !PROD_ENV) {
|
|
667
|
-
console.log(result.issues);
|
|
668
|
-
}
|
|
669
|
-
throw new Error(JSON.stringify(result.issues));
|
|
587
|
+
(0, import_es_toolkit.omitBy)(presetConfig, import_util2.isEmptyInput),
|
|
588
|
+
(0, import_es_toolkit.omitBy)(this.#modelConfig ?? {}, import_util2.isEmptyInput)
|
|
589
|
+
) : this.#modelConfig ?? {};
|
|
670
590
|
}
|
|
671
591
|
};
|
|
672
592
|
|
|
@@ -779,47 +699,89 @@ var TemplateFormatService = class extends import_static_injector4.RootStaticInje
|
|
|
779
699
|
}
|
|
780
700
|
};
|
|
781
701
|
|
|
782
|
-
// packages/workflow/inline/node/chat/main/
|
|
783
|
-
var
|
|
702
|
+
// packages/workflow/inline/node/chat/main/runner.ts
|
|
703
|
+
var import_util3 = require("@cyia/util");
|
|
704
|
+
|
|
705
|
+
// packages/workflow/inline/node/chat/util/useChat.ts
|
|
706
|
+
var import_static_injector5 = require("static-injector");
|
|
707
|
+
|
|
708
|
+
// packages/workflow/util/serialize-text-template.ts
|
|
709
|
+
var import_compat2 = require("es-toolkit/compat");
|
|
710
|
+
var import_variable_serialization = require("@shenghuabi/lexical-textarea/variable-serialization");
|
|
711
|
+
function serializeLexicalTextarea(input, options) {
|
|
712
|
+
const { context, environmentContext, onMetadata } = options;
|
|
713
|
+
return (0, import_variable_serialization.serializeTemplate)(input, (item) => {
|
|
714
|
+
if (item.type === "custom") {
|
|
715
|
+
return (0, import_compat2.get)(environmentContext, item.value);
|
|
716
|
+
}
|
|
717
|
+
const result = (0, import_compat2.get)(context, item.value);
|
|
718
|
+
if (typeof result === "string") {
|
|
719
|
+
return result;
|
|
720
|
+
}
|
|
721
|
+
if ("ref" in result) {
|
|
722
|
+
onMetadata?.(Array.isArray(result.ref) ? result.ref : [result.ref]);
|
|
723
|
+
}
|
|
724
|
+
return `${result}`;
|
|
725
|
+
}).trim();
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
// packages/workflow/inline/node/chat/util/useChat.ts
|
|
729
|
+
function useChat() {
|
|
730
|
+
const contextProvider = (0, import_static_injector5.inject)(NodeContextToken);
|
|
731
|
+
const environmentContext = (0, import_static_injector5.inject)(EnviromentParametersToken);
|
|
732
|
+
return async (list) => {
|
|
733
|
+
const metadataList = [];
|
|
734
|
+
const context = await contextProvider();
|
|
735
|
+
const serializeOptions = {
|
|
736
|
+
context,
|
|
737
|
+
environmentContext,
|
|
738
|
+
onMetadata: (metadata) => {
|
|
739
|
+
metadataList.push(...metadata);
|
|
740
|
+
}
|
|
741
|
+
};
|
|
742
|
+
const list2 = list.map((item) => {
|
|
743
|
+
const contentList = item.content.map((contentChild) => {
|
|
744
|
+
if (contentChild.type === "text") {
|
|
745
|
+
const text = serializeLexicalTextarea(
|
|
746
|
+
contentChild.text,
|
|
747
|
+
serializeOptions
|
|
748
|
+
);
|
|
749
|
+
return { type: contentChild.type, text };
|
|
750
|
+
} else if (contentChild.type === "image_url") {
|
|
751
|
+
const url = serializeLexicalTextarea(
|
|
752
|
+
contentChild.image_url.url,
|
|
753
|
+
serializeOptions
|
|
754
|
+
);
|
|
755
|
+
return {
|
|
756
|
+
type: contentChild.type,
|
|
757
|
+
text: { image_url: { url } }
|
|
758
|
+
};
|
|
759
|
+
}
|
|
760
|
+
});
|
|
761
|
+
return {
|
|
762
|
+
role: item.role,
|
|
763
|
+
content: contentList
|
|
764
|
+
};
|
|
765
|
+
});
|
|
766
|
+
return { metadataList, list: list2 };
|
|
767
|
+
};
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
// packages/workflow/inline/node/chat/main/runner.ts
|
|
784
771
|
var LlmRunner = class extends NodeRunnerBase {
|
|
785
|
-
#format = (0,
|
|
786
|
-
#chatService = (0,
|
|
787
|
-
#abort = (0,
|
|
788
|
-
#channel = (0,
|
|
772
|
+
#format = (0, import_static_injector6.inject)(TemplateFormatService);
|
|
773
|
+
#chatService = (0, import_static_injector6.inject)(ChatServiceToken);
|
|
774
|
+
#abort = (0, import_static_injector6.inject)(AbortSignalToken);
|
|
775
|
+
#channel = (0, import_static_injector6.inject)(import_external_call.LogService).getToken("chat");
|
|
776
|
+
chatParse = useChat();
|
|
789
777
|
async run() {
|
|
790
|
-
const
|
|
791
|
-
const inputJsonSchema = this.inputParams.get(DEFAULT_CHAT_SCHEMA_KEY);
|
|
792
|
-
const nodeResult = this.getParsedNode(CHAT_NODE_DEFINE);
|
|
778
|
+
const nodeResult = this.inputs;
|
|
793
779
|
const config = nodeResult;
|
|
794
780
|
const examples = config.examples;
|
|
795
781
|
const list = nodeResult.value;
|
|
796
|
-
const historyList =
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
obj
|
|
800
|
-
);
|
|
801
|
-
return {
|
|
802
|
-
role: item.role,
|
|
803
|
-
content: [
|
|
804
|
-
{ type: "text", text: content },
|
|
805
|
-
...item.content.filter((item2) => item2.type === "image_url").flatMap((item2) => {
|
|
806
|
-
if (item2.type === "image_url") {
|
|
807
|
-
return obj[item2.image_url.url].map((item3) => ({
|
|
808
|
-
type: "image_url",
|
|
809
|
-
image_url: { url: item3.data }
|
|
810
|
-
}));
|
|
811
|
-
}
|
|
812
|
-
return item2;
|
|
813
|
-
})
|
|
814
|
-
]
|
|
815
|
-
};
|
|
816
|
-
});
|
|
817
|
-
const schema = (0, import_util2.isChatSchema)(inputJsonSchema?.value);
|
|
818
|
-
if (inputJsonSchema?.value && !schema) {
|
|
819
|
-
throw new Error(
|
|
820
|
-
`JsonSchema传入格式异常,需要: {name:string,schema:object},传入: ${JSON.stringify(inputJsonSchema.value)}`
|
|
821
|
-
);
|
|
822
|
-
} else if (schema) {
|
|
782
|
+
const { list: historyList, metadataList } = await this.chatParse(list);
|
|
783
|
+
const schema = config.jsonSchema;
|
|
784
|
+
if (schema) {
|
|
823
785
|
config.parseBy ??= "json";
|
|
824
786
|
config.responseFormat ??= "json_schema";
|
|
825
787
|
}
|
|
@@ -853,7 +815,7 @@ var LlmRunner = class extends NodeRunnerBase {
|
|
|
853
815
|
const result = await llm.stream(
|
|
854
816
|
{
|
|
855
817
|
messages: historyList,
|
|
856
|
-
response_format: config.responseFormat === "json_schema" ? { type: "json_schema", json_schema:
|
|
818
|
+
response_format: config.responseFormat === "json_schema" ? { type: "json_schema", json_schema: config.jsonSchema } : config.responseFormat === "json_object" ? { type: "json_object" } : void 0
|
|
857
819
|
},
|
|
858
820
|
{ signal: this.#abort }
|
|
859
821
|
);
|
|
@@ -884,33 +846,31 @@ var LlmRunner = class extends NodeRunnerBase {
|
|
|
884
846
|
historyList.push(createAssistantMessage(resultContent));
|
|
885
847
|
streamData.extra.historyList = historyList;
|
|
886
848
|
this.emitter.send(streamData);
|
|
887
|
-
return async (
|
|
888
|
-
if (
|
|
889
|
-
return
|
|
890
|
-
value: streamData.value,
|
|
891
|
-
dataId: streamData.dataId,
|
|
892
|
-
extra: streamData.extra
|
|
893
|
-
};
|
|
894
|
-
}
|
|
895
|
-
let value;
|
|
896
|
-
switch (config.parseBy) {
|
|
897
|
-
case "markdown":
|
|
898
|
-
value = (0, import_util2.markdownParse)(resultContent);
|
|
899
|
-
break;
|
|
900
|
-
case "json":
|
|
901
|
-
value = (0, import_util2.jsonParse)(resultContent);
|
|
902
|
-
break;
|
|
903
|
-
case "yaml":
|
|
904
|
-
value = (0, import_util2.yamlParse)(resultContent);
|
|
905
|
-
break;
|
|
906
|
-
default:
|
|
907
|
-
value = resultContent;
|
|
908
|
-
break;
|
|
849
|
+
return async (id) => {
|
|
850
|
+
if (id === RUNNER_ORIGIN_OUTPUT[0].id) {
|
|
851
|
+
return streamData.value;
|
|
909
852
|
}
|
|
910
|
-
if (
|
|
911
|
-
|
|
853
|
+
if (id === "format") {
|
|
854
|
+
let value;
|
|
855
|
+
switch (config.parseBy) {
|
|
856
|
+
case "markdown":
|
|
857
|
+
value = (0, import_util3.markdownParse)(resultContent);
|
|
858
|
+
break;
|
|
859
|
+
case "json":
|
|
860
|
+
value = (0, import_util3.jsonParse)(resultContent);
|
|
861
|
+
break;
|
|
862
|
+
case "yaml":
|
|
863
|
+
value = (0, import_util3.yamlParse)(resultContent);
|
|
864
|
+
break;
|
|
865
|
+
default:
|
|
866
|
+
value = resultContent;
|
|
867
|
+
break;
|
|
868
|
+
}
|
|
869
|
+
if (typeof value === "undefined") {
|
|
870
|
+
throw new Error(`解析${config.parseBy}失败`);
|
|
871
|
+
}
|
|
872
|
+
return value;
|
|
912
873
|
}
|
|
913
|
-
return { value, dataId: streamData.dataId, extra: streamData.extra };
|
|
914
874
|
};
|
|
915
875
|
}
|
|
916
876
|
#exampleFormat(data, format) {
|
|
@@ -929,7 +889,7 @@ var LlmRunner = class extends NodeRunnerBase {
|
|
|
929
889
|
var ChatMainConfig = {
|
|
930
890
|
...NODE_COMMON,
|
|
931
891
|
runner: LlmRunner,
|
|
932
|
-
|
|
892
|
+
configDefine: CHAT_NODE_DEFINE
|
|
933
893
|
};
|
|
934
894
|
|
|
935
895
|
// packages/workflow/inline/node/text/common.ts
|
|
@@ -944,530 +904,112 @@ var NODE_COMMON2 = {
|
|
|
944
904
|
priority: -98
|
|
945
905
|
};
|
|
946
906
|
|
|
947
|
-
// packages/workflow/inline/node/text/
|
|
948
|
-
var
|
|
907
|
+
// packages/workflow/inline/node/text/text.node.define.ts
|
|
908
|
+
var import_view_angular_core6 = require("@piying/view-angular-core");
|
|
909
|
+
var v7 = __toESM(require("valibot"), 1);
|
|
910
|
+
var TEXT_NODE_DEFINE = v7.object({
|
|
911
|
+
value: v7.pipe(
|
|
912
|
+
v7.any(),
|
|
913
|
+
(0, import_view_angular_core6.setComponent)("textarea-template"),
|
|
914
|
+
import_view_angular_core6.actions.class.top("nodrag")
|
|
915
|
+
)
|
|
916
|
+
});
|
|
917
|
+
|
|
918
|
+
// packages/workflow/inline/node/text/main/runner.ts
|
|
919
|
+
var import_static_injector7 = require("static-injector");
|
|
949
920
|
var TextareaRunner = class extends NodeRunnerBase {
|
|
950
|
-
|
|
921
|
+
environmentContext = (0, import_static_injector7.inject)(EnviromentParametersToken);
|
|
951
922
|
async run() {
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
923
|
+
return async () => {
|
|
924
|
+
let metadataList;
|
|
925
|
+
const context = await this.context$$();
|
|
926
|
+
const value = serializeLexicalTextarea(this.inputs.value, {
|
|
927
|
+
context,
|
|
928
|
+
environmentContext: this.environmentContext,
|
|
929
|
+
onMetadata(metadata) {
|
|
930
|
+
metadataList = metadata;
|
|
931
|
+
}
|
|
932
|
+
});
|
|
933
|
+
if (metadataList?.length) {
|
|
934
|
+
return {
|
|
935
|
+
toJSON: () => ({ ref: metadataList, value }),
|
|
936
|
+
toString: () => value,
|
|
937
|
+
ref: metadataList
|
|
938
|
+
};
|
|
939
|
+
}
|
|
940
|
+
return value;
|
|
941
|
+
};
|
|
955
942
|
}
|
|
956
943
|
};
|
|
957
944
|
|
|
958
945
|
// packages/workflow/inline/node/text/main/index.ts
|
|
959
946
|
var TextMainConfig = {
|
|
960
947
|
...NODE_COMMON2,
|
|
961
|
-
runner: TextareaRunner
|
|
948
|
+
runner: TextareaRunner,
|
|
949
|
+
configDefine: TEXT_NODE_DEFINE
|
|
962
950
|
};
|
|
963
951
|
|
|
964
|
-
// packages/workflow/
|
|
965
|
-
var
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
output: flatFilterHandleList(node.data.handle?.output)
|
|
1006
|
-
};
|
|
1007
|
-
const cEdges = (0, import_react.getConnectedEdges)([node], edges);
|
|
1008
|
-
const inputNodes = (0, import_react.getIncomers)(node, nodes, cEdges);
|
|
1009
|
-
const inputHandleList = flatFilterHandleList(node.data.handle?.input);
|
|
1010
|
-
const inputParams = [];
|
|
1011
|
-
for (const item of inputHandleList) {
|
|
1012
|
-
const targetHandle = item.id;
|
|
1013
|
-
const linkedEdges = cEdges.filter(
|
|
1014
|
-
(item2) => item2.targetHandle === targetHandle && item2.target === node.id
|
|
1015
|
-
);
|
|
1016
|
-
if (linkedEdges.length > 1) {
|
|
1017
|
-
return {
|
|
1018
|
-
error: {
|
|
1019
|
-
message: `${node.id}:不支持多个节点连接一个输入点`,
|
|
1020
|
-
nodeId: node.id
|
|
1021
|
-
}
|
|
1022
|
-
};
|
|
1023
|
-
}
|
|
1024
|
-
if (linkedEdges.length === 1) {
|
|
1025
|
-
const linkedEdge = linkedEdges[0];
|
|
1026
|
-
const linkedNode = inputNodes.find(
|
|
1027
|
-
(item2) => item2.id === linkedEdge.source
|
|
1028
|
-
);
|
|
1029
|
-
const linkedOuput = flatFilterHandleList(
|
|
1030
|
-
linkedNode.data.handle?.output
|
|
1031
|
-
).find((item2) => item2.id === linkedEdge.sourceHandle);
|
|
1032
|
-
inputParams.push({
|
|
1033
|
-
...item,
|
|
1034
|
-
nodeId: linkedNode.id,
|
|
1035
|
-
outputName: linkedOuput.value
|
|
1036
|
-
});
|
|
1037
|
-
if (!graph.hasNode(linkedNode.id)) {
|
|
1038
|
-
if (!this.#getParentNodeDefine(linkedNode.id)) {
|
|
1039
|
-
return {
|
|
1040
|
-
error: {
|
|
1041
|
-
message: `${linkedNode.id}:未找到连接节点,只能读取到当前及祖先范围内的节点`,
|
|
1042
|
-
nodeId: linkedNode.id
|
|
1043
|
-
}
|
|
1044
|
-
};
|
|
1045
|
-
}
|
|
1046
|
-
graph.addNode(linkedNode.id);
|
|
1047
|
-
}
|
|
1048
|
-
graph.addEdge(linkedNode.id, node.id);
|
|
1049
|
-
} else {
|
|
1050
|
-
inputParams.push({ ...item });
|
|
1051
|
-
if (item.type) {
|
|
1052
|
-
continue;
|
|
1053
|
-
}
|
|
1054
|
-
this.userInputParams.push(item);
|
|
1055
|
-
}
|
|
1056
|
-
}
|
|
1057
|
-
nodeData.nodes[node.id] = {
|
|
1058
|
-
data: node.data,
|
|
1059
|
-
//输入用
|
|
1060
|
-
inputs: inputParams,
|
|
1061
|
-
outputs: handle.output,
|
|
1062
|
-
type: node.type,
|
|
1063
|
-
id: node.id
|
|
1064
|
-
};
|
|
1065
|
-
if (this.subObject[node.id]) {
|
|
1066
|
-
for (let index = 0; index < this.subObject[node.id].length; index++) {
|
|
1067
|
-
const { key, startId, nodeList } = this.subObject[node.id][index];
|
|
1068
|
-
const instance = new _WorkflowParserContext(
|
|
1069
|
-
nodeList,
|
|
1070
|
-
this.subObject,
|
|
1071
|
-
this.data,
|
|
1072
|
-
node,
|
|
1073
|
-
this.userInputParams,
|
|
1074
|
-
this
|
|
1075
|
-
);
|
|
1076
|
-
const result = instance.parseItem();
|
|
1077
|
-
if (result.error) {
|
|
1078
|
-
return { error: { ...result.error } };
|
|
1079
|
-
}
|
|
1080
|
-
nodeData.nodes[node.id].subFlowList ??= [];
|
|
1081
|
-
nodeData.nodes[node.id].subFlowList.push({
|
|
1082
|
-
key,
|
|
1083
|
-
flow: result.data,
|
|
1084
|
-
startId
|
|
1085
|
-
});
|
|
1086
|
-
}
|
|
952
|
+
// packages/workflow/inline/node/iteration/common.ts
|
|
953
|
+
var NODE_COMMON3 = {
|
|
954
|
+
priority: -100,
|
|
955
|
+
type: "iteration",
|
|
956
|
+
label: `迭代`,
|
|
957
|
+
icon: { fontIcon: "chat" },
|
|
958
|
+
disableHead: false,
|
|
959
|
+
disableConnect: false,
|
|
960
|
+
color: "accent",
|
|
961
|
+
help: [`- 列表循环`].join("\n"),
|
|
962
|
+
// 普通的和flat
|
|
963
|
+
outputs: [RUNNER_ORIGIN_OUTPUT]
|
|
964
|
+
};
|
|
965
|
+
|
|
966
|
+
// packages/workflow/inline/node/iteration/node.define.ts
|
|
967
|
+
var v8 = __toESM(require("valibot"), 1);
|
|
968
|
+
var import_view_angular_core7 = require("@piying/view-angular-core");
|
|
969
|
+
var ITERATION_NODE_DEFINE = v8.pipe(
|
|
970
|
+
v8.object({
|
|
971
|
+
list: v8.pipe(
|
|
972
|
+
v8.array(v8.any()),
|
|
973
|
+
(0, import_view_angular_core7.asControl)(),
|
|
974
|
+
import_view_angular_core7.actions.wrappers.patch(["use-ref"])
|
|
975
|
+
)
|
|
976
|
+
}),
|
|
977
|
+
import_view_angular_core7.actions.wrappers.patch(["div"]),
|
|
978
|
+
import_view_angular_core7.actions.class.top("grid auto-rows-auto gap-2")
|
|
979
|
+
);
|
|
980
|
+
|
|
981
|
+
// packages/workflow/runner/workflow-runner.service.ts
|
|
982
|
+
var import_static_injector10 = require("static-injector");
|
|
983
|
+
|
|
984
|
+
// packages/workflow/inline/node/input-params/main/runner.ts
|
|
985
|
+
var import_static_injector8 = require("static-injector");
|
|
986
|
+
var InputParamsRunner = class extends NodeRunnerBase {
|
|
987
|
+
#env = (0, import_static_injector8.inject)(EnviromentParametersToken);
|
|
988
|
+
async run() {
|
|
989
|
+
const data = this.#env;
|
|
990
|
+
return async (id) => {
|
|
991
|
+
if (!id || id === "[default]") {
|
|
992
|
+
return data;
|
|
1087
993
|
}
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
graph.forEachNode((node) => {
|
|
1091
|
-
if (!this.#childUseNodeSet.has(node) && graph.outDegree(node) === 0) {
|
|
1092
|
-
outList.push(node);
|
|
994
|
+
if (id === "[rest]") {
|
|
995
|
+
return data;
|
|
1093
996
|
}
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
return { error: { message: `计算时存在多个出口` } };
|
|
1097
|
-
} else if (outList.length === 0) {
|
|
1098
|
-
return { error: { message: `可能出现循环依赖,没有出口` } };
|
|
1099
|
-
} else {
|
|
1100
|
-
nodeData.end = outList[0];
|
|
1101
|
-
nodeData.inputList = (0, import_es_toolkit4.uniqBy)(
|
|
1102
|
-
this.userInputParams,
|
|
1103
|
-
(item) => `${item.inputType || "string"}|${item.value}`
|
|
1104
|
-
).map((item) => ({
|
|
1105
|
-
inputType: item.inputType || "string",
|
|
1106
|
-
value: item.value,
|
|
1107
|
-
label: item.label || item.value,
|
|
1108
|
-
optional: item.optional
|
|
1109
|
-
}));
|
|
1110
|
-
return { data: nodeData };
|
|
1111
|
-
}
|
|
997
|
+
return data[id];
|
|
998
|
+
};
|
|
1112
999
|
}
|
|
1113
1000
|
};
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
return
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
this.#group.set(node.type, nodeMap);
|
|
1127
|
-
}
|
|
1128
|
-
getList(type) {
|
|
1129
|
-
return this.#group.get(type) || [];
|
|
1130
|
-
}
|
|
1131
|
-
};
|
|
1132
|
-
var WorkflowDataToken = new import_static_injector7.InjectionToken(
|
|
1133
|
-
"WorkflowData"
|
|
1134
|
-
);
|
|
1135
|
-
var WorkflowPreParser = class {
|
|
1136
|
-
/**
|
|
1137
|
-
* 迭代块:直接找父级parentid就行了
|
|
1138
|
-
* 分类块:所有后面的都算他的
|
|
1139
|
-
* 重构,所有节点进行迭代
|
|
1140
|
-
* 找迭代快,找到后找子级item块,找到后进行output查找+parent==迭代快
|
|
1141
|
-
* 找分类,找到后output查找
|
|
1142
|
-
* 所有独立块都是找到独立节点后终止
|
|
1143
|
-
*/
|
|
1144
|
-
#nodeGroup = new NodeGroup();
|
|
1145
|
-
#data = (0, import_static_injector7.inject)(WorkflowDataToken);
|
|
1146
|
-
#plugin = (0, import_static_injector7.inject)(WorkflowPluginService);
|
|
1147
|
-
#inlineNodeService = (0, import_static_injector7.inject)(InlineNodeService);
|
|
1148
|
-
#fullBlockObject$$ = (0, import_static_injector7.computed)(
|
|
1149
|
-
() => ({
|
|
1150
|
-
...this.#inlineNodeService.conditionNodeList(),
|
|
1151
|
-
...this.#plugin.conditionNodeList$$(),
|
|
1152
|
-
["iteration" /* iteration */]: true
|
|
1153
|
-
})
|
|
1154
|
-
);
|
|
1155
|
-
#conditionBlockObject$$ = (0, import_static_injector7.computed)(
|
|
1156
|
-
() => ({
|
|
1157
|
-
...this.#inlineNodeService.conditionNodeList(),
|
|
1158
|
-
...this.#plugin.conditionNodeList$$()
|
|
1159
|
-
})
|
|
1160
|
-
);
|
|
1161
|
-
parse() {
|
|
1162
|
-
const { nodes, edges } = this.#data.flow;
|
|
1163
|
-
const mainList = [];
|
|
1164
|
-
const subObjectGroup = {};
|
|
1165
|
-
const excludeSet = /* @__PURE__ */ new Set();
|
|
1166
|
-
const isBlock = (item) => this.#fullBlockObject$$()[item.type];
|
|
1167
|
-
const removedList = /* @__PURE__ */ new Set();
|
|
1168
|
-
const getSubNode = (node, subNodeList) => {
|
|
1169
|
-
subNodeList.push(node);
|
|
1170
|
-
excludeSet.add(node.id);
|
|
1171
|
-
if (!isBlock(node)) {
|
|
1172
|
-
(0, import_react.getOutgoers)(node, nodes, edges).forEach((item) => {
|
|
1173
|
-
getSubNode(item, subNodeList);
|
|
1174
|
-
});
|
|
1175
|
-
}
|
|
1176
|
-
};
|
|
1177
|
-
let manualInput = false;
|
|
1178
|
-
for (let i = 0; i < nodes.length; i++) {
|
|
1179
|
-
const node = nodes[i];
|
|
1180
|
-
if (node.data.excludeUsage) {
|
|
1181
|
-
removedList.add(node.id);
|
|
1182
|
-
nodes.splice(i, 1);
|
|
1183
|
-
i--;
|
|
1184
|
-
continue;
|
|
1185
|
-
}
|
|
1186
|
-
if (node.type === "input-params") {
|
|
1187
|
-
manualInput ||= !!node.data.config?.["manualInput"];
|
|
1188
|
-
} else if (isBlock(node)) {
|
|
1189
|
-
this.#nodeGroup.add(node);
|
|
1190
|
-
} else if (node.type === "iteration-start" /* iterationStart */) {
|
|
1191
|
-
this.#nodeGroup.addContainerStart(node);
|
|
1192
|
-
}
|
|
1193
|
-
}
|
|
1194
|
-
Object.keys(this.#fullBlockObject$$()).flatMap((key) => this.#nodeGroup.getList(key)).forEach((node) => {
|
|
1195
|
-
const outputList = subObjectGroup[node.id] || [];
|
|
1196
|
-
subObjectGroup[node.id] = outputList;
|
|
1197
|
-
if (node.type === "iteration" /* iteration */) {
|
|
1198
|
-
const subNodeList = [];
|
|
1199
|
-
const startNode = this.#nodeGroup.getContainerStart(node);
|
|
1200
|
-
getSubNode(startNode, subNodeList);
|
|
1201
|
-
outputList.push({
|
|
1202
|
-
nodeList: (0, import_es_toolkit4.uniqBy)(subNodeList, (item) => item.id),
|
|
1203
|
-
startId: startNode.id,
|
|
1204
|
-
key: `[default]`
|
|
1205
|
-
});
|
|
1206
|
-
} else if (this.#conditionBlockObject$$()[node.type]) {
|
|
1207
|
-
const cEdges = (0, import_react.getConnectedEdges)([node], edges);
|
|
1208
|
-
const children = (0, import_react.getOutgoers)(node, nodes, cEdges);
|
|
1209
|
-
const outputHandleList = flatFilterHandleList(
|
|
1210
|
-
node.data.handle.output
|
|
1211
|
-
);
|
|
1212
|
-
for (const outputHandle of outputHandleList) {
|
|
1213
|
-
const outputEdgeList = cEdges.filter(
|
|
1214
|
-
(edge) => edge.sourceHandle === outputHandle.id
|
|
1215
|
-
);
|
|
1216
|
-
if (!outputEdgeList.length) {
|
|
1217
|
-
throw new Error(`[${node.data.title || ""}]节点上发现未连接出口`);
|
|
1218
|
-
}
|
|
1219
|
-
for (const childNode of children.filter(
|
|
1220
|
-
({ id }) => outputEdgeList.some(({ target }) => target === id)
|
|
1221
|
-
)) {
|
|
1222
|
-
const subNodeList = [];
|
|
1223
|
-
getSubNode(childNode, subNodeList);
|
|
1224
|
-
outputList.push({
|
|
1225
|
-
nodeList: (0, import_es_toolkit4.uniqBy)(subNodeList, (item) => item.id),
|
|
1226
|
-
startId: childNode.id,
|
|
1227
|
-
key: outputHandle.value
|
|
1228
|
-
});
|
|
1229
|
-
}
|
|
1230
|
-
}
|
|
1231
|
-
}
|
|
1232
|
-
});
|
|
1233
|
-
for (const node of nodes) {
|
|
1234
|
-
if (excludeSet.has(node.id)) {
|
|
1235
|
-
continue;
|
|
1236
|
-
}
|
|
1237
|
-
mainList.push(node);
|
|
1238
|
-
}
|
|
1239
|
-
return {
|
|
1240
|
-
list: mainList,
|
|
1241
|
-
subObjectGroup,
|
|
1242
|
-
manualInput,
|
|
1243
|
-
edges: edges.filter(
|
|
1244
|
-
(edge) => !removedList.has(edge.source) && !removedList.has(edge.target)
|
|
1245
|
-
)
|
|
1246
|
-
};
|
|
1247
|
-
}
|
|
1248
|
-
};
|
|
1249
|
-
var WorkflowParserService = class {
|
|
1250
|
-
#injector = (0, import_static_injector7.inject)(import_static_injector7.Injector);
|
|
1251
|
-
#inlineNode = (0, import_static_injector7.inject)(InlineNodeService);
|
|
1252
|
-
constructor() {
|
|
1253
|
-
this.#inlineNode.register(index_node_exports);
|
|
1254
|
-
}
|
|
1255
|
-
/**
|
|
1256
|
-
* 1.如果出现孤立节点,那么需要判断是不是子级引用
|
|
1257
|
-
* 2.子级引用本级别找不到,那么需要找父级
|
|
1258
|
-
*/
|
|
1259
|
-
/**
|
|
1260
|
-
* 边有id,通过source 找到连接的节点
|
|
1261
|
-
*
|
|
1262
|
-
*/
|
|
1263
|
-
parse(data) {
|
|
1264
|
-
const injector = (0, import_static_injector7.createInjector)({
|
|
1265
|
-
providers: [
|
|
1266
|
-
WorkflowPreParser,
|
|
1267
|
-
{ provide: WorkflowDataToken, useValue: data }
|
|
1268
|
-
],
|
|
1269
|
-
parent: this.#injector
|
|
1270
|
-
});
|
|
1271
|
-
const preInstance = injector.get(WorkflowPreParser);
|
|
1272
|
-
const result = preInstance.parse();
|
|
1273
|
-
if (!result.list.length) {
|
|
1274
|
-
return {
|
|
1275
|
-
error: {
|
|
1276
|
-
message: "无可用节点"
|
|
1277
|
-
}
|
|
1278
|
-
};
|
|
1279
|
-
}
|
|
1280
|
-
const instance = new WorkflowParserContext(
|
|
1281
|
-
result.list,
|
|
1282
|
-
result.subObjectGroup,
|
|
1283
|
-
{ ...data, flow: { ...data.flow, edges: result.edges } }
|
|
1284
|
-
);
|
|
1285
|
-
return { ...instance.parseItem(), manualInput: result.manualInput };
|
|
1286
|
-
}
|
|
1287
|
-
};
|
|
1288
|
-
|
|
1289
|
-
// packages/workflow/workflow-exec.service.ts
|
|
1290
|
-
var import_static_injector14 = require("static-injector");
|
|
1291
|
-
|
|
1292
|
-
// packages/workflow/preset/inline-runner.service.ts
|
|
1293
|
-
var import_static_injector12 = require("static-injector");
|
|
1294
|
-
|
|
1295
|
-
// packages/workflow/preset/inline-build.service.ts
|
|
1296
|
-
var import_static_injector8 = require("static-injector");
|
|
1297
|
-
|
|
1298
|
-
// packages/workflow/runner/parameters.runner.ts
|
|
1299
|
-
var ParametersRunner = class extends NodeRunnerBase {
|
|
1300
|
-
static runnerName = "parameters";
|
|
1301
|
-
async run() {
|
|
1302
|
-
return async () => ({ value: this.inputs$$() });
|
|
1303
|
-
}
|
|
1304
|
-
};
|
|
1305
|
-
|
|
1306
|
-
// packages/workflow/preset/inline-build.service.ts
|
|
1307
|
-
var InlineBuilderService = class {
|
|
1308
|
-
template = (0, import_static_injector8.inject)(TemplateFormatService);
|
|
1309
|
-
parser = (0, import_static_injector8.inject)(WorkflowParserService);
|
|
1310
|
-
#createLLMNode(input) {
|
|
1311
|
-
return {
|
|
1312
|
-
id: "1",
|
|
1313
|
-
data: {
|
|
1314
|
-
handle: {
|
|
1315
|
-
input: [
|
|
1316
|
-
Object.keys({ ...input.input, ...input.context }).map(
|
|
1317
|
-
(value, i) => ({
|
|
1318
|
-
id: `${i}`,
|
|
1319
|
-
value,
|
|
1320
|
-
label: ``
|
|
1321
|
-
})
|
|
1322
|
-
)
|
|
1323
|
-
],
|
|
1324
|
-
output: [
|
|
1325
|
-
[
|
|
1326
|
-
{
|
|
1327
|
-
id: "1",
|
|
1328
|
-
label: "",
|
|
1329
|
-
value: "输出"
|
|
1330
|
-
}
|
|
1331
|
-
]
|
|
1332
|
-
]
|
|
1333
|
-
}
|
|
1334
|
-
},
|
|
1335
|
-
type: ParametersRunner.runnerName
|
|
1336
|
-
};
|
|
1337
|
-
}
|
|
1338
|
-
#createEdge(llmNode, context) {
|
|
1339
|
-
const edgeList = [];
|
|
1340
|
-
const addEdge = (node) => {
|
|
1341
|
-
const inputHandleList = node.data.handle?.input.flat() || [];
|
|
1342
|
-
for (const inputHandle of inputHandleList) {
|
|
1343
|
-
const item = context[inputHandle.value];
|
|
1344
|
-
if (!item) {
|
|
1345
|
-
continue;
|
|
1346
|
-
}
|
|
1347
|
-
const sourceHandle = item.data.handle.output[0][0];
|
|
1348
|
-
edgeList.push({
|
|
1349
|
-
source: item.id,
|
|
1350
|
-
sourceHandle: sourceHandle.id,
|
|
1351
|
-
// 自身
|
|
1352
|
-
target: node.id,
|
|
1353
|
-
targetHandle: inputHandle.id
|
|
1354
|
-
});
|
|
1355
|
-
}
|
|
1356
|
-
};
|
|
1357
|
-
for (const ctxKey in context) {
|
|
1358
|
-
const node = context[ctxKey];
|
|
1359
|
-
addEdge(node);
|
|
1360
|
-
}
|
|
1361
|
-
addEdge(llmNode);
|
|
1362
|
-
return edgeList;
|
|
1363
|
-
}
|
|
1364
|
-
#createWorkflow(input) {
|
|
1365
|
-
const chatNode = this.#createLLMNode(input);
|
|
1366
|
-
const edges = this.#createEdge(chatNode, input.context);
|
|
1367
|
-
return {
|
|
1368
|
-
nodes: [chatNode, ...Object.values(input.context)],
|
|
1369
|
-
edges
|
|
1370
|
-
};
|
|
1371
|
-
}
|
|
1372
|
-
createDefine(input) {
|
|
1373
|
-
return this.parser.parse({ flow: this.#createWorkflow(input) });
|
|
1374
|
-
}
|
|
1375
|
-
};
|
|
1376
|
-
|
|
1377
|
-
// packages/workflow/runner/workflow-runner.service.ts
|
|
1378
|
-
var import_static_injector11 = require("static-injector");
|
|
1379
|
-
|
|
1380
|
-
// packages/workflow/runner/inline-input-item.runner.ts
|
|
1381
|
-
var import_static_injector9 = require("static-injector");
|
|
1382
|
-
var InlineInputItemRunner = class extends NodeRunnerBase {
|
|
1383
|
-
static runnerName = "inlineInputItem";
|
|
1384
|
-
#env = (0, import_static_injector9.inject)(EnviromentParametersToken);
|
|
1385
|
-
async run() {
|
|
1386
|
-
return async () => {
|
|
1387
|
-
const key = this.node.inputs[0].value;
|
|
1388
|
-
const result = this.#env;
|
|
1389
|
-
if (!result) {
|
|
1390
|
-
throw new Error(`读取上下文参数[${key}]失败`);
|
|
1391
|
-
}
|
|
1392
|
-
return { value: result[key] };
|
|
1393
|
-
};
|
|
1394
|
-
}
|
|
1395
|
-
};
|
|
1396
|
-
|
|
1397
|
-
// packages/workflow/runner/input-params.runner.ts
|
|
1398
|
-
var import_static_injector10 = require("static-injector");
|
|
1399
|
-
var InputParamsRunner = class extends NodeRunnerBase {
|
|
1400
|
-
#env = (0, import_static_injector10.inject)(EnviromentParametersToken);
|
|
1401
|
-
async run() {
|
|
1402
|
-
return async () => {
|
|
1403
|
-
const value = this.#env;
|
|
1404
|
-
if (!value) {
|
|
1405
|
-
throw new Error(`读取上下文失败`);
|
|
1406
|
-
}
|
|
1407
|
-
return {
|
|
1408
|
-
value
|
|
1409
|
-
};
|
|
1410
|
-
};
|
|
1411
|
-
}
|
|
1412
|
-
};
|
|
1413
|
-
|
|
1414
|
-
// packages/workflow/runner/iteration-start.runner.ts
|
|
1415
|
-
var IterationStartRunner = class extends NodeRunnerBase {
|
|
1416
|
-
async run() {
|
|
1417
|
-
return async () => this.inputParams.get(ITERATION_ITEM_SYMBOL);
|
|
1418
|
-
}
|
|
1419
|
-
};
|
|
1420
|
-
|
|
1421
|
-
// packages/workflow/runner/iteration.runner.ts
|
|
1422
|
-
var import_util3 = require("@cyia/util");
|
|
1423
|
-
var IterationRunner = class extends NodeRunnerBase {
|
|
1424
|
-
async run() {
|
|
1425
|
-
const data = this.inputParams.get(this.node.inputs[0].value);
|
|
1426
|
-
if (!data) {
|
|
1427
|
-
throw new Error("输入节点为空");
|
|
1428
|
-
}
|
|
1429
|
-
const extra = data.extra;
|
|
1430
|
-
const value = data.value;
|
|
1431
|
-
if (!(0, import_util3.isIterable)(value)) {
|
|
1432
|
-
throw new Error(`输入值不是可迭代(数组)类型: ${JSON.stringify(value)}`);
|
|
1433
|
-
}
|
|
1434
|
-
const resultList = [];
|
|
1435
|
-
let index = 0;
|
|
1436
|
-
for (const item of value) {
|
|
1437
|
-
const newInputs = new Map(this.inputParams);
|
|
1438
|
-
newInputs.set(ITERATION_ITEM_SYMBOL, {
|
|
1439
|
-
value: item,
|
|
1440
|
-
extra: extra?.[index]
|
|
1441
|
-
});
|
|
1442
|
-
try {
|
|
1443
|
-
resultList.push(
|
|
1444
|
-
await this.injector.get(WorkflowRunnerService).createContext(
|
|
1445
|
-
//迭代只有一个子流
|
|
1446
|
-
this.node.subFlowList[0].flow,
|
|
1447
|
-
newInputs,
|
|
1448
|
-
this.context,
|
|
1449
|
-
this.injector
|
|
1450
|
-
).run()
|
|
1451
|
-
);
|
|
1452
|
-
} catch (error) {
|
|
1453
|
-
throw new Error(`执行第${index}出现异常`, { cause: error });
|
|
1454
|
-
}
|
|
1455
|
-
index++;
|
|
1456
|
-
}
|
|
1457
|
-
const list = resultList.reduce(
|
|
1458
|
-
(obj, item) => {
|
|
1459
|
-
obj.value.push(item.value);
|
|
1460
|
-
obj.extra.push(item.extra);
|
|
1461
|
-
return obj;
|
|
1462
|
-
},
|
|
1463
|
-
{ value: [], extra: [] }
|
|
1464
|
-
);
|
|
1465
|
-
return async (outputName) => {
|
|
1466
|
-
if (outputName === "flat") {
|
|
1467
|
-
return { value: list.value.flat(999), extra: list.extra.flat(999) };
|
|
1468
|
-
}
|
|
1469
|
-
return list;
|
|
1470
|
-
};
|
|
1001
|
+
|
|
1002
|
+
// packages/workflow/inline/node/iteration/main/iteration-start.runner.ts
|
|
1003
|
+
var import_static_injector9 = require("static-injector");
|
|
1004
|
+
var IterationStartRunner = class extends NodeRunnerBase {
|
|
1005
|
+
#nodeParentMap = (0, import_static_injector9.inject)(NodeParentMapToken);
|
|
1006
|
+
async run() {
|
|
1007
|
+
const data = this.#nodeParentMap.get(this.node.parentId);
|
|
1008
|
+
return async (id) => {
|
|
1009
|
+
const list = this.node.outputs;
|
|
1010
|
+
const result = list.find((item) => item.id === id);
|
|
1011
|
+
return data[result.name];
|
|
1012
|
+
};
|
|
1471
1013
|
}
|
|
1472
1014
|
};
|
|
1473
1015
|
|
|
@@ -1475,9 +1017,7 @@ var IterationRunner = class extends NodeRunnerBase {
|
|
|
1475
1017
|
var ItemRunnerObject = {
|
|
1476
1018
|
["iteration" /* iteration */]: IterationRunner,
|
|
1477
1019
|
["iteration-start" /* iterationStart */]: IterationStartRunner,
|
|
1478
|
-
["input-params" /* inputParams */]: InputParamsRunner
|
|
1479
|
-
["parameters" /* parameters */]: ParametersRunner,
|
|
1480
|
-
["inlineInputItem" /* inlineInputItem */]: InlineInputItemRunner
|
|
1020
|
+
["input-params" /* inputParams */]: InputParamsRunner
|
|
1481
1021
|
};
|
|
1482
1022
|
|
|
1483
1023
|
// packages/workflow/runner/runner-error.ts
|
|
@@ -1506,20 +1046,26 @@ var AbortSignalError = class extends Error {
|
|
|
1506
1046
|
|
|
1507
1047
|
// packages/workflow/runner/workflow-runner.service.ts
|
|
1508
1048
|
var import_external_call2 = require("@cyia/external-call");
|
|
1509
|
-
var
|
|
1049
|
+
var import_compat3 = require("es-toolkit/compat");
|
|
1050
|
+
var v9 = __toESM(require("valibot"), 1);
|
|
1051
|
+
var import_util4 = require("@cyia/util");
|
|
1052
|
+
var import_fast_equals = require("fast-equals");
|
|
1510
1053
|
var WorkflowRunnerContext = class {
|
|
1511
|
-
#injector = (0,
|
|
1512
|
-
data = (0,
|
|
1513
|
-
parent = (0,
|
|
1054
|
+
#injector = (0, import_static_injector10.inject)(import_static_injector10.Injector);
|
|
1055
|
+
data = (0, import_static_injector10.inject)(CurrentWorkflowToken);
|
|
1056
|
+
parent = (0, import_static_injector10.inject)(ParentContextToken);
|
|
1514
1057
|
#callCache = /* @__PURE__ */ new Map();
|
|
1515
1058
|
#outputCache = /* @__PURE__ */ new Map();
|
|
1516
|
-
inputs = (0,
|
|
1517
|
-
#plugin = (0,
|
|
1518
|
-
#emitter = (0,
|
|
1519
|
-
#inlineNode = (0,
|
|
1059
|
+
inputs = (0, import_static_injector10.inject)(InputsToken);
|
|
1060
|
+
#plugin = (0, import_static_injector10.inject)(WorkflowPluginService);
|
|
1061
|
+
#emitter = (0, import_static_injector10.inject)(WorkflowEmitter);
|
|
1062
|
+
#inlineNode = (0, import_static_injector10.inject)(InlineNodeService);
|
|
1520
1063
|
async #getNodeRunner(type) {
|
|
1521
1064
|
return this.#inlineNode.getNodeRunner(type) ?? ItemRunnerObject[type] ?? await this.#plugin.getNodeRunner(type);
|
|
1522
1065
|
}
|
|
1066
|
+
async #getNodeDefine(type) {
|
|
1067
|
+
return this.#inlineNode.getNodeDefine(type) ?? await this.#plugin.getNodeDefine(type);
|
|
1068
|
+
}
|
|
1523
1069
|
getNodeById(id) {
|
|
1524
1070
|
const result = this.data.nodes[id];
|
|
1525
1071
|
if (!result) {
|
|
@@ -1549,68 +1095,114 @@ var WorkflowRunnerContext = class {
|
|
|
1549
1095
|
return this.#runItem(node);
|
|
1550
1096
|
}
|
|
1551
1097
|
// 当前node 调用 node context
|
|
1552
|
-
async #createNodeRunner(item, inputParams,
|
|
1098
|
+
async #createNodeRunner(item, inputParams, contextFactory, callNode) {
|
|
1553
1099
|
const define = await this.#getNodeRunner(item.type);
|
|
1554
|
-
return (0,
|
|
1100
|
+
return (0, import_static_injector10.createInjector)({
|
|
1555
1101
|
providers: [
|
|
1556
1102
|
define,
|
|
1557
1103
|
{ provide: CurrentNodeToken, useValue: item },
|
|
1558
|
-
|
|
1104
|
+
[
|
|
1105
|
+
callNode ? { provide: CurrentCallNodeToken, useValue: callNode } : void 0
|
|
1106
|
+
].filter(Boolean),
|
|
1559
1107
|
{ provide: CurrentContextToken, useValue: this },
|
|
1560
|
-
{ provide:
|
|
1561
|
-
{ provide:
|
|
1108
|
+
{ provide: NodeInputsToken, useValue: inputParams },
|
|
1109
|
+
{ provide: NodeContextToken, useValue: contextFactory }
|
|
1562
1110
|
],
|
|
1563
1111
|
parent: this.#injector
|
|
1564
1112
|
}).get(define);
|
|
1565
1113
|
}
|
|
1566
|
-
#abort = (0,
|
|
1114
|
+
#abort = (0, import_static_injector10.inject)(AbortSignalToken);
|
|
1567
1115
|
async #runItem(node, callNode, input) {
|
|
1568
1116
|
try {
|
|
1569
1117
|
if (this.#abort?.aborted) {
|
|
1570
1118
|
throw new AbortSignalError();
|
|
1571
1119
|
}
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1120
|
+
let inputObjResoved;
|
|
1121
|
+
const config = node.data.config;
|
|
1122
|
+
const supportList = /* @__PURE__ */ new Set();
|
|
1123
|
+
const config2 = await this.#getNodeDefine(node.type);
|
|
1124
|
+
if (config2?.configDefine) {
|
|
1125
|
+
const inputObj = (0, import_util4.deepClone)(config?.value ?? {});
|
|
1126
|
+
if (config?.refList) {
|
|
1127
|
+
for (const input2 of config.refList) {
|
|
1128
|
+
const inputNode = this.getNodeById(input2.value);
|
|
1129
|
+
if (inputNode.subFlowList?.some(
|
|
1130
|
+
(subItem) => subItem.startId === node.id
|
|
1131
|
+
)) {
|
|
1132
|
+
continue;
|
|
1133
|
+
}
|
|
1134
|
+
const result2 = await this.#runItem(inputNode, node, {
|
|
1135
|
+
outputName: input2.outlet
|
|
1136
|
+
});
|
|
1137
|
+
(0, import_compat3.set)(inputObj, input2.key, result2);
|
|
1138
|
+
supportList.add(input2.key.join("|"));
|
|
1580
1139
|
}
|
|
1581
|
-
|
|
1582
|
-
|
|
1140
|
+
}
|
|
1141
|
+
if (config?.invalidList) {
|
|
1142
|
+
for (const input2 of config.invalidList) {
|
|
1143
|
+
const keyStr = input2.key.join("|");
|
|
1144
|
+
if (supportList.has(keyStr)) {
|
|
1145
|
+
continue;
|
|
1146
|
+
}
|
|
1147
|
+
const data = this.inputs[node.id];
|
|
1148
|
+
const item = data.find((item2) => (0, import_fast_equals.deepEqual)(item2.key, input2.key));
|
|
1149
|
+
(0, import_compat3.set)(inputObj, input2.key, item.value);
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
const result = v9.safeParse(config2.configDefine, inputObj);
|
|
1153
|
+
if (result.success) {
|
|
1154
|
+
inputObjResoved = result.output;
|
|
1155
|
+
} else {
|
|
1156
|
+
if (typeof PROD_ENV === "undefined" || !PROD_ENV) {
|
|
1157
|
+
console.error(result.issues);
|
|
1158
|
+
}
|
|
1159
|
+
throw new Error(v9.summarize(result.issues));
|
|
1583
1160
|
}
|
|
1584
1161
|
}
|
|
1162
|
+
const contextFactory = async () => {
|
|
1163
|
+
let contextData = {};
|
|
1164
|
+
if (node.context.length) {
|
|
1165
|
+
for (const contextItem of node.context) {
|
|
1166
|
+
const inputNode = this.getNodeById(contextItem.id);
|
|
1167
|
+
const result = await this.#runItem(inputNode, node, {
|
|
1168
|
+
outputName: contextItem.output
|
|
1169
|
+
});
|
|
1170
|
+
if (contextItem.rest) {
|
|
1171
|
+
contextData = { ...contextData, ...result };
|
|
1172
|
+
} else {
|
|
1173
|
+
contextData[contextItem.output] = result;
|
|
1174
|
+
}
|
|
1175
|
+
}
|
|
1176
|
+
}
|
|
1177
|
+
return contextData;
|
|
1178
|
+
};
|
|
1585
1179
|
const nodeRunner = await this.#createNodeRunner(
|
|
1586
1180
|
node,
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1181
|
+
inputObjResoved,
|
|
1182
|
+
contextFactory,
|
|
1183
|
+
callNode
|
|
1590
1184
|
);
|
|
1591
1185
|
const outputList = node.outputs;
|
|
1592
|
-
const outputName = input?.outputName ?? node.data.outputName ?? outputList[0]
|
|
1186
|
+
const outputName = input?.outputName ?? node.data.outputName ?? outputList[0]?.name;
|
|
1593
1187
|
let dataResult = this.#getCallCache(node.id);
|
|
1594
1188
|
if (dataResult === void 0) {
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
this.#callCache.set(node.id, res);
|
|
1599
|
-
}
|
|
1189
|
+
const res = await nodeRunner.run();
|
|
1190
|
+
dataResult = { result: res };
|
|
1191
|
+
this.#callCache.set(node.id, res);
|
|
1600
1192
|
}
|
|
1601
1193
|
const outputKey = `${node.id}|${outputName}`;
|
|
1602
1194
|
const outputResult = this.#getOuputCache(outputKey);
|
|
1603
1195
|
let returnData;
|
|
1604
1196
|
if (outputResult === void 0) {
|
|
1605
|
-
const
|
|
1606
|
-
this.#outputCache.set(outputKey,
|
|
1607
|
-
returnData =
|
|
1197
|
+
const outputValue = await dataResult.result(outputName);
|
|
1198
|
+
this.#outputCache.set(outputKey, outputValue);
|
|
1199
|
+
returnData = outputValue;
|
|
1608
1200
|
} else {
|
|
1609
1201
|
returnData = outputResult.result;
|
|
1610
1202
|
}
|
|
1611
1203
|
this.#emitter.send(
|
|
1612
1204
|
createResultData({
|
|
1613
|
-
|
|
1205
|
+
value: returnData,
|
|
1614
1206
|
node
|
|
1615
1207
|
})
|
|
1616
1208
|
);
|
|
@@ -1636,16 +1228,15 @@ var WorkflowRunnerContext = class {
|
|
|
1636
1228
|
}
|
|
1637
1229
|
};
|
|
1638
1230
|
var WorkflowRunnerService = class {
|
|
1639
|
-
#injector = (0,
|
|
1231
|
+
#injector = (0, import_static_injector10.inject)(import_static_injector10.Injector);
|
|
1640
1232
|
/** 自己使用
|
|
1641
1233
|
* @internal
|
|
1642
1234
|
*/
|
|
1643
|
-
createContext(data,
|
|
1644
|
-
return (0,
|
|
1235
|
+
createContext(data, parent, parentInjector) {
|
|
1236
|
+
return (0, import_static_injector10.createInjector)({
|
|
1645
1237
|
providers: [
|
|
1646
1238
|
WorkflowRunnerContext,
|
|
1647
1239
|
{ provide: CurrentWorkflowToken, useValue: data },
|
|
1648
|
-
{ provide: InputsToken, useValue: inputs },
|
|
1649
1240
|
{ provide: ParentContextToken, useValue: parent }
|
|
1650
1241
|
],
|
|
1651
1242
|
parent: parentInjector ?? this.#injector
|
|
@@ -1656,9 +1247,8 @@ var WorkflowRunnerService = class {
|
|
|
1656
1247
|
return this.#log ?? (this.#log = this.#injector.get(import_external_call2.LogService, void 0, { optional: true })?.getToken("workflow"));
|
|
1657
1248
|
}
|
|
1658
1249
|
/** 入口 */
|
|
1659
|
-
run(
|
|
1660
|
-
|
|
1661
|
-
const injector = (0, import_static_injector11.createInjector)({
|
|
1250
|
+
run(wofkflowData, input, ob, signal2, providers) {
|
|
1251
|
+
const injector = (0, import_static_injector10.createInjector)({
|
|
1662
1252
|
providers: [
|
|
1663
1253
|
WorkflowEmitter,
|
|
1664
1254
|
{ provide: AbortSignalToken, useValue: signal2 },
|
|
@@ -1666,11 +1256,13 @@ var WorkflowRunnerService = class {
|
|
|
1666
1256
|
provide: EnviromentParametersToken,
|
|
1667
1257
|
useValue: input.environmentParameters
|
|
1668
1258
|
},
|
|
1669
|
-
{ provide:
|
|
1259
|
+
{ provide: InputsToken, useValue: input.inputs },
|
|
1260
|
+
{ provide: NodeParentMapToken, useValue: /* @__PURE__ */ new Map() },
|
|
1261
|
+
...providers ?? []
|
|
1670
1262
|
],
|
|
1671
1263
|
parent: this.#injector
|
|
1672
1264
|
});
|
|
1673
|
-
const runner = this.createContext(
|
|
1265
|
+
const runner = this.createContext(wofkflowData, void 0, injector);
|
|
1674
1266
|
if (ob) {
|
|
1675
1267
|
injector.get(WorkflowEmitter).setObserver(ob);
|
|
1676
1268
|
}
|
|
@@ -1678,67 +1270,414 @@ var WorkflowRunnerService = class {
|
|
|
1678
1270
|
}
|
|
1679
1271
|
};
|
|
1680
1272
|
|
|
1681
|
-
// packages/workflow/
|
|
1682
|
-
var
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1273
|
+
// packages/workflow/inline/node/iteration/main/runner.ts
|
|
1274
|
+
var import_util5 = require("@cyia/util");
|
|
1275
|
+
var import_static_injector11 = require("static-injector");
|
|
1276
|
+
var IterationRunner = class extends NodeRunnerBase {
|
|
1277
|
+
#nodeParentMap = (0, import_static_injector11.inject)(NodeParentMapToken);
|
|
1278
|
+
async run() {
|
|
1279
|
+
const inputs = this.inputs;
|
|
1280
|
+
const value = inputs.list;
|
|
1281
|
+
if (!(0, import_util5.isIterable)(value)) {
|
|
1282
|
+
throw new Error(`输入值不是可迭代(数组)类型: ${JSON.stringify(value)}`);
|
|
1283
|
+
}
|
|
1284
|
+
const resultList = [];
|
|
1285
|
+
let index = 0;
|
|
1286
|
+
for (const item of value) {
|
|
1287
|
+
this.#nodeParentMap.set(this.node.id, { item });
|
|
1288
|
+
try {
|
|
1289
|
+
resultList.push(
|
|
1290
|
+
await this.injector.get(WorkflowRunnerService).createContext(
|
|
1291
|
+
//迭代只有一个子流
|
|
1292
|
+
this.node.subFlowList[0].flow,
|
|
1293
|
+
this.context,
|
|
1294
|
+
this.injector
|
|
1295
|
+
).run()
|
|
1296
|
+
);
|
|
1297
|
+
} catch (error) {
|
|
1298
|
+
throw new Error(`执行第${index}出现异常`, { cause: error });
|
|
1299
|
+
}
|
|
1300
|
+
index++;
|
|
1301
|
+
}
|
|
1302
|
+
return async (id) => {
|
|
1303
|
+
if (id === "flat") {
|
|
1304
|
+
return resultList.flat(999);
|
|
1305
|
+
}
|
|
1306
|
+
return resultList;
|
|
1307
|
+
};
|
|
1308
|
+
}
|
|
1309
|
+
};
|
|
1310
|
+
|
|
1311
|
+
// packages/workflow/inline/node/iteration/main/index.ts
|
|
1312
|
+
var IterationMainConfig = {
|
|
1313
|
+
...NODE_COMMON3,
|
|
1314
|
+
runner: IterationRunner,
|
|
1315
|
+
configDefine: ITERATION_NODE_DEFINE
|
|
1316
|
+
};
|
|
1317
|
+
|
|
1318
|
+
// packages/workflow/inline/node/input-params/common.ts
|
|
1319
|
+
var NODE_COMMON4 = {
|
|
1320
|
+
priority: -100,
|
|
1321
|
+
type: "input-params",
|
|
1322
|
+
label: `入口`,
|
|
1323
|
+
icon: { fontIcon: "chat" },
|
|
1324
|
+
disableHead: false,
|
|
1325
|
+
disableConnect: false,
|
|
1326
|
+
color: "accent",
|
|
1327
|
+
help: [`- 入口`].join("\n"),
|
|
1328
|
+
outputs: [RUNNER_ORIGIN_OUTPUT]
|
|
1329
|
+
};
|
|
1330
|
+
|
|
1331
|
+
// packages/workflow/inline/node/input-params/node.define.ts
|
|
1332
|
+
var v10 = __toESM(require("valibot"), 1);
|
|
1333
|
+
var import_view_angular_core8 = require("@piying/view-angular-core");
|
|
1334
|
+
var import_rxjs2 = require("rxjs");
|
|
1335
|
+
var InputParams_NODE_DEFINE = v10.pipe(
|
|
1336
|
+
// todo 输入参数应该禁止被引用
|
|
1337
|
+
v10.object({
|
|
1338
|
+
/** 入口点通过不同的选择,提供不同的数据 */
|
|
1339
|
+
type: v10.pipe(
|
|
1340
|
+
v10.string(),
|
|
1341
|
+
(0, import_view_angular_core8.setComponent)("select"),
|
|
1342
|
+
import_view_angular_core8.actions.inputs.patchAsync({
|
|
1343
|
+
options: (field) => field.context["getUsageType"]()
|
|
1344
|
+
}),
|
|
1345
|
+
(0, import_view_angular_core8.valueChange)((fn) => {
|
|
1346
|
+
fn().pipe((0, import_rxjs2.filter)(Boolean)).subscribe(({ list: [value], field }) => {
|
|
1347
|
+
field.context["getUsageOutputs"](value).then((list) => {
|
|
1348
|
+
field.context.setOutputHandle(1, list);
|
|
1349
|
+
});
|
|
1350
|
+
field.context["usageChange"](value);
|
|
1351
|
+
});
|
|
1352
|
+
}),
|
|
1353
|
+
v10.title("输入类型")
|
|
1354
|
+
)
|
|
1355
|
+
}),
|
|
1356
|
+
import_view_angular_core8.actions.wrappers.patch(["div"]),
|
|
1357
|
+
import_view_angular_core8.actions.class.top("grid auto-rows-auto gap-2")
|
|
1358
|
+
);
|
|
1359
|
+
|
|
1360
|
+
// packages/workflow/inline/node/input-params/main/index.ts
|
|
1361
|
+
var EntryMainConfig = {
|
|
1362
|
+
...NODE_COMMON4,
|
|
1363
|
+
runner: InputParamsRunner,
|
|
1364
|
+
configDefine: InputParams_NODE_DEFINE
|
|
1365
|
+
};
|
|
1366
|
+
|
|
1367
|
+
// packages/workflow/workflow-parser.service.ts
|
|
1368
|
+
var WorkflowParserContext = class _WorkflowParserContext {
|
|
1369
|
+
constructor(list, subObject, data, parentNode, parent) {
|
|
1370
|
+
this.list = list;
|
|
1371
|
+
this.subObject = subObject;
|
|
1372
|
+
this.data = data;
|
|
1373
|
+
this.parentNode = parentNode;
|
|
1374
|
+
this.parent = parent;
|
|
1375
|
+
}
|
|
1376
|
+
list;
|
|
1377
|
+
subObject;
|
|
1378
|
+
data;
|
|
1379
|
+
parentNode;
|
|
1380
|
+
parent;
|
|
1381
|
+
// fixme 或许可以分离,单独调用,然后加上children查找,不过那样就太慢了
|
|
1382
|
+
#childUseNodeSet = /* @__PURE__ */ new Set();
|
|
1383
|
+
/** 只能子级在本级找不到节点时调用父级使用 */
|
|
1384
|
+
childUseDefine(id, parentId) {
|
|
1385
|
+
const define = this.list.find((item) => item.id === id);
|
|
1386
|
+
if (!define) {
|
|
1387
|
+
return this.parent?.childUseDefine(id, parentId);
|
|
1388
|
+
}
|
|
1389
|
+
if (id !== parentId) {
|
|
1390
|
+
this.#childUseNodeSet.add(id);
|
|
1391
|
+
}
|
|
1392
|
+
return define;
|
|
1393
|
+
}
|
|
1394
|
+
#getParentNodeDefine(id) {
|
|
1395
|
+
return this.parent?.childUseDefine(id, this.parentNode?.id);
|
|
1396
|
+
}
|
|
1397
|
+
parseItem() {
|
|
1398
|
+
const graph = new import_graphology.default({ multi: true });
|
|
1399
|
+
const { nodes, edges } = this.data.flow;
|
|
1400
|
+
const nodeData = { nodes: {}, end: void 0 };
|
|
1401
|
+
for (const node of this.list) {
|
|
1402
|
+
graph.addNode(node.id);
|
|
1403
|
+
const handle = {
|
|
1404
|
+
output: flatFilterHandleList(node.data.handle?.output)
|
|
1405
|
+
};
|
|
1406
|
+
const cEdges = (0, import_react.getConnectedEdges)([node], edges);
|
|
1407
|
+
const inputNodes = (0, import_react.getIncomers)(node, nodes, cEdges);
|
|
1408
|
+
const contextData = [];
|
|
1409
|
+
for (const linkedEdge of cEdges) {
|
|
1410
|
+
if (linkedEdge.target !== node.id) {
|
|
1411
|
+
continue;
|
|
1412
|
+
}
|
|
1413
|
+
if (linkedEdge.targetHandle === "[context]") {
|
|
1414
|
+
contextData.push({
|
|
1415
|
+
id: linkedEdge.source,
|
|
1416
|
+
output: linkedEdge.sourceHandle,
|
|
1417
|
+
rest: linkedEdge.sourceHandle.includes("[rest]")
|
|
1418
|
+
});
|
|
1419
|
+
}
|
|
1420
|
+
const linkedNode = inputNodes.find(
|
|
1421
|
+
(item) => item.id === linkedEdge.source
|
|
1422
|
+
);
|
|
1423
|
+
if (!graph.hasNode(linkedNode.id)) {
|
|
1424
|
+
if (!this.#getParentNodeDefine(linkedNode.id)) {
|
|
1425
|
+
return {
|
|
1426
|
+
error: {
|
|
1427
|
+
message: `${linkedNode.id}:未找到连接节点,只能读取到当前及祖先范围内的节点`,
|
|
1428
|
+
nodeId: linkedNode.id
|
|
1429
|
+
}
|
|
1430
|
+
};
|
|
1431
|
+
}
|
|
1432
|
+
graph.addNode(linkedNode.id);
|
|
1433
|
+
}
|
|
1434
|
+
graph.addEdge(linkedNode.id, node.id);
|
|
1435
|
+
}
|
|
1436
|
+
nodeData.nodes[node.id] = {
|
|
1437
|
+
data: node.data,
|
|
1438
|
+
outputs: handle.output,
|
|
1439
|
+
type: node.type,
|
|
1440
|
+
id: node.id,
|
|
1441
|
+
context: contextData,
|
|
1442
|
+
parentId: node.parentId
|
|
1443
|
+
};
|
|
1444
|
+
if (this.subObject[node.id]) {
|
|
1445
|
+
for (let index = 0; index < this.subObject[node.id].length; index++) {
|
|
1446
|
+
const { key, startId, nodeList } = this.subObject[node.id][index];
|
|
1447
|
+
const instance = new _WorkflowParserContext(
|
|
1448
|
+
nodeList,
|
|
1449
|
+
this.subObject,
|
|
1450
|
+
this.data,
|
|
1451
|
+
node,
|
|
1452
|
+
this
|
|
1453
|
+
);
|
|
1454
|
+
const result = instance.parseItem();
|
|
1455
|
+
if (result.error) {
|
|
1456
|
+
return { error: { ...result.error } };
|
|
1457
|
+
}
|
|
1458
|
+
nodeData.nodes[node.id].subFlowList ??= [];
|
|
1459
|
+
nodeData.nodes[node.id].subFlowList.push({
|
|
1460
|
+
key,
|
|
1461
|
+
flow: result.data,
|
|
1462
|
+
startId
|
|
1463
|
+
});
|
|
1464
|
+
}
|
|
1465
|
+
}
|
|
1466
|
+
}
|
|
1467
|
+
const outList = [];
|
|
1468
|
+
graph.forEachNode((node) => {
|
|
1469
|
+
if (!this.#childUseNodeSet.has(node) && graph.outDegree(node) === 0) {
|
|
1470
|
+
outList.push(node);
|
|
1471
|
+
}
|
|
1472
|
+
});
|
|
1473
|
+
if (outList.length > 1) {
|
|
1474
|
+
return { error: { message: `计算时存在多个出口` } };
|
|
1475
|
+
} else if (outList.length === 0) {
|
|
1476
|
+
return { error: { message: `可能出现循环依赖,没有出口` } };
|
|
1477
|
+
} else {
|
|
1478
|
+
nodeData.end = outList[0];
|
|
1479
|
+
return { data: nodeData };
|
|
1480
|
+
}
|
|
1481
|
+
}
|
|
1482
|
+
};
|
|
1483
|
+
var NodeGroup = class {
|
|
1484
|
+
#group = /* @__PURE__ */ new Map();
|
|
1485
|
+
#iterationMap = /* @__PURE__ */ new Map();
|
|
1486
|
+
addContainerStart(node) {
|
|
1487
|
+
this.#iterationMap.set(node.parentId, node);
|
|
1488
|
+
}
|
|
1489
|
+
getContainerStart(node) {
|
|
1490
|
+
return this.#iterationMap.get(node.id);
|
|
1491
|
+
}
|
|
1492
|
+
add(node) {
|
|
1493
|
+
const nodeMap = this.#group.get(node.type) || [];
|
|
1494
|
+
nodeMap.push(node);
|
|
1495
|
+
this.#group.set(node.type, nodeMap);
|
|
1496
|
+
}
|
|
1497
|
+
getList(type) {
|
|
1498
|
+
return this.#group.get(type) || [];
|
|
1499
|
+
}
|
|
1500
|
+
};
|
|
1501
|
+
var WorkflowDataToken = new import_static_injector12.InjectionToken(
|
|
1502
|
+
"WorkflowData"
|
|
1503
|
+
);
|
|
1504
|
+
var WorkflowPreParser = class {
|
|
1505
|
+
/**
|
|
1506
|
+
* 迭代块:直接找父级parentid就行了
|
|
1507
|
+
* 分类块:所有后面的都算他的
|
|
1508
|
+
* 重构,所有节点进行迭代
|
|
1509
|
+
* 找迭代快,找到后找子级item块,找到后进行output查找+parent==迭代快
|
|
1510
|
+
* 找分类,找到后output查找
|
|
1511
|
+
* 所有独立块都是找到独立节点后终止
|
|
1512
|
+
*/
|
|
1513
|
+
#nodeGroup = new NodeGroup();
|
|
1514
|
+
#data = (0, import_static_injector12.inject)(WorkflowDataToken);
|
|
1515
|
+
#plugin = (0, import_static_injector12.inject)(WorkflowPluginService);
|
|
1516
|
+
#inlineNodeService = (0, import_static_injector12.inject)(InlineNodeService);
|
|
1517
|
+
#fullBlockObject$$ = (0, import_static_injector12.computed)(
|
|
1518
|
+
() => ({
|
|
1519
|
+
...this.#inlineNodeService.conditionNodeList(),
|
|
1520
|
+
...this.#plugin.conditionNodeList$$(),
|
|
1521
|
+
["iteration" /* iteration */]: true
|
|
1522
|
+
})
|
|
1523
|
+
);
|
|
1524
|
+
#conditionBlockObject$$ = (0, import_static_injector12.computed)(
|
|
1525
|
+
() => ({
|
|
1526
|
+
...this.#inlineNodeService.conditionNodeList(),
|
|
1527
|
+
...this.#plugin.conditionNodeList$$()
|
|
1528
|
+
})
|
|
1529
|
+
);
|
|
1530
|
+
parse() {
|
|
1531
|
+
const { nodes, edges } = this.#data.flow;
|
|
1532
|
+
const mainList = [];
|
|
1533
|
+
const subObjectGroup = {};
|
|
1534
|
+
const excludeSet = /* @__PURE__ */ new Set();
|
|
1535
|
+
const isBlock = (item) => this.#fullBlockObject$$()[item.type];
|
|
1536
|
+
const removedList = /* @__PURE__ */ new Set();
|
|
1537
|
+
const getSubNode = (node, subNodeList) => {
|
|
1538
|
+
subNodeList.push(node);
|
|
1539
|
+
excludeSet.add(node.id);
|
|
1540
|
+
if (!isBlock(node)) {
|
|
1541
|
+
(0, import_react.getOutgoers)(node, nodes, edges).forEach((item) => {
|
|
1542
|
+
getSubNode(item, subNodeList);
|
|
1543
|
+
});
|
|
1544
|
+
}
|
|
1545
|
+
};
|
|
1546
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
1547
|
+
const node = nodes[i];
|
|
1548
|
+
if (node.data.excludeUsage) {
|
|
1549
|
+
removedList.add(node.id);
|
|
1550
|
+
nodes.splice(i, 1);
|
|
1551
|
+
i--;
|
|
1552
|
+
continue;
|
|
1553
|
+
}
|
|
1554
|
+
if (node.type === "input-params") {
|
|
1555
|
+
} else if (isBlock(node)) {
|
|
1556
|
+
this.#nodeGroup.add(node);
|
|
1557
|
+
} else if (node.type === "iteration-start" /* iterationStart */) {
|
|
1558
|
+
this.#nodeGroup.addContainerStart(node);
|
|
1559
|
+
}
|
|
1560
|
+
}
|
|
1561
|
+
Object.keys(this.#fullBlockObject$$()).flatMap((key) => this.#nodeGroup.getList(key)).forEach((node) => {
|
|
1562
|
+
const outputList = subObjectGroup[node.id] || [];
|
|
1563
|
+
subObjectGroup[node.id] = outputList;
|
|
1564
|
+
if (node.type === "iteration" /* iteration */) {
|
|
1565
|
+
const subNodeList = [];
|
|
1566
|
+
const startNode = this.#nodeGroup.getContainerStart(node);
|
|
1567
|
+
getSubNode(startNode, subNodeList);
|
|
1568
|
+
outputList.push({
|
|
1569
|
+
nodeList: (0, import_es_toolkit4.uniqBy)(subNodeList, (item) => item.id),
|
|
1570
|
+
startId: startNode.id,
|
|
1571
|
+
key: `[default]`
|
|
1572
|
+
});
|
|
1573
|
+
} else if (this.#conditionBlockObject$$()[node.type]) {
|
|
1574
|
+
const cEdges = (0, import_react.getConnectedEdges)([node], edges);
|
|
1575
|
+
const children = (0, import_react.getOutgoers)(node, nodes, cEdges);
|
|
1576
|
+
const outputHandleList = flatFilterHandleList(
|
|
1577
|
+
node.data.handle.output
|
|
1578
|
+
);
|
|
1579
|
+
for (const outputHandle of outputHandleList) {
|
|
1580
|
+
const outputEdgeList = cEdges.filter(
|
|
1581
|
+
(edge) => edge.sourceHandle === outputHandle.id
|
|
1582
|
+
);
|
|
1583
|
+
if (!outputEdgeList.length) {
|
|
1584
|
+
throw new Error(`[${node.data.title || ""}]节点上发现未连接出口`);
|
|
1585
|
+
}
|
|
1586
|
+
for (const childNode of children.filter(
|
|
1587
|
+
({ id }) => outputEdgeList.some(({ target }) => target === id)
|
|
1588
|
+
)) {
|
|
1589
|
+
const subNodeList = [];
|
|
1590
|
+
getSubNode(childNode, subNodeList);
|
|
1591
|
+
outputList.push({
|
|
1592
|
+
nodeList: (0, import_es_toolkit4.uniqBy)(subNodeList, (item) => item.id),
|
|
1593
|
+
startId: childNode.id,
|
|
1594
|
+
key: outputHandle.name
|
|
1595
|
+
});
|
|
1596
|
+
}
|
|
1597
|
+
}
|
|
1598
|
+
}
|
|
1599
|
+
});
|
|
1600
|
+
for (const node of nodes) {
|
|
1601
|
+
if (excludeSet.has(node.id)) {
|
|
1602
|
+
continue;
|
|
1603
|
+
}
|
|
1604
|
+
mainList.push(node);
|
|
1605
|
+
}
|
|
1606
|
+
return {
|
|
1607
|
+
list: mainList,
|
|
1608
|
+
subObjectGroup,
|
|
1609
|
+
edges: edges.filter(
|
|
1610
|
+
(edge) => !removedList.has(edge.source) && !removedList.has(edge.target)
|
|
1611
|
+
)
|
|
1612
|
+
};
|
|
1613
|
+
}
|
|
1614
|
+
};
|
|
1615
|
+
var WorkflowParserService = class {
|
|
1616
|
+
#injector = (0, import_static_injector12.inject)(import_static_injector12.Injector);
|
|
1617
|
+
#inlineNode = (0, import_static_injector12.inject)(InlineNodeService);
|
|
1618
|
+
constructor() {
|
|
1619
|
+
this.#inlineNode.register(index_node_exports);
|
|
1620
|
+
}
|
|
1621
|
+
/**
|
|
1622
|
+
* 1.如果出现孤立节点,那么需要判断是不是子级引用
|
|
1623
|
+
* 2.子级引用本级别找不到,那么需要找父级
|
|
1624
|
+
*/
|
|
1625
|
+
/**
|
|
1626
|
+
* 边有id,通过source 找到连接的节点
|
|
1627
|
+
*
|
|
1628
|
+
*/
|
|
1629
|
+
parse(data) {
|
|
1630
|
+
const injector = (0, import_static_injector12.createInjector)({
|
|
1631
|
+
providers: [
|
|
1632
|
+
WorkflowPreParser,
|
|
1633
|
+
{ provide: WorkflowDataToken, useValue: data }
|
|
1634
|
+
],
|
|
1635
|
+
parent: this.#injector
|
|
1636
|
+
});
|
|
1637
|
+
const preInstance = injector.get(WorkflowPreParser);
|
|
1638
|
+
const result = preInstance.parse();
|
|
1639
|
+
if (!result.list.length) {
|
|
1640
|
+
return {
|
|
1641
|
+
error: {
|
|
1642
|
+
message: "无可用节点"
|
|
1643
|
+
}
|
|
1644
|
+
};
|
|
1645
|
+
}
|
|
1646
|
+
const instance = new WorkflowParserContext(
|
|
1647
|
+
result.list,
|
|
1648
|
+
result.subObjectGroup,
|
|
1649
|
+
{ ...data, flow: { ...data.flow, edges: result.edges } }
|
|
1650
|
+
);
|
|
1651
|
+
return { ...instance.parseItem() };
|
|
1652
|
+
}
|
|
1653
|
+
};
|
|
1654
|
+
|
|
1655
|
+
// packages/workflow/workflow-exec.service.ts
|
|
1656
|
+
var import_static_injector14 = require("static-injector");
|
|
1657
|
+
var import_rxjs3 = require("rxjs");
|
|
1658
|
+
|
|
1659
|
+
// packages/workflow/preset/context-build.service.ts
|
|
1709
1660
|
var import_static_injector13 = require("static-injector");
|
|
1710
|
-
var import_es_toolkit5 = require("es-toolkit");
|
|
1711
1661
|
var ContextBuildService = class {
|
|
1712
1662
|
template = (0, import_static_injector13.inject)(TemplateFormatService);
|
|
1713
1663
|
parser = (0, import_static_injector13.inject)(WorkflowParserService);
|
|
1714
|
-
createWorkflow(input
|
|
1664
|
+
createWorkflow(input) {
|
|
1715
1665
|
const result = this.template.parse(
|
|
1716
1666
|
input.template.flatMap(
|
|
1717
1667
|
(item) => item.content.map((item2) => item2.type === "text" ? item2.text : "")
|
|
1718
1668
|
).join("\n")
|
|
1719
1669
|
).list.map((item) => item.value);
|
|
1720
|
-
const inputList = [
|
|
1721
|
-
(0, import_es_toolkit5.uniq)([
|
|
1722
|
-
...Object.keys({ ...input.input, ...input.context }),
|
|
1723
|
-
...result
|
|
1724
|
-
]).map((value, i) => ({
|
|
1725
|
-
id: `${i}`,
|
|
1726
|
-
value,
|
|
1727
|
-
label: ``
|
|
1728
|
-
}))
|
|
1729
|
-
];
|
|
1730
1670
|
const chatNode = {
|
|
1731
1671
|
id: "2",
|
|
1732
1672
|
data: {
|
|
1733
|
-
title: "
|
|
1673
|
+
title: "",
|
|
1734
1674
|
handle: {
|
|
1735
|
-
input: inputList,
|
|
1736
1675
|
output: [
|
|
1737
1676
|
[
|
|
1738
1677
|
{
|
|
1739
1678
|
id: "1",
|
|
1740
1679
|
label: "",
|
|
1741
|
-
value: "
|
|
1680
|
+
value: "default"
|
|
1742
1681
|
}
|
|
1743
1682
|
]
|
|
1744
1683
|
]
|
|
@@ -1748,62 +1687,8 @@ var ContextBuildService = class {
|
|
|
1748
1687
|
},
|
|
1749
1688
|
type: "chat"
|
|
1750
1689
|
};
|
|
1751
|
-
if (!inlineMode) {
|
|
1752
|
-
return {
|
|
1753
|
-
nodes: [chatNode],
|
|
1754
|
-
edges: []
|
|
1755
|
-
};
|
|
1756
|
-
}
|
|
1757
|
-
const inputParamsNode = {
|
|
1758
|
-
id: "1",
|
|
1759
|
-
type: "input-params" /* inputParams */,
|
|
1760
|
-
data: {
|
|
1761
|
-
handle: {
|
|
1762
|
-
input: [
|
|
1763
|
-
[
|
|
1764
|
-
{
|
|
1765
|
-
...generateHandle(DEFAULT_INPUT_KEY, ""),
|
|
1766
|
-
inputType: "object"
|
|
1767
|
-
}
|
|
1768
|
-
]
|
|
1769
|
-
],
|
|
1770
|
-
output: [[{ id: "1", value: "default", label: "" }]]
|
|
1771
|
-
}
|
|
1772
|
-
}
|
|
1773
|
-
};
|
|
1774
|
-
const bridgeNodeList = inputList.flat().map((item, i) => ({
|
|
1775
|
-
id: `${InlineInputItemRunner.runnerName}-${i}`,
|
|
1776
|
-
type: InlineInputItemRunner.runnerName,
|
|
1777
|
-
data: {
|
|
1778
|
-
handle: {
|
|
1779
|
-
input: [[{ id: "1", value: item.value, label: "" }]],
|
|
1780
|
-
output: [
|
|
1781
|
-
[
|
|
1782
|
-
{
|
|
1783
|
-
id: "1",
|
|
1784
|
-
label: "",
|
|
1785
|
-
value: "输出"
|
|
1786
|
-
}
|
|
1787
|
-
]
|
|
1788
|
-
]
|
|
1789
|
-
}
|
|
1790
|
-
}
|
|
1791
|
-
}));
|
|
1792
|
-
const bridgeEdgeList1 = inputList.flat().map((item, i) => ({
|
|
1793
|
-
source: inputParamsNode.id,
|
|
1794
|
-
sourceHandle: "1",
|
|
1795
|
-
target: `${InlineInputItemRunner.runnerName}-${i}`,
|
|
1796
|
-
targetHandle: "1"
|
|
1797
|
-
}));
|
|
1798
|
-
const bridgeEdgeList2 = inputList.flat().map((item, i) => ({
|
|
1799
|
-
source: `${InlineInputItemRunner.runnerName}-${i}`,
|
|
1800
|
-
sourceHandle: "1",
|
|
1801
|
-
target: chatNode.id,
|
|
1802
|
-
targetHandle: item.id
|
|
1803
|
-
}));
|
|
1804
1690
|
return {
|
|
1805
|
-
nodes: [
|
|
1806
|
-
edges: [...bridgeEdgeList1, ...bridgeEdgeList2]
|
|
1691
|
+
nodes: [chatNode]
|
|
1807
1692
|
};
|
|
1808
1693
|
}
|
|
1809
1694
|
};
|
|
@@ -1811,21 +1696,16 @@ var ContextBuildService = class {
|
|
|
1811
1696
|
// packages/workflow/workflow-exec.service.ts
|
|
1812
1697
|
var WorkflowExecService = class {
|
|
1813
1698
|
#parser = (0, import_static_injector14.inject)(WorkflowParserService);
|
|
1814
|
-
#parameterResolve = (0, import_static_injector14.inject)(InlineParametersService);
|
|
1815
1699
|
#runner = (0, import_static_injector14.inject)(WorkflowRunnerService);
|
|
1816
1700
|
parse(data) {
|
|
1817
1701
|
return this.#parser.parse(data);
|
|
1818
1702
|
}
|
|
1819
1703
|
async runParse(define, input, ob, abortSignal) {
|
|
1820
|
-
const parameters = await this.#parameterResolve.run(input);
|
|
1821
1704
|
return this.#runner.run(
|
|
1822
1705
|
define,
|
|
1823
1706
|
{
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
),
|
|
1827
|
-
environmentParameters: input.environmentParameters,
|
|
1828
|
-
modelOptions: input.modelOptions
|
|
1707
|
+
inputs: input.input ?? {},
|
|
1708
|
+
environmentParameters: input.environmentParameters
|
|
1829
1709
|
},
|
|
1830
1710
|
ob,
|
|
1831
1711
|
abortSignal
|
|
@@ -1852,8 +1732,8 @@ var WorkflowExecService = class {
|
|
|
1852
1732
|
}
|
|
1853
1733
|
#contextBuild = (0, import_static_injector14.inject)(ContextBuildService);
|
|
1854
1734
|
async agentChat(input, fn, abort) {
|
|
1855
|
-
const workflow = this.#contextBuild.createWorkflow(input
|
|
1856
|
-
const subject = new
|
|
1735
|
+
const workflow = this.#contextBuild.createWorkflow(input);
|
|
1736
|
+
const subject = new import_rxjs3.Subject();
|
|
1857
1737
|
subject.subscribe({
|
|
1858
1738
|
next: (value) => {
|
|
1859
1739
|
fn(value);
|
|
@@ -1862,7 +1742,8 @@ var WorkflowExecService = class {
|
|
|
1862
1742
|
const result2 = await this.exec(
|
|
1863
1743
|
{ flow: workflow },
|
|
1864
1744
|
{
|
|
1865
|
-
|
|
1745
|
+
input: input.input,
|
|
1746
|
+
environmentParameters: input.environmentParameters
|
|
1866
1747
|
},
|
|
1867
1748
|
{ showError: true },
|
|
1868
1749
|
subject,
|
|
@@ -1957,9 +1838,7 @@ var WORKFLOW_MODULE = {
|
|
|
1957
1838
|
WorkflowSelectService,
|
|
1958
1839
|
WorkflowFileService,
|
|
1959
1840
|
ContextBuildService,
|
|
1960
|
-
InlineBuilderService,
|
|
1961
1841
|
WorkflowRunnerService,
|
|
1962
|
-
InlineParametersService,
|
|
1963
1842
|
WorkflowPluginService,
|
|
1964
1843
|
InlineNodeService
|
|
1965
1844
|
],
|
|
@@ -1977,24 +1856,22 @@ var WORKFLOW_MODULE = {
|
|
|
1977
1856
|
CurrentContextToken,
|
|
1978
1857
|
CurrentNodeToken,
|
|
1979
1858
|
CurrentWorkflowToken,
|
|
1980
|
-
DEFAULT_CHAT_SCHEMA_KEY,
|
|
1981
|
-
DEFAULT_INPUT_KEY,
|
|
1982
1859
|
EXAMPLES_DEFINE,
|
|
1983
1860
|
EnviromentParametersToken,
|
|
1984
1861
|
HelpObj,
|
|
1985
1862
|
INLINE_Template,
|
|
1986
1863
|
INLINE_Template2,
|
|
1987
|
-
ITERATION_ITEM_SYMBOL,
|
|
1988
1864
|
InlineNodeService,
|
|
1989
|
-
InputParamsToken,
|
|
1990
1865
|
InputsToken,
|
|
1991
1866
|
LLMDataDefine,
|
|
1992
1867
|
ModelOptionsToken,
|
|
1868
|
+
NodeContextToken,
|
|
1869
|
+
NodeInputsToken,
|
|
1870
|
+
NodeParentMapToken,
|
|
1993
1871
|
NodeRunnerBase,
|
|
1994
1872
|
ParentContextToken,
|
|
1995
|
-
|
|
1873
|
+
RUNNER_ORIGIN_OUTPUT,
|
|
1996
1874
|
TemplateFormatService,
|
|
1997
|
-
UseInputToken,
|
|
1998
1875
|
WORKFLOW_MODULE,
|
|
1999
1876
|
WorkflowConfigToken,
|
|
2000
1877
|
WorkflowEmitter,
|
|
@@ -2009,8 +1886,7 @@ var WORKFLOW_MODULE = {
|
|
|
2009
1886
|
createLLMData,
|
|
2010
1887
|
createResultData,
|
|
2011
1888
|
flatFilterHandleList,
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
llmModelConfig
|
|
1889
|
+
llmModelConfig,
|
|
1890
|
+
serializeLexicalTextarea
|
|
2015
1891
|
});
|
|
2016
1892
|
//# sourceMappingURL=index.js.map
|