@shenghuabi/workflow 1.1.4 → 1.1.6

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