@shenghuabi/workflow 1.1.3 → 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 -30
- 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.mjs
CHANGED
|
@@ -7,10 +7,10 @@ var __export = (target, all) => {
|
|
|
7
7
|
// packages/workflow/workflow-parser.service.ts
|
|
8
8
|
import {
|
|
9
9
|
computed as computed3,
|
|
10
|
-
createInjector,
|
|
11
|
-
inject as
|
|
10
|
+
createInjector as createInjector2,
|
|
11
|
+
inject as inject9,
|
|
12
12
|
InjectionToken as InjectionToken2,
|
|
13
|
-
Injector as
|
|
13
|
+
Injector as Injector3
|
|
14
14
|
} from "static-injector";
|
|
15
15
|
import Graph from "graphology";
|
|
16
16
|
import {
|
|
@@ -24,9 +24,6 @@ var WorkflowNodeType = /* @__PURE__ */ ((WorkflowNodeType2) => {
|
|
|
24
24
|
WorkflowNodeType2["iteration"] = "iteration";
|
|
25
25
|
WorkflowNodeType2["iterationStart"] = "iteration-start";
|
|
26
26
|
WorkflowNodeType2["inputParams"] = "input-params";
|
|
27
|
-
WorkflowNodeType2["serialize"] = "serialize";
|
|
28
|
-
WorkflowNodeType2["parameters"] = "parameters";
|
|
29
|
-
WorkflowNodeType2["inlineInputItem"] = "inlineInputItem";
|
|
30
27
|
return WorkflowNodeType2;
|
|
31
28
|
})(WorkflowNodeType || {});
|
|
32
29
|
|
|
@@ -65,6 +62,9 @@ var InlineNodeService = class {
|
|
|
65
62
|
getNodeRunner(type) {
|
|
66
63
|
return this.inlineList.find((item) => item.type === type)?.runner;
|
|
67
64
|
}
|
|
65
|
+
getNodeDefine(type) {
|
|
66
|
+
return this.inlineList.find((item) => item.type === type);
|
|
67
|
+
}
|
|
68
68
|
};
|
|
69
69
|
|
|
70
70
|
// packages/workflow/plugin/plugin.service.ts
|
|
@@ -87,29 +87,26 @@ var WorkflowPluginService = class {
|
|
|
87
87
|
getNodeRunner(type) {
|
|
88
88
|
return this.nodeList().find((item) => item.type === type).runner;
|
|
89
89
|
}
|
|
90
|
+
getNodeDefine(type) {
|
|
91
|
+
return this.nodeList().find((item) => item.type === type);
|
|
92
|
+
}
|
|
90
93
|
};
|
|
91
94
|
|
|
92
95
|
// packages/workflow/inline/node/index.node.ts
|
|
93
96
|
var index_node_exports = {};
|
|
94
97
|
__export(index_node_exports, {
|
|
95
98
|
ChatMainConfig: () => ChatMainConfig,
|
|
99
|
+
EntryMainConfig: () => EntryMainConfig,
|
|
100
|
+
IterationMainConfig: () => IterationMainConfig,
|
|
96
101
|
TextMainConfig: () => TextMainConfig
|
|
97
102
|
});
|
|
98
103
|
|
|
99
104
|
// packages/workflow/share/const.ts
|
|
100
|
-
var DEFAULT_INPUT_KEY = `[INPUT]`;
|
|
101
105
|
var HelpObj = {
|
|
102
106
|
templateVarLine: `- 变量定义格式: {{xx}},{{xx.yy}}`,
|
|
103
107
|
pathTodoLine: `- **TODO** 接收传入路径而不是指定`
|
|
104
108
|
};
|
|
105
109
|
|
|
106
|
-
// packages/workflow/share/util.ts
|
|
107
|
-
import { v5 } from "uuid";
|
|
108
|
-
var UUID_NS = "404cfae8-94e7-41a6-acec-1037dd1fdaad";
|
|
109
|
-
function generateHandle(value, label = value) {
|
|
110
|
-
return { id: v5(value, UUID_NS), label, value };
|
|
111
|
-
}
|
|
112
|
-
|
|
113
110
|
// packages/workflow/share/common/examples.define.ts
|
|
114
111
|
import { actions as actions2 } from "@piying/view-angular-core";
|
|
115
112
|
import * as v from "valibot";
|
|
@@ -260,50 +257,48 @@ function llmModelConfig(item) {
|
|
|
260
257
|
}
|
|
261
258
|
|
|
262
259
|
// packages/workflow/share/common/const.ts
|
|
263
|
-
var
|
|
264
|
-
|
|
260
|
+
var RUNNER_ORIGIN_OUTPUT = [
|
|
261
|
+
{ id: "default", label: "默认", name: `default` }
|
|
262
|
+
];
|
|
265
263
|
|
|
266
264
|
// packages/workflow/share/type2.ts
|
|
267
265
|
import { v4 } from "uuid";
|
|
268
|
-
import * as
|
|
269
|
-
var extraData =
|
|
270
|
-
references:
|
|
266
|
+
import * as v5 from "valibot";
|
|
267
|
+
var extraData = v5.looseObject({
|
|
268
|
+
references: v5.optional(v5.array(v5.custom(Boolean)))
|
|
271
269
|
});
|
|
272
|
-
var baseDataDefine =
|
|
273
|
-
node:
|
|
274
|
-
nodeResult:
|
|
275
|
-
dataId:
|
|
276
|
-
extra:
|
|
270
|
+
var baseDataDefine = v5.object({
|
|
271
|
+
node: v5.object({ type: v5.string(), id: v5.string() }),
|
|
272
|
+
nodeResult: v5.pipe(v5.optional(v5.boolean(), false)),
|
|
273
|
+
dataId: v5.optional(v5.string(), () => v4()),
|
|
274
|
+
extra: v5.optional(extraData)
|
|
277
275
|
});
|
|
278
|
-
var CommonDataDefine =
|
|
276
|
+
var CommonDataDefine = v5.object({
|
|
279
277
|
...baseDataDefine.entries,
|
|
280
|
-
value:
|
|
278
|
+
value: v5.any()
|
|
281
279
|
});
|
|
282
|
-
var LLMDataDefine =
|
|
280
|
+
var LLMDataDefine = v5.object({
|
|
283
281
|
...baseDataDefine.entries,
|
|
284
|
-
type:
|
|
282
|
+
type: v5.optional(v5.literal("chat-stream"), "chat-stream"),
|
|
285
283
|
// 用来进行普通查询
|
|
286
|
-
value:
|
|
287
|
-
extra:
|
|
284
|
+
value: v5.string(),
|
|
285
|
+
extra: v5.object({
|
|
288
286
|
...extraData.entries,
|
|
289
|
-
content:
|
|
290
|
-
thinkContent:
|
|
291
|
-
isThinking:
|
|
292
|
-
delta:
|
|
293
|
-
historyList:
|
|
287
|
+
content: v5.string(),
|
|
288
|
+
thinkContent: v5.optional(v5.string()),
|
|
289
|
+
isThinking: v5.optional(v5.boolean()),
|
|
290
|
+
delta: v5.string(),
|
|
291
|
+
historyList: v5.custom(Boolean)
|
|
294
292
|
})
|
|
295
293
|
});
|
|
296
294
|
function createLLMData(data) {
|
|
297
|
-
return
|
|
295
|
+
return v5.parse(LLMDataDefine, data);
|
|
298
296
|
}
|
|
299
297
|
function createResultData(data) {
|
|
300
|
-
const result =
|
|
298
|
+
const result = v5.parse(CommonDataDefine, data);
|
|
301
299
|
result.nodeResult = true;
|
|
302
300
|
return result;
|
|
303
301
|
}
|
|
304
|
-
function isChatStream(data) {
|
|
305
|
-
return !!data.extra && "content" in data.extra && "thinkContent" in data.extra;
|
|
306
|
-
}
|
|
307
302
|
|
|
308
303
|
// packages/workflow/share/workflow.emit.ts
|
|
309
304
|
var WorkflowEmitter = class {
|
|
@@ -348,31 +343,35 @@ var NODE_COMMON = {
|
|
|
348
343
|
"> 不清楚是否所有模型都遵循此规则,所以并没有限制输入"
|
|
349
344
|
].join("\n"),
|
|
350
345
|
// config: defineConfig,
|
|
351
|
-
inputs: [
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
],
|
|
362
|
-
outputs: [
|
|
346
|
+
// inputs: [
|
|
347
|
+
// [],
|
|
348
|
+
// [
|
|
349
|
+
// {
|
|
350
|
+
// label: 'JsonSchema',
|
|
351
|
+
// value: DEFAULT_CHAT_SCHEMA_KEY,
|
|
352
|
+
// inputType: 'schema',
|
|
353
|
+
// optional: true,
|
|
354
|
+
// },
|
|
355
|
+
// ],
|
|
356
|
+
// ],
|
|
357
|
+
outputs: [
|
|
358
|
+
RUNNER_ORIGIN_OUTPUT,
|
|
359
|
+
[{ id: "format", label: "格式化", name: "format" }]
|
|
360
|
+
]
|
|
363
361
|
};
|
|
364
362
|
|
|
365
|
-
// packages/workflow/inline/node/chat/
|
|
366
|
-
import * as
|
|
363
|
+
// packages/workflow/inline/node/chat/node.define.ts
|
|
364
|
+
import * as v6 from "valibot";
|
|
367
365
|
import { actions as actions5, setComponent as setComponent2, valueChange } from "@piying/view-angular-core";
|
|
366
|
+
import { isChatSchema } from "@cyia/util";
|
|
368
367
|
var ResponseList = ["json", "markdown", "yaml"];
|
|
369
368
|
var ResponseFormat = ["text", "json_object", "json_schema"];
|
|
370
|
-
var CHAT_NODE_DEFINE =
|
|
371
|
-
|
|
372
|
-
llm:
|
|
369
|
+
var CHAT_NODE_DEFINE = v6.pipe(
|
|
370
|
+
v6.object({
|
|
371
|
+
llm: v6.optional(llmModelConfig()),
|
|
373
372
|
/** 处理时解析 */
|
|
374
|
-
responseFormat:
|
|
375
|
-
|
|
373
|
+
responseFormat: v6.pipe(
|
|
374
|
+
v6.optional(v6.picklist(ResponseFormat)),
|
|
376
375
|
actions5.inputs.patch({
|
|
377
376
|
options: [
|
|
378
377
|
// 有输入json时
|
|
@@ -394,11 +393,11 @@ var CHAT_NODE_DEFINE = v7.pipe(
|
|
|
394
393
|
}
|
|
395
394
|
]
|
|
396
395
|
}),
|
|
397
|
-
|
|
396
|
+
v6.title("响应格式")
|
|
398
397
|
),
|
|
399
398
|
/** 处理后解析 */
|
|
400
|
-
parseBy:
|
|
401
|
-
|
|
399
|
+
parseBy: v6.pipe(
|
|
400
|
+
v6.optional(v6.picklist(ResponseList)),
|
|
402
401
|
actions5.inputs.patch({
|
|
403
402
|
options: [
|
|
404
403
|
{ label: "直接返回", value: void 0 },
|
|
@@ -419,7 +418,7 @@ var CHAT_NODE_DEFINE = v7.pipe(
|
|
|
419
418
|
}
|
|
420
419
|
]
|
|
421
420
|
}),
|
|
422
|
-
|
|
421
|
+
v6.title("返回解析"),
|
|
423
422
|
valueChange((fn) => {
|
|
424
423
|
fn({ list: [["..", "responseFormat"]] }).subscribe(
|
|
425
424
|
({ list: [value], field }) => {
|
|
@@ -433,17 +432,29 @@ var CHAT_NODE_DEFINE = v7.pipe(
|
|
|
433
432
|
})
|
|
434
433
|
),
|
|
435
434
|
examples: EXAMPLES_DEFINE,
|
|
436
|
-
value:
|
|
437
|
-
|
|
435
|
+
value: v6.pipe(
|
|
436
|
+
v6.custom(Boolean),
|
|
438
437
|
setComponent2("prompt-list")
|
|
438
|
+
),
|
|
439
|
+
jsonSchema: v6.pipe(
|
|
440
|
+
v6.optional(
|
|
441
|
+
v6.pipe(
|
|
442
|
+
v6.any(),
|
|
443
|
+
v6.check(
|
|
444
|
+
(value) => isChatSchema(value),
|
|
445
|
+
(issue) => `jsonSchema 格式异常:输入 ${issue.input};需要类型 {name:string,schema:object}`
|
|
446
|
+
)
|
|
447
|
+
)
|
|
448
|
+
),
|
|
449
|
+
setComponent2("jsonSchema")
|
|
439
450
|
)
|
|
440
451
|
}),
|
|
441
452
|
actions5.wrappers.patch(["div"]),
|
|
442
453
|
actions5.class.top("grid auto-rows-auto gap-2")
|
|
443
454
|
);
|
|
444
455
|
|
|
445
|
-
// packages/workflow/inline/node/chat/main/
|
|
446
|
-
import { inject as
|
|
456
|
+
// packages/workflow/inline/node/chat/main/runner.ts
|
|
457
|
+
import { inject as inject3 } from "static-injector";
|
|
447
458
|
import { parse as parse2 } from "yaml";
|
|
448
459
|
import { uniqBy as uniqBy2 } from "es-toolkit";
|
|
449
460
|
|
|
@@ -455,7 +466,7 @@ function createAssistantMessage(text = "") {
|
|
|
455
466
|
};
|
|
456
467
|
}
|
|
457
468
|
|
|
458
|
-
// packages/workflow/inline/node/chat/main/
|
|
469
|
+
// packages/workflow/inline/node/chat/main/runner.ts
|
|
459
470
|
import { LogService } from "@cyia/external-call";
|
|
460
471
|
|
|
461
472
|
// packages/workflow/runner/runner-item.ts
|
|
@@ -466,7 +477,10 @@ import { InjectionToken } from "static-injector";
|
|
|
466
477
|
var CurrentWorkflowToken = new InjectionToken(
|
|
467
478
|
"CurrentWorkflow"
|
|
468
479
|
);
|
|
469
|
-
var InputsToken = new InjectionToken("
|
|
480
|
+
var InputsToken = new InjectionToken("Inputs");
|
|
481
|
+
var NodeInputsToken = new InjectionToken("NodeInputs");
|
|
482
|
+
var NodeContextToken = new InjectionToken("NodeContext");
|
|
483
|
+
var NodeParentMapToken = new InjectionToken("NodeParentMap");
|
|
470
484
|
var CurrentNodeToken = new InjectionToken("CurrentNode");
|
|
471
485
|
var CurrentCallNodeToken = new InjectionToken(
|
|
472
486
|
"CurrentCallNode"
|
|
@@ -474,11 +488,7 @@ var CurrentCallNodeToken = new InjectionToken(
|
|
|
474
488
|
var CurrentContextToken = new InjectionToken(
|
|
475
489
|
"CurrentContext"
|
|
476
490
|
);
|
|
477
|
-
var InputParamsToken = new InjectionToken(
|
|
478
|
-
"InputParams"
|
|
479
|
-
);
|
|
480
491
|
var ParentContextToken = new InjectionToken("ParentContext");
|
|
481
|
-
var UseInputToken = new InjectionToken("UseInput");
|
|
482
492
|
var AbortSignalToken = new InjectionToken(
|
|
483
493
|
"AbortSignal"
|
|
484
494
|
);
|
|
@@ -490,99 +500,22 @@ var WorkflowConfigToken = new InjectionToken("WorkflowConfig");
|
|
|
490
500
|
var ChatServiceToken = new InjectionToken("ChatServiceToken");
|
|
491
501
|
|
|
492
502
|
// packages/workflow/runner/runner-item.ts
|
|
493
|
-
import
|
|
494
|
-
import { isEmptyInput, isStringArray } from "@cyia/util";
|
|
503
|
+
import { isEmptyInput } from "@cyia/util";
|
|
495
504
|
import { omitBy } from "es-toolkit";
|
|
496
505
|
import { defaultsDeep } from "es-toolkit/compat";
|
|
497
506
|
var NodeRunnerBase = class {
|
|
498
507
|
node = inject(CurrentNodeToken);
|
|
499
|
-
callNode = inject(CurrentCallNodeToken);
|
|
508
|
+
callNode = inject(CurrentCallNodeToken, { optional: true }) ?? void 0;
|
|
500
509
|
context = inject(CurrentContextToken);
|
|
501
|
-
// protected useInput = inject(UseInputToken);
|
|
502
|
-
inputParams = inject(InputParamsToken);
|
|
503
510
|
injector = inject(Injector);
|
|
504
511
|
emitter = inject(WorkflowEmitter);
|
|
505
512
|
abortSignal = inject(AbortSignalToken);
|
|
513
|
+
inputs = inject(NodeInputsToken);
|
|
506
514
|
async run() {
|
|
507
515
|
throw new Error("待实现");
|
|
508
516
|
}
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
for (const input of this.node.inputs) {
|
|
512
|
-
if (!input.type) {
|
|
513
|
-
const data = this.inputParams.get(input.value);
|
|
514
|
-
if (!data) {
|
|
515
|
-
if (input.optional) {
|
|
516
|
-
continue;
|
|
517
|
-
} else {
|
|
518
|
-
throw new Error(`缺少输入参数: ${input.value}`);
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
obj[input.value] = data;
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
return obj;
|
|
525
|
-
});
|
|
526
|
-
inputValueObject$$ = computed2(
|
|
527
|
-
() => Object.entries(this.inputs$$()).reduce(
|
|
528
|
-
(obj, item) => {
|
|
529
|
-
obj[item[0]] = item[1].value;
|
|
530
|
-
return obj;
|
|
531
|
-
},
|
|
532
|
-
{}
|
|
533
|
-
)
|
|
534
|
-
);
|
|
535
|
-
inputMetadataList$$ = computed2(
|
|
536
|
-
() => Object.values(this.inputs$$()).map((item) => item.extra?.metadata)
|
|
537
|
-
);
|
|
538
|
-
getInputMetadata(input) {
|
|
539
|
-
return this.inputs$$()[input].extra?.metadata;
|
|
540
|
-
}
|
|
541
|
-
async getInputChat() {
|
|
542
|
-
const metadataList = [];
|
|
543
|
-
const obj = {};
|
|
544
|
-
const errorList = [];
|
|
545
|
-
for (const input of this.node.inputs) {
|
|
546
|
-
if (!input.type) {
|
|
547
|
-
const data = this.inputParams.get(input.value);
|
|
548
|
-
if (!data) {
|
|
549
|
-
if (input.optional) {
|
|
550
|
-
continue;
|
|
551
|
-
} else {
|
|
552
|
-
errorList.push(input.value);
|
|
553
|
-
continue;
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
if (input.inputType === "image") {
|
|
557
|
-
obj[input.value] = data?.value;
|
|
558
|
-
} else if (isStringArray(data?.value)) {
|
|
559
|
-
obj[input.value] = data.value.join("\n");
|
|
560
|
-
} else {
|
|
561
|
-
obj[input.value] = data?.value ?? "";
|
|
562
|
-
}
|
|
563
|
-
const extra = data?.extra;
|
|
564
|
-
if (extra) {
|
|
565
|
-
if (Array.isArray(extra)) {
|
|
566
|
-
for (const { metadata } of extra) {
|
|
567
|
-
if (!metadata) {
|
|
568
|
-
continue;
|
|
569
|
-
}
|
|
570
|
-
metadataList.push(metadata);
|
|
571
|
-
}
|
|
572
|
-
} else {
|
|
573
|
-
if (extra.metadata) {
|
|
574
|
-
metadataList.push(extra.metadata);
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
if (errorList.length) {
|
|
581
|
-
throw new Error(`缺少输入参数: ${errorList.join(",")}`);
|
|
582
|
-
}
|
|
583
|
-
return { metadataList, obj };
|
|
584
|
-
}
|
|
585
|
-
#modelConfig = inject(ModelOptionsToken);
|
|
517
|
+
#modelConfig = inject(ModelOptionsToken, { optional: true }) ?? void 0;
|
|
518
|
+
context$$ = computed2(() => this.injector.get(NodeContextToken)());
|
|
586
519
|
mergeChatModel(input) {
|
|
587
520
|
const chatService = this.injector.get(ChatServiceToken);
|
|
588
521
|
let presetConfig = {};
|
|
@@ -599,17 +532,7 @@ var NodeRunnerBase = class {
|
|
|
599
532
|
),
|
|
600
533
|
omitBy(presetConfig, isEmptyInput),
|
|
601
534
|
omitBy(this.#modelConfig ?? {}, isEmptyInput)
|
|
602
|
-
) : this.#modelConfig;
|
|
603
|
-
}
|
|
604
|
-
getParsedNode(schema) {
|
|
605
|
-
const result = v8.safeParse(schema, this.node.data.config);
|
|
606
|
-
if (result.success) {
|
|
607
|
-
return result.output;
|
|
608
|
-
}
|
|
609
|
-
if (typeof PROD_ENV === "undefined" || !PROD_ENV) {
|
|
610
|
-
console.log(result.issues);
|
|
611
|
-
}
|
|
612
|
-
throw new Error(JSON.stringify(result.issues));
|
|
535
|
+
) : this.#modelConfig ?? {};
|
|
613
536
|
}
|
|
614
537
|
};
|
|
615
538
|
|
|
@@ -722,47 +645,89 @@ var TemplateFormatService = class extends RootStaticInjectOptions {
|
|
|
722
645
|
}
|
|
723
646
|
};
|
|
724
647
|
|
|
725
|
-
// packages/workflow/inline/node/chat/main/
|
|
726
|
-
import { jsonParse, yamlParse, markdownParse
|
|
648
|
+
// packages/workflow/inline/node/chat/main/runner.ts
|
|
649
|
+
import { jsonParse, yamlParse, markdownParse } from "@cyia/util";
|
|
650
|
+
|
|
651
|
+
// packages/workflow/inline/node/chat/util/useChat.ts
|
|
652
|
+
import { inject as inject2 } from "static-injector";
|
|
653
|
+
|
|
654
|
+
// packages/workflow/util/serialize-text-template.ts
|
|
655
|
+
import { get } from "es-toolkit/compat";
|
|
656
|
+
import { serializeTemplate } from "@shenghuabi/lexical-textarea/variable-serialization";
|
|
657
|
+
function serializeWithContext(input, options) {
|
|
658
|
+
const { context, environmentContext, onMetadata } = options;
|
|
659
|
+
return serializeTemplate(input, (item) => {
|
|
660
|
+
if (item.type === "custom") {
|
|
661
|
+
return get(environmentContext, item.value);
|
|
662
|
+
}
|
|
663
|
+
const result = get(context, item.value);
|
|
664
|
+
if (typeof result === "string") {
|
|
665
|
+
return result;
|
|
666
|
+
}
|
|
667
|
+
if ("ref" in result) {
|
|
668
|
+
onMetadata?.(Array.isArray(result.ref) ? result.ref : [result.ref]);
|
|
669
|
+
}
|
|
670
|
+
return `${result}`;
|
|
671
|
+
}).trim();
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
// packages/workflow/inline/node/chat/util/useChat.ts
|
|
675
|
+
function useChat() {
|
|
676
|
+
const contextProvider = inject2(NodeContextToken);
|
|
677
|
+
const environmentContext = inject2(EnviromentParametersToken);
|
|
678
|
+
return async (list) => {
|
|
679
|
+
const metadataList = [];
|
|
680
|
+
const context = await contextProvider();
|
|
681
|
+
const serializeOptions = {
|
|
682
|
+
context,
|
|
683
|
+
environmentContext,
|
|
684
|
+
onMetadata: (metadata) => {
|
|
685
|
+
metadataList.push(...metadata);
|
|
686
|
+
}
|
|
687
|
+
};
|
|
688
|
+
const list2 = list.map((item) => {
|
|
689
|
+
const contentList = item.content.map((contentChild) => {
|
|
690
|
+
if (contentChild.type === "text") {
|
|
691
|
+
const text = serializeWithContext(
|
|
692
|
+
contentChild.text,
|
|
693
|
+
serializeOptions
|
|
694
|
+
);
|
|
695
|
+
return { type: contentChild.type, text };
|
|
696
|
+
} else if (contentChild.type === "image_url") {
|
|
697
|
+
const url = serializeWithContext(
|
|
698
|
+
contentChild.image_url.url,
|
|
699
|
+
serializeOptions
|
|
700
|
+
);
|
|
701
|
+
return {
|
|
702
|
+
type: contentChild.type,
|
|
703
|
+
text: { image_url: { url } }
|
|
704
|
+
};
|
|
705
|
+
}
|
|
706
|
+
});
|
|
707
|
+
return {
|
|
708
|
+
role: item.role,
|
|
709
|
+
content: contentList
|
|
710
|
+
};
|
|
711
|
+
});
|
|
712
|
+
return { metadataList, list: list2 };
|
|
713
|
+
};
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
// packages/workflow/inline/node/chat/main/runner.ts
|
|
727
717
|
var LlmRunner = class extends NodeRunnerBase {
|
|
728
|
-
#format =
|
|
729
|
-
#chatService =
|
|
730
|
-
#abort =
|
|
731
|
-
#channel =
|
|
718
|
+
#format = inject3(TemplateFormatService);
|
|
719
|
+
#chatService = inject3(ChatServiceToken);
|
|
720
|
+
#abort = inject3(AbortSignalToken);
|
|
721
|
+
#channel = inject3(LogService).getToken("chat");
|
|
722
|
+
chatParse = useChat();
|
|
732
723
|
async run() {
|
|
733
|
-
const
|
|
734
|
-
const inputJsonSchema = this.inputParams.get(DEFAULT_CHAT_SCHEMA_KEY);
|
|
735
|
-
const nodeResult = this.getParsedNode(CHAT_NODE_DEFINE);
|
|
724
|
+
const nodeResult = this.inputs;
|
|
736
725
|
const config = nodeResult;
|
|
737
726
|
const examples = config.examples;
|
|
738
727
|
const list = nodeResult.value;
|
|
739
|
-
const historyList =
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
obj
|
|
743
|
-
);
|
|
744
|
-
return {
|
|
745
|
-
role: item.role,
|
|
746
|
-
content: [
|
|
747
|
-
{ type: "text", text: content },
|
|
748
|
-
...item.content.filter((item2) => item2.type === "image_url").flatMap((item2) => {
|
|
749
|
-
if (item2.type === "image_url") {
|
|
750
|
-
return obj[item2.image_url.url].map((item3) => ({
|
|
751
|
-
type: "image_url",
|
|
752
|
-
image_url: { url: item3.data }
|
|
753
|
-
}));
|
|
754
|
-
}
|
|
755
|
-
return item2;
|
|
756
|
-
})
|
|
757
|
-
]
|
|
758
|
-
};
|
|
759
|
-
});
|
|
760
|
-
const schema = isChatSchema(inputJsonSchema?.value);
|
|
761
|
-
if (inputJsonSchema?.value && !schema) {
|
|
762
|
-
throw new Error(
|
|
763
|
-
`JsonSchema传入格式异常,需要: {name:string,schema:object},传入: ${JSON.stringify(inputJsonSchema.value)}`
|
|
764
|
-
);
|
|
765
|
-
} else if (schema) {
|
|
728
|
+
const { list: historyList, metadataList } = await this.chatParse(list);
|
|
729
|
+
const schema = config.jsonSchema;
|
|
730
|
+
if (schema) {
|
|
766
731
|
config.parseBy ??= "json";
|
|
767
732
|
config.responseFormat ??= "json_schema";
|
|
768
733
|
}
|
|
@@ -796,7 +761,7 @@ var LlmRunner = class extends NodeRunnerBase {
|
|
|
796
761
|
const result = await llm.stream(
|
|
797
762
|
{
|
|
798
763
|
messages: historyList,
|
|
799
|
-
response_format: config.responseFormat === "json_schema" ? { type: "json_schema", json_schema:
|
|
764
|
+
response_format: config.responseFormat === "json_schema" ? { type: "json_schema", json_schema: config.jsonSchema } : config.responseFormat === "json_object" ? { type: "json_object" } : void 0
|
|
800
765
|
},
|
|
801
766
|
{ signal: this.#abort }
|
|
802
767
|
);
|
|
@@ -827,33 +792,31 @@ var LlmRunner = class extends NodeRunnerBase {
|
|
|
827
792
|
historyList.push(createAssistantMessage(resultContent));
|
|
828
793
|
streamData.extra.historyList = historyList;
|
|
829
794
|
this.emitter.send(streamData);
|
|
830
|
-
return async (
|
|
831
|
-
if (
|
|
832
|
-
return
|
|
833
|
-
value: streamData.value,
|
|
834
|
-
dataId: streamData.dataId,
|
|
835
|
-
extra: streamData.extra
|
|
836
|
-
};
|
|
795
|
+
return async (id) => {
|
|
796
|
+
if (id === RUNNER_ORIGIN_OUTPUT[0].id) {
|
|
797
|
+
return streamData.value;
|
|
837
798
|
}
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
799
|
+
if (id === "format") {
|
|
800
|
+
let value;
|
|
801
|
+
switch (config.parseBy) {
|
|
802
|
+
case "markdown":
|
|
803
|
+
value = markdownParse(resultContent);
|
|
804
|
+
break;
|
|
805
|
+
case "json":
|
|
806
|
+
value = jsonParse(resultContent);
|
|
807
|
+
break;
|
|
808
|
+
case "yaml":
|
|
809
|
+
value = yamlParse(resultContent);
|
|
810
|
+
break;
|
|
811
|
+
default:
|
|
812
|
+
value = resultContent;
|
|
813
|
+
break;
|
|
814
|
+
}
|
|
815
|
+
if (typeof value === "undefined") {
|
|
816
|
+
throw new Error(`解析${config.parseBy}失败`);
|
|
817
|
+
}
|
|
818
|
+
return value;
|
|
855
819
|
}
|
|
856
|
-
return { value, dataId: streamData.dataId, extra: streamData.extra };
|
|
857
820
|
};
|
|
858
821
|
}
|
|
859
822
|
#exampleFormat(data, format) {
|
|
@@ -872,7 +835,7 @@ var LlmRunner = class extends NodeRunnerBase {
|
|
|
872
835
|
var ChatMainConfig = {
|
|
873
836
|
...NODE_COMMON,
|
|
874
837
|
runner: LlmRunner,
|
|
875
|
-
|
|
838
|
+
configDefine: CHAT_NODE_DEFINE
|
|
876
839
|
};
|
|
877
840
|
|
|
878
841
|
// packages/workflow/inline/node/text/common.ts
|
|
@@ -887,125 +850,544 @@ var NODE_COMMON2 = {
|
|
|
887
850
|
priority: -98
|
|
888
851
|
};
|
|
889
852
|
|
|
890
|
-
// packages/workflow/inline/node/text/
|
|
891
|
-
import {
|
|
853
|
+
// packages/workflow/inline/node/text/text.node.define.ts
|
|
854
|
+
import { actions as actions6, setComponent as setComponent3 } from "@piying/view-angular-core";
|
|
855
|
+
import * as v7 from "valibot";
|
|
856
|
+
var TEXT_NODE_DEFINE = v7.object({
|
|
857
|
+
value: v7.pipe(
|
|
858
|
+
v7.any(),
|
|
859
|
+
setComponent3("textarea-template"),
|
|
860
|
+
actions6.class.top("nodrag")
|
|
861
|
+
)
|
|
862
|
+
});
|
|
863
|
+
|
|
864
|
+
// packages/workflow/inline/node/text/main/runner.ts
|
|
865
|
+
import { inject as inject4 } from "static-injector";
|
|
892
866
|
var TextareaRunner = class extends NodeRunnerBase {
|
|
893
|
-
|
|
867
|
+
environmentContext = inject4(EnviromentParametersToken);
|
|
894
868
|
async run() {
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
869
|
+
return async () => {
|
|
870
|
+
let metadataList;
|
|
871
|
+
const context = await this.context$$();
|
|
872
|
+
const value = serializeWithContext(this.inputs.value, {
|
|
873
|
+
context,
|
|
874
|
+
environmentContext: this.environmentContext,
|
|
875
|
+
onMetadata(metadata) {
|
|
876
|
+
metadataList = metadata;
|
|
877
|
+
}
|
|
878
|
+
});
|
|
879
|
+
if (metadataList?.length) {
|
|
880
|
+
return {
|
|
881
|
+
toJSON: () => ({ ref: metadataList, value }),
|
|
882
|
+
toString: () => value,
|
|
883
|
+
ref: metadataList
|
|
884
|
+
};
|
|
885
|
+
}
|
|
886
|
+
return value;
|
|
887
|
+
};
|
|
898
888
|
}
|
|
899
889
|
};
|
|
900
890
|
|
|
901
891
|
// packages/workflow/inline/node/text/main/index.ts
|
|
902
892
|
var TextMainConfig = {
|
|
903
893
|
...NODE_COMMON2,
|
|
904
|
-
runner: TextareaRunner
|
|
894
|
+
runner: TextareaRunner,
|
|
895
|
+
configDefine: TEXT_NODE_DEFINE
|
|
905
896
|
};
|
|
906
897
|
|
|
907
|
-
// packages/workflow/
|
|
908
|
-
var
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
898
|
+
// packages/workflow/inline/node/iteration/common.ts
|
|
899
|
+
var NODE_COMMON3 = {
|
|
900
|
+
priority: -100,
|
|
901
|
+
type: "iteration",
|
|
902
|
+
label: `迭代`,
|
|
903
|
+
icon: { fontIcon: "chat" },
|
|
904
|
+
disableHead: false,
|
|
905
|
+
disableConnect: false,
|
|
906
|
+
color: "accent",
|
|
907
|
+
help: [`- 列表循环`].join("\n"),
|
|
908
|
+
// 普通的和flat
|
|
909
|
+
outputs: [RUNNER_ORIGIN_OUTPUT]
|
|
910
|
+
};
|
|
911
|
+
|
|
912
|
+
// packages/workflow/inline/node/iteration/node.define.ts
|
|
913
|
+
import * as v8 from "valibot";
|
|
914
|
+
import { actions as actions7, asControl } from "@piying/view-angular-core";
|
|
915
|
+
var ITERATION_NODE_DEFINE = v8.pipe(
|
|
916
|
+
v8.object({
|
|
917
|
+
list: v8.pipe(
|
|
918
|
+
v8.array(v8.any()),
|
|
919
|
+
asControl(),
|
|
920
|
+
actions7.wrappers.patch(["use-ref"])
|
|
921
|
+
)
|
|
922
|
+
}),
|
|
923
|
+
actions7.wrappers.patch(["div"]),
|
|
924
|
+
actions7.class.top("grid auto-rows-auto gap-2")
|
|
925
|
+
);
|
|
926
|
+
|
|
927
|
+
// packages/workflow/runner/workflow-runner.service.ts
|
|
928
|
+
import { createInjector, inject as inject7, Injector as Injector2 } from "static-injector";
|
|
929
|
+
|
|
930
|
+
// packages/workflow/inline/node/input-params/main/runner.ts
|
|
931
|
+
import { inject as inject5 } from "static-injector";
|
|
932
|
+
var InputParamsRunner = class extends NodeRunnerBase {
|
|
933
|
+
#env = inject5(EnviromentParametersToken);
|
|
934
|
+
async run() {
|
|
935
|
+
const data = this.#env;
|
|
936
|
+
return async (id) => {
|
|
937
|
+
if (!id || id === "[default]") {
|
|
938
|
+
return data;
|
|
939
|
+
}
|
|
940
|
+
if (id === "[rest]") {
|
|
941
|
+
return data;
|
|
942
|
+
}
|
|
943
|
+
return data[id];
|
|
944
|
+
};
|
|
916
945
|
}
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
946
|
+
};
|
|
947
|
+
|
|
948
|
+
// packages/workflow/inline/node/iteration/main/iteration-start.runner.ts
|
|
949
|
+
import { inject as inject6 } from "static-injector";
|
|
950
|
+
var IterationStartRunner = class extends NodeRunnerBase {
|
|
951
|
+
#nodeParentMap = inject6(NodeParentMapToken);
|
|
952
|
+
async run() {
|
|
953
|
+
const data = this.#nodeParentMap.get(this.node.parentId);
|
|
954
|
+
return async (id) => {
|
|
955
|
+
const list = this.node.outputs;
|
|
956
|
+
const result = list.find((item) => item.id === id);
|
|
957
|
+
return data[result.name];
|
|
958
|
+
};
|
|
959
|
+
}
|
|
960
|
+
};
|
|
961
|
+
|
|
962
|
+
// packages/workflow/runner/define.ts
|
|
963
|
+
var ItemRunnerObject = {
|
|
964
|
+
["iteration" /* iteration */]: IterationRunner,
|
|
965
|
+
["iteration-start" /* iterationStart */]: IterationStartRunner,
|
|
966
|
+
["input-params" /* inputParams */]: InputParamsRunner
|
|
967
|
+
};
|
|
968
|
+
|
|
969
|
+
// packages/workflow/runner/runner-error.ts
|
|
970
|
+
var RunnerError = class _RunnerError extends Error {
|
|
971
|
+
#origin;
|
|
972
|
+
#list;
|
|
973
|
+
constructor(origin, list) {
|
|
974
|
+
super(
|
|
975
|
+
`${list.map(
|
|
976
|
+
(item) => `[${item.title}]${item.message ? ": " + item.message : ""}`
|
|
977
|
+
).join("<-")}`,
|
|
978
|
+
{ cause: origin }
|
|
979
|
+
);
|
|
980
|
+
this.#origin = origin;
|
|
981
|
+
this.#list = list;
|
|
982
|
+
delete this.stack;
|
|
983
|
+
this.name = `节点运行异常`;
|
|
984
|
+
}
|
|
985
|
+
create(item) {
|
|
986
|
+
this.#list.push(item);
|
|
987
|
+
return new _RunnerError(this.#origin, this.#list);
|
|
988
|
+
}
|
|
989
|
+
};
|
|
990
|
+
var AbortSignalError = class extends Error {
|
|
991
|
+
};
|
|
992
|
+
|
|
993
|
+
// packages/workflow/runner/workflow-runner.service.ts
|
|
994
|
+
import { LogService as LogService2 } from "@cyia/external-call";
|
|
995
|
+
import { set } from "es-toolkit/compat";
|
|
996
|
+
import * as v9 from "valibot";
|
|
997
|
+
import { deepClone } from "@cyia/util";
|
|
998
|
+
import { deepEqual } from "fast-equals";
|
|
999
|
+
var WorkflowRunnerContext = class {
|
|
1000
|
+
#injector = inject7(Injector2);
|
|
1001
|
+
data = inject7(CurrentWorkflowToken);
|
|
1002
|
+
parent = inject7(ParentContextToken);
|
|
1003
|
+
#callCache = /* @__PURE__ */ new Map();
|
|
1004
|
+
#outputCache = /* @__PURE__ */ new Map();
|
|
1005
|
+
inputs = inject7(InputsToken);
|
|
1006
|
+
#plugin = inject7(WorkflowPluginService);
|
|
1007
|
+
#emitter = inject7(WorkflowEmitter);
|
|
1008
|
+
#inlineNode = inject7(InlineNodeService);
|
|
1009
|
+
async #getNodeRunner(type) {
|
|
1010
|
+
return this.#inlineNode.getNodeRunner(type) ?? ItemRunnerObject[type] ?? await this.#plugin.getNodeRunner(type);
|
|
1011
|
+
}
|
|
1012
|
+
async #getNodeDefine(type) {
|
|
1013
|
+
return this.#inlineNode.getNodeDefine(type) ?? await this.#plugin.getNodeDefine(type);
|
|
1014
|
+
}
|
|
1015
|
+
getNodeById(id) {
|
|
1016
|
+
const result = this.data.nodes[id];
|
|
1017
|
+
if (!result) {
|
|
1018
|
+
return this.parent?.getNodeById(id);
|
|
930
1019
|
}
|
|
931
|
-
|
|
932
|
-
|
|
1020
|
+
return result;
|
|
1021
|
+
}
|
|
1022
|
+
/** 调用缓存,同一个上下文内容不可能变化 */
|
|
1023
|
+
#getCallCache(id) {
|
|
1024
|
+
if (this.#callCache.has(id)) {
|
|
1025
|
+
return { result: this.#callCache.get(id) };
|
|
933
1026
|
}
|
|
934
|
-
return
|
|
1027
|
+
return this.parent ? this.parent.#getCallCache(id) : void 0;
|
|
935
1028
|
}
|
|
936
|
-
#
|
|
937
|
-
|
|
1029
|
+
#getOuputCache(id) {
|
|
1030
|
+
if (this.#outputCache.has(id)) {
|
|
1031
|
+
return { result: this.#outputCache.get(id) };
|
|
1032
|
+
}
|
|
1033
|
+
return this.parent ? this.parent.#getOuputCache(id) : void 0;
|
|
938
1034
|
}
|
|
939
|
-
|
|
940
|
-
const
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
1035
|
+
async startRun() {
|
|
1036
|
+
const node = this.getNodeById(this.data.end);
|
|
1037
|
+
return this.#runItem(node);
|
|
1038
|
+
}
|
|
1039
|
+
async run() {
|
|
1040
|
+
const node = this.getNodeById(this.data.end);
|
|
1041
|
+
return this.#runItem(node);
|
|
1042
|
+
}
|
|
1043
|
+
// 当前node 调用 node context
|
|
1044
|
+
async #createNodeRunner(item, inputParams, contextFactory, callNode) {
|
|
1045
|
+
const define = await this.#getNodeRunner(item.type);
|
|
1046
|
+
return createInjector({
|
|
1047
|
+
providers: [
|
|
1048
|
+
define,
|
|
1049
|
+
{ provide: CurrentNodeToken, useValue: item },
|
|
1050
|
+
[
|
|
1051
|
+
callNode ? { provide: CurrentCallNodeToken, useValue: callNode } : void 0
|
|
1052
|
+
].filter(Boolean),
|
|
1053
|
+
{ provide: CurrentContextToken, useValue: this },
|
|
1054
|
+
{ provide: NodeInputsToken, useValue: inputParams },
|
|
1055
|
+
{ provide: NodeContextToken, useValue: contextFactory }
|
|
1056
|
+
],
|
|
1057
|
+
parent: this.#injector
|
|
1058
|
+
}).get(define);
|
|
1059
|
+
}
|
|
1060
|
+
#abort = inject7(AbortSignalToken);
|
|
1061
|
+
async #runItem(node, callNode, input) {
|
|
1062
|
+
try {
|
|
1063
|
+
if (this.#abort?.aborted) {
|
|
1064
|
+
throw new AbortSignalError();
|
|
1065
|
+
}
|
|
1066
|
+
let inputObjResoved;
|
|
1067
|
+
const config = node.data.config;
|
|
1068
|
+
const supportList = /* @__PURE__ */ new Set();
|
|
1069
|
+
const config2 = await this.#getNodeDefine(node.type);
|
|
1070
|
+
if (config2?.configDefine) {
|
|
1071
|
+
const inputObj = deepClone(config?.value ?? {});
|
|
1072
|
+
if (config?.refList) {
|
|
1073
|
+
for (const input2 of config.refList) {
|
|
1074
|
+
const inputNode = this.getNodeById(input2.value);
|
|
1075
|
+
if (inputNode.subFlowList?.some(
|
|
1076
|
+
(subItem) => subItem.startId === node.id
|
|
1077
|
+
)) {
|
|
1078
|
+
continue;
|
|
964
1079
|
}
|
|
965
|
-
|
|
1080
|
+
const result2 = await this.#runItem(inputNode, node, {
|
|
1081
|
+
outputName: input2.outlet
|
|
1082
|
+
});
|
|
1083
|
+
set(inputObj, input2.key, result2);
|
|
1084
|
+
supportList.add(input2.key.join("|"));
|
|
1085
|
+
}
|
|
966
1086
|
}
|
|
967
|
-
if (
|
|
968
|
-
const
|
|
969
|
-
|
|
970
|
-
(
|
|
971
|
-
|
|
972
|
-
const linkedOuput = flatFilterHandleList(
|
|
973
|
-
linkedNode.data.handle?.output
|
|
974
|
-
).find((item2) => item2.id === linkedEdge.sourceHandle);
|
|
975
|
-
inputParams.push({
|
|
976
|
-
...item,
|
|
977
|
-
nodeId: linkedNode.id,
|
|
978
|
-
outputName: linkedOuput.value
|
|
979
|
-
});
|
|
980
|
-
if (!graph.hasNode(linkedNode.id)) {
|
|
981
|
-
if (!this.#getParentNodeDefine(linkedNode.id)) {
|
|
982
|
-
return {
|
|
983
|
-
error: {
|
|
984
|
-
message: `${linkedNode.id}:未找到连接节点,只能读取到当前及祖先范围内的节点`,
|
|
985
|
-
nodeId: linkedNode.id
|
|
986
|
-
}
|
|
987
|
-
};
|
|
1087
|
+
if (config?.invalidList) {
|
|
1088
|
+
for (const input2 of config.invalidList) {
|
|
1089
|
+
const keyStr = input2.key.join("|");
|
|
1090
|
+
if (supportList.has(keyStr)) {
|
|
1091
|
+
continue;
|
|
988
1092
|
}
|
|
989
|
-
|
|
1093
|
+
const data = this.inputs[node.id];
|
|
1094
|
+
const item = data.find((item2) => deepEqual(item2.key, input2.key));
|
|
1095
|
+
set(inputObj, input2.key, item.value);
|
|
990
1096
|
}
|
|
991
|
-
|
|
1097
|
+
}
|
|
1098
|
+
const result = v9.safeParse(config2.configDefine, inputObj);
|
|
1099
|
+
if (result.success) {
|
|
1100
|
+
inputObjResoved = result.output;
|
|
992
1101
|
} else {
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
continue;
|
|
1102
|
+
if (typeof PROD_ENV === "undefined" || !PROD_ENV) {
|
|
1103
|
+
console.error(result.issues);
|
|
996
1104
|
}
|
|
997
|
-
|
|
1105
|
+
throw new Error(v9.summarize(result.issues));
|
|
998
1106
|
}
|
|
999
1107
|
}
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1108
|
+
const contextFactory = async () => {
|
|
1109
|
+
let contextData = {};
|
|
1110
|
+
if (node.context.length) {
|
|
1111
|
+
for (const contextItem of node.context) {
|
|
1112
|
+
const inputNode = this.getNodeById(contextItem.id);
|
|
1113
|
+
const result = await this.#runItem(inputNode, node, {
|
|
1114
|
+
outputName: contextItem.output
|
|
1115
|
+
});
|
|
1116
|
+
if (contextItem.rest) {
|
|
1117
|
+
contextData = { ...contextData, ...result };
|
|
1118
|
+
} else {
|
|
1119
|
+
contextData[contextItem.output] = result;
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
return contextData;
|
|
1124
|
+
};
|
|
1125
|
+
const nodeRunner = await this.#createNodeRunner(
|
|
1126
|
+
node,
|
|
1127
|
+
inputObjResoved,
|
|
1128
|
+
contextFactory,
|
|
1129
|
+
callNode
|
|
1130
|
+
);
|
|
1131
|
+
const outputList = node.outputs;
|
|
1132
|
+
const outputName = input?.outputName ?? node.data.outputName ?? outputList[0]?.name;
|
|
1133
|
+
let dataResult = this.#getCallCache(node.id);
|
|
1134
|
+
if (dataResult === void 0) {
|
|
1135
|
+
const res = await nodeRunner.run();
|
|
1136
|
+
dataResult = { result: res };
|
|
1137
|
+
this.#callCache.set(node.id, res);
|
|
1138
|
+
}
|
|
1139
|
+
const outputKey = `${node.id}|${outputName}`;
|
|
1140
|
+
const outputResult = this.#getOuputCache(outputKey);
|
|
1141
|
+
let returnData;
|
|
1142
|
+
if (outputResult === void 0) {
|
|
1143
|
+
const outputValue = await dataResult.result(outputName);
|
|
1144
|
+
this.#outputCache.set(outputKey, outputValue);
|
|
1145
|
+
returnData = outputValue;
|
|
1146
|
+
} else {
|
|
1147
|
+
returnData = outputResult.result;
|
|
1148
|
+
}
|
|
1149
|
+
this.#emitter.send(
|
|
1150
|
+
createResultData({
|
|
1151
|
+
value: returnData,
|
|
1152
|
+
node
|
|
1153
|
+
})
|
|
1154
|
+
);
|
|
1155
|
+
return returnData;
|
|
1156
|
+
} catch (error) {
|
|
1157
|
+
if (error instanceof Error && error.message === "Request was aborted." || error instanceof AbortSignalError) {
|
|
1158
|
+
return { value: void 0 };
|
|
1159
|
+
}
|
|
1160
|
+
const item = { title: node.data.title || "" };
|
|
1161
|
+
if (error instanceof RunnerError) {
|
|
1162
|
+
throw error.create(item);
|
|
1163
|
+
} else {
|
|
1164
|
+
if (error instanceof Error && error.message === "Connection error.") {
|
|
1165
|
+
const newError = new RunnerError(error.cause, [
|
|
1166
|
+
{ ...item, message: "接口请求失败" }
|
|
1167
|
+
]);
|
|
1168
|
+
delete newError.stack;
|
|
1169
|
+
throw newError;
|
|
1170
|
+
}
|
|
1171
|
+
throw new RunnerError(error, [item]);
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
};
|
|
1176
|
+
var WorkflowRunnerService = class {
|
|
1177
|
+
#injector = inject7(Injector2);
|
|
1178
|
+
/** 自己使用
|
|
1179
|
+
* @internal
|
|
1180
|
+
*/
|
|
1181
|
+
createContext(data, parent, parentInjector) {
|
|
1182
|
+
return createInjector({
|
|
1183
|
+
providers: [
|
|
1184
|
+
WorkflowRunnerContext,
|
|
1185
|
+
{ provide: CurrentWorkflowToken, useValue: data },
|
|
1186
|
+
{ provide: ParentContextToken, useValue: parent }
|
|
1187
|
+
],
|
|
1188
|
+
parent: parentInjector ?? this.#injector
|
|
1189
|
+
}).get(WorkflowRunnerContext);
|
|
1190
|
+
}
|
|
1191
|
+
#log;
|
|
1192
|
+
get log() {
|
|
1193
|
+
return this.#log ?? (this.#log = this.#injector.get(LogService2, void 0, { optional: true })?.getToken("workflow"));
|
|
1194
|
+
}
|
|
1195
|
+
/** 入口 */
|
|
1196
|
+
run(wofkflowData, input, ob, signal2, providers) {
|
|
1197
|
+
const injector = createInjector({
|
|
1198
|
+
providers: [
|
|
1199
|
+
WorkflowEmitter,
|
|
1200
|
+
{ provide: AbortSignalToken, useValue: signal2 },
|
|
1201
|
+
{
|
|
1202
|
+
provide: EnviromentParametersToken,
|
|
1203
|
+
useValue: input.environmentParameters
|
|
1204
|
+
},
|
|
1205
|
+
{ provide: InputsToken, useValue: input.inputs },
|
|
1206
|
+
{ provide: NodeParentMapToken, useValue: /* @__PURE__ */ new Map() },
|
|
1207
|
+
...providers ?? []
|
|
1208
|
+
],
|
|
1209
|
+
parent: this.#injector
|
|
1210
|
+
});
|
|
1211
|
+
const runner = this.createContext(wofkflowData, void 0, injector);
|
|
1212
|
+
if (ob) {
|
|
1213
|
+
injector.get(WorkflowEmitter).setObserver(ob);
|
|
1214
|
+
}
|
|
1215
|
+
return runner.startRun();
|
|
1216
|
+
}
|
|
1217
|
+
};
|
|
1218
|
+
|
|
1219
|
+
// packages/workflow/inline/node/iteration/main/runner.ts
|
|
1220
|
+
import { isIterable } from "@cyia/util";
|
|
1221
|
+
import { inject as inject8 } from "static-injector";
|
|
1222
|
+
var IterationRunner = class extends NodeRunnerBase {
|
|
1223
|
+
#nodeParentMap = inject8(NodeParentMapToken);
|
|
1224
|
+
async run() {
|
|
1225
|
+
const inputs = this.inputs;
|
|
1226
|
+
const value = inputs.list;
|
|
1227
|
+
if (!isIterable(value)) {
|
|
1228
|
+
throw new Error(`输入值不是可迭代(数组)类型: ${JSON.stringify(value)}`);
|
|
1229
|
+
}
|
|
1230
|
+
const resultList = [];
|
|
1231
|
+
let index = 0;
|
|
1232
|
+
for (const item of value) {
|
|
1233
|
+
this.#nodeParentMap.set(this.node.id, { item });
|
|
1234
|
+
try {
|
|
1235
|
+
resultList.push(
|
|
1236
|
+
await this.injector.get(WorkflowRunnerService).createContext(
|
|
1237
|
+
//迭代只有一个子流
|
|
1238
|
+
this.node.subFlowList[0].flow,
|
|
1239
|
+
this.context,
|
|
1240
|
+
this.injector
|
|
1241
|
+
).run()
|
|
1242
|
+
);
|
|
1243
|
+
} catch (error) {
|
|
1244
|
+
throw new Error(`执行第${index}出现异常`, { cause: error });
|
|
1245
|
+
}
|
|
1246
|
+
index++;
|
|
1247
|
+
}
|
|
1248
|
+
return async (id) => {
|
|
1249
|
+
if (id === "flat") {
|
|
1250
|
+
return resultList.flat(999);
|
|
1251
|
+
}
|
|
1252
|
+
return resultList;
|
|
1253
|
+
};
|
|
1254
|
+
}
|
|
1255
|
+
};
|
|
1256
|
+
|
|
1257
|
+
// packages/workflow/inline/node/iteration/main/index.ts
|
|
1258
|
+
var IterationMainConfig = {
|
|
1259
|
+
...NODE_COMMON3,
|
|
1260
|
+
runner: IterationRunner,
|
|
1261
|
+
configDefine: ITERATION_NODE_DEFINE
|
|
1262
|
+
};
|
|
1263
|
+
|
|
1264
|
+
// packages/workflow/inline/node/input-params/common.ts
|
|
1265
|
+
var NODE_COMMON4 = {
|
|
1266
|
+
priority: -100,
|
|
1267
|
+
type: "input-params",
|
|
1268
|
+
label: `入口`,
|
|
1269
|
+
icon: { fontIcon: "chat" },
|
|
1270
|
+
disableHead: false,
|
|
1271
|
+
disableConnect: false,
|
|
1272
|
+
color: "accent",
|
|
1273
|
+
help: [`- 入口`].join("\n"),
|
|
1274
|
+
outputs: [RUNNER_ORIGIN_OUTPUT]
|
|
1275
|
+
};
|
|
1276
|
+
|
|
1277
|
+
// packages/workflow/inline/node/input-params/node.define.ts
|
|
1278
|
+
import * as v10 from "valibot";
|
|
1279
|
+
import { actions as actions8, setComponent as setComponent4, valueChange as valueChange2 } from "@piying/view-angular-core";
|
|
1280
|
+
import { filter } from "rxjs";
|
|
1281
|
+
var InputParams_NODE_DEFINE = v10.pipe(
|
|
1282
|
+
// todo 输入参数应该禁止被引用
|
|
1283
|
+
v10.object({
|
|
1284
|
+
/** 入口点通过不同的选择,提供不同的数据 */
|
|
1285
|
+
type: v10.pipe(
|
|
1286
|
+
v10.string(),
|
|
1287
|
+
setComponent4("select"),
|
|
1288
|
+
actions8.inputs.patchAsync({
|
|
1289
|
+
options: (field) => field.context["getUsageType"]()
|
|
1290
|
+
}),
|
|
1291
|
+
valueChange2((fn) => {
|
|
1292
|
+
fn().pipe(filter(Boolean)).subscribe(({ list: [value], field }) => {
|
|
1293
|
+
field.context["getUsageOutputs"](value).then((list) => {
|
|
1294
|
+
field.context.setOutputHandle(1, list);
|
|
1295
|
+
});
|
|
1296
|
+
field.context["usageChange"](value);
|
|
1297
|
+
});
|
|
1298
|
+
}),
|
|
1299
|
+
v10.title("输入类型")
|
|
1300
|
+
)
|
|
1301
|
+
}),
|
|
1302
|
+
actions8.wrappers.patch(["div"]),
|
|
1303
|
+
actions8.class.top("grid auto-rows-auto gap-2")
|
|
1304
|
+
);
|
|
1305
|
+
|
|
1306
|
+
// packages/workflow/inline/node/input-params/main/index.ts
|
|
1307
|
+
var EntryMainConfig = {
|
|
1308
|
+
...NODE_COMMON4,
|
|
1309
|
+
runner: InputParamsRunner,
|
|
1310
|
+
configDefine: InputParams_NODE_DEFINE
|
|
1311
|
+
};
|
|
1312
|
+
|
|
1313
|
+
// packages/workflow/workflow-parser.service.ts
|
|
1314
|
+
var WorkflowParserContext = class _WorkflowParserContext {
|
|
1315
|
+
constructor(list, subObject, data, parentNode, parent) {
|
|
1316
|
+
this.list = list;
|
|
1317
|
+
this.subObject = subObject;
|
|
1318
|
+
this.data = data;
|
|
1319
|
+
this.parentNode = parentNode;
|
|
1320
|
+
this.parent = parent;
|
|
1321
|
+
}
|
|
1322
|
+
list;
|
|
1323
|
+
subObject;
|
|
1324
|
+
data;
|
|
1325
|
+
parentNode;
|
|
1326
|
+
parent;
|
|
1327
|
+
// fixme 或许可以分离,单独调用,然后加上children查找,不过那样就太慢了
|
|
1328
|
+
#childUseNodeSet = /* @__PURE__ */ new Set();
|
|
1329
|
+
/** 只能子级在本级找不到节点时调用父级使用 */
|
|
1330
|
+
childUseDefine(id, parentId) {
|
|
1331
|
+
const define = this.list.find((item) => item.id === id);
|
|
1332
|
+
if (!define) {
|
|
1333
|
+
return this.parent?.childUseDefine(id, parentId);
|
|
1334
|
+
}
|
|
1335
|
+
if (id !== parentId) {
|
|
1336
|
+
this.#childUseNodeSet.add(id);
|
|
1337
|
+
}
|
|
1338
|
+
return define;
|
|
1339
|
+
}
|
|
1340
|
+
#getParentNodeDefine(id) {
|
|
1341
|
+
return this.parent?.childUseDefine(id, this.parentNode?.id);
|
|
1342
|
+
}
|
|
1343
|
+
parseItem() {
|
|
1344
|
+
const graph = new Graph({ multi: true });
|
|
1345
|
+
const { nodes, edges } = this.data.flow;
|
|
1346
|
+
const nodeData = { nodes: {}, end: void 0 };
|
|
1347
|
+
for (const node of this.list) {
|
|
1348
|
+
graph.addNode(node.id);
|
|
1349
|
+
const handle = {
|
|
1350
|
+
output: flatFilterHandleList(node.data.handle?.output)
|
|
1351
|
+
};
|
|
1352
|
+
const cEdges = getConnectedEdges([node], edges);
|
|
1353
|
+
const inputNodes = getIncomers(node, nodes, cEdges);
|
|
1354
|
+
const contextData = [];
|
|
1355
|
+
for (const linkedEdge of cEdges) {
|
|
1356
|
+
if (linkedEdge.target !== node.id) {
|
|
1357
|
+
continue;
|
|
1358
|
+
}
|
|
1359
|
+
if (linkedEdge.targetHandle === "[context]") {
|
|
1360
|
+
contextData.push({
|
|
1361
|
+
id: linkedEdge.source,
|
|
1362
|
+
output: linkedEdge.sourceHandle,
|
|
1363
|
+
rest: linkedEdge.sourceHandle.includes("[rest]")
|
|
1364
|
+
});
|
|
1365
|
+
}
|
|
1366
|
+
const linkedNode = inputNodes.find(
|
|
1367
|
+
(item) => item.id === linkedEdge.source
|
|
1368
|
+
);
|
|
1369
|
+
if (!graph.hasNode(linkedNode.id)) {
|
|
1370
|
+
if (!this.#getParentNodeDefine(linkedNode.id)) {
|
|
1371
|
+
return {
|
|
1372
|
+
error: {
|
|
1373
|
+
message: `${linkedNode.id}:未找到连接节点,只能读取到当前及祖先范围内的节点`,
|
|
1374
|
+
nodeId: linkedNode.id
|
|
1375
|
+
}
|
|
1376
|
+
};
|
|
1377
|
+
}
|
|
1378
|
+
graph.addNode(linkedNode.id);
|
|
1379
|
+
}
|
|
1380
|
+
graph.addEdge(linkedNode.id, node.id);
|
|
1381
|
+
}
|
|
1382
|
+
nodeData.nodes[node.id] = {
|
|
1383
|
+
data: node.data,
|
|
1384
|
+
outputs: handle.output,
|
|
1385
|
+
type: node.type,
|
|
1386
|
+
id: node.id,
|
|
1387
|
+
context: contextData,
|
|
1388
|
+
parentId: node.parentId
|
|
1389
|
+
};
|
|
1390
|
+
if (this.subObject[node.id]) {
|
|
1009
1391
|
for (let index = 0; index < this.subObject[node.id].length; index++) {
|
|
1010
1392
|
const { key, startId, nodeList } = this.subObject[node.id][index];
|
|
1011
1393
|
const instance = new _WorkflowParserContext(
|
|
@@ -1013,7 +1395,6 @@ var WorkflowParserContext = class _WorkflowParserContext {
|
|
|
1013
1395
|
this.subObject,
|
|
1014
1396
|
this.data,
|
|
1015
1397
|
node,
|
|
1016
|
-
this.userInputParams,
|
|
1017
1398
|
this
|
|
1018
1399
|
);
|
|
1019
1400
|
const result = instance.parseItem();
|
|
@@ -1041,15 +1422,6 @@ var WorkflowParserContext = class _WorkflowParserContext {
|
|
|
1041
1422
|
return { error: { message: `可能出现循环依赖,没有出口` } };
|
|
1042
1423
|
} else {
|
|
1043
1424
|
nodeData.end = outList[0];
|
|
1044
|
-
nodeData.inputList = uniqBy3(
|
|
1045
|
-
this.userInputParams,
|
|
1046
|
-
(item) => `${item.inputType || "string"}|${item.value}`
|
|
1047
|
-
).map((item) => ({
|
|
1048
|
-
inputType: item.inputType || "string",
|
|
1049
|
-
value: item.value,
|
|
1050
|
-
label: item.label || item.value,
|
|
1051
|
-
optional: item.optional
|
|
1052
|
-
}));
|
|
1053
1425
|
return { data: nodeData };
|
|
1054
1426
|
}
|
|
1055
1427
|
}
|
|
@@ -1085,9 +1457,9 @@ var WorkflowPreParser = class {
|
|
|
1085
1457
|
* 所有独立块都是找到独立节点后终止
|
|
1086
1458
|
*/
|
|
1087
1459
|
#nodeGroup = new NodeGroup();
|
|
1088
|
-
#data =
|
|
1089
|
-
#plugin =
|
|
1090
|
-
#inlineNodeService =
|
|
1460
|
+
#data = inject9(WorkflowDataToken);
|
|
1461
|
+
#plugin = inject9(WorkflowPluginService);
|
|
1462
|
+
#inlineNodeService = inject9(InlineNodeService);
|
|
1091
1463
|
#fullBlockObject$$ = computed3(
|
|
1092
1464
|
() => ({
|
|
1093
1465
|
...this.#inlineNodeService.conditionNodeList(),
|
|
@@ -1117,7 +1489,6 @@ var WorkflowPreParser = class {
|
|
|
1117
1489
|
});
|
|
1118
1490
|
}
|
|
1119
1491
|
};
|
|
1120
|
-
let manualInput = false;
|
|
1121
1492
|
for (let i = 0; i < nodes.length; i++) {
|
|
1122
1493
|
const node = nodes[i];
|
|
1123
1494
|
if (node.data.excludeUsage) {
|
|
@@ -1127,7 +1498,6 @@ var WorkflowPreParser = class {
|
|
|
1127
1498
|
continue;
|
|
1128
1499
|
}
|
|
1129
1500
|
if (node.type === "input-params") {
|
|
1130
|
-
manualInput ||= !!node.data.config?.["manualInput"];
|
|
1131
1501
|
} else if (isBlock(node)) {
|
|
1132
1502
|
this.#nodeGroup.add(node);
|
|
1133
1503
|
} else if (node.type === "iteration-start" /* iterationStart */) {
|
|
@@ -1167,7 +1537,7 @@ var WorkflowPreParser = class {
|
|
|
1167
1537
|
outputList.push({
|
|
1168
1538
|
nodeList: uniqBy3(subNodeList, (item) => item.id),
|
|
1169
1539
|
startId: childNode.id,
|
|
1170
|
-
key: outputHandle.
|
|
1540
|
+
key: outputHandle.name
|
|
1171
1541
|
});
|
|
1172
1542
|
}
|
|
1173
1543
|
}
|
|
@@ -1182,7 +1552,6 @@ var WorkflowPreParser = class {
|
|
|
1182
1552
|
return {
|
|
1183
1553
|
list: mainList,
|
|
1184
1554
|
subObjectGroup,
|
|
1185
|
-
manualInput,
|
|
1186
1555
|
edges: edges.filter(
|
|
1187
1556
|
(edge) => !removedList.has(edge.source) && !removedList.has(edge.target)
|
|
1188
1557
|
)
|
|
@@ -1190,8 +1559,8 @@ var WorkflowPreParser = class {
|
|
|
1190
1559
|
}
|
|
1191
1560
|
};
|
|
1192
1561
|
var WorkflowParserService = class {
|
|
1193
|
-
#injector =
|
|
1194
|
-
#inlineNode =
|
|
1562
|
+
#injector = inject9(Injector3);
|
|
1563
|
+
#inlineNode = inject9(InlineNodeService);
|
|
1195
1564
|
constructor() {
|
|
1196
1565
|
this.#inlineNode.register(index_node_exports);
|
|
1197
1566
|
}
|
|
@@ -1204,7 +1573,7 @@ var WorkflowParserService = class {
|
|
|
1204
1573
|
*
|
|
1205
1574
|
*/
|
|
1206
1575
|
parse(data) {
|
|
1207
|
-
const injector =
|
|
1576
|
+
const injector = createInjector2({
|
|
1208
1577
|
providers: [
|
|
1209
1578
|
WorkflowPreParser,
|
|
1210
1579
|
{ provide: WorkflowDataToken, useValue: data }
|
|
@@ -1225,463 +1594,36 @@ var WorkflowParserService = class {
|
|
|
1225
1594
|
result.subObjectGroup,
|
|
1226
1595
|
{ ...data, flow: { ...data.flow, edges: result.edges } }
|
|
1227
1596
|
);
|
|
1228
|
-
return { ...instance.parseItem()
|
|
1597
|
+
return { ...instance.parseItem() };
|
|
1229
1598
|
}
|
|
1230
1599
|
};
|
|
1231
1600
|
|
|
1232
1601
|
// packages/workflow/workflow-exec.service.ts
|
|
1233
1602
|
import { inject as inject11 } from "static-injector";
|
|
1234
|
-
|
|
1235
|
-
// packages/workflow/preset/inline-runner.service.ts
|
|
1236
|
-
import { inject as inject9 } from "static-injector";
|
|
1237
|
-
|
|
1238
|
-
// packages/workflow/preset/inline-build.service.ts
|
|
1239
|
-
import { inject as inject5 } from "static-injector";
|
|
1240
|
-
|
|
1241
|
-
// packages/workflow/runner/parameters.runner.ts
|
|
1242
|
-
var ParametersRunner = class extends NodeRunnerBase {
|
|
1243
|
-
static runnerName = "parameters";
|
|
1244
|
-
async run() {
|
|
1245
|
-
return async () => ({ value: this.inputs$$() });
|
|
1246
|
-
}
|
|
1247
|
-
};
|
|
1248
|
-
|
|
1249
|
-
// packages/workflow/preset/inline-build.service.ts
|
|
1250
|
-
var InlineBuilderService = class {
|
|
1251
|
-
template = inject5(TemplateFormatService);
|
|
1252
|
-
parser = inject5(WorkflowParserService);
|
|
1253
|
-
#createLLMNode(input) {
|
|
1254
|
-
return {
|
|
1255
|
-
id: "1",
|
|
1256
|
-
data: {
|
|
1257
|
-
handle: {
|
|
1258
|
-
input: [
|
|
1259
|
-
Object.keys({ ...input.input, ...input.context }).map(
|
|
1260
|
-
(value, i) => ({
|
|
1261
|
-
id: `${i}`,
|
|
1262
|
-
value,
|
|
1263
|
-
label: ``
|
|
1264
|
-
})
|
|
1265
|
-
)
|
|
1266
|
-
],
|
|
1267
|
-
output: [
|
|
1268
|
-
[
|
|
1269
|
-
{
|
|
1270
|
-
id: "1",
|
|
1271
|
-
label: "",
|
|
1272
|
-
value: "输出"
|
|
1273
|
-
}
|
|
1274
|
-
]
|
|
1275
|
-
]
|
|
1276
|
-
}
|
|
1277
|
-
},
|
|
1278
|
-
type: ParametersRunner.runnerName
|
|
1279
|
-
};
|
|
1280
|
-
}
|
|
1281
|
-
#createEdge(llmNode, context) {
|
|
1282
|
-
const edgeList = [];
|
|
1283
|
-
const addEdge = (node) => {
|
|
1284
|
-
const inputHandleList = node.data.handle?.input.flat() || [];
|
|
1285
|
-
for (const inputHandle of inputHandleList) {
|
|
1286
|
-
const item = context[inputHandle.value];
|
|
1287
|
-
if (!item) {
|
|
1288
|
-
continue;
|
|
1289
|
-
}
|
|
1290
|
-
const sourceHandle = item.data.handle.output[0][0];
|
|
1291
|
-
edgeList.push({
|
|
1292
|
-
source: item.id,
|
|
1293
|
-
sourceHandle: sourceHandle.id,
|
|
1294
|
-
// 自身
|
|
1295
|
-
target: node.id,
|
|
1296
|
-
targetHandle: inputHandle.id
|
|
1297
|
-
});
|
|
1298
|
-
}
|
|
1299
|
-
};
|
|
1300
|
-
for (const ctxKey in context) {
|
|
1301
|
-
const node = context[ctxKey];
|
|
1302
|
-
addEdge(node);
|
|
1303
|
-
}
|
|
1304
|
-
addEdge(llmNode);
|
|
1305
|
-
return edgeList;
|
|
1306
|
-
}
|
|
1307
|
-
#createWorkflow(input) {
|
|
1308
|
-
const chatNode = this.#createLLMNode(input);
|
|
1309
|
-
const edges = this.#createEdge(chatNode, input.context);
|
|
1310
|
-
return {
|
|
1311
|
-
nodes: [chatNode, ...Object.values(input.context)],
|
|
1312
|
-
edges
|
|
1313
|
-
};
|
|
1314
|
-
}
|
|
1315
|
-
createDefine(input) {
|
|
1316
|
-
return this.parser.parse({ flow: this.#createWorkflow(input) });
|
|
1317
|
-
}
|
|
1318
|
-
};
|
|
1319
|
-
|
|
1320
|
-
// packages/workflow/runner/workflow-runner.service.ts
|
|
1321
|
-
import { createInjector as createInjector2, inject as inject8, Injector as Injector3 } from "static-injector";
|
|
1322
|
-
|
|
1323
|
-
// packages/workflow/runner/inline-input-item.runner.ts
|
|
1324
|
-
import { inject as inject6 } from "static-injector";
|
|
1325
|
-
var InlineInputItemRunner = class extends NodeRunnerBase {
|
|
1326
|
-
static runnerName = "inlineInputItem";
|
|
1327
|
-
#env = inject6(EnviromentParametersToken);
|
|
1328
|
-
async run() {
|
|
1329
|
-
return async () => {
|
|
1330
|
-
const key = this.node.inputs[0].value;
|
|
1331
|
-
const result = this.#env;
|
|
1332
|
-
if (!result) {
|
|
1333
|
-
throw new Error(`读取上下文参数[${key}]失败`);
|
|
1334
|
-
}
|
|
1335
|
-
return { value: result[key] };
|
|
1336
|
-
};
|
|
1337
|
-
}
|
|
1338
|
-
};
|
|
1339
|
-
|
|
1340
|
-
// packages/workflow/runner/input-params.runner.ts
|
|
1341
|
-
import { inject as inject7 } from "static-injector";
|
|
1342
|
-
var InputParamsRunner = class extends NodeRunnerBase {
|
|
1343
|
-
#env = inject7(EnviromentParametersToken);
|
|
1344
|
-
async run() {
|
|
1345
|
-
return async () => {
|
|
1346
|
-
const value = this.#env;
|
|
1347
|
-
if (!value) {
|
|
1348
|
-
throw new Error(`读取上下文失败`);
|
|
1349
|
-
}
|
|
1350
|
-
return {
|
|
1351
|
-
value
|
|
1352
|
-
};
|
|
1353
|
-
};
|
|
1354
|
-
}
|
|
1355
|
-
};
|
|
1356
|
-
|
|
1357
|
-
// packages/workflow/runner/iteration-start.runner.ts
|
|
1358
|
-
var IterationStartRunner = class extends NodeRunnerBase {
|
|
1359
|
-
async run() {
|
|
1360
|
-
return async () => this.inputParams.get(ITERATION_ITEM_SYMBOL);
|
|
1361
|
-
}
|
|
1362
|
-
};
|
|
1363
|
-
|
|
1364
|
-
// packages/workflow/runner/iteration.runner.ts
|
|
1365
|
-
import { isIterable } from "@cyia/util";
|
|
1366
|
-
var IterationRunner = class extends NodeRunnerBase {
|
|
1367
|
-
async run() {
|
|
1368
|
-
const data = this.inputParams.get(this.node.inputs[0].value);
|
|
1369
|
-
if (!data) {
|
|
1370
|
-
throw new Error("输入节点为空");
|
|
1371
|
-
}
|
|
1372
|
-
const extra = data.extra;
|
|
1373
|
-
const value = data.value;
|
|
1374
|
-
if (!isIterable(value)) {
|
|
1375
|
-
throw new Error(`输入值不是可迭代(数组)类型: ${JSON.stringify(value)}`);
|
|
1376
|
-
}
|
|
1377
|
-
const resultList = [];
|
|
1378
|
-
let index = 0;
|
|
1379
|
-
for (const item of value) {
|
|
1380
|
-
const newInputs = new Map(this.inputParams);
|
|
1381
|
-
newInputs.set(ITERATION_ITEM_SYMBOL, {
|
|
1382
|
-
value: item,
|
|
1383
|
-
extra: extra?.[index]
|
|
1384
|
-
});
|
|
1385
|
-
try {
|
|
1386
|
-
resultList.push(
|
|
1387
|
-
await this.injector.get(WorkflowRunnerService).createContext(
|
|
1388
|
-
//迭代只有一个子流
|
|
1389
|
-
this.node.subFlowList[0].flow,
|
|
1390
|
-
newInputs,
|
|
1391
|
-
this.context,
|
|
1392
|
-
this.injector
|
|
1393
|
-
).run()
|
|
1394
|
-
);
|
|
1395
|
-
} catch (error) {
|
|
1396
|
-
throw new Error(`执行第${index}出现异常`, { cause: error });
|
|
1397
|
-
}
|
|
1398
|
-
index++;
|
|
1399
|
-
}
|
|
1400
|
-
const list = resultList.reduce(
|
|
1401
|
-
(obj, item) => {
|
|
1402
|
-
obj.value.push(item.value);
|
|
1403
|
-
obj.extra.push(item.extra);
|
|
1404
|
-
return obj;
|
|
1405
|
-
},
|
|
1406
|
-
{ value: [], extra: [] }
|
|
1407
|
-
);
|
|
1408
|
-
return async (outputName) => {
|
|
1409
|
-
if (outputName === "flat") {
|
|
1410
|
-
return { value: list.value.flat(999), extra: list.extra.flat(999) };
|
|
1411
|
-
}
|
|
1412
|
-
return list;
|
|
1413
|
-
};
|
|
1414
|
-
}
|
|
1415
|
-
};
|
|
1416
|
-
|
|
1417
|
-
// packages/workflow/runner/define.ts
|
|
1418
|
-
var ItemRunnerObject = {
|
|
1419
|
-
["iteration" /* iteration */]: IterationRunner,
|
|
1420
|
-
["iteration-start" /* iterationStart */]: IterationStartRunner,
|
|
1421
|
-
["input-params" /* inputParams */]: InputParamsRunner,
|
|
1422
|
-
["parameters" /* parameters */]: ParametersRunner,
|
|
1423
|
-
["inlineInputItem" /* inlineInputItem */]: InlineInputItemRunner
|
|
1424
|
-
};
|
|
1425
|
-
|
|
1426
|
-
// packages/workflow/runner/runner-error.ts
|
|
1427
|
-
var RunnerError = class _RunnerError extends Error {
|
|
1428
|
-
#origin;
|
|
1429
|
-
#list;
|
|
1430
|
-
constructor(origin, list) {
|
|
1431
|
-
super(
|
|
1432
|
-
`${list.map(
|
|
1433
|
-
(item) => `[${item.title}]${item.message ? ": " + item.message : ""}`
|
|
1434
|
-
).join("<-")}`,
|
|
1435
|
-
{ cause: origin }
|
|
1436
|
-
);
|
|
1437
|
-
this.#origin = origin;
|
|
1438
|
-
this.#list = list;
|
|
1439
|
-
delete this.stack;
|
|
1440
|
-
this.name = `节点运行异常`;
|
|
1441
|
-
}
|
|
1442
|
-
create(item) {
|
|
1443
|
-
this.#list.push(item);
|
|
1444
|
-
return new _RunnerError(this.#origin, this.#list);
|
|
1445
|
-
}
|
|
1446
|
-
};
|
|
1447
|
-
var AbortSignalError = class extends Error {
|
|
1448
|
-
};
|
|
1449
|
-
|
|
1450
|
-
// packages/workflow/runner/workflow-runner.service.ts
|
|
1451
|
-
import { LogService as LogService2 } from "@cyia/external-call";
|
|
1452
|
-
var ITERATION_ITEM_SYMBOL = /* @__PURE__ */ Symbol("ITERATION_ITEM");
|
|
1453
|
-
var WorkflowRunnerContext = class {
|
|
1454
|
-
#injector = inject8(Injector3);
|
|
1455
|
-
data = inject8(CurrentWorkflowToken);
|
|
1456
|
-
parent = inject8(ParentContextToken);
|
|
1457
|
-
#callCache = /* @__PURE__ */ new Map();
|
|
1458
|
-
#outputCache = /* @__PURE__ */ new Map();
|
|
1459
|
-
inputs = inject8(InputsToken);
|
|
1460
|
-
#plugin = inject8(WorkflowPluginService);
|
|
1461
|
-
#emitter = inject8(WorkflowEmitter);
|
|
1462
|
-
#inlineNode = inject8(InlineNodeService);
|
|
1463
|
-
async #getNodeRunner(type) {
|
|
1464
|
-
return this.#inlineNode.getNodeRunner(type) ?? ItemRunnerObject[type] ?? await this.#plugin.getNodeRunner(type);
|
|
1465
|
-
}
|
|
1466
|
-
getNodeById(id) {
|
|
1467
|
-
const result = this.data.nodes[id];
|
|
1468
|
-
if (!result) {
|
|
1469
|
-
return this.parent?.getNodeById(id);
|
|
1470
|
-
}
|
|
1471
|
-
return result;
|
|
1472
|
-
}
|
|
1473
|
-
/** 调用缓存,同一个上下文内容不可能变化 */
|
|
1474
|
-
#getCallCache(id) {
|
|
1475
|
-
if (this.#callCache.has(id)) {
|
|
1476
|
-
return { result: this.#callCache.get(id) };
|
|
1477
|
-
}
|
|
1478
|
-
return this.parent ? this.parent.#getCallCache(id) : void 0;
|
|
1479
|
-
}
|
|
1480
|
-
#getOuputCache(id) {
|
|
1481
|
-
if (this.#outputCache.has(id)) {
|
|
1482
|
-
return { result: this.#outputCache.get(id) };
|
|
1483
|
-
}
|
|
1484
|
-
return this.parent ? this.parent.#getOuputCache(id) : void 0;
|
|
1485
|
-
}
|
|
1486
|
-
async startRun() {
|
|
1487
|
-
const node = this.getNodeById(this.data.end);
|
|
1488
|
-
return this.#runItem(node);
|
|
1489
|
-
}
|
|
1490
|
-
async run() {
|
|
1491
|
-
const node = this.getNodeById(this.data.end);
|
|
1492
|
-
return this.#runItem(node);
|
|
1493
|
-
}
|
|
1494
|
-
// 当前node 调用 node context
|
|
1495
|
-
async #createNodeRunner(item, inputParams, callNode, input) {
|
|
1496
|
-
const define = await this.#getNodeRunner(item.type);
|
|
1497
|
-
return createInjector2({
|
|
1498
|
-
providers: [
|
|
1499
|
-
define,
|
|
1500
|
-
{ provide: CurrentNodeToken, useValue: item },
|
|
1501
|
-
{ provide: CurrentCallNodeToken, useValue: callNode },
|
|
1502
|
-
{ provide: CurrentContextToken, useValue: this },
|
|
1503
|
-
{ provide: UseInputToken, useValue: input },
|
|
1504
|
-
{ provide: InputParamsToken, useValue: inputParams }
|
|
1505
|
-
],
|
|
1506
|
-
parent: this.#injector
|
|
1507
|
-
}).get(define);
|
|
1508
|
-
}
|
|
1509
|
-
#abort = inject8(AbortSignalToken);
|
|
1510
|
-
async #runItem(node, callNode, input) {
|
|
1511
|
-
try {
|
|
1512
|
-
if (this.#abort?.aborted) {
|
|
1513
|
-
throw new AbortSignalError();
|
|
1514
|
-
}
|
|
1515
|
-
const inputParams = new Map(this.inputs);
|
|
1516
|
-
for (const input2 of node.inputs) {
|
|
1517
|
-
if (input2.nodeId) {
|
|
1518
|
-
const inputNode = this.getNodeById(input2.nodeId);
|
|
1519
|
-
if (inputNode.subFlowList?.some(
|
|
1520
|
-
(subItem) => subItem.startId === node.id
|
|
1521
|
-
)) {
|
|
1522
|
-
continue;
|
|
1523
|
-
}
|
|
1524
|
-
const result = await this.#runItem(inputNode, node, input2);
|
|
1525
|
-
inputParams.set(input2.value, result);
|
|
1526
|
-
}
|
|
1527
|
-
}
|
|
1528
|
-
const nodeRunner = await this.#createNodeRunner(
|
|
1529
|
-
node,
|
|
1530
|
-
inputParams,
|
|
1531
|
-
callNode,
|
|
1532
|
-
input
|
|
1533
|
-
);
|
|
1534
|
-
const outputList = node.outputs;
|
|
1535
|
-
const outputName = input?.outputName ?? node.data.outputName ?? outputList[0].value;
|
|
1536
|
-
let dataResult = this.#getCallCache(node.id);
|
|
1537
|
-
if (dataResult === void 0) {
|
|
1538
|
-
{
|
|
1539
|
-
const res = await nodeRunner.run();
|
|
1540
|
-
dataResult = { result: res };
|
|
1541
|
-
this.#callCache.set(node.id, res);
|
|
1542
|
-
}
|
|
1543
|
-
}
|
|
1544
|
-
const outputKey = `${node.id}|${outputName}`;
|
|
1545
|
-
const outputResult = this.#getOuputCache(outputKey);
|
|
1546
|
-
let returnData;
|
|
1547
|
-
if (outputResult === void 0) {
|
|
1548
|
-
const res = await dataResult.result(outputName);
|
|
1549
|
-
this.#outputCache.set(outputKey, res);
|
|
1550
|
-
returnData = res;
|
|
1551
|
-
} else {
|
|
1552
|
-
returnData = outputResult.result;
|
|
1553
|
-
}
|
|
1554
|
-
this.#emitter.send(
|
|
1555
|
-
createResultData({
|
|
1556
|
-
...returnData,
|
|
1557
|
-
node
|
|
1558
|
-
})
|
|
1559
|
-
);
|
|
1560
|
-
return returnData;
|
|
1561
|
-
} catch (error) {
|
|
1562
|
-
if (error instanceof Error && error.message === "Request was aborted." || error instanceof AbortSignalError) {
|
|
1563
|
-
return { value: void 0 };
|
|
1564
|
-
}
|
|
1565
|
-
const item = { title: node.data.title || "" };
|
|
1566
|
-
if (error instanceof RunnerError) {
|
|
1567
|
-
throw error.create(item);
|
|
1568
|
-
} else {
|
|
1569
|
-
if (error instanceof Error && error.message === "Connection error.") {
|
|
1570
|
-
const newError = new RunnerError(error.cause, [
|
|
1571
|
-
{ ...item, message: "接口请求失败" }
|
|
1572
|
-
]);
|
|
1573
|
-
delete newError.stack;
|
|
1574
|
-
throw newError;
|
|
1575
|
-
}
|
|
1576
|
-
throw new RunnerError(error, [item]);
|
|
1577
|
-
}
|
|
1578
|
-
}
|
|
1579
|
-
}
|
|
1580
|
-
};
|
|
1581
|
-
var WorkflowRunnerService = class {
|
|
1582
|
-
#injector = inject8(Injector3);
|
|
1583
|
-
/** 自己使用
|
|
1584
|
-
* @internal
|
|
1585
|
-
*/
|
|
1586
|
-
createContext(data, inputs, parent, parentInjector) {
|
|
1587
|
-
return createInjector2({
|
|
1588
|
-
providers: [
|
|
1589
|
-
WorkflowRunnerContext,
|
|
1590
|
-
{ provide: CurrentWorkflowToken, useValue: data },
|
|
1591
|
-
{ provide: InputsToken, useValue: inputs },
|
|
1592
|
-
{ provide: ParentContextToken, useValue: parent }
|
|
1593
|
-
],
|
|
1594
|
-
parent: parentInjector ?? this.#injector
|
|
1595
|
-
}).get(WorkflowRunnerContext);
|
|
1596
|
-
}
|
|
1597
|
-
#log;
|
|
1598
|
-
get log() {
|
|
1599
|
-
return this.#log ?? (this.#log = this.#injector.get(LogService2, void 0, { optional: true })?.getToken("workflow"));
|
|
1600
|
-
}
|
|
1601
|
-
/** 入口 */
|
|
1602
|
-
run(data, input, ob, signal2) {
|
|
1603
|
-
this.log?.info("工作流默认对话配置", input.modelOptions);
|
|
1604
|
-
const injector = createInjector2({
|
|
1605
|
-
providers: [
|
|
1606
|
-
WorkflowEmitter,
|
|
1607
|
-
{ provide: AbortSignalToken, useValue: signal2 },
|
|
1608
|
-
{
|
|
1609
|
-
provide: EnviromentParametersToken,
|
|
1610
|
-
useValue: input.environmentParameters
|
|
1611
|
-
},
|
|
1612
|
-
{ provide: ModelOptionsToken, useValue: input.modelOptions }
|
|
1613
|
-
],
|
|
1614
|
-
parent: this.#injector
|
|
1615
|
-
});
|
|
1616
|
-
const runner = this.createContext(data, input.input, void 0, injector);
|
|
1617
|
-
if (ob) {
|
|
1618
|
-
injector.get(WorkflowEmitter).setObserver(ob);
|
|
1619
|
-
}
|
|
1620
|
-
return runner.startRun();
|
|
1621
|
-
}
|
|
1622
|
-
};
|
|
1623
|
-
|
|
1624
|
-
// packages/workflow/preset/inline-runner.service.ts
|
|
1625
|
-
var InlineParametersService = class {
|
|
1626
|
-
#inlineBuild = inject9(InlineBuilderService);
|
|
1627
|
-
#workflowRunner = inject9(WorkflowRunnerService);
|
|
1628
|
-
async run(input) {
|
|
1629
|
-
const define = this.#inlineBuild.createDefine({
|
|
1630
|
-
...input,
|
|
1631
|
-
input: input.input ?? {},
|
|
1632
|
-
context: input.context ?? {}
|
|
1633
|
-
});
|
|
1634
|
-
const result2 = await this.#workflowRunner.run(define.data, {
|
|
1635
|
-
input: new Map(
|
|
1636
|
-
Object.entries(input.input || {}).map(([key, value]) => [
|
|
1637
|
-
key,
|
|
1638
|
-
{ value }
|
|
1639
|
-
])
|
|
1640
|
-
),
|
|
1641
|
-
environmentParameters: input.environmentParameters,
|
|
1642
|
-
modelOptions: input.modelOptions
|
|
1643
|
-
});
|
|
1644
|
-
return result2;
|
|
1645
|
-
}
|
|
1646
|
-
};
|
|
1647
|
-
|
|
1648
|
-
// packages/workflow/workflow-exec.service.ts
|
|
1649
1603
|
import { Subject } from "rxjs";
|
|
1650
1604
|
|
|
1651
1605
|
// packages/workflow/preset/context-build.service.ts
|
|
1652
1606
|
import { inject as inject10 } from "static-injector";
|
|
1653
|
-
import { uniq } from "es-toolkit";
|
|
1654
1607
|
var ContextBuildService = class {
|
|
1655
1608
|
template = inject10(TemplateFormatService);
|
|
1656
1609
|
parser = inject10(WorkflowParserService);
|
|
1657
|
-
createWorkflow(input
|
|
1610
|
+
createWorkflow(input) {
|
|
1658
1611
|
const result = this.template.parse(
|
|
1659
1612
|
input.template.flatMap(
|
|
1660
1613
|
(item) => item.content.map((item2) => item2.type === "text" ? item2.text : "")
|
|
1661
1614
|
).join("\n")
|
|
1662
1615
|
).list.map((item) => item.value);
|
|
1663
|
-
const inputList = [
|
|
1664
|
-
uniq([
|
|
1665
|
-
...Object.keys({ ...input.input, ...input.context }),
|
|
1666
|
-
...result
|
|
1667
|
-
]).map((value, i) => ({
|
|
1668
|
-
id: `${i}`,
|
|
1669
|
-
value,
|
|
1670
|
-
label: ``
|
|
1671
|
-
}))
|
|
1672
|
-
];
|
|
1673
1616
|
const chatNode = {
|
|
1674
1617
|
id: "2",
|
|
1675
1618
|
data: {
|
|
1676
|
-
title: "
|
|
1619
|
+
title: "",
|
|
1677
1620
|
handle: {
|
|
1678
|
-
input: inputList,
|
|
1679
1621
|
output: [
|
|
1680
1622
|
[
|
|
1681
1623
|
{
|
|
1682
1624
|
id: "1",
|
|
1683
1625
|
label: "",
|
|
1684
|
-
value: "
|
|
1626
|
+
value: "default"
|
|
1685
1627
|
}
|
|
1686
1628
|
]
|
|
1687
1629
|
]
|
|
@@ -1691,62 +1633,8 @@ var ContextBuildService = class {
|
|
|
1691
1633
|
},
|
|
1692
1634
|
type: "chat"
|
|
1693
1635
|
};
|
|
1694
|
-
if (!inlineMode) {
|
|
1695
|
-
return {
|
|
1696
|
-
nodes: [chatNode],
|
|
1697
|
-
edges: []
|
|
1698
|
-
};
|
|
1699
|
-
}
|
|
1700
|
-
const inputParamsNode = {
|
|
1701
|
-
id: "1",
|
|
1702
|
-
type: "input-params" /* inputParams */,
|
|
1703
|
-
data: {
|
|
1704
|
-
handle: {
|
|
1705
|
-
input: [
|
|
1706
|
-
[
|
|
1707
|
-
{
|
|
1708
|
-
...generateHandle(DEFAULT_INPUT_KEY, ""),
|
|
1709
|
-
inputType: "object"
|
|
1710
|
-
}
|
|
1711
|
-
]
|
|
1712
|
-
],
|
|
1713
|
-
output: [[{ id: "1", value: "default", label: "" }]]
|
|
1714
|
-
}
|
|
1715
|
-
}
|
|
1716
|
-
};
|
|
1717
|
-
const bridgeNodeList = inputList.flat().map((item, i) => ({
|
|
1718
|
-
id: `${InlineInputItemRunner.runnerName}-${i}`,
|
|
1719
|
-
type: InlineInputItemRunner.runnerName,
|
|
1720
|
-
data: {
|
|
1721
|
-
handle: {
|
|
1722
|
-
input: [[{ id: "1", value: item.value, label: "" }]],
|
|
1723
|
-
output: [
|
|
1724
|
-
[
|
|
1725
|
-
{
|
|
1726
|
-
id: "1",
|
|
1727
|
-
label: "",
|
|
1728
|
-
value: "输出"
|
|
1729
|
-
}
|
|
1730
|
-
]
|
|
1731
|
-
]
|
|
1732
|
-
}
|
|
1733
|
-
}
|
|
1734
|
-
}));
|
|
1735
|
-
const bridgeEdgeList1 = inputList.flat().map((item, i) => ({
|
|
1736
|
-
source: inputParamsNode.id,
|
|
1737
|
-
sourceHandle: "1",
|
|
1738
|
-
target: `${InlineInputItemRunner.runnerName}-${i}`,
|
|
1739
|
-
targetHandle: "1"
|
|
1740
|
-
}));
|
|
1741
|
-
const bridgeEdgeList2 = inputList.flat().map((item, i) => ({
|
|
1742
|
-
source: `${InlineInputItemRunner.runnerName}-${i}`,
|
|
1743
|
-
sourceHandle: "1",
|
|
1744
|
-
target: chatNode.id,
|
|
1745
|
-
targetHandle: item.id
|
|
1746
|
-
}));
|
|
1747
1636
|
return {
|
|
1748
|
-
nodes: [
|
|
1749
|
-
edges: [...bridgeEdgeList1, ...bridgeEdgeList2]
|
|
1637
|
+
nodes: [chatNode]
|
|
1750
1638
|
};
|
|
1751
1639
|
}
|
|
1752
1640
|
};
|
|
@@ -1754,21 +1642,16 @@ var ContextBuildService = class {
|
|
|
1754
1642
|
// packages/workflow/workflow-exec.service.ts
|
|
1755
1643
|
var WorkflowExecService = class {
|
|
1756
1644
|
#parser = inject11(WorkflowParserService);
|
|
1757
|
-
#parameterResolve = inject11(InlineParametersService);
|
|
1758
1645
|
#runner = inject11(WorkflowRunnerService);
|
|
1759
1646
|
parse(data) {
|
|
1760
1647
|
return this.#parser.parse(data);
|
|
1761
1648
|
}
|
|
1762
1649
|
async runParse(define, input, ob, abortSignal) {
|
|
1763
|
-
const parameters = await this.#parameterResolve.run(input);
|
|
1764
1650
|
return this.#runner.run(
|
|
1765
1651
|
define,
|
|
1766
1652
|
{
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
),
|
|
1770
|
-
environmentParameters: input.environmentParameters,
|
|
1771
|
-
modelOptions: input.modelOptions
|
|
1653
|
+
inputs: input.input ?? {},
|
|
1654
|
+
environmentParameters: input.environmentParameters
|
|
1772
1655
|
},
|
|
1773
1656
|
ob,
|
|
1774
1657
|
abortSignal
|
|
@@ -1795,7 +1678,7 @@ var WorkflowExecService = class {
|
|
|
1795
1678
|
}
|
|
1796
1679
|
#contextBuild = inject11(ContextBuildService);
|
|
1797
1680
|
async agentChat(input, fn, abort) {
|
|
1798
|
-
const workflow = this.#contextBuild.createWorkflow(input
|
|
1681
|
+
const workflow = this.#contextBuild.createWorkflow(input);
|
|
1799
1682
|
const subject = new Subject();
|
|
1800
1683
|
subject.subscribe({
|
|
1801
1684
|
next: (value) => {
|
|
@@ -1805,7 +1688,8 @@ var WorkflowExecService = class {
|
|
|
1805
1688
|
const result2 = await this.exec(
|
|
1806
1689
|
{ flow: workflow },
|
|
1807
1690
|
{
|
|
1808
|
-
|
|
1691
|
+
input: input.input,
|
|
1692
|
+
environmentParameters: input.environmentParameters
|
|
1809
1693
|
},
|
|
1810
1694
|
{ showError: true },
|
|
1811
1695
|
subject,
|
|
@@ -1900,9 +1784,7 @@ var WORKFLOW_MODULE = {
|
|
|
1900
1784
|
WorkflowSelectService,
|
|
1901
1785
|
WorkflowFileService,
|
|
1902
1786
|
ContextBuildService,
|
|
1903
|
-
InlineBuilderService,
|
|
1904
1787
|
WorkflowRunnerService,
|
|
1905
|
-
InlineParametersService,
|
|
1906
1788
|
WorkflowPluginService,
|
|
1907
1789
|
InlineNodeService
|
|
1908
1790
|
],
|
|
@@ -1919,24 +1801,22 @@ export {
|
|
|
1919
1801
|
CurrentContextToken,
|
|
1920
1802
|
CurrentNodeToken,
|
|
1921
1803
|
CurrentWorkflowToken,
|
|
1922
|
-
DEFAULT_CHAT_SCHEMA_KEY,
|
|
1923
|
-
DEFAULT_INPUT_KEY,
|
|
1924
1804
|
EXAMPLES_DEFINE,
|
|
1925
1805
|
EnviromentParametersToken,
|
|
1926
1806
|
HelpObj,
|
|
1927
1807
|
INLINE_Template,
|
|
1928
1808
|
INLINE_Template2,
|
|
1929
|
-
ITERATION_ITEM_SYMBOL,
|
|
1930
1809
|
InlineNodeService,
|
|
1931
|
-
InputParamsToken,
|
|
1932
1810
|
InputsToken,
|
|
1933
1811
|
LLMDataDefine,
|
|
1934
1812
|
ModelOptionsToken,
|
|
1813
|
+
NodeContextToken,
|
|
1814
|
+
NodeInputsToken,
|
|
1815
|
+
NodeParentMapToken,
|
|
1935
1816
|
NodeRunnerBase,
|
|
1936
1817
|
ParentContextToken,
|
|
1937
|
-
|
|
1818
|
+
RUNNER_ORIGIN_OUTPUT,
|
|
1938
1819
|
TemplateFormatService,
|
|
1939
|
-
UseInputToken,
|
|
1940
1820
|
WORKFLOW_MODULE,
|
|
1941
1821
|
WorkflowConfigToken,
|
|
1942
1822
|
WorkflowEmitter,
|
|
@@ -1951,8 +1831,6 @@ export {
|
|
|
1951
1831
|
createLLMData,
|
|
1952
1832
|
createResultData,
|
|
1953
1833
|
flatFilterHandleList,
|
|
1954
|
-
generateHandle,
|
|
1955
|
-
isChatStream,
|
|
1956
1834
|
llmModelConfig
|
|
1957
1835
|
};
|
|
1958
1836
|
//# sourceMappingURL=index.mjs.map
|