@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.
Files changed (72) hide show
  1. package/index.js +790 -916
  2. package/index.js.map +4 -4
  3. package/index.mjs +728 -850
  4. package/index.mjs.map +4 -4
  5. package/inline/inline.service.d.ts +1 -0
  6. package/inline/node/chat/main/index.d.ts +7 -12
  7. package/inline/node/chat/main/runner.d.ts +35 -0
  8. package/inline/node/chat/{chat.node.define.d.ts → node.define.d.ts} +3 -0
  9. package/inline/node/chat/util/useChat.d.ts +31 -0
  10. package/inline/node/index.browser.d.ts +2 -0
  11. package/inline/node/index.node.d.ts +2 -0
  12. package/inline/node/input-params/common.d.ts +2 -0
  13. package/inline/node/input-params/main/index.d.ts +29 -0
  14. package/inline/node/input-params/main/runner.d.ts +5 -0
  15. package/inline/node/input-params/node.define.d.ts +9 -0
  16. package/inline/node/input-params/webview/index.d.ts +2 -0
  17. package/inline/node/iteration/common.d.ts +2 -0
  18. package/inline/node/iteration/main/index.d.ts +29 -0
  19. package/inline/node/iteration/main/iteration-start.runner.d.ts +5 -0
  20. package/inline/node/iteration/main/runner.d.ts +6 -0
  21. package/inline/node/iteration/node.define.d.ts +11 -0
  22. package/inline/node/iteration/webview/index.d.ts +2 -0
  23. package/inline/node/text/main/index.d.ts +6 -11
  24. package/inline/node/text/main/runner.d.ts +14 -0
  25. package/inline/node/text/text.node.define.d.ts +2 -4
  26. package/module.d.ts +1 -3
  27. package/package.json +4 -3
  28. package/plugin/plugin.service.d.ts +1 -0
  29. package/preset/context-build.service.d.ts +2 -50
  30. package/runner/define.d.ts +3 -7
  31. package/runner/runner-item.d.ts +5 -20
  32. package/runner/workflow-runner.service.d.ts +9 -17
  33. package/share/common/const.d.ts +3 -2
  34. package/share/common/define.d.ts +3 -10
  35. package/share/const.d.ts +0 -1
  36. package/share/handle-node.d.ts +47 -18
  37. package/share/index.d.ts +0 -1
  38. package/share/index.js +27 -48
  39. package/share/index.js.map +4 -4
  40. package/share/index.mjs +25 -42
  41. package/share/index.mjs.map +3 -3
  42. package/share/type.d.ts +11 -29
  43. package/share/type2.d.ts +4 -8
  44. package/share/workflow.const.d.ts +1 -4
  45. package/test/util/chat-fixture.d.ts +44 -0
  46. package/test/util/text-input/common.d.ts +2 -0
  47. package/test/util/text-input/main/index.d.ts +25 -0
  48. package/test/util/text-input/main/runner.d.ts +6 -0
  49. package/test/util/text-input/text.node.define.d.ts +4 -0
  50. package/token.d.ts +8 -6
  51. package/type/type.d.ts +1 -1
  52. package/util/serialize-text-template.d.ts +16 -0
  53. package/webview/index.js +128 -41
  54. package/webview/index.js.map +4 -4
  55. package/webview/index.mjs +127 -43
  56. package/webview/index.mjs.map +4 -4
  57. package/workflow-exec.service.d.ts +14 -24
  58. package/workflow-parser.service.d.ts +0 -1
  59. package/inline/node/chat/main/llm.runner.d.ts +0 -41
  60. package/inline/node/text/main/textarea.runner.d.ts +0 -7
  61. package/preset/inline-build.service.d.ts +0 -11
  62. package/preset/inline-runner.service.d.ts +0 -16
  63. package/runner/inline-input-item.runner.d.ts +0 -8
  64. package/runner/input-params.runner.d.ts +0 -7
  65. package/runner/iteration-start.runner.d.ts +0 -7
  66. package/runner/iteration.runner.d.ts +0 -7
  67. package/runner/parameters.runner.d.ts +0 -10
  68. package/share/util.d.ts +0 -5
  69. package/test/chat.spec.d.ts +0 -1
  70. package/test/file.spec.d.ts +0 -1
  71. package/test/hello.spec.d.ts +0 -1
  72. 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
- RUNNER_ORIGIN_OUTPUT_KEY: () => RUNNER_ORIGIN_OUTPUT_KEY,
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 import_static_injector7 = require("static-injector");
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 DEFAULT_CHAT_SCHEMA_KEY = `[JsonSchema]`;
321
- var RUNNER_ORIGIN_OUTPUT_KEY = `[Origin]`;
313
+ var RUNNER_ORIGIN_OUTPUT = [
314
+ { id: "default", label: "默认", name: `default` }
315
+ ];
322
316
 
323
317
  // packages/workflow/share/type2.ts
324
- var import_uuid2 = require("uuid");
325
- var v6 = __toESM(require("valibot"), 1);
326
- var extraData = v6.looseObject({
327
- references: v6.optional(v6.array(v6.custom(Boolean)))
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 = v6.object({
330
- node: v6.object({ type: v6.string(), id: v6.string() }),
331
- nodeResult: v6.pipe(v6.optional(v6.boolean(), false)),
332
- dataId: v6.optional(v6.string(), () => (0, import_uuid2.v4)()),
333
- extra: v6.optional(extraData)
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 = v6.object({
329
+ var CommonDataDefine = v5.object({
336
330
  ...baseDataDefine.entries,
337
- value: v6.any()
331
+ value: v5.any()
338
332
  });
339
- var LLMDataDefine = v6.object({
333
+ var LLMDataDefine = v5.object({
340
334
  ...baseDataDefine.entries,
341
- type: v6.optional(v6.literal("chat-stream"), "chat-stream"),
335
+ type: v5.optional(v5.literal("chat-stream"), "chat-stream"),
342
336
  // 用来进行普通查询
343
- value: v6.string(),
344
- extra: v6.object({
337
+ value: v5.string(),
338
+ extra: v5.object({
345
339
  ...extraData.entries,
346
- content: v6.string(),
347
- thinkContent: v6.optional(v6.string()),
348
- isThinking: v6.optional(v6.boolean()),
349
- delta: v6.string(),
350
- historyList: v6.custom(Boolean)
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 v6.parse(LLMDataDefine, data);
348
+ return v5.parse(LLMDataDefine, data);
355
349
  }
356
350
  function createResultData(data) {
357
- const result = v6.parse(CommonDataDefine, data);
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
- label: "JsonSchema",
413
- value: DEFAULT_CHAT_SCHEMA_KEY,
414
- inputType: "schema",
415
- optional: true
416
- }
417
- ]
418
- ],
419
- outputs: [[{ label: "原始输出", value: RUNNER_ORIGIN_OUTPUT_KEY }]]
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/chat.node.define.ts
423
- var v7 = __toESM(require("valibot"), 1);
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 = v7.pipe(
428
- v7.object({
429
- llm: v7.optional(llmModelConfig()),
422
+ var CHAT_NODE_DEFINE = v6.pipe(
423
+ v6.object({
424
+ llm: v6.optional(llmModelConfig()),
430
425
  /** 处理时解析 */
431
- responseFormat: v7.pipe(
432
- v7.optional(v7.picklist(ResponseFormat)),
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
- v7.title("响应格式")
449
+ v6.title("响应格式")
455
450
  ),
456
451
  /** 处理后解析 */
457
- parseBy: v7.pipe(
458
- v7.optional(v7.picklist(ResponseList)),
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
- v7.title("返回解析"),
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: v7.pipe(
494
- v7.custom(Boolean),
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/llm.runner.ts
503
- var import_static_injector5 = require("static-injector");
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/llm.runner.ts
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("Input");
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 v8 = __toESM(require("valibot"), 1);
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
- inputs$$ = (0, import_static_injector3.computed)(() => {
567
- const obj = {};
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
- import_util.isEmptyInput
584
+ import_util2.isEmptyInput
656
585
  ),
657
- (0, import_es_toolkit.omitBy)(presetConfig, import_util.isEmptyInput),
658
- (0, import_es_toolkit.omitBy)(this.#modelConfig ?? {}, import_util.isEmptyInput)
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/llm.runner.ts
783
- var import_util2 = require("@cyia/util");
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, import_static_injector5.inject)(TemplateFormatService);
786
- #chatService = (0, import_static_injector5.inject)(ChatServiceToken);
787
- #abort = (0, import_static_injector5.inject)(AbortSignalToken);
788
- #channel = (0, import_static_injector5.inject)(import_external_call.LogService).getToken("chat");
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 { metadataList, obj } = await this.getInputChat();
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 = list.map((item) => {
797
- const content = this.#format.interpolate(
798
- item.content.map((item2) => item2.type === "text" ? item2.text : "").join("\n"),
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: inputJsonSchema?.value } : config.responseFormat === "json_object" ? { type: "json_object" } : void 0
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 (outputName) => {
888
- if (outputName === RUNNER_ORIGIN_OUTPUT_KEY) {
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 (typeof value === "undefined") {
911
- throw new Error(`解析${config.parseBy}失败`);
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
- define: CHAT_NODE_DEFINE
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/main/textarea.runner.ts
948
- var import_static_injector6 = require("static-injector");
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
- #format = (0, import_static_injector6.inject)(TemplateFormatService);
920
+ environmentContext = (0, import_static_injector7.inject)(EnviromentParametersToken);
951
921
  async run() {
952
- const obj = this.inputValueObject$$();
953
- const str = this.node.data.value;
954
- return async () => ({ value: this.#format.interpolate(str, obj) });
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/workflow-parser.service.ts
965
- var WorkflowParserContext = class _WorkflowParserContext {
966
- constructor(list, subObject, data, parentNode, userInputParams = [], parent) {
967
- this.list = list;
968
- this.subObject = subObject;
969
- this.data = data;
970
- this.parentNode = parentNode;
971
- this.userInputParams = userInputParams;
972
- this.parent = parent;
973
- }
974
- list;
975
- subObject;
976
- data;
977
- parentNode;
978
- userInputParams;
979
- parent;
980
- // fixme 或许可以分离,单独调用,然后加上children查找,不过那样就太慢了
981
- #childUseNodeSet = /* @__PURE__ */ new Set();
982
- /** 只能子级在本级找不到节点时调用父级使用 */
983
- childUseDefine(id, parentId) {
984
- const define = this.list.find((item) => item.id === id);
985
- if (!define) {
986
- return this.parent?.childUseDefine(id, parentId);
987
- }
988
- if (id !== parentId) {
989
- this.#childUseNodeSet.add(id);
990
- }
991
- return define;
992
- }
993
- #getParentNodeDefine(id) {
994
- return this.parent?.childUseDefine(id, this.parentNode?.id);
995
- }
996
- parseItem() {
997
- const graph = new import_graphology.default({ multi: true });
998
- const { nodes, edges } = this.data.flow;
999
- const nodeData = { nodes: {}, end: void 0 };
1000
- this.list.forEach((node) => {
1001
- graph.addNode(node.id);
1002
- });
1003
- for (const node of this.list) {
1004
- const handle = {
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
- const outList = [];
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
- if (outList.length > 1) {
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
- var NodeGroup = class {
1115
- #group = /* @__PURE__ */ new Map();
1116
- #iterationMap = /* @__PURE__ */ new Map();
1117
- addContainerStart(node) {
1118
- this.#iterationMap.set(node.parentId, node);
1119
- }
1120
- getContainerStart(node) {
1121
- return this.#iterationMap.get(node.id);
1122
- }
1123
- add(node) {
1124
- const nodeMap = this.#group.get(node.type) || [];
1125
- nodeMap.push(node);
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 ITERATION_ITEM_SYMBOL = /* @__PURE__ */ Symbol("ITERATION_ITEM");
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, import_static_injector11.inject)(import_static_injector11.Injector);
1512
- data = (0, import_static_injector11.inject)(CurrentWorkflowToken);
1513
- parent = (0, import_static_injector11.inject)(ParentContextToken);
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, import_static_injector11.inject)(InputsToken);
1517
- #plugin = (0, import_static_injector11.inject)(WorkflowPluginService);
1518
- #emitter = (0, import_static_injector11.inject)(WorkflowEmitter);
1519
- #inlineNode = (0, import_static_injector11.inject)(InlineNodeService);
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, callNode, input) {
1097
+ async #createNodeRunner(item, inputParams, contextFactory, callNode) {
1553
1098
  const define = await this.#getNodeRunner(item.type);
1554
- return (0, import_static_injector11.createInjector)({
1099
+ return (0, import_static_injector10.createInjector)({
1555
1100
  providers: [
1556
1101
  define,
1557
1102
  { provide: CurrentNodeToken, useValue: item },
1558
- { provide: CurrentCallNodeToken, useValue: callNode },
1103
+ [
1104
+ callNode ? { provide: CurrentCallNodeToken, useValue: callNode } : void 0
1105
+ ].filter(Boolean),
1559
1106
  { provide: CurrentContextToken, useValue: this },
1560
- { provide: UseInputToken, useValue: input },
1561
- { provide: InputParamsToken, useValue: inputParams }
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, import_static_injector11.inject)(AbortSignalToken);
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
- const inputParams = new Map(this.inputs);
1573
- for (const input2 of node.inputs) {
1574
- if (input2.nodeId) {
1575
- const inputNode = this.getNodeById(input2.nodeId);
1576
- if (inputNode.subFlowList?.some(
1577
- (subItem) => subItem.startId === node.id
1578
- )) {
1579
- continue;
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
- const result = await this.#runItem(inputNode, node, input2);
1582
- inputParams.set(input2.value, result);
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
- inputParams,
1588
- callNode,
1589
- input
1180
+ inputObjResoved,
1181
+ contextFactory,
1182
+ callNode
1590
1183
  );
1591
1184
  const outputList = node.outputs;
1592
- const outputName = input?.outputName ?? node.data.outputName ?? outputList[0].value;
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
- const res = await nodeRunner.run();
1597
- dataResult = { result: res };
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 res = await dataResult.result(outputName);
1606
- this.#outputCache.set(outputKey, res);
1607
- returnData = res;
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
- ...returnData,
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, import_static_injector11.inject)(import_static_injector11.Injector);
1230
+ #injector = (0, import_static_injector10.inject)(import_static_injector10.Injector);
1640
1231
  /** 自己使用
1641
1232
  * @internal
1642
1233
  */
1643
- createContext(data, inputs, parent, parentInjector) {
1644
- return (0, import_static_injector11.createInjector)({
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(data, input, ob, signal2) {
1660
- this.log?.info("工作流默认对话配置", input.modelOptions);
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: ModelOptionsToken, useValue: input.modelOptions }
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(data, input.input, void 0, injector);
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/preset/inline-runner.service.ts
1682
- var InlineParametersService = class {
1683
- #inlineBuild = (0, import_static_injector12.inject)(InlineBuilderService);
1684
- #workflowRunner = (0, import_static_injector12.inject)(WorkflowRunnerService);
1685
- async run(input) {
1686
- const define = this.#inlineBuild.createDefine({
1687
- ...input,
1688
- input: input.input ?? {},
1689
- context: input.context ?? {}
1690
- });
1691
- const result2 = await this.#workflowRunner.run(define.data, {
1692
- input: new Map(
1693
- Object.entries(input.input || {}).map(([key, value]) => [
1694
- key,
1695
- { value }
1696
- ])
1697
- ),
1698
- environmentParameters: input.environmentParameters,
1699
- modelOptions: input.modelOptions
1700
- });
1701
- return result2;
1702
- }
1703
- };
1704
-
1705
- // packages/workflow/workflow-exec.service.ts
1706
- var import_rxjs2 = require("rxjs");
1707
-
1708
- // packages/workflow/preset/context-build.service.ts
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, inlineMode) {
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: [inputParamsNode, chatNode, ...bridgeNodeList],
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
- input: new Map(
1825
- Object.entries(parameters.value).map(([key, value]) => [key, value])
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, input.inlineMode);
1856
- const subject = new import_rxjs2.Subject();
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
- ...input
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
- RUNNER_ORIGIN_OUTPUT_KEY,
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