@shenghuabi/workflow 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +14 -0
- package/index.js +2078 -0
- package/index.js.map +7 -0
- package/index.mjs +2035 -0
- package/index.mjs.map +7 -0
- package/inline/inline.service.d.ts +8 -0
- package/inline/node/chat/chat.node.define.d.ts +185 -0
- package/inline/node/chat/common.d.ts +2 -0
- package/inline/node/chat/main/index.d.ts +209 -0
- package/inline/node/chat/main/llm.runner.d.ts +41 -0
- package/inline/node/chat/util.d.ts +8 -0
- package/inline/node/chat/webview/index.d.ts +2 -0
- package/inline/node/index.browser.d.ts +2 -0
- package/inline/node/index.node.d.ts +2 -0
- package/inline/node/text/common.d.ts +2 -0
- package/inline/node/text/main/index.d.ts +30 -0
- package/inline/node/text/main/textarea.runner.d.ts +7 -0
- package/inline/node/text/text.node.define.d.ts +6 -0
- package/inline/node/text/webview/index.d.ts +2 -0
- package/module.d.ts +23 -0
- package/package.json +52 -0
- package/plugin/plugin.service.d.ts +7 -0
- package/preset/context-build.service.d.ts +102 -0
- package/preset/inline-build.service.d.ts +11 -0
- package/preset/inline-runner.service.d.ts +16 -0
- package/runner/define.d.ts +12 -0
- package/runner/inline-input-item.runner.d.ts +8 -0
- package/runner/input-params.runner.d.ts +7 -0
- package/runner/iteration-start.runner.d.ts +7 -0
- package/runner/iteration.runner.d.ts +7 -0
- package/runner/parameters.runner.d.ts +10 -0
- package/runner/runner-error.d.ts +12 -0
- package/runner/runner-item.d.ts +35 -0
- package/runner/workflow-runner.service.d.ts +35 -0
- package/share/common/const.d.ts +2 -0
- package/share/common/define.d.ts +71 -0
- package/share/common/examples.define.d.ts +53 -0
- package/share/common/handle.define.d.ts +5 -0
- package/share/common/index.d.ts +5 -0
- package/share/common/inline-template.define.d.ts +15 -0
- package/share/common/llm.define.d.ts +29 -0
- package/share/const.d.ts +5 -0
- package/share/handle-node.d.ts +60 -0
- package/share/index.d.ts +8 -0
- package/share/index.js +336 -0
- package/share/index.js.map +7 -0
- package/share/index.mjs +296 -0
- package/share/index.mjs.map +7 -0
- package/share/type.d.ts +89 -0
- package/share/type2.d.ts +132 -0
- package/share/util/layout.d.ts +2 -0
- package/share/util.d.ts +5 -0
- package/share/workflow.const.d.ts +8 -0
- package/share/workflow.emit.d.ts +9 -0
- package/template-format.service.d.ts +29 -0
- package/test/chat.spec.d.ts +1 -0
- package/test/file.spec.d.ts +1 -0
- package/test/hello.spec.d.ts +1 -0
- package/test/plugin.spec.d.ts +1 -0
- package/token.d.ts +68 -0
- package/type/type.d.ts +5 -0
- package/webview/index.d.ts +1 -0
- package/webview/index.js +399 -0
- package/webview/index.js.map +7 -0
- package/webview/index.mjs +388 -0
- package/webview/index.mjs.map +7 -0
- package/workflow-exec.service.d.ts +41 -0
- package/workflow-file.service.d.ts +9 -0
- package/workflow-parser.service.d.ts +24 -0
- package/workflow-select.service.d.ts +13 -0
package/index.js
ADDED
|
@@ -0,0 +1,2078 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// packages/workflow/index.ts
|
|
31
|
+
var workflow_exports = {};
|
|
32
|
+
__export(workflow_exports, {
|
|
33
|
+
AbortSignalToken: () => AbortSignalToken,
|
|
34
|
+
ChatServiceToken: () => ChatServiceToken,
|
|
35
|
+
CommonDataDefine: () => CommonDataDefine,
|
|
36
|
+
CurrentCallNodeToken: () => CurrentCallNodeToken,
|
|
37
|
+
CurrentContextToken: () => CurrentContextToken,
|
|
38
|
+
CurrentNodeToken: () => CurrentNodeToken,
|
|
39
|
+
CurrentWorkflowToken: () => CurrentWorkflowToken,
|
|
40
|
+
DEFAULT_CHAT_SCHEMA_KEY: () => DEFAULT_CHAT_SCHEMA_KEY,
|
|
41
|
+
DEFAULT_INPUT_KEY: () => DEFAULT_INPUT_KEY,
|
|
42
|
+
EXAMPLES_DEFINE: () => EXAMPLES_DEFINE,
|
|
43
|
+
EnviromentParametersToken: () => EnviromentParametersToken,
|
|
44
|
+
HandleDataDefine: () => HandleDataDefine,
|
|
45
|
+
HelpObj: () => HelpObj,
|
|
46
|
+
INLINE_Template: () => INLINE_Template,
|
|
47
|
+
INLINE_Template2: () => INLINE_Template2,
|
|
48
|
+
ITERATION_ITEM_SYMBOL: () => ITERATION_ITEM_SYMBOL,
|
|
49
|
+
InlineNodeService: () => InlineNodeService,
|
|
50
|
+
InputParamsToken: () => InputParamsToken,
|
|
51
|
+
InputsToken: () => InputsToken,
|
|
52
|
+
LLMDataDefine: () => LLMDataDefine,
|
|
53
|
+
ModelOptionsToken: () => ModelOptionsToken,
|
|
54
|
+
NodeRunnerBase: () => NodeRunnerBase,
|
|
55
|
+
ParentContextToken: () => ParentContextToken,
|
|
56
|
+
RUNNER_ORIGIN_OUTPUT_KEY: () => RUNNER_ORIGIN_OUTPUT_KEY,
|
|
57
|
+
TemplateFormatService: () => TemplateFormatService,
|
|
58
|
+
UseInputToken: () => UseInputToken,
|
|
59
|
+
WORKFLOW_MODULE: () => WORKFLOW_MODULE,
|
|
60
|
+
WorkflowConfigToken: () => WorkflowConfigToken,
|
|
61
|
+
WorkflowEmitter: () => WorkflowEmitter,
|
|
62
|
+
WorkflowExecService: () => WorkflowExecService,
|
|
63
|
+
WorkflowFileService: () => WorkflowFileService,
|
|
64
|
+
WorkflowNodeType: () => WorkflowNodeType,
|
|
65
|
+
WorkflowParserService: () => WorkflowParserService,
|
|
66
|
+
WorkflowPluginService: () => WorkflowPluginService,
|
|
67
|
+
WorkflowRunnerContext: () => WorkflowRunnerContext,
|
|
68
|
+
WorkflowRunnerService: () => WorkflowRunnerService,
|
|
69
|
+
WorkflowSelectService: () => WorkflowSelectService,
|
|
70
|
+
createLLMData: () => createLLMData,
|
|
71
|
+
createResultData: () => createResultData,
|
|
72
|
+
flatFilterHandleList: () => flatFilterHandleList,
|
|
73
|
+
generateHandle: () => generateHandle,
|
|
74
|
+
isChatStream: () => isChatStream,
|
|
75
|
+
llmModelConfig: () => llmModelConfig
|
|
76
|
+
});
|
|
77
|
+
module.exports = __toCommonJS(workflow_exports);
|
|
78
|
+
|
|
79
|
+
// packages/workflow/workflow-parser.service.ts
|
|
80
|
+
var import_static_injector7 = require("static-injector");
|
|
81
|
+
var import_graphology = __toESM(require("graphology"), 1);
|
|
82
|
+
var import_react = require("@xyflow/react");
|
|
83
|
+
|
|
84
|
+
// packages/workflow/share/workflow.const.ts
|
|
85
|
+
var WorkflowNodeType = /* @__PURE__ */ ((WorkflowNodeType2) => {
|
|
86
|
+
WorkflowNodeType2["iteration"] = "iteration";
|
|
87
|
+
WorkflowNodeType2["iterationStart"] = "iteration-start";
|
|
88
|
+
WorkflowNodeType2["inputParams"] = "input-params";
|
|
89
|
+
WorkflowNodeType2["serialize"] = "serialize";
|
|
90
|
+
WorkflowNodeType2["parameters"] = "parameters";
|
|
91
|
+
WorkflowNodeType2["inlineInputItem"] = "inlineInputItem";
|
|
92
|
+
return WorkflowNodeType2;
|
|
93
|
+
})(WorkflowNodeType || {});
|
|
94
|
+
|
|
95
|
+
// packages/workflow/workflow-parser.service.ts
|
|
96
|
+
var import_es_toolkit4 = require("es-toolkit");
|
|
97
|
+
|
|
98
|
+
// packages/workflow/share/handle-node.ts
|
|
99
|
+
function flatFilterHandleList(list) {
|
|
100
|
+
if (!list) {
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
return list.flat().filter(Boolean);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// packages/workflow/inline/inline.service.ts
|
|
107
|
+
var InlineNodeService = class {
|
|
108
|
+
inlineList = [];
|
|
109
|
+
register(obj) {
|
|
110
|
+
Object.values(obj).forEach((item) => {
|
|
111
|
+
this.inlineList.push(item);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
getInlineList() {
|
|
115
|
+
return this.inlineList;
|
|
116
|
+
}
|
|
117
|
+
conditionNodeList() {
|
|
118
|
+
return this.inlineList.filter((item) => item.nodeMode === "condition").reduce(
|
|
119
|
+
(obj, item) => {
|
|
120
|
+
obj[item.type] = true;
|
|
121
|
+
return obj;
|
|
122
|
+
},
|
|
123
|
+
{}
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
// todo 类型
|
|
127
|
+
getNodeRunner(type) {
|
|
128
|
+
return this.inlineList.find((item) => item.type === type)?.runner;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// packages/workflow/plugin/plugin.service.ts
|
|
133
|
+
var import_static_injector = require("static-injector");
|
|
134
|
+
var WorkflowPluginService = class {
|
|
135
|
+
nodeList = (0, import_static_injector.signal)([]);
|
|
136
|
+
setNodeObject(obj) {
|
|
137
|
+
this.nodeList.set(obj);
|
|
138
|
+
}
|
|
139
|
+
conditionNodeList$$ = (0, import_static_injector.computed)(
|
|
140
|
+
() => this.nodeList().filter((item) => item.nodeMode === "condition").reduce(
|
|
141
|
+
(obj, item) => {
|
|
142
|
+
obj[item.type] = true;
|
|
143
|
+
return obj;
|
|
144
|
+
},
|
|
145
|
+
{}
|
|
146
|
+
)
|
|
147
|
+
);
|
|
148
|
+
// todo 类型
|
|
149
|
+
getNodeRunner(type) {
|
|
150
|
+
return this.nodeList().find((item) => item.type === type).runner;
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
// packages/workflow/inline/node/index.node.ts
|
|
155
|
+
var index_node_exports = {};
|
|
156
|
+
__export(index_node_exports, {
|
|
157
|
+
ChatMainConfig: () => ChatMainConfig,
|
|
158
|
+
TextMainConfig: () => TextMainConfig
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// packages/workflow/share/const.ts
|
|
162
|
+
var DEFAULT_INPUT_KEY = `[INPUT]`;
|
|
163
|
+
var HelpObj = {
|
|
164
|
+
templateVarLine: `- 变量定义格式: {{xx}},{{xx.yy}}`,
|
|
165
|
+
pathTodoLine: `- **TODO** 接收传入路径而不是指定`
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
// packages/workflow/share/util.ts
|
|
169
|
+
var import_uuid = require("uuid");
|
|
170
|
+
var UUID_NS = "404cfae8-94e7-41a6-acec-1037dd1fdaad";
|
|
171
|
+
function generateHandle(value, label = value) {
|
|
172
|
+
return { id: (0, import_uuid.v5)(value, UUID_NS), label, value };
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// packages/workflow/share/common/examples.define.ts
|
|
176
|
+
var import_view_angular_core2 = require("@piying/view-angular-core");
|
|
177
|
+
var v = __toESM(require("valibot"), 1);
|
|
178
|
+
|
|
179
|
+
// packages/workflow/share/util/layout.ts
|
|
180
|
+
var import_view_angular_core = require("@piying/view-angular-core");
|
|
181
|
+
function asColumn() {
|
|
182
|
+
return (0, import_view_angular_core.componentClass)("grid gap-2");
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// packages/workflow/share/common/examples.define.ts
|
|
186
|
+
var EXAMPLES_DEFINE = v.pipe(
|
|
187
|
+
v.optional(
|
|
188
|
+
v.array(
|
|
189
|
+
v.pipe(
|
|
190
|
+
v.object({
|
|
191
|
+
input: v.pipe(
|
|
192
|
+
v.object({
|
|
193
|
+
format: v.pipe(
|
|
194
|
+
v.optional(v.boolean(), false),
|
|
195
|
+
v.description(
|
|
196
|
+
"选中后会尝试使用yaml解析为对象,再序列化为对应的响应类型"
|
|
197
|
+
),
|
|
198
|
+
(0, import_view_angular_core2.patchWrappers)(["tooltip"])
|
|
199
|
+
),
|
|
200
|
+
value: v.pipe(v.string(), v.title("问题"), (0, import_view_angular_core2.topClass)("flex-1"))
|
|
201
|
+
}),
|
|
202
|
+
// todo 待修复
|
|
203
|
+
(0, import_view_angular_core2.topClass)("flex gap-2 items-center")
|
|
204
|
+
),
|
|
205
|
+
output: v.pipe(
|
|
206
|
+
v.object({
|
|
207
|
+
format: v.pipe(
|
|
208
|
+
v.optional(v.boolean(), false),
|
|
209
|
+
v.description("是否需要格式化"),
|
|
210
|
+
(0, import_view_angular_core2.patchWrappers)(["tooltip"])
|
|
211
|
+
),
|
|
212
|
+
value: v.pipe(v.string(), v.title("回答"), (0, import_view_angular_core2.topClass)("flex-1"))
|
|
213
|
+
}),
|
|
214
|
+
(0, import_view_angular_core2.topClass)("flex gap-2 items-center")
|
|
215
|
+
)
|
|
216
|
+
}),
|
|
217
|
+
asColumn()
|
|
218
|
+
)
|
|
219
|
+
),
|
|
220
|
+
[]
|
|
221
|
+
),
|
|
222
|
+
v.title("用例"),
|
|
223
|
+
v.description("回答问题之前,会参考定义的用例格式进行回复,用于规范回答"),
|
|
224
|
+
(0, import_view_angular_core2.condition)({
|
|
225
|
+
environments: ["display"],
|
|
226
|
+
actions: [
|
|
227
|
+
(0, import_view_angular_core2.renderConfig)({
|
|
228
|
+
hidden: true
|
|
229
|
+
})
|
|
230
|
+
]
|
|
231
|
+
})
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
// packages/workflow/share/common/handle.define.ts
|
|
235
|
+
var v2 = __toESM(require("valibot"), 1);
|
|
236
|
+
var import_view_angular_core3 = require("@piying/view-angular-core");
|
|
237
|
+
var import_valibot_visit = require("@piying/valibot-visit");
|
|
238
|
+
var HiddenAction = (0, import_valibot_visit.condition)({
|
|
239
|
+
environments: ["display", "default"],
|
|
240
|
+
actions: [(0, import_view_angular_core3.setComponent)(""), (0, import_view_angular_core3.renderConfig)({ hidden: true })]
|
|
241
|
+
});
|
|
242
|
+
var AnyHiddenList = v2.pipe(
|
|
243
|
+
v2.array(v2.pipe(v2.optional(v2.any()), HiddenAction)),
|
|
244
|
+
(0, import_view_angular_core3.setComponent)(""),
|
|
245
|
+
(0, import_view_angular_core3.renderConfig)({ hidden: true })
|
|
246
|
+
);
|
|
247
|
+
var HandleDataDefine = v2.pipe(
|
|
248
|
+
v2.optional(
|
|
249
|
+
v2.object({
|
|
250
|
+
output: AnyHiddenList,
|
|
251
|
+
input: AnyHiddenList
|
|
252
|
+
})
|
|
253
|
+
),
|
|
254
|
+
HiddenAction
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
// packages/workflow/share/common/inline-template.define.ts
|
|
258
|
+
var import_view_angular_core4 = require("@piying/view-angular-core");
|
|
259
|
+
var import_rxjs = require("rxjs");
|
|
260
|
+
var v3 = __toESM(require("valibot"), 1);
|
|
261
|
+
var INLINE_Template = v3.pipe(
|
|
262
|
+
v3.object({
|
|
263
|
+
enable: v3.optional(v3.boolean(), true),
|
|
264
|
+
// 经用条件
|
|
265
|
+
value: v3.pipe(
|
|
266
|
+
v3.optional(v3.string(), "{{NODE.description}}"),
|
|
267
|
+
v3.title("模板"),
|
|
268
|
+
v3.description("允许使用变量:{{NODE.xxx}}(参考节点帮助)"),
|
|
269
|
+
(0, import_view_angular_core4.setWrappers)(["tooltip", "form-field"]),
|
|
270
|
+
(0, import_view_angular_core4.topClass)("flex-1"),
|
|
271
|
+
(0, import_view_angular_core4.disableWhen)({
|
|
272
|
+
listen: (fn) => fn({
|
|
273
|
+
list: [["..", "enable"]]
|
|
274
|
+
}).pipe((0, import_rxjs.map)(({ list }) => !list[0]))
|
|
275
|
+
})
|
|
276
|
+
)
|
|
277
|
+
}),
|
|
278
|
+
(0, import_view_angular_core4.componentClass)("flex gap-2")
|
|
279
|
+
);
|
|
280
|
+
var INLINE_Template2 = v3.pipe(
|
|
281
|
+
v3.object({
|
|
282
|
+
enable: v3.optional(v3.boolean(), false),
|
|
283
|
+
// 经用条件
|
|
284
|
+
value: v3.pipe(
|
|
285
|
+
v3.optional(v3.string()),
|
|
286
|
+
v3.title("模板"),
|
|
287
|
+
v3.description("允许使用变量:{{ENTRY.xxx}}(参考节点帮助)"),
|
|
288
|
+
(0, import_view_angular_core4.setWrappers)(["tooltip", "form-field"]),
|
|
289
|
+
(0, import_view_angular_core4.topClass)("flex-1"),
|
|
290
|
+
(0, import_view_angular_core4.disableWhen)({
|
|
291
|
+
listen: (fn) => fn({
|
|
292
|
+
list: [["..", "enable"]]
|
|
293
|
+
}).pipe((0, import_rxjs.map)(({ list }) => !list[0]))
|
|
294
|
+
})
|
|
295
|
+
)
|
|
296
|
+
}),
|
|
297
|
+
(0, import_view_angular_core4.componentClass)("flex gap-2 items-center")
|
|
298
|
+
);
|
|
299
|
+
|
|
300
|
+
// packages/workflow/share/common/llm.define.ts
|
|
301
|
+
var import_view_angular_core5 = require("@piying/view-angular-core");
|
|
302
|
+
var import_valibot_visit2 = require("@piying/valibot-visit");
|
|
303
|
+
var v4 = __toESM(require("valibot"), 1);
|
|
304
|
+
function llmModelConfig(item) {
|
|
305
|
+
return v4.pipe(
|
|
306
|
+
v4.intersect([
|
|
307
|
+
v4.pipe(
|
|
308
|
+
v4.intersect([
|
|
309
|
+
v4.pipe(
|
|
310
|
+
v4.object({
|
|
311
|
+
name: v4.pipe(
|
|
312
|
+
v4.optional(v4.string()),
|
|
313
|
+
v4.title("预定义模型配置"),
|
|
314
|
+
(0, import_view_angular_core5.setComponent)("select"),
|
|
315
|
+
(0, import_view_angular_core5.patchAsyncInputs)({
|
|
316
|
+
options: (field) => field.context.getModelList()
|
|
317
|
+
})
|
|
318
|
+
),
|
|
319
|
+
model: v4.pipe(v4.optional(v4.string()), v4.title("模型")),
|
|
320
|
+
// todo 配置变化configuration层被去掉.这里应该更详细支持更多参数
|
|
321
|
+
baseURL: v4.pipe(v4.optional(v4.string()), v4.title("地址"))
|
|
322
|
+
}),
|
|
323
|
+
asColumn()
|
|
324
|
+
)
|
|
325
|
+
]),
|
|
326
|
+
v4.title(item?.label ?? "对话模型"),
|
|
327
|
+
(0, import_valibot_visit2.condition)({
|
|
328
|
+
environments: ["display", "config"],
|
|
329
|
+
actions: [(0, import_view_angular_core5.asVirtualGroup)()]
|
|
330
|
+
})
|
|
331
|
+
)
|
|
332
|
+
]),
|
|
333
|
+
(0, import_valibot_visit2.condition)({
|
|
334
|
+
environments: ["display", "config"],
|
|
335
|
+
actions: [(0, import_view_angular_core5.asVirtualGroup)()]
|
|
336
|
+
}),
|
|
337
|
+
(0, import_view_angular_core5.setComponent)("accordion")
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// packages/workflow/share/common/const.ts
|
|
342
|
+
var DEFAULT_CHAT_SCHEMA_KEY = `[JsonSchema]`;
|
|
343
|
+
var RUNNER_ORIGIN_OUTPUT_KEY = `[Origin]`;
|
|
344
|
+
|
|
345
|
+
// packages/workflow/share/type2.ts
|
|
346
|
+
var import_uuid2 = require("uuid");
|
|
347
|
+
var v6 = __toESM(require("valibot"), 1);
|
|
348
|
+
var extraData = v6.looseObject({
|
|
349
|
+
references: v6.optional(v6.array(v6.custom(Boolean)))
|
|
350
|
+
});
|
|
351
|
+
var baseDataDefine = v6.object({
|
|
352
|
+
node: v6.object({ type: v6.string(), id: v6.string() }),
|
|
353
|
+
nodeResult: v6.pipe(v6.optional(v6.boolean(), false)),
|
|
354
|
+
dataId: v6.optional(v6.string(), () => (0, import_uuid2.v4)()),
|
|
355
|
+
extra: v6.optional(extraData)
|
|
356
|
+
});
|
|
357
|
+
var CommonDataDefine = v6.object({
|
|
358
|
+
...baseDataDefine.entries,
|
|
359
|
+
value: v6.any()
|
|
360
|
+
});
|
|
361
|
+
var LLMDataDefine = v6.object({
|
|
362
|
+
...baseDataDefine.entries,
|
|
363
|
+
type: v6.optional(v6.literal("chat-stream"), "chat-stream"),
|
|
364
|
+
// 用来进行普通查询
|
|
365
|
+
value: v6.string(),
|
|
366
|
+
extra: v6.object({
|
|
367
|
+
...extraData.entries,
|
|
368
|
+
content: v6.string(),
|
|
369
|
+
thinkContent: v6.optional(v6.string()),
|
|
370
|
+
isThinking: v6.optional(v6.boolean()),
|
|
371
|
+
delta: v6.string(),
|
|
372
|
+
historyList: v6.custom(Boolean)
|
|
373
|
+
})
|
|
374
|
+
});
|
|
375
|
+
function createLLMData(data) {
|
|
376
|
+
return v6.parse(LLMDataDefine, data);
|
|
377
|
+
}
|
|
378
|
+
function createResultData(data) {
|
|
379
|
+
const result = v6.parse(CommonDataDefine, data);
|
|
380
|
+
result.nodeResult = true;
|
|
381
|
+
return result;
|
|
382
|
+
}
|
|
383
|
+
function isChatStream(data) {
|
|
384
|
+
return !!data.extra && "content" in data.extra && "thinkContent" in data.extra;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// packages/workflow/share/workflow.emit.ts
|
|
388
|
+
var WorkflowEmitter = class {
|
|
389
|
+
#ob;
|
|
390
|
+
setObserver(ob) {
|
|
391
|
+
this.#ob = ob;
|
|
392
|
+
}
|
|
393
|
+
getObserver() {
|
|
394
|
+
return this.#ob;
|
|
395
|
+
}
|
|
396
|
+
createLLMData = createLLMData;
|
|
397
|
+
send(data) {
|
|
398
|
+
if (this.#ob) {
|
|
399
|
+
this.#ob.next(data);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
// packages/workflow/inline/node/chat/common.ts
|
|
405
|
+
var NODE_COMMON = {
|
|
406
|
+
priority: -100,
|
|
407
|
+
type: "chat",
|
|
408
|
+
label: `对话`,
|
|
409
|
+
icon: { fontIcon: "chat" },
|
|
410
|
+
disableHead: false,
|
|
411
|
+
disableConnect: false,
|
|
412
|
+
color: "accent",
|
|
413
|
+
help: [
|
|
414
|
+
`- 点击输入框左侧图标可以切换或添加新行`,
|
|
415
|
+
`${HelpObj.templateVarLine}`,
|
|
416
|
+
"### 指定类型输出",
|
|
417
|
+
"- `JsonSchema`为可选输入,需要使用`代码`节点生成",
|
|
418
|
+
"> 设置后响应类型会自动变为json",
|
|
419
|
+
"> 也可以使用任何符合`ChatJsonSchema`类型的数据结构传入(`代码`节点编辑时有声明)",
|
|
420
|
+
"- 原始输出: 不进行任何格式化处理的输出",
|
|
421
|
+
"### 定义图片变量",
|
|
422
|
+
"- 只有支持图片传入的大语言模型才支持此选项",
|
|
423
|
+
"> 如`minicpm-v:8b`",
|
|
424
|
+
"- 定义后在对话中可以传入图片",
|
|
425
|
+
"- 或者可以使用`图片输入`节点手动指定一张图片",
|
|
426
|
+
"- 只有`用户提示词`可以使用图片输入",
|
|
427
|
+
"> 不清楚是否所有模型都遵循此规则,所以并没有限制输入"
|
|
428
|
+
].join("\n"),
|
|
429
|
+
// config: defineConfig,
|
|
430
|
+
inputs: [
|
|
431
|
+
[],
|
|
432
|
+
[
|
|
433
|
+
{
|
|
434
|
+
label: "JsonSchema",
|
|
435
|
+
value: DEFAULT_CHAT_SCHEMA_KEY,
|
|
436
|
+
inputType: "schema",
|
|
437
|
+
optional: true
|
|
438
|
+
}
|
|
439
|
+
]
|
|
440
|
+
],
|
|
441
|
+
outputs: [[{ label: "原始输出", value: RUNNER_ORIGIN_OUTPUT_KEY }]]
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
// packages/workflow/inline/node/chat/chat.node.define.ts
|
|
445
|
+
var v7 = __toESM(require("valibot"), 1);
|
|
446
|
+
var import_view_angular_core6 = require("@piying/view-angular-core");
|
|
447
|
+
var ResponseList = ["json", "markdown", "yaml"];
|
|
448
|
+
var ResponseFormat = ["text", "json_object", "json_schema"];
|
|
449
|
+
var CHAT_NODE_DEFINE = v7.looseObject({
|
|
450
|
+
data: v7.looseObject({
|
|
451
|
+
config: v7.pipe(
|
|
452
|
+
v7.object({
|
|
453
|
+
llm: v7.optional(llmModelConfig()),
|
|
454
|
+
/** 处理时解析 */
|
|
455
|
+
responseFormat: v7.pipe(
|
|
456
|
+
v7.optional(v7.picklist(ResponseFormat)),
|
|
457
|
+
(0, import_view_angular_core6.patchInputs)({
|
|
458
|
+
options: [
|
|
459
|
+
// 有输入json时
|
|
460
|
+
{
|
|
461
|
+
label: "自动",
|
|
462
|
+
value: void 0,
|
|
463
|
+
description: `传入JsonSchema时为[json_schema],否则为[text]`
|
|
464
|
+
},
|
|
465
|
+
{ label: "文本", value: "text" },
|
|
466
|
+
{
|
|
467
|
+
label: "JSON对象",
|
|
468
|
+
value: "json_object",
|
|
469
|
+
description: "只限制返回类型为JSON对象,不对字段进行限制"
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
label: "JSON格式定义",
|
|
473
|
+
value: "json_schema",
|
|
474
|
+
description: "限制返回类型为JSON对象,同时限制字段,不建议手动指定,传入JsonSchema后自动启用"
|
|
475
|
+
}
|
|
476
|
+
]
|
|
477
|
+
}),
|
|
478
|
+
v7.title("响应格式")
|
|
479
|
+
),
|
|
480
|
+
/** 处理后解析 */
|
|
481
|
+
parseBy: v7.pipe(
|
|
482
|
+
v7.optional(v7.picklist(ResponseList)),
|
|
483
|
+
(0, import_view_angular_core6.patchInputs)({
|
|
484
|
+
options: [
|
|
485
|
+
{ label: "直接返回", value: void 0 },
|
|
486
|
+
{
|
|
487
|
+
label: "json",
|
|
488
|
+
value: "json",
|
|
489
|
+
description: `将返回的json代码块内容或原始内容解析为对象`
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
label: "markdown",
|
|
493
|
+
value: "markdown",
|
|
494
|
+
description: `[需要提示词约束]将返回其中的markdown代码块内容或原始内容`
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
label: "yaml",
|
|
498
|
+
value: "yaml",
|
|
499
|
+
description: `[需要提示词约束]将返回的yaml代码块内容或原始内容解析为对象`
|
|
500
|
+
}
|
|
501
|
+
]
|
|
502
|
+
}),
|
|
503
|
+
v7.title("返回解析"),
|
|
504
|
+
(0, import_view_angular_core6.valueChange)((fn) => {
|
|
505
|
+
fn({ list: [["..", "responseFormat"]] }).subscribe(
|
|
506
|
+
({ list: [value], field }) => {
|
|
507
|
+
if ((value ?? "").startsWith("json")) {
|
|
508
|
+
if (!field.form.control.value) {
|
|
509
|
+
field.form.control.updateValue("json");
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
);
|
|
514
|
+
})
|
|
515
|
+
),
|
|
516
|
+
examples: EXAMPLES_DEFINE
|
|
517
|
+
}),
|
|
518
|
+
(0, import_view_angular_core6.componentClass)("grid auto-rows-auto gap-2")
|
|
519
|
+
),
|
|
520
|
+
value: v7.pipe(
|
|
521
|
+
v7.custom(Boolean),
|
|
522
|
+
(0, import_view_angular_core6.setComponent)(""),
|
|
523
|
+
(0, import_view_angular_core6.condition)({
|
|
524
|
+
environments: ["display"],
|
|
525
|
+
actions: [
|
|
526
|
+
(0, import_view_angular_core6.setComponent)("prompt-list"),
|
|
527
|
+
(0, import_view_angular_core6.valueChange)((fn) => {
|
|
528
|
+
fn({ list: [void 0] }).subscribe(({ list: [value], field }) => {
|
|
529
|
+
if (!Array.isArray(value)) {
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
const inputValue = value ?? [];
|
|
533
|
+
field.context.parseTemplate(
|
|
534
|
+
inputValue.flatMap(
|
|
535
|
+
(item) => item.content.map(
|
|
536
|
+
(item2) => item2.type === "text" ? item2.text : ""
|
|
537
|
+
)
|
|
538
|
+
)
|
|
539
|
+
).then((value2) => {
|
|
540
|
+
if (!value2) {
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
field.context.changeHandleData(field, "input", 1, value2);
|
|
544
|
+
});
|
|
545
|
+
const list = inputValue.flatMap(
|
|
546
|
+
(item) => item.content.map(
|
|
547
|
+
(item2) => item2.type === "image_url" ? item2.image_url.url : void 0
|
|
548
|
+
)
|
|
549
|
+
).filter(Boolean).map((item) => ({
|
|
550
|
+
value: `${item}`,
|
|
551
|
+
label: `${item}`,
|
|
552
|
+
inputType: `image`
|
|
553
|
+
}));
|
|
554
|
+
field.context.changeHandleData(field, "input", 3, list ?? []);
|
|
555
|
+
});
|
|
556
|
+
})
|
|
557
|
+
]
|
|
558
|
+
})
|
|
559
|
+
)
|
|
560
|
+
})
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
// packages/workflow/inline/node/chat/main/llm.runner.ts
|
|
564
|
+
var import_static_injector5 = require("static-injector");
|
|
565
|
+
var import_yaml = require("yaml");
|
|
566
|
+
var import_es_toolkit3 = require("es-toolkit");
|
|
567
|
+
|
|
568
|
+
// packages/openai/chat/util/create.ts
|
|
569
|
+
function createAssistantMessage(text = "") {
|
|
570
|
+
return {
|
|
571
|
+
role: "assistant",
|
|
572
|
+
content: [{ type: "text", text }]
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
// packages/workflow/inline/node/chat/main/llm.runner.ts
|
|
577
|
+
var import_external_call = require("@cyia/external-call");
|
|
578
|
+
|
|
579
|
+
// packages/workflow/runner/runner-item.ts
|
|
580
|
+
var import_static_injector3 = require("static-injector");
|
|
581
|
+
|
|
582
|
+
// packages/workflow/token.ts
|
|
583
|
+
var import_static_injector2 = require("static-injector");
|
|
584
|
+
var CurrentWorkflowToken = new import_static_injector2.InjectionToken(
|
|
585
|
+
"CurrentWorkflow"
|
|
586
|
+
);
|
|
587
|
+
var InputsToken = new import_static_injector2.InjectionToken("Input");
|
|
588
|
+
var CurrentNodeToken = new import_static_injector2.InjectionToken("CurrentNode");
|
|
589
|
+
var CurrentCallNodeToken = new import_static_injector2.InjectionToken(
|
|
590
|
+
"CurrentCallNode"
|
|
591
|
+
);
|
|
592
|
+
var CurrentContextToken = new import_static_injector2.InjectionToken(
|
|
593
|
+
"CurrentContext"
|
|
594
|
+
);
|
|
595
|
+
var InputParamsToken = new import_static_injector2.InjectionToken(
|
|
596
|
+
"InputParams"
|
|
597
|
+
);
|
|
598
|
+
var ParentContextToken = new import_static_injector2.InjectionToken("ParentContext");
|
|
599
|
+
var UseInputToken = new import_static_injector2.InjectionToken("UseInput");
|
|
600
|
+
var AbortSignalToken = new import_static_injector2.InjectionToken(
|
|
601
|
+
"AbortSignal"
|
|
602
|
+
);
|
|
603
|
+
var EnviromentParametersToken = new import_static_injector2.InjectionToken("EnviromentParameters");
|
|
604
|
+
var ModelOptionsToken = new import_static_injector2.InjectionToken(
|
|
605
|
+
"ModelOptions"
|
|
606
|
+
);
|
|
607
|
+
var WorkflowConfigToken = new import_static_injector2.InjectionToken("WorkflowConfig");
|
|
608
|
+
var ChatServiceToken = new import_static_injector2.InjectionToken("ChatServiceToken");
|
|
609
|
+
|
|
610
|
+
// packages/workflow/runner/runner-item.ts
|
|
611
|
+
var v8 = __toESM(require("valibot"), 1);
|
|
612
|
+
var import_util = require("@cyia/util");
|
|
613
|
+
var import_es_toolkit = require("es-toolkit");
|
|
614
|
+
var import_compat = require("es-toolkit/compat");
|
|
615
|
+
var NodeRunnerBase = class {
|
|
616
|
+
node = (0, import_static_injector3.inject)(CurrentNodeToken);
|
|
617
|
+
callNode = (0, import_static_injector3.inject)(CurrentCallNodeToken);
|
|
618
|
+
context = (0, import_static_injector3.inject)(CurrentContextToken);
|
|
619
|
+
// protected useInput = inject(UseInputToken);
|
|
620
|
+
inputParams = (0, import_static_injector3.inject)(InputParamsToken);
|
|
621
|
+
injector = (0, import_static_injector3.inject)(import_static_injector3.Injector);
|
|
622
|
+
emitter = (0, import_static_injector3.inject)(WorkflowEmitter);
|
|
623
|
+
abortSignal = (0, import_static_injector3.inject)(AbortSignalToken);
|
|
624
|
+
async run() {
|
|
625
|
+
throw new Error("待实现");
|
|
626
|
+
}
|
|
627
|
+
inputs$$ = (0, import_static_injector3.computed)(() => {
|
|
628
|
+
const obj = {};
|
|
629
|
+
for (const input of this.node.inputs) {
|
|
630
|
+
if (!input.type) {
|
|
631
|
+
const data = this.inputParams.get(input.value);
|
|
632
|
+
if (!data) {
|
|
633
|
+
if (input.optional) {
|
|
634
|
+
continue;
|
|
635
|
+
} else {
|
|
636
|
+
throw new Error(`缺少输入参数: ${input.value}`);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
obj[input.value] = data;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
return obj;
|
|
643
|
+
});
|
|
644
|
+
inputValueObject$$ = (0, import_static_injector3.computed)(
|
|
645
|
+
() => Object.entries(this.inputs$$()).reduce(
|
|
646
|
+
(obj, item) => {
|
|
647
|
+
obj[item[0]] = item[1].value;
|
|
648
|
+
return obj;
|
|
649
|
+
},
|
|
650
|
+
{}
|
|
651
|
+
)
|
|
652
|
+
);
|
|
653
|
+
inputMetadataList$$ = (0, import_static_injector3.computed)(
|
|
654
|
+
() => Object.values(this.inputs$$()).map((item) => item.extra?.metadata)
|
|
655
|
+
);
|
|
656
|
+
getInputMetadata(input) {
|
|
657
|
+
return this.inputs$$()[input].extra?.metadata;
|
|
658
|
+
}
|
|
659
|
+
async getInputChat() {
|
|
660
|
+
const metadataList = [];
|
|
661
|
+
const obj = {};
|
|
662
|
+
const errorList = [];
|
|
663
|
+
for (const input of this.node.inputs) {
|
|
664
|
+
if (!input.type) {
|
|
665
|
+
const data = this.inputParams.get(input.value);
|
|
666
|
+
if (!data) {
|
|
667
|
+
if (input.optional) {
|
|
668
|
+
continue;
|
|
669
|
+
} else {
|
|
670
|
+
errorList.push(input.value);
|
|
671
|
+
continue;
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
if (input.inputType === "image") {
|
|
675
|
+
obj[input.value] = data?.value;
|
|
676
|
+
} else if ((0, import_util.isStringArray)(data?.value)) {
|
|
677
|
+
obj[input.value] = data.value.join("\n");
|
|
678
|
+
} else {
|
|
679
|
+
obj[input.value] = data?.value ?? "";
|
|
680
|
+
}
|
|
681
|
+
const extra = data?.extra;
|
|
682
|
+
if (extra) {
|
|
683
|
+
if (Array.isArray(extra)) {
|
|
684
|
+
for (const { metadata } of extra) {
|
|
685
|
+
if (!metadata) {
|
|
686
|
+
continue;
|
|
687
|
+
}
|
|
688
|
+
metadataList.push(metadata);
|
|
689
|
+
}
|
|
690
|
+
} else {
|
|
691
|
+
if (extra.metadata) {
|
|
692
|
+
metadataList.push(extra.metadata);
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
if (errorList.length) {
|
|
699
|
+
throw new Error(`缺少输入参数: ${errorList.join(",")}`);
|
|
700
|
+
}
|
|
701
|
+
return { metadataList, obj };
|
|
702
|
+
}
|
|
703
|
+
#modelConfig = (0, import_static_injector3.inject)(ModelOptionsToken);
|
|
704
|
+
mergeChatModel(input) {
|
|
705
|
+
let chatService = this.injector.get(ChatServiceToken);
|
|
706
|
+
let presetConfig = {};
|
|
707
|
+
if (input?.name) {
|
|
708
|
+
presetConfig = chatService.getModelConfig(input.name) ?? {};
|
|
709
|
+
}
|
|
710
|
+
return input ? (0, import_compat.defaultsDeep)(
|
|
711
|
+
(0, import_es_toolkit.omitBy)(
|
|
712
|
+
{
|
|
713
|
+
model: input.model,
|
|
714
|
+
baseURL: input?.baseURL
|
|
715
|
+
},
|
|
716
|
+
import_util.isEmptyInput
|
|
717
|
+
),
|
|
718
|
+
(0, import_es_toolkit.omitBy)(presetConfig, import_util.isEmptyInput),
|
|
719
|
+
(0, import_es_toolkit.omitBy)(this.#modelConfig ?? {}, import_util.isEmptyInput)
|
|
720
|
+
) : this.#modelConfig;
|
|
721
|
+
}
|
|
722
|
+
getParsedNode(schema) {
|
|
723
|
+
const result = v8.safeParse(schema, this.node);
|
|
724
|
+
if (result.success) {
|
|
725
|
+
return result.output;
|
|
726
|
+
}
|
|
727
|
+
if (!PROD_ENV) {
|
|
728
|
+
console.log(result.issues);
|
|
729
|
+
}
|
|
730
|
+
throw new Error(JSON.stringify(result.issues));
|
|
731
|
+
}
|
|
732
|
+
};
|
|
733
|
+
|
|
734
|
+
// packages/workflow/template-format.service.ts
|
|
735
|
+
var import_handlebars = __toESM(require("handlebars"), 1);
|
|
736
|
+
var import_static_injector4 = require("static-injector");
|
|
737
|
+
var import_es_toolkit2 = require("es-toolkit");
|
|
738
|
+
var import_liquidjs = require("liquidjs");
|
|
739
|
+
var engine = new import_liquidjs.Liquid({ jsTruthy: true });
|
|
740
|
+
var TemplateFormatService = class extends import_static_injector4.RootStaticInjectOptions {
|
|
741
|
+
interpolate(input, value) {
|
|
742
|
+
return import_handlebars.default.compile(input, { noEscape: true, preventIndent: true })(value, {
|
|
743
|
+
allowProtoPropertiesByDefault: true
|
|
744
|
+
});
|
|
745
|
+
}
|
|
746
|
+
entryInterpolate(payload, knowledge, content, embedingTemplate) {
|
|
747
|
+
return embedingTemplate?.enable ? this.interpolate(embedingTemplate.value ?? "", {
|
|
748
|
+
ENTRY: { ...payload, knowledge }
|
|
749
|
+
}) : content;
|
|
750
|
+
}
|
|
751
|
+
/** 用于模板格式化 */
|
|
752
|
+
parse(input) {
|
|
753
|
+
let list;
|
|
754
|
+
try {
|
|
755
|
+
list = import_handlebars.default.parse(input).body;
|
|
756
|
+
} catch (error) {
|
|
757
|
+
return { list: [], error: true };
|
|
758
|
+
}
|
|
759
|
+
const result = this.#getActionInputVariable(list, /* @__PURE__ */ new Set());
|
|
760
|
+
return {
|
|
761
|
+
list: [...result.set].map((item) => {
|
|
762
|
+
if (result.object.has(item)) {
|
|
763
|
+
return { inputType: "object", value: item };
|
|
764
|
+
}
|
|
765
|
+
return { inputType: "string", value: item };
|
|
766
|
+
}),
|
|
767
|
+
error: false
|
|
768
|
+
};
|
|
769
|
+
}
|
|
770
|
+
// 只有条件用,没太大用途
|
|
771
|
+
async parserJs(input) {
|
|
772
|
+
const { createCssSelectorForTs } = await import("@cyia/code-util/selector/ts");
|
|
773
|
+
try {
|
|
774
|
+
const selector = createCssSelectorForTs(input, { scriptKind: 1 });
|
|
775
|
+
const objectList = selector.queryAll(
|
|
776
|
+
`:not(DotToken)+Identifier,*::children(0)[tag=Identifier]`
|
|
777
|
+
);
|
|
778
|
+
return {
|
|
779
|
+
list: (0, import_es_toolkit2.uniqBy)(objectList, (item) => item.value).map((item) => ({
|
|
780
|
+
inputType: "object",
|
|
781
|
+
value: item.value
|
|
782
|
+
})),
|
|
783
|
+
error: false
|
|
784
|
+
};
|
|
785
|
+
} catch (error) {
|
|
786
|
+
return {
|
|
787
|
+
error: true,
|
|
788
|
+
list: []
|
|
789
|
+
};
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
async parserLiquid(input) {
|
|
793
|
+
try {
|
|
794
|
+
const result = engine.parse(input);
|
|
795
|
+
const varList = /* @__PURE__ */ new Set();
|
|
796
|
+
const proxyObj = new Proxy(
|
|
797
|
+
{},
|
|
798
|
+
{
|
|
799
|
+
getOwnPropertyDescriptor(target, p) {
|
|
800
|
+
return void 0;
|
|
801
|
+
},
|
|
802
|
+
has(target, p) {
|
|
803
|
+
varList.add(p);
|
|
804
|
+
return true;
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
);
|
|
808
|
+
await engine.render(result, proxyObj);
|
|
809
|
+
return {
|
|
810
|
+
list: [...varList].map((item) => ({
|
|
811
|
+
inputType: "object",
|
|
812
|
+
value: item
|
|
813
|
+
})),
|
|
814
|
+
error: false
|
|
815
|
+
};
|
|
816
|
+
} catch (error) {
|
|
817
|
+
return { error: true, list: [] };
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
#getActionInputVariable(body, nowSet) {
|
|
821
|
+
const obj = {
|
|
822
|
+
set: /* @__PURE__ */ new Set(),
|
|
823
|
+
block: {},
|
|
824
|
+
object: /* @__PURE__ */ new Set()
|
|
825
|
+
};
|
|
826
|
+
for (const item of body) {
|
|
827
|
+
if (item.type === "MustacheStatement") {
|
|
828
|
+
if (item.path.type === "PathExpression") {
|
|
829
|
+
const path3 = item.path;
|
|
830
|
+
obj.set.add(path3.parts[0]);
|
|
831
|
+
if (path3.parts.length > 1) {
|
|
832
|
+
obj.object.add(path3.parts[0]);
|
|
833
|
+
}
|
|
834
|
+
} else {
|
|
835
|
+
}
|
|
836
|
+
} else {
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
return obj;
|
|
840
|
+
}
|
|
841
|
+
};
|
|
842
|
+
|
|
843
|
+
// packages/workflow/inline/node/chat/main/llm.runner.ts
|
|
844
|
+
var import_util2 = require("@cyia/util");
|
|
845
|
+
var LlmRunner = class extends NodeRunnerBase {
|
|
846
|
+
#format = (0, import_static_injector5.inject)(TemplateFormatService);
|
|
847
|
+
#chatService = (0, import_static_injector5.inject)(ChatServiceToken);
|
|
848
|
+
#abort = (0, import_static_injector5.inject)(AbortSignalToken);
|
|
849
|
+
#channel = (0, import_static_injector5.inject)(import_external_call.LogService).getToken("chat");
|
|
850
|
+
async run() {
|
|
851
|
+
const { metadataList, obj } = await this.getInputChat();
|
|
852
|
+
const inputJsonSchema = this.inputParams.get(DEFAULT_CHAT_SCHEMA_KEY);
|
|
853
|
+
const nodeResult = this.getParsedNode(CHAT_NODE_DEFINE);
|
|
854
|
+
const config = nodeResult.data.config;
|
|
855
|
+
const examples = config.examples;
|
|
856
|
+
const list = nodeResult.data.value;
|
|
857
|
+
const historyList = list.map((item) => {
|
|
858
|
+
const content = this.#format.interpolate(
|
|
859
|
+
item.content.map((item2) => item2.type === "text" ? item2.text : "").join("\n"),
|
|
860
|
+
obj
|
|
861
|
+
);
|
|
862
|
+
return {
|
|
863
|
+
role: item.role,
|
|
864
|
+
content: [
|
|
865
|
+
{ type: "text", text: content },
|
|
866
|
+
...item.content.filter((item2) => item2.type === "image_url").flatMap((item2) => {
|
|
867
|
+
if (item2.type === "image_url") {
|
|
868
|
+
return obj[item2.image_url.url].map((item3) => ({
|
|
869
|
+
type: "image_url",
|
|
870
|
+
image_url: { url: item3.data }
|
|
871
|
+
}));
|
|
872
|
+
}
|
|
873
|
+
return item2;
|
|
874
|
+
})
|
|
875
|
+
]
|
|
876
|
+
};
|
|
877
|
+
});
|
|
878
|
+
const schema = (0, import_util2.isChatSchema)(inputJsonSchema?.value);
|
|
879
|
+
if (inputJsonSchema?.value && !schema) {
|
|
880
|
+
throw new Error(
|
|
881
|
+
`JsonSchema传入格式异常,需要: {name:string,schema:object},传入: ${JSON.stringify(inputJsonSchema.value)}`
|
|
882
|
+
);
|
|
883
|
+
} else if (schema) {
|
|
884
|
+
config.parseBy ??= "json";
|
|
885
|
+
config.responseFormat ??= "json_schema";
|
|
886
|
+
}
|
|
887
|
+
if (examples.length) {
|
|
888
|
+
const examplesTemplate = examples.filter((item) => item.input.value && item.output.value).flatMap((item) => [
|
|
889
|
+
{
|
|
890
|
+
role: "user",
|
|
891
|
+
content: [
|
|
892
|
+
{
|
|
893
|
+
type: "text",
|
|
894
|
+
text: this.#exampleFormat(item.input, config.parseBy)
|
|
895
|
+
}
|
|
896
|
+
]
|
|
897
|
+
},
|
|
898
|
+
{
|
|
899
|
+
role: "assistant",
|
|
900
|
+
content: [
|
|
901
|
+
{
|
|
902
|
+
type: "text",
|
|
903
|
+
text: this.#exampleFormat(item.output, config.parseBy)
|
|
904
|
+
}
|
|
905
|
+
]
|
|
906
|
+
}
|
|
907
|
+
]);
|
|
908
|
+
let index = historyList.findIndex((item) => item.role === "system");
|
|
909
|
+
index = index === -1 ? 0 : index + 1;
|
|
910
|
+
historyList.splice(index, 0, ...examplesTemplate);
|
|
911
|
+
}
|
|
912
|
+
this.#channel?.info("节点对话配置", config.llm);
|
|
913
|
+
const llm = await this.#chatService.chat(this.mergeChatModel(config.llm));
|
|
914
|
+
const result = await llm.stream(
|
|
915
|
+
{
|
|
916
|
+
messages: historyList,
|
|
917
|
+
response_format: config.responseFormat === "json_schema" ? { type: "json_schema", json_schema: inputJsonSchema?.value } : config.responseFormat === "json_object" ? { type: "json_object" } : void 0
|
|
918
|
+
},
|
|
919
|
+
{ signal: this.#abort }
|
|
920
|
+
);
|
|
921
|
+
const streamData = createLLMData({
|
|
922
|
+
node: this.node,
|
|
923
|
+
value: "",
|
|
924
|
+
extra: {
|
|
925
|
+
references: (0, import_es_toolkit3.uniqBy)(
|
|
926
|
+
metadataList,
|
|
927
|
+
(item) => item.type + item.description + item.tooltip || ""
|
|
928
|
+
),
|
|
929
|
+
historyList: [],
|
|
930
|
+
delta: "",
|
|
931
|
+
content: ""
|
|
932
|
+
}
|
|
933
|
+
});
|
|
934
|
+
const endRef = this.#chatService.getMetadataEndRef(
|
|
935
|
+
streamData.extra.references
|
|
936
|
+
);
|
|
937
|
+
for await (const item of result) {
|
|
938
|
+
const value = endRef ? item.content + endRef : item.content;
|
|
939
|
+
streamData.value = value;
|
|
940
|
+
streamData.extra = { ...streamData.extra, ...item, content: value };
|
|
941
|
+
this.emitter.send(streamData);
|
|
942
|
+
}
|
|
943
|
+
const resultContent = streamData.value;
|
|
944
|
+
streamData.extra.delta = "";
|
|
945
|
+
historyList.push(createAssistantMessage(resultContent));
|
|
946
|
+
streamData.extra.historyList = historyList;
|
|
947
|
+
this.emitter.send(streamData);
|
|
948
|
+
return async (outputName) => {
|
|
949
|
+
if (outputName === RUNNER_ORIGIN_OUTPUT_KEY) {
|
|
950
|
+
return {
|
|
951
|
+
value: streamData.value,
|
|
952
|
+
dataId: streamData.dataId,
|
|
953
|
+
extra: streamData.extra
|
|
954
|
+
};
|
|
955
|
+
}
|
|
956
|
+
let value;
|
|
957
|
+
switch (config.parseBy) {
|
|
958
|
+
case "markdown":
|
|
959
|
+
value = (0, import_util2.markdownParse)(resultContent);
|
|
960
|
+
break;
|
|
961
|
+
case "json":
|
|
962
|
+
value = (0, import_util2.jsonParse)(resultContent);
|
|
963
|
+
break;
|
|
964
|
+
case "yaml":
|
|
965
|
+
value = (0, import_util2.yamlParse)(resultContent);
|
|
966
|
+
break;
|
|
967
|
+
default:
|
|
968
|
+
value = resultContent;
|
|
969
|
+
break;
|
|
970
|
+
}
|
|
971
|
+
if (typeof value === "undefined") {
|
|
972
|
+
throw new Error(`解析${config.parseBy}失败`);
|
|
973
|
+
}
|
|
974
|
+
return { value, dataId: streamData.dataId, extra: streamData.extra };
|
|
975
|
+
};
|
|
976
|
+
}
|
|
977
|
+
#exampleFormat(data, format) {
|
|
978
|
+
if (data.format) {
|
|
979
|
+
if (format === "json") {
|
|
980
|
+
return JSON.stringify((0, import_yaml.parse)(data.value));
|
|
981
|
+
}
|
|
982
|
+
return data.value;
|
|
983
|
+
} else {
|
|
984
|
+
return data.value;
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
};
|
|
988
|
+
|
|
989
|
+
// packages/workflow/inline/node/chat/main/index.ts
|
|
990
|
+
var ChatMainConfig = {
|
|
991
|
+
...NODE_COMMON,
|
|
992
|
+
runner: LlmRunner,
|
|
993
|
+
define: CHAT_NODE_DEFINE
|
|
994
|
+
};
|
|
995
|
+
|
|
996
|
+
// packages/workflow/inline/node/text/common.ts
|
|
997
|
+
var NODE_COMMON2 = {
|
|
998
|
+
type: "textarea",
|
|
999
|
+
label: `文本模板`,
|
|
1000
|
+
icon: { fontIcon: "text_snippet" },
|
|
1001
|
+
disableHead: false,
|
|
1002
|
+
disableConnect: false,
|
|
1003
|
+
color: "primary",
|
|
1004
|
+
help: `${HelpObj.templateVarLine}`,
|
|
1005
|
+
priority: -98
|
|
1006
|
+
};
|
|
1007
|
+
|
|
1008
|
+
// packages/workflow/inline/node/text/main/textarea.runner.ts
|
|
1009
|
+
var import_static_injector6 = require("static-injector");
|
|
1010
|
+
var TextareaRunner = class extends NodeRunnerBase {
|
|
1011
|
+
#format = (0, import_static_injector6.inject)(TemplateFormatService);
|
|
1012
|
+
async run() {
|
|
1013
|
+
const obj = this.inputValueObject$$();
|
|
1014
|
+
const str = this.node.data.value;
|
|
1015
|
+
return async () => ({ value: this.#format.interpolate(str, obj) });
|
|
1016
|
+
}
|
|
1017
|
+
};
|
|
1018
|
+
|
|
1019
|
+
// packages/workflow/inline/node/text/main/index.ts
|
|
1020
|
+
var TextMainConfig = {
|
|
1021
|
+
...NODE_COMMON2,
|
|
1022
|
+
runner: TextareaRunner
|
|
1023
|
+
};
|
|
1024
|
+
|
|
1025
|
+
// packages/workflow/workflow-parser.service.ts
|
|
1026
|
+
var WorkflowParserContext = class _WorkflowParserContext {
|
|
1027
|
+
constructor(list, subObject, data, parentNode, userInputParams = [], parent) {
|
|
1028
|
+
this.list = list;
|
|
1029
|
+
this.subObject = subObject;
|
|
1030
|
+
this.data = data;
|
|
1031
|
+
this.parentNode = parentNode;
|
|
1032
|
+
this.userInputParams = userInputParams;
|
|
1033
|
+
this.parent = parent;
|
|
1034
|
+
}
|
|
1035
|
+
list;
|
|
1036
|
+
subObject;
|
|
1037
|
+
data;
|
|
1038
|
+
parentNode;
|
|
1039
|
+
userInputParams;
|
|
1040
|
+
parent;
|
|
1041
|
+
// fixme 或许可以分离,单独调用,然后加上children查找,不过那样就太慢了
|
|
1042
|
+
#childUseNodeSet = /* @__PURE__ */ new Set();
|
|
1043
|
+
/** 只能子级在本级找不到节点时调用父级使用 */
|
|
1044
|
+
childUseDefine(id, parentId) {
|
|
1045
|
+
const define = this.list.find((item) => item.id === id);
|
|
1046
|
+
if (!define) {
|
|
1047
|
+
return this.parent?.childUseDefine(id, parentId);
|
|
1048
|
+
}
|
|
1049
|
+
if (id !== parentId) {
|
|
1050
|
+
this.#childUseNodeSet.add(id);
|
|
1051
|
+
}
|
|
1052
|
+
return define;
|
|
1053
|
+
}
|
|
1054
|
+
#getParentNodeDefine(id) {
|
|
1055
|
+
return this.parent?.childUseDefine(id, this.parentNode?.id);
|
|
1056
|
+
}
|
|
1057
|
+
parseItem() {
|
|
1058
|
+
const graph = new import_graphology.default({ multi: true });
|
|
1059
|
+
const { nodes, edges } = this.data.flow;
|
|
1060
|
+
const nodeData = { nodes: {}, end: void 0 };
|
|
1061
|
+
this.list.forEach((node) => {
|
|
1062
|
+
graph.addNode(node.id);
|
|
1063
|
+
});
|
|
1064
|
+
for (const node of this.list) {
|
|
1065
|
+
const handle = {
|
|
1066
|
+
output: flatFilterHandleList(node.data.handle?.output)
|
|
1067
|
+
};
|
|
1068
|
+
const cEdges = (0, import_react.getConnectedEdges)([node], edges);
|
|
1069
|
+
const inputNodes = (0, import_react.getIncomers)(node, nodes, cEdges);
|
|
1070
|
+
const inputHandleList = flatFilterHandleList(node.data.handle?.input);
|
|
1071
|
+
const inputParams = [];
|
|
1072
|
+
for (const item of inputHandleList) {
|
|
1073
|
+
const targetHandle = item.id;
|
|
1074
|
+
const linkedEdges = cEdges.filter(
|
|
1075
|
+
(item2) => item2.targetHandle === targetHandle && item2.target === node.id
|
|
1076
|
+
);
|
|
1077
|
+
if (linkedEdges.length > 1) {
|
|
1078
|
+
return {
|
|
1079
|
+
error: {
|
|
1080
|
+
message: `${node.id}:不支持多个节点连接一个输入点`,
|
|
1081
|
+
nodeId: node.id
|
|
1082
|
+
}
|
|
1083
|
+
};
|
|
1084
|
+
}
|
|
1085
|
+
if (linkedEdges.length === 1) {
|
|
1086
|
+
const linkedEdge = linkedEdges[0];
|
|
1087
|
+
const linkedNode = inputNodes.find(
|
|
1088
|
+
(item2) => item2.id === linkedEdge.source
|
|
1089
|
+
);
|
|
1090
|
+
const linkedOuput = flatFilterHandleList(
|
|
1091
|
+
linkedNode.data.handle?.output
|
|
1092
|
+
).find((item2) => item2.id === linkedEdge.sourceHandle);
|
|
1093
|
+
inputParams.push({
|
|
1094
|
+
...item,
|
|
1095
|
+
nodeId: linkedNode.id,
|
|
1096
|
+
outputName: linkedOuput.value
|
|
1097
|
+
});
|
|
1098
|
+
if (!graph.hasNode(linkedNode.id)) {
|
|
1099
|
+
if (!this.#getParentNodeDefine(linkedNode.id)) {
|
|
1100
|
+
return {
|
|
1101
|
+
error: {
|
|
1102
|
+
message: `${linkedNode.id}:未找到连接节点,只能读取到当前及祖先范围内的节点`,
|
|
1103
|
+
nodeId: linkedNode.id
|
|
1104
|
+
}
|
|
1105
|
+
};
|
|
1106
|
+
}
|
|
1107
|
+
graph.addNode(linkedNode.id);
|
|
1108
|
+
}
|
|
1109
|
+
graph.addEdge(linkedNode.id, node.id);
|
|
1110
|
+
} else {
|
|
1111
|
+
inputParams.push({ ...item });
|
|
1112
|
+
if (item.type) {
|
|
1113
|
+
continue;
|
|
1114
|
+
}
|
|
1115
|
+
this.userInputParams.push(item);
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
nodeData.nodes[node.id] = {
|
|
1119
|
+
data: node.data,
|
|
1120
|
+
//输入用
|
|
1121
|
+
inputs: inputParams,
|
|
1122
|
+
outputs: handle.output,
|
|
1123
|
+
type: node.type,
|
|
1124
|
+
id: node.id
|
|
1125
|
+
};
|
|
1126
|
+
if (this.subObject[node.id]) {
|
|
1127
|
+
for (let index = 0; index < this.subObject[node.id].length; index++) {
|
|
1128
|
+
const { key, startId, nodeList } = this.subObject[node.id][index];
|
|
1129
|
+
const instance = new _WorkflowParserContext(
|
|
1130
|
+
nodeList,
|
|
1131
|
+
this.subObject,
|
|
1132
|
+
this.data,
|
|
1133
|
+
node,
|
|
1134
|
+
this.userInputParams,
|
|
1135
|
+
this
|
|
1136
|
+
);
|
|
1137
|
+
const result = instance.parseItem();
|
|
1138
|
+
if (result.error) {
|
|
1139
|
+
return { error: { ...result.error } };
|
|
1140
|
+
}
|
|
1141
|
+
nodeData.nodes[node.id].subFlowList ??= [];
|
|
1142
|
+
nodeData.nodes[node.id].subFlowList.push({
|
|
1143
|
+
key,
|
|
1144
|
+
flow: result.data,
|
|
1145
|
+
startId
|
|
1146
|
+
});
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
const outList = [];
|
|
1151
|
+
graph.forEachNode((node) => {
|
|
1152
|
+
if (!this.#childUseNodeSet.has(node) && graph.outDegree(node) === 0) {
|
|
1153
|
+
outList.push(node);
|
|
1154
|
+
}
|
|
1155
|
+
});
|
|
1156
|
+
if (outList.length > 1) {
|
|
1157
|
+
return { error: { message: `计算时存在多个出口` } };
|
|
1158
|
+
} else if (outList.length === 0) {
|
|
1159
|
+
return { error: { message: `可能出现循环依赖,没有出口` } };
|
|
1160
|
+
} else {
|
|
1161
|
+
nodeData.end = outList[0];
|
|
1162
|
+
nodeData.inputList = (0, import_es_toolkit4.uniqBy)(
|
|
1163
|
+
this.userInputParams,
|
|
1164
|
+
(item) => `${item.inputType || "string"}|${item.value}`
|
|
1165
|
+
).map((item) => ({
|
|
1166
|
+
inputType: item.inputType || "string",
|
|
1167
|
+
value: item.value,
|
|
1168
|
+
label: item.label || item.value,
|
|
1169
|
+
optional: item.optional
|
|
1170
|
+
}));
|
|
1171
|
+
return { data: nodeData };
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
};
|
|
1175
|
+
var NodeGroup = class {
|
|
1176
|
+
#group = /* @__PURE__ */ new Map();
|
|
1177
|
+
#iterationMap = /* @__PURE__ */ new Map();
|
|
1178
|
+
addContainerStart(node) {
|
|
1179
|
+
this.#iterationMap.set(node.parentId, node);
|
|
1180
|
+
}
|
|
1181
|
+
getContainerStart(node) {
|
|
1182
|
+
return this.#iterationMap.get(node.id);
|
|
1183
|
+
}
|
|
1184
|
+
add(node) {
|
|
1185
|
+
const nodeMap = this.#group.get(node.type) || [];
|
|
1186
|
+
nodeMap.push(node);
|
|
1187
|
+
this.#group.set(node.type, nodeMap);
|
|
1188
|
+
}
|
|
1189
|
+
getList(type) {
|
|
1190
|
+
return this.#group.get(type) || [];
|
|
1191
|
+
}
|
|
1192
|
+
};
|
|
1193
|
+
var WorkflowDataToken = new import_static_injector7.InjectionToken(
|
|
1194
|
+
"WorkflowData"
|
|
1195
|
+
);
|
|
1196
|
+
var WorkflowPreParser = class {
|
|
1197
|
+
/**
|
|
1198
|
+
* 迭代块:直接找父级parentid就行了
|
|
1199
|
+
* 分类块:所有后面的都算他的
|
|
1200
|
+
* 重构,所有节点进行迭代
|
|
1201
|
+
* 找迭代快,找到后找子级item块,找到后进行output查找+parent==迭代快
|
|
1202
|
+
* 找分类,找到后output查找
|
|
1203
|
+
* 所有独立块都是找到独立节点后终止
|
|
1204
|
+
*/
|
|
1205
|
+
#nodeGroup = new NodeGroup();
|
|
1206
|
+
#data = (0, import_static_injector7.inject)(WorkflowDataToken);
|
|
1207
|
+
#plugin = (0, import_static_injector7.inject)(WorkflowPluginService);
|
|
1208
|
+
#inlineNodeService = (0, import_static_injector7.inject)(InlineNodeService);
|
|
1209
|
+
#fullBlockObject$$ = (0, import_static_injector7.computed)(
|
|
1210
|
+
() => ({
|
|
1211
|
+
...this.#inlineNodeService.conditionNodeList(),
|
|
1212
|
+
...this.#plugin.conditionNodeList$$(),
|
|
1213
|
+
["iteration" /* iteration */]: true
|
|
1214
|
+
})
|
|
1215
|
+
);
|
|
1216
|
+
#conditionBlockObject$$ = (0, import_static_injector7.computed)(
|
|
1217
|
+
() => ({
|
|
1218
|
+
...this.#inlineNodeService.conditionNodeList(),
|
|
1219
|
+
...this.#plugin.conditionNodeList$$()
|
|
1220
|
+
})
|
|
1221
|
+
);
|
|
1222
|
+
parse() {
|
|
1223
|
+
const { nodes, edges } = this.#data.flow;
|
|
1224
|
+
const mainList = [];
|
|
1225
|
+
const subObjectGroup = {};
|
|
1226
|
+
const excludeSet = /* @__PURE__ */ new Set();
|
|
1227
|
+
const isBlock = (item) => this.#fullBlockObject$$()[item.type];
|
|
1228
|
+
const removedList = /* @__PURE__ */ new Set();
|
|
1229
|
+
const getSubNode = (node, subNodeList) => {
|
|
1230
|
+
subNodeList.push(node);
|
|
1231
|
+
excludeSet.add(node.id);
|
|
1232
|
+
if (!isBlock(node)) {
|
|
1233
|
+
(0, import_react.getOutgoers)(node, nodes, edges).forEach((item) => {
|
|
1234
|
+
getSubNode(item, subNodeList);
|
|
1235
|
+
});
|
|
1236
|
+
}
|
|
1237
|
+
};
|
|
1238
|
+
let manualInput = false;
|
|
1239
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
1240
|
+
const node = nodes[i];
|
|
1241
|
+
if (node.data.excludeUsage) {
|
|
1242
|
+
removedList.add(node.id);
|
|
1243
|
+
nodes.splice(i, 1);
|
|
1244
|
+
i--;
|
|
1245
|
+
continue;
|
|
1246
|
+
}
|
|
1247
|
+
if (node.type === "input-params") {
|
|
1248
|
+
manualInput ||= !!node.data.config?.["manualInput"];
|
|
1249
|
+
} else if (isBlock(node)) {
|
|
1250
|
+
this.#nodeGroup.add(node);
|
|
1251
|
+
} else if (node.type === "iteration-start" /* iterationStart */) {
|
|
1252
|
+
this.#nodeGroup.addContainerStart(node);
|
|
1253
|
+
}
|
|
1254
|
+
}
|
|
1255
|
+
Object.keys(this.#fullBlockObject$$()).flatMap((key) => this.#nodeGroup.getList(key)).forEach((node) => {
|
|
1256
|
+
const outputList = subObjectGroup[node.id] || [];
|
|
1257
|
+
subObjectGroup[node.id] = outputList;
|
|
1258
|
+
if (node.type === "iteration" /* iteration */) {
|
|
1259
|
+
const subNodeList = [];
|
|
1260
|
+
const startNode = this.#nodeGroup.getContainerStart(node);
|
|
1261
|
+
getSubNode(startNode, subNodeList);
|
|
1262
|
+
outputList.push({
|
|
1263
|
+
nodeList: (0, import_es_toolkit4.uniqBy)(subNodeList, (item) => item.id),
|
|
1264
|
+
startId: startNode.id,
|
|
1265
|
+
key: `[default]`
|
|
1266
|
+
});
|
|
1267
|
+
} else if (this.#conditionBlockObject$$()[node.type]) {
|
|
1268
|
+
const cEdges = (0, import_react.getConnectedEdges)([node], edges);
|
|
1269
|
+
const children = (0, import_react.getOutgoers)(node, nodes, cEdges);
|
|
1270
|
+
const outputHandleList = flatFilterHandleList(
|
|
1271
|
+
node.data.handle.output
|
|
1272
|
+
);
|
|
1273
|
+
for (const outputHandle of outputHandleList) {
|
|
1274
|
+
const outputEdgeList = cEdges.filter(
|
|
1275
|
+
(edge) => edge.sourceHandle === outputHandle.id
|
|
1276
|
+
);
|
|
1277
|
+
if (!outputEdgeList.length) {
|
|
1278
|
+
throw new Error(`[${node.data.title || ""}]节点上发现未连接出口`);
|
|
1279
|
+
}
|
|
1280
|
+
for (const childNode of children.filter(
|
|
1281
|
+
({ id }) => outputEdgeList.some(({ target }) => target === id)
|
|
1282
|
+
)) {
|
|
1283
|
+
const subNodeList = [];
|
|
1284
|
+
getSubNode(childNode, subNodeList);
|
|
1285
|
+
outputList.push({
|
|
1286
|
+
nodeList: (0, import_es_toolkit4.uniqBy)(subNodeList, (item) => item.id),
|
|
1287
|
+
startId: childNode.id,
|
|
1288
|
+
key: outputHandle.value
|
|
1289
|
+
});
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
});
|
|
1294
|
+
for (const node of nodes) {
|
|
1295
|
+
if (excludeSet.has(node.id)) {
|
|
1296
|
+
continue;
|
|
1297
|
+
}
|
|
1298
|
+
mainList.push(node);
|
|
1299
|
+
}
|
|
1300
|
+
return {
|
|
1301
|
+
list: mainList,
|
|
1302
|
+
subObjectGroup,
|
|
1303
|
+
manualInput,
|
|
1304
|
+
edges: edges.filter(
|
|
1305
|
+
(edge) => !removedList.has(edge.source) && !removedList.has(edge.target)
|
|
1306
|
+
)
|
|
1307
|
+
};
|
|
1308
|
+
}
|
|
1309
|
+
};
|
|
1310
|
+
var WorkflowParserService = class {
|
|
1311
|
+
#injector = (0, import_static_injector7.inject)(import_static_injector7.Injector);
|
|
1312
|
+
#inlineNode = (0, import_static_injector7.inject)(InlineNodeService);
|
|
1313
|
+
constructor() {
|
|
1314
|
+
this.#inlineNode.register(index_node_exports);
|
|
1315
|
+
}
|
|
1316
|
+
/**
|
|
1317
|
+
* 1.如果出现孤立节点,那么需要判断是不是子级引用
|
|
1318
|
+
* 2.子级引用本级别找不到,那么需要找父级
|
|
1319
|
+
*/
|
|
1320
|
+
/**
|
|
1321
|
+
* 边有id,通过source 找到连接的节点
|
|
1322
|
+
*
|
|
1323
|
+
*/
|
|
1324
|
+
parse(data) {
|
|
1325
|
+
const injector = (0, import_static_injector7.createInjector)({
|
|
1326
|
+
providers: [
|
|
1327
|
+
WorkflowPreParser,
|
|
1328
|
+
{ provide: WorkflowDataToken, useValue: data }
|
|
1329
|
+
],
|
|
1330
|
+
parent: this.#injector
|
|
1331
|
+
});
|
|
1332
|
+
const preInstance = injector.get(WorkflowPreParser);
|
|
1333
|
+
const result = preInstance.parse();
|
|
1334
|
+
if (!result.list.length) {
|
|
1335
|
+
return {
|
|
1336
|
+
error: {
|
|
1337
|
+
message: "无可用节点"
|
|
1338
|
+
}
|
|
1339
|
+
};
|
|
1340
|
+
}
|
|
1341
|
+
const instance = new WorkflowParserContext(
|
|
1342
|
+
result.list,
|
|
1343
|
+
result.subObjectGroup,
|
|
1344
|
+
{ ...data, flow: { ...data.flow, edges: result.edges } }
|
|
1345
|
+
);
|
|
1346
|
+
return { ...instance.parseItem(), manualInput: result.manualInput };
|
|
1347
|
+
}
|
|
1348
|
+
};
|
|
1349
|
+
|
|
1350
|
+
// packages/workflow/workflow-exec.service.ts
|
|
1351
|
+
var import_static_injector14 = require("static-injector");
|
|
1352
|
+
|
|
1353
|
+
// packages/workflow/preset/inline-runner.service.ts
|
|
1354
|
+
var import_static_injector12 = require("static-injector");
|
|
1355
|
+
|
|
1356
|
+
// packages/workflow/preset/inline-build.service.ts
|
|
1357
|
+
var import_static_injector8 = require("static-injector");
|
|
1358
|
+
|
|
1359
|
+
// packages/workflow/runner/parameters.runner.ts
|
|
1360
|
+
var ParametersRunner = class extends NodeRunnerBase {
|
|
1361
|
+
static runnerName = "parameters";
|
|
1362
|
+
async run() {
|
|
1363
|
+
return async () => ({ value: this.inputs$$() });
|
|
1364
|
+
}
|
|
1365
|
+
};
|
|
1366
|
+
|
|
1367
|
+
// packages/workflow/preset/inline-build.service.ts
|
|
1368
|
+
var InlineBuilderService = class {
|
|
1369
|
+
template = (0, import_static_injector8.inject)(TemplateFormatService);
|
|
1370
|
+
parser = (0, import_static_injector8.inject)(WorkflowParserService);
|
|
1371
|
+
#createLLMNode(input) {
|
|
1372
|
+
return {
|
|
1373
|
+
id: "1",
|
|
1374
|
+
data: {
|
|
1375
|
+
handle: {
|
|
1376
|
+
input: [
|
|
1377
|
+
Object.keys({ ...input.input, ...input.context }).map(
|
|
1378
|
+
(value, i) => ({
|
|
1379
|
+
id: `${i}`,
|
|
1380
|
+
value,
|
|
1381
|
+
label: ``
|
|
1382
|
+
})
|
|
1383
|
+
)
|
|
1384
|
+
],
|
|
1385
|
+
output: [
|
|
1386
|
+
[
|
|
1387
|
+
{
|
|
1388
|
+
id: "1",
|
|
1389
|
+
label: "",
|
|
1390
|
+
value: "输出"
|
|
1391
|
+
}
|
|
1392
|
+
]
|
|
1393
|
+
]
|
|
1394
|
+
}
|
|
1395
|
+
},
|
|
1396
|
+
type: ParametersRunner.runnerName
|
|
1397
|
+
};
|
|
1398
|
+
}
|
|
1399
|
+
#createEdge(llmNode, context) {
|
|
1400
|
+
const edgeList = [];
|
|
1401
|
+
const addEdge = (node) => {
|
|
1402
|
+
const inputHandleList = node.data.handle?.input.flat() || [];
|
|
1403
|
+
for (const inputHandle of inputHandleList) {
|
|
1404
|
+
const item = context[inputHandle.value];
|
|
1405
|
+
if (!item) {
|
|
1406
|
+
continue;
|
|
1407
|
+
}
|
|
1408
|
+
const sourceHandle = item.data.handle.output[0][0];
|
|
1409
|
+
edgeList.push({
|
|
1410
|
+
source: item.id,
|
|
1411
|
+
sourceHandle: sourceHandle.id,
|
|
1412
|
+
// 自身
|
|
1413
|
+
target: node.id,
|
|
1414
|
+
targetHandle: inputHandle.id
|
|
1415
|
+
});
|
|
1416
|
+
}
|
|
1417
|
+
};
|
|
1418
|
+
for (const ctxKey in context) {
|
|
1419
|
+
const node = context[ctxKey];
|
|
1420
|
+
addEdge(node);
|
|
1421
|
+
}
|
|
1422
|
+
addEdge(llmNode);
|
|
1423
|
+
return edgeList;
|
|
1424
|
+
}
|
|
1425
|
+
#createWorkflow(input) {
|
|
1426
|
+
const chatNode = this.#createLLMNode(input);
|
|
1427
|
+
const edges = this.#createEdge(chatNode, input.context);
|
|
1428
|
+
return {
|
|
1429
|
+
nodes: [chatNode, ...Object.values(input.context)],
|
|
1430
|
+
edges
|
|
1431
|
+
};
|
|
1432
|
+
}
|
|
1433
|
+
createDefine(input) {
|
|
1434
|
+
return this.parser.parse({ flow: this.#createWorkflow(input) });
|
|
1435
|
+
}
|
|
1436
|
+
};
|
|
1437
|
+
|
|
1438
|
+
// packages/workflow/runner/workflow-runner.service.ts
|
|
1439
|
+
var import_static_injector11 = require("static-injector");
|
|
1440
|
+
|
|
1441
|
+
// packages/workflow/runner/inline-input-item.runner.ts
|
|
1442
|
+
var import_static_injector9 = require("static-injector");
|
|
1443
|
+
var InlineInputItemRunner = class extends NodeRunnerBase {
|
|
1444
|
+
static runnerName = "inlineInputItem";
|
|
1445
|
+
#env = (0, import_static_injector9.inject)(EnviromentParametersToken);
|
|
1446
|
+
async run() {
|
|
1447
|
+
return async () => {
|
|
1448
|
+
const key = this.node.inputs[0].value;
|
|
1449
|
+
const result = this.#env;
|
|
1450
|
+
if (!result) {
|
|
1451
|
+
throw new Error(`读取上下文参数[${key}]失败`);
|
|
1452
|
+
}
|
|
1453
|
+
return { value: result[key] };
|
|
1454
|
+
};
|
|
1455
|
+
}
|
|
1456
|
+
};
|
|
1457
|
+
|
|
1458
|
+
// packages/workflow/runner/input-params.runner.ts
|
|
1459
|
+
var import_static_injector10 = require("static-injector");
|
|
1460
|
+
var InputParamsRunner = class extends NodeRunnerBase {
|
|
1461
|
+
#env = (0, import_static_injector10.inject)(EnviromentParametersToken);
|
|
1462
|
+
async run() {
|
|
1463
|
+
return async () => {
|
|
1464
|
+
const value = this.#env;
|
|
1465
|
+
if (!value) {
|
|
1466
|
+
throw new Error(`读取上下文失败`);
|
|
1467
|
+
}
|
|
1468
|
+
return {
|
|
1469
|
+
value
|
|
1470
|
+
};
|
|
1471
|
+
};
|
|
1472
|
+
}
|
|
1473
|
+
};
|
|
1474
|
+
|
|
1475
|
+
// packages/workflow/runner/iteration-start.runner.ts
|
|
1476
|
+
var IterationStartRunner = class extends NodeRunnerBase {
|
|
1477
|
+
async run() {
|
|
1478
|
+
return async () => this.inputParams.get(ITERATION_ITEM_SYMBOL);
|
|
1479
|
+
}
|
|
1480
|
+
};
|
|
1481
|
+
|
|
1482
|
+
// packages/workflow/runner/iteration.runner.ts
|
|
1483
|
+
var import_util3 = require("@cyia/util");
|
|
1484
|
+
var IterationRunner = class extends NodeRunnerBase {
|
|
1485
|
+
async run() {
|
|
1486
|
+
const data = this.inputParams.get(this.node.inputs[0].value);
|
|
1487
|
+
if (!data) {
|
|
1488
|
+
throw new Error("输入节点为空");
|
|
1489
|
+
}
|
|
1490
|
+
const extra = data.extra;
|
|
1491
|
+
const value = data.value;
|
|
1492
|
+
if (!(0, import_util3.isIterable)(value)) {
|
|
1493
|
+
throw new Error(`输入值不是可迭代(数组)类型: ${JSON.stringify(value)}`);
|
|
1494
|
+
}
|
|
1495
|
+
const resultList = [];
|
|
1496
|
+
let index = 0;
|
|
1497
|
+
for (const item of value) {
|
|
1498
|
+
const newInputs = new Map(this.inputParams);
|
|
1499
|
+
newInputs.set(ITERATION_ITEM_SYMBOL, {
|
|
1500
|
+
value: item,
|
|
1501
|
+
extra: extra?.[index]
|
|
1502
|
+
});
|
|
1503
|
+
try {
|
|
1504
|
+
resultList.push(
|
|
1505
|
+
await this.injector.get(WorkflowRunnerService).createContext(
|
|
1506
|
+
//迭代只有一个子流
|
|
1507
|
+
this.node.subFlowList[0].flow,
|
|
1508
|
+
newInputs,
|
|
1509
|
+
this.context,
|
|
1510
|
+
this.injector
|
|
1511
|
+
).run()
|
|
1512
|
+
);
|
|
1513
|
+
} catch (error) {
|
|
1514
|
+
throw new Error(`执行第${index}出现异常`, { cause: error });
|
|
1515
|
+
}
|
|
1516
|
+
index++;
|
|
1517
|
+
}
|
|
1518
|
+
const list = resultList.reduce(
|
|
1519
|
+
(obj, item) => {
|
|
1520
|
+
obj.value.push(item.value);
|
|
1521
|
+
obj.extra.push(item.extra);
|
|
1522
|
+
return obj;
|
|
1523
|
+
},
|
|
1524
|
+
{ value: [], extra: [] }
|
|
1525
|
+
);
|
|
1526
|
+
return async (outputName) => {
|
|
1527
|
+
if (outputName === "flat") {
|
|
1528
|
+
return { value: list.value.flat(999), extra: list.extra.flat(999) };
|
|
1529
|
+
}
|
|
1530
|
+
return list;
|
|
1531
|
+
};
|
|
1532
|
+
}
|
|
1533
|
+
};
|
|
1534
|
+
|
|
1535
|
+
// packages/workflow/runner/define.ts
|
|
1536
|
+
var ItemRunnerObject = {
|
|
1537
|
+
["iteration" /* iteration */]: IterationRunner,
|
|
1538
|
+
["iteration-start" /* iterationStart */]: IterationStartRunner,
|
|
1539
|
+
["input-params" /* inputParams */]: InputParamsRunner,
|
|
1540
|
+
["parameters" /* parameters */]: ParametersRunner,
|
|
1541
|
+
["inlineInputItem" /* inlineInputItem */]: InlineInputItemRunner
|
|
1542
|
+
};
|
|
1543
|
+
|
|
1544
|
+
// packages/workflow/runner/runner-error.ts
|
|
1545
|
+
var RunnerError = class _RunnerError extends Error {
|
|
1546
|
+
#origin;
|
|
1547
|
+
#list;
|
|
1548
|
+
constructor(origin, list) {
|
|
1549
|
+
super(
|
|
1550
|
+
`${list.map(
|
|
1551
|
+
(item) => `[${item.title}]${item.message ? ": " + item.message : ""}`
|
|
1552
|
+
).join("<-")}`,
|
|
1553
|
+
{ cause: origin }
|
|
1554
|
+
);
|
|
1555
|
+
this.#origin = origin;
|
|
1556
|
+
this.#list = list;
|
|
1557
|
+
delete this.stack;
|
|
1558
|
+
this.name = `节点运行异常`;
|
|
1559
|
+
}
|
|
1560
|
+
create(item) {
|
|
1561
|
+
this.#list.push(item);
|
|
1562
|
+
return new _RunnerError(this.#origin, this.#list);
|
|
1563
|
+
}
|
|
1564
|
+
};
|
|
1565
|
+
var AbortSignalError = class extends Error {
|
|
1566
|
+
};
|
|
1567
|
+
|
|
1568
|
+
// packages/workflow/runner/workflow-runner.service.ts
|
|
1569
|
+
var import_external_call2 = require("@cyia/external-call");
|
|
1570
|
+
var ITERATION_ITEM_SYMBOL = /* @__PURE__ */ Symbol("ITERATION_ITEM");
|
|
1571
|
+
var WorkflowRunnerContext = class {
|
|
1572
|
+
#injector = (0, import_static_injector11.inject)(import_static_injector11.Injector);
|
|
1573
|
+
data = (0, import_static_injector11.inject)(CurrentWorkflowToken);
|
|
1574
|
+
parent = (0, import_static_injector11.inject)(ParentContextToken);
|
|
1575
|
+
#callCache = /* @__PURE__ */ new Map();
|
|
1576
|
+
#outputCache = /* @__PURE__ */ new Map();
|
|
1577
|
+
inputs = (0, import_static_injector11.inject)(InputsToken);
|
|
1578
|
+
#plugin = (0, import_static_injector11.inject)(WorkflowPluginService);
|
|
1579
|
+
#emitter = (0, import_static_injector11.inject)(WorkflowEmitter);
|
|
1580
|
+
#inlineNode = (0, import_static_injector11.inject)(InlineNodeService);
|
|
1581
|
+
async #getNodeRunner(type) {
|
|
1582
|
+
return this.#inlineNode.getNodeRunner(type) ?? ItemRunnerObject[type] ?? await this.#plugin.getNodeRunner(type);
|
|
1583
|
+
}
|
|
1584
|
+
getNodeById(id) {
|
|
1585
|
+
const result = this.data.nodes[id];
|
|
1586
|
+
if (!result) {
|
|
1587
|
+
return this.parent?.getNodeById(id);
|
|
1588
|
+
}
|
|
1589
|
+
return result;
|
|
1590
|
+
}
|
|
1591
|
+
/** 调用缓存,同一个上下文内容不可能变化 */
|
|
1592
|
+
#getCallCache(id) {
|
|
1593
|
+
if (this.#callCache.has(id)) {
|
|
1594
|
+
return { result: this.#callCache.get(id) };
|
|
1595
|
+
}
|
|
1596
|
+
return this.parent ? this.parent.#getCallCache(id) : void 0;
|
|
1597
|
+
}
|
|
1598
|
+
#getOuputCache(id) {
|
|
1599
|
+
if (this.#outputCache.has(id)) {
|
|
1600
|
+
return { result: this.#outputCache.get(id) };
|
|
1601
|
+
}
|
|
1602
|
+
return this.parent ? this.parent.#getOuputCache(id) : void 0;
|
|
1603
|
+
}
|
|
1604
|
+
async startRun() {
|
|
1605
|
+
const node = this.getNodeById(this.data.end);
|
|
1606
|
+
return this.#runItem(node);
|
|
1607
|
+
}
|
|
1608
|
+
async run() {
|
|
1609
|
+
const node = this.getNodeById(this.data.end);
|
|
1610
|
+
return this.#runItem(node);
|
|
1611
|
+
}
|
|
1612
|
+
// 当前node 调用 node context
|
|
1613
|
+
async #createNodeRunner(item, inputParams, callNode, input) {
|
|
1614
|
+
const define = await this.#getNodeRunner(item.type);
|
|
1615
|
+
return (0, import_static_injector11.createInjector)({
|
|
1616
|
+
providers: [
|
|
1617
|
+
define,
|
|
1618
|
+
{ provide: CurrentNodeToken, useValue: item },
|
|
1619
|
+
{ provide: CurrentCallNodeToken, useValue: callNode },
|
|
1620
|
+
{ provide: CurrentContextToken, useValue: this },
|
|
1621
|
+
{ provide: UseInputToken, useValue: input },
|
|
1622
|
+
{ provide: InputParamsToken, useValue: inputParams }
|
|
1623
|
+
],
|
|
1624
|
+
parent: this.#injector
|
|
1625
|
+
}).get(define);
|
|
1626
|
+
}
|
|
1627
|
+
#abort = (0, import_static_injector11.inject)(AbortSignalToken);
|
|
1628
|
+
async #runItem(node, callNode, input) {
|
|
1629
|
+
try {
|
|
1630
|
+
if (this.#abort?.aborted) {
|
|
1631
|
+
throw new AbortSignalError();
|
|
1632
|
+
}
|
|
1633
|
+
const inputParams = new Map(this.inputs);
|
|
1634
|
+
for (const input2 of node.inputs) {
|
|
1635
|
+
if (input2.nodeId) {
|
|
1636
|
+
const inputNode = this.getNodeById(input2.nodeId);
|
|
1637
|
+
if (inputNode.subFlowList?.some(
|
|
1638
|
+
(subItem) => subItem.startId === node.id
|
|
1639
|
+
)) {
|
|
1640
|
+
continue;
|
|
1641
|
+
}
|
|
1642
|
+
const result = await this.#runItem(inputNode, node, input2);
|
|
1643
|
+
inputParams.set(input2.value, result);
|
|
1644
|
+
}
|
|
1645
|
+
}
|
|
1646
|
+
const nodeRunner = await this.#createNodeRunner(
|
|
1647
|
+
node,
|
|
1648
|
+
inputParams,
|
|
1649
|
+
callNode,
|
|
1650
|
+
input
|
|
1651
|
+
);
|
|
1652
|
+
const outputList = node.outputs;
|
|
1653
|
+
const outputName = input?.outputName ?? node.data.outputName ?? outputList[0].value;
|
|
1654
|
+
let dataResult = this.#getCallCache(node.id);
|
|
1655
|
+
if (dataResult === void 0) {
|
|
1656
|
+
{
|
|
1657
|
+
const res = await nodeRunner.run();
|
|
1658
|
+
dataResult = { result: res };
|
|
1659
|
+
this.#callCache.set(node.id, res);
|
|
1660
|
+
}
|
|
1661
|
+
}
|
|
1662
|
+
const outputKey = `${node.id}|${outputName}`;
|
|
1663
|
+
const outputResult = this.#getOuputCache(outputKey);
|
|
1664
|
+
let returnData;
|
|
1665
|
+
if (outputResult === void 0) {
|
|
1666
|
+
const res = await dataResult.result(outputName);
|
|
1667
|
+
this.#outputCache.set(outputKey, res);
|
|
1668
|
+
returnData = res;
|
|
1669
|
+
} else {
|
|
1670
|
+
returnData = outputResult.result;
|
|
1671
|
+
}
|
|
1672
|
+
this.#emitter.send(
|
|
1673
|
+
createResultData({
|
|
1674
|
+
...returnData,
|
|
1675
|
+
node
|
|
1676
|
+
})
|
|
1677
|
+
);
|
|
1678
|
+
return returnData;
|
|
1679
|
+
} catch (error) {
|
|
1680
|
+
if (error instanceof Error && error.message === "Request was aborted." || error instanceof AbortSignalError) {
|
|
1681
|
+
return { value: void 0 };
|
|
1682
|
+
}
|
|
1683
|
+
const item = { title: node.data.title || "" };
|
|
1684
|
+
if (error instanceof RunnerError) {
|
|
1685
|
+
throw error.create(item);
|
|
1686
|
+
} else {
|
|
1687
|
+
if (error instanceof Error && error.message === "Connection error.") {
|
|
1688
|
+
const newError = new RunnerError(error.cause, [
|
|
1689
|
+
{ ...item, message: "接口请求失败" }
|
|
1690
|
+
]);
|
|
1691
|
+
delete newError.stack;
|
|
1692
|
+
throw newError;
|
|
1693
|
+
}
|
|
1694
|
+
throw new RunnerError(error, [item]);
|
|
1695
|
+
}
|
|
1696
|
+
}
|
|
1697
|
+
}
|
|
1698
|
+
};
|
|
1699
|
+
var WorkflowRunnerService = class {
|
|
1700
|
+
#injector = (0, import_static_injector11.inject)(import_static_injector11.Injector);
|
|
1701
|
+
/** 自己使用
|
|
1702
|
+
* @internal
|
|
1703
|
+
*/
|
|
1704
|
+
createContext(data, inputs, parent, parentInjector) {
|
|
1705
|
+
return (0, import_static_injector11.createInjector)({
|
|
1706
|
+
providers: [
|
|
1707
|
+
WorkflowRunnerContext,
|
|
1708
|
+
{ provide: CurrentWorkflowToken, useValue: data },
|
|
1709
|
+
{ provide: InputsToken, useValue: inputs },
|
|
1710
|
+
{ provide: ParentContextToken, useValue: parent }
|
|
1711
|
+
],
|
|
1712
|
+
parent: parentInjector ?? this.#injector
|
|
1713
|
+
}).get(WorkflowRunnerContext);
|
|
1714
|
+
}
|
|
1715
|
+
#log;
|
|
1716
|
+
get log() {
|
|
1717
|
+
return this.#log ?? (this.#log = this.#injector.get(import_external_call2.LogService, void 0, { optional: true })?.getToken("workflow"));
|
|
1718
|
+
}
|
|
1719
|
+
/** 入口 */
|
|
1720
|
+
run(data, input, ob, signal2) {
|
|
1721
|
+
this.log?.info("工作流默认对话配置", input.modelOptions);
|
|
1722
|
+
const injector = (0, import_static_injector11.createInjector)({
|
|
1723
|
+
providers: [
|
|
1724
|
+
WorkflowEmitter,
|
|
1725
|
+
{ provide: AbortSignalToken, useValue: signal2 },
|
|
1726
|
+
{
|
|
1727
|
+
provide: EnviromentParametersToken,
|
|
1728
|
+
useValue: input.environmentParameters
|
|
1729
|
+
},
|
|
1730
|
+
{ provide: ModelOptionsToken, useValue: input.modelOptions }
|
|
1731
|
+
],
|
|
1732
|
+
parent: this.#injector
|
|
1733
|
+
});
|
|
1734
|
+
const runner = this.createContext(data, input.input, void 0, injector);
|
|
1735
|
+
if (ob) {
|
|
1736
|
+
injector.get(WorkflowEmitter).setObserver(ob);
|
|
1737
|
+
}
|
|
1738
|
+
return runner.startRun();
|
|
1739
|
+
}
|
|
1740
|
+
};
|
|
1741
|
+
|
|
1742
|
+
// packages/workflow/preset/inline-runner.service.ts
|
|
1743
|
+
var InlineParametersService = class {
|
|
1744
|
+
#inlineBuild = (0, import_static_injector12.inject)(InlineBuilderService);
|
|
1745
|
+
#workflowRunner = (0, import_static_injector12.inject)(WorkflowRunnerService);
|
|
1746
|
+
async run(input) {
|
|
1747
|
+
const define = this.#inlineBuild.createDefine({
|
|
1748
|
+
...input,
|
|
1749
|
+
input: input.input ?? {},
|
|
1750
|
+
context: input.context ?? {}
|
|
1751
|
+
});
|
|
1752
|
+
const result2 = await this.#workflowRunner.run(define.data, {
|
|
1753
|
+
input: new Map(
|
|
1754
|
+
Object.entries(input.input || {}).map(([key, value]) => [
|
|
1755
|
+
key,
|
|
1756
|
+
{ value }
|
|
1757
|
+
])
|
|
1758
|
+
),
|
|
1759
|
+
environmentParameters: input.environmentParameters,
|
|
1760
|
+
modelOptions: input.modelOptions
|
|
1761
|
+
});
|
|
1762
|
+
return result2;
|
|
1763
|
+
}
|
|
1764
|
+
};
|
|
1765
|
+
|
|
1766
|
+
// packages/workflow/workflow-exec.service.ts
|
|
1767
|
+
var import_rxjs2 = require("rxjs");
|
|
1768
|
+
|
|
1769
|
+
// packages/workflow/preset/context-build.service.ts
|
|
1770
|
+
var import_static_injector13 = require("static-injector");
|
|
1771
|
+
var import_es_toolkit5 = require("es-toolkit");
|
|
1772
|
+
var ContextBuildService = class {
|
|
1773
|
+
template = (0, import_static_injector13.inject)(TemplateFormatService);
|
|
1774
|
+
parser = (0, import_static_injector13.inject)(WorkflowParserService);
|
|
1775
|
+
createWorkflow(input, inlineMode) {
|
|
1776
|
+
const result = this.template.parse(
|
|
1777
|
+
input.template.flatMap(
|
|
1778
|
+
(item) => item.content.map((item2) => item2.type === "text" ? item2.text : "")
|
|
1779
|
+
).join("\n")
|
|
1780
|
+
).list.map((item) => item.value);
|
|
1781
|
+
const inputList = [
|
|
1782
|
+
(0, import_es_toolkit5.uniq)([
|
|
1783
|
+
...Object.keys({ ...input.input, ...input.context }),
|
|
1784
|
+
...result
|
|
1785
|
+
]).map((value, i) => ({
|
|
1786
|
+
id: `${i}`,
|
|
1787
|
+
value,
|
|
1788
|
+
label: ``
|
|
1789
|
+
}))
|
|
1790
|
+
];
|
|
1791
|
+
const chatNode = {
|
|
1792
|
+
id: "2",
|
|
1793
|
+
data: {
|
|
1794
|
+
title: "对话",
|
|
1795
|
+
handle: {
|
|
1796
|
+
input: inputList,
|
|
1797
|
+
output: [
|
|
1798
|
+
[
|
|
1799
|
+
{
|
|
1800
|
+
id: "1",
|
|
1801
|
+
label: "",
|
|
1802
|
+
value: "输出"
|
|
1803
|
+
}
|
|
1804
|
+
]
|
|
1805
|
+
]
|
|
1806
|
+
},
|
|
1807
|
+
value: input.template,
|
|
1808
|
+
config: {}
|
|
1809
|
+
},
|
|
1810
|
+
type: "chat"
|
|
1811
|
+
};
|
|
1812
|
+
if (!inlineMode) {
|
|
1813
|
+
return {
|
|
1814
|
+
nodes: [chatNode],
|
|
1815
|
+
edges: []
|
|
1816
|
+
};
|
|
1817
|
+
}
|
|
1818
|
+
const inputParamsNode = {
|
|
1819
|
+
id: "1",
|
|
1820
|
+
type: "input-params" /* inputParams */,
|
|
1821
|
+
data: {
|
|
1822
|
+
handle: {
|
|
1823
|
+
input: [
|
|
1824
|
+
[
|
|
1825
|
+
{
|
|
1826
|
+
...generateHandle(DEFAULT_INPUT_KEY, ""),
|
|
1827
|
+
inputType: "object"
|
|
1828
|
+
}
|
|
1829
|
+
]
|
|
1830
|
+
],
|
|
1831
|
+
output: [[{ id: "1", value: "default", label: "" }]]
|
|
1832
|
+
}
|
|
1833
|
+
}
|
|
1834
|
+
};
|
|
1835
|
+
const bridgeNodeList = inputList.flat().map((item, i) => ({
|
|
1836
|
+
id: `${InlineInputItemRunner.runnerName}-${i}`,
|
|
1837
|
+
type: InlineInputItemRunner.runnerName,
|
|
1838
|
+
data: {
|
|
1839
|
+
handle: {
|
|
1840
|
+
input: [[{ id: "1", value: item.value, label: "" }]],
|
|
1841
|
+
output: [
|
|
1842
|
+
[
|
|
1843
|
+
{
|
|
1844
|
+
id: "1",
|
|
1845
|
+
label: "",
|
|
1846
|
+
value: "输出"
|
|
1847
|
+
}
|
|
1848
|
+
]
|
|
1849
|
+
]
|
|
1850
|
+
}
|
|
1851
|
+
}
|
|
1852
|
+
}));
|
|
1853
|
+
const bridgeEdgeList1 = inputList.flat().map((item, i) => ({
|
|
1854
|
+
source: inputParamsNode.id,
|
|
1855
|
+
sourceHandle: "1",
|
|
1856
|
+
target: `${InlineInputItemRunner.runnerName}-${i}`,
|
|
1857
|
+
targetHandle: "1"
|
|
1858
|
+
}));
|
|
1859
|
+
const bridgeEdgeList2 = inputList.flat().map((item, i) => ({
|
|
1860
|
+
source: `${InlineInputItemRunner.runnerName}-${i}`,
|
|
1861
|
+
sourceHandle: "1",
|
|
1862
|
+
target: chatNode.id,
|
|
1863
|
+
targetHandle: item.id
|
|
1864
|
+
}));
|
|
1865
|
+
return {
|
|
1866
|
+
nodes: [inputParamsNode, chatNode, ...bridgeNodeList],
|
|
1867
|
+
edges: [...bridgeEdgeList1, ...bridgeEdgeList2]
|
|
1868
|
+
};
|
|
1869
|
+
}
|
|
1870
|
+
};
|
|
1871
|
+
|
|
1872
|
+
// packages/workflow/workflow-exec.service.ts
|
|
1873
|
+
var WorkflowExecService = class {
|
|
1874
|
+
#parser = (0, import_static_injector14.inject)(WorkflowParserService);
|
|
1875
|
+
#parameterResolve = (0, import_static_injector14.inject)(InlineParametersService);
|
|
1876
|
+
#runner = (0, import_static_injector14.inject)(WorkflowRunnerService);
|
|
1877
|
+
parse(data) {
|
|
1878
|
+
return this.#parser.parse(data);
|
|
1879
|
+
}
|
|
1880
|
+
async runParse(define, input, ob, abortSignal) {
|
|
1881
|
+
const parameters = await this.#parameterResolve.run(input);
|
|
1882
|
+
return this.#runner.run(
|
|
1883
|
+
define,
|
|
1884
|
+
{
|
|
1885
|
+
input: new Map(
|
|
1886
|
+
Object.entries(parameters.value).map(([key, value]) => [key, value])
|
|
1887
|
+
),
|
|
1888
|
+
environmentParameters: input.environmentParameters,
|
|
1889
|
+
modelOptions: input.modelOptions
|
|
1890
|
+
},
|
|
1891
|
+
ob,
|
|
1892
|
+
abortSignal
|
|
1893
|
+
);
|
|
1894
|
+
}
|
|
1895
|
+
async exec(data, input, options, ob, abortSignal) {
|
|
1896
|
+
let define;
|
|
1897
|
+
if (data.define) {
|
|
1898
|
+
define = data.define;
|
|
1899
|
+
} else {
|
|
1900
|
+
const res = this.#parser.parse(data);
|
|
1901
|
+
if (res.error) {
|
|
1902
|
+
throw res.error;
|
|
1903
|
+
}
|
|
1904
|
+
define = res.data;
|
|
1905
|
+
}
|
|
1906
|
+
try {
|
|
1907
|
+
return await this.runParse(define, input, ob, abortSignal);
|
|
1908
|
+
} catch (error) {
|
|
1909
|
+
if (options.showError) {
|
|
1910
|
+
}
|
|
1911
|
+
throw error;
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1914
|
+
#contextBuild = (0, import_static_injector14.inject)(ContextBuildService);
|
|
1915
|
+
async agentChat(input, fn, abort) {
|
|
1916
|
+
const workflow = this.#contextBuild.createWorkflow(input, input.inlineMode);
|
|
1917
|
+
const subject = new import_rxjs2.Subject();
|
|
1918
|
+
subject.subscribe({
|
|
1919
|
+
next: (value) => {
|
|
1920
|
+
fn(value);
|
|
1921
|
+
}
|
|
1922
|
+
});
|
|
1923
|
+
const result2 = await this.exec(
|
|
1924
|
+
{ flow: workflow },
|
|
1925
|
+
{
|
|
1926
|
+
...input
|
|
1927
|
+
},
|
|
1928
|
+
{ showError: true },
|
|
1929
|
+
subject,
|
|
1930
|
+
abort
|
|
1931
|
+
);
|
|
1932
|
+
return result2;
|
|
1933
|
+
}
|
|
1934
|
+
};
|
|
1935
|
+
|
|
1936
|
+
// packages/workflow/workflow-select.service.ts
|
|
1937
|
+
var import_static_injector16 = require("static-injector");
|
|
1938
|
+
var import_vfs22 = require("@cyia/vfs2");
|
|
1939
|
+
|
|
1940
|
+
// packages/workflow/workflow-file.service.ts
|
|
1941
|
+
var import_static_injector15 = require("static-injector");
|
|
1942
|
+
var import_vfs2 = require("@cyia/vfs2");
|
|
1943
|
+
var import_bundle_file = require("@cyia/bundle-file");
|
|
1944
|
+
var WorkflowFileService = class {
|
|
1945
|
+
#config = (0, import_static_injector15.inject)(WorkflowConfigToken);
|
|
1946
|
+
#fileMap = /* @__PURE__ */ new Map();
|
|
1947
|
+
getFile(filePath) {
|
|
1948
|
+
const nFilePath = import_vfs2.path.normalize(filePath);
|
|
1949
|
+
let file = this.#fileMap.get(nFilePath);
|
|
1950
|
+
if (!file) {
|
|
1951
|
+
file = new import_bundle_file.RawFile(nFilePath);
|
|
1952
|
+
this.#fileMap.set(nFilePath, file);
|
|
1953
|
+
}
|
|
1954
|
+
return file;
|
|
1955
|
+
}
|
|
1956
|
+
/** 关闭已打开的默认工作流文件 */
|
|
1957
|
+
async closeDefulatFile() {
|
|
1958
|
+
const dir = import_vfs2.path.join(this.#config().dir, "default");
|
|
1959
|
+
for (const [filePath, file] of this.#fileMap) {
|
|
1960
|
+
if (filePath.startsWith(dir)) {
|
|
1961
|
+
await file.close();
|
|
1962
|
+
this.#fileMap.delete(filePath);
|
|
1963
|
+
}
|
|
1964
|
+
}
|
|
1965
|
+
}
|
|
1966
|
+
async remove(filePath) {
|
|
1967
|
+
const nFilePath = import_vfs2.path.normalize(filePath);
|
|
1968
|
+
const file = this.#fileMap.get(nFilePath);
|
|
1969
|
+
if (!file) {
|
|
1970
|
+
return;
|
|
1971
|
+
}
|
|
1972
|
+
await file.close();
|
|
1973
|
+
this.#fileMap.delete(nFilePath);
|
|
1974
|
+
}
|
|
1975
|
+
};
|
|
1976
|
+
|
|
1977
|
+
// packages/workflow/workflow-select.service.ts
|
|
1978
|
+
var WorkflowSelectService = class {
|
|
1979
|
+
#fileService = (0, import_static_injector16.inject)(WorkflowFileService);
|
|
1980
|
+
#config = (0, import_static_injector16.inject)(WorkflowConfigToken);
|
|
1981
|
+
#vfs = (0, import_static_injector16.computed)(
|
|
1982
|
+
() => (0, import_vfs22.createNormalizeVfs)({
|
|
1983
|
+
dir: this.#config().dir
|
|
1984
|
+
})
|
|
1985
|
+
);
|
|
1986
|
+
async get({ workflowName }) {
|
|
1987
|
+
const wfPath = import_vfs22.path.join(this.#config().dir, `${workflowName}.workflow`);
|
|
1988
|
+
if (!await this.#vfs().exists(wfPath)) {
|
|
1989
|
+
const isDefulat = workflowName.startsWith("default/");
|
|
1990
|
+
throw new Error(
|
|
1991
|
+
`工作流: [${workflowName}] 不存在;${isDefulat ? "您可以尝试[同步内置工作流]更新" : ""}`
|
|
1992
|
+
);
|
|
1993
|
+
}
|
|
1994
|
+
const file = this.#fileService.getFile(wfPath);
|
|
1995
|
+
return await file.readOriginData();
|
|
1996
|
+
}
|
|
1997
|
+
async getList() {
|
|
1998
|
+
const rootDir = this.#config().dir;
|
|
1999
|
+
const list = [];
|
|
2000
|
+
const listG = this.#vfs().glob("**/*.workflow", { cwd: rootDir });
|
|
2001
|
+
for await (const item of listG) {
|
|
2002
|
+
const relFilePath = item.replace(/\.workflow$/, "");
|
|
2003
|
+
list.push({
|
|
2004
|
+
relPath: relFilePath,
|
|
2005
|
+
name: import_vfs22.path.basename(relFilePath),
|
|
2006
|
+
stat: await this.#vfs().stat(item)
|
|
2007
|
+
});
|
|
2008
|
+
}
|
|
2009
|
+
return list;
|
|
2010
|
+
}
|
|
2011
|
+
};
|
|
2012
|
+
|
|
2013
|
+
// packages/workflow/module.ts
|
|
2014
|
+
var WORKFLOW_MODULE = {
|
|
2015
|
+
provider: [
|
|
2016
|
+
WorkflowExecService,
|
|
2017
|
+
WorkflowParserService,
|
|
2018
|
+
WorkflowSelectService,
|
|
2019
|
+
WorkflowFileService,
|
|
2020
|
+
ContextBuildService,
|
|
2021
|
+
InlineBuilderService,
|
|
2022
|
+
WorkflowRunnerService,
|
|
2023
|
+
InlineParametersService,
|
|
2024
|
+
WorkflowPluginService,
|
|
2025
|
+
InlineNodeService
|
|
2026
|
+
],
|
|
2027
|
+
token: {
|
|
2028
|
+
ChatServiceToken,
|
|
2029
|
+
WorkflowConfigToken
|
|
2030
|
+
}
|
|
2031
|
+
};
|
|
2032
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
2033
|
+
0 && (module.exports = {
|
|
2034
|
+
AbortSignalToken,
|
|
2035
|
+
ChatServiceToken,
|
|
2036
|
+
CommonDataDefine,
|
|
2037
|
+
CurrentCallNodeToken,
|
|
2038
|
+
CurrentContextToken,
|
|
2039
|
+
CurrentNodeToken,
|
|
2040
|
+
CurrentWorkflowToken,
|
|
2041
|
+
DEFAULT_CHAT_SCHEMA_KEY,
|
|
2042
|
+
DEFAULT_INPUT_KEY,
|
|
2043
|
+
EXAMPLES_DEFINE,
|
|
2044
|
+
EnviromentParametersToken,
|
|
2045
|
+
HandleDataDefine,
|
|
2046
|
+
HelpObj,
|
|
2047
|
+
INLINE_Template,
|
|
2048
|
+
INLINE_Template2,
|
|
2049
|
+
ITERATION_ITEM_SYMBOL,
|
|
2050
|
+
InlineNodeService,
|
|
2051
|
+
InputParamsToken,
|
|
2052
|
+
InputsToken,
|
|
2053
|
+
LLMDataDefine,
|
|
2054
|
+
ModelOptionsToken,
|
|
2055
|
+
NodeRunnerBase,
|
|
2056
|
+
ParentContextToken,
|
|
2057
|
+
RUNNER_ORIGIN_OUTPUT_KEY,
|
|
2058
|
+
TemplateFormatService,
|
|
2059
|
+
UseInputToken,
|
|
2060
|
+
WORKFLOW_MODULE,
|
|
2061
|
+
WorkflowConfigToken,
|
|
2062
|
+
WorkflowEmitter,
|
|
2063
|
+
WorkflowExecService,
|
|
2064
|
+
WorkflowFileService,
|
|
2065
|
+
WorkflowNodeType,
|
|
2066
|
+
WorkflowParserService,
|
|
2067
|
+
WorkflowPluginService,
|
|
2068
|
+
WorkflowRunnerContext,
|
|
2069
|
+
WorkflowRunnerService,
|
|
2070
|
+
WorkflowSelectService,
|
|
2071
|
+
createLLMData,
|
|
2072
|
+
createResultData,
|
|
2073
|
+
flatFilterHandleList,
|
|
2074
|
+
generateHandle,
|
|
2075
|
+
isChatStream,
|
|
2076
|
+
llmModelConfig
|
|
2077
|
+
});
|
|
2078
|
+
//# sourceMappingURL=index.js.map
|