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