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