@shenghuabi/workflow 1.0.11 → 1.1.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.js +92 -138
- package/index.js.map +4 -4
- package/index.mjs +78 -129
- package/index.mjs.map +4 -4
- package/inline/node/chat/chat.node.define.d.ts +5 -18
- package/inline/node/chat/main/index.d.ts +5 -18
- package/inline/node/text/text.node.define.d.ts +1 -1
- package/package.json +2 -2
- package/share/common/examples.define.d.ts +1 -10
- package/share/common/index.d.ts +0 -1
- package/share/common/llm.define.d.ts +2 -6
- package/share/index.js +56 -96
- package/share/index.js.map +4 -4
- package/share/index.mjs +47 -91
- package/share/index.mjs.map +4 -4
- package/webview/index.js +56 -83
- package/webview/index.js.map +2 -2
- package/webview/index.mjs +58 -93
- package/webview/index.mjs.map +3 -3
- package/share/common/handle.define.d.ts +0 -5
package/share/index.mjs
CHANGED
|
@@ -32,11 +32,7 @@ var WorkflowNodeType = /* @__PURE__ */ ((WorkflowNodeType2) => {
|
|
|
32
32
|
})(WorkflowNodeType || {});
|
|
33
33
|
|
|
34
34
|
// packages/workflow/share/common/examples.define.ts
|
|
35
|
-
import {
|
|
36
|
-
actions as actions2,
|
|
37
|
-
condition,
|
|
38
|
-
renderConfig
|
|
39
|
-
} from "@piying/view-angular-core";
|
|
35
|
+
import { actions as actions2 } from "@piying/view-angular-core";
|
|
40
36
|
import * as v from "valibot";
|
|
41
37
|
|
|
42
38
|
// packages/workflow/share/util/layout.ts
|
|
@@ -67,7 +63,11 @@ var EXAMPLES_DEFINE = v.pipe(
|
|
|
67
63
|
),
|
|
68
64
|
actions2.wrappers.set(["tooltip"])
|
|
69
65
|
),
|
|
70
|
-
value: v.pipe(
|
|
66
|
+
value: v.pipe(
|
|
67
|
+
v.string(),
|
|
68
|
+
v.title("问题"),
|
|
69
|
+
actions2.class.top("flex-1")
|
|
70
|
+
)
|
|
71
71
|
}),
|
|
72
72
|
// todo 待修复
|
|
73
73
|
actions2.class.top("flex gap-2 items-center")
|
|
@@ -79,7 +79,11 @@ var EXAMPLES_DEFINE = v.pipe(
|
|
|
79
79
|
v.description("是否需要格式化"),
|
|
80
80
|
actions2.wrappers.set(["tooltip"])
|
|
81
81
|
),
|
|
82
|
-
value: v.pipe(
|
|
82
|
+
value: v.pipe(
|
|
83
|
+
v.string(),
|
|
84
|
+
v.title("回答"),
|
|
85
|
+
actions2.class.top("flex-1")
|
|
86
|
+
)
|
|
83
87
|
}),
|
|
84
88
|
actions2.class.top("flex gap-2 items-center")
|
|
85
89
|
)
|
|
@@ -90,52 +94,21 @@ var EXAMPLES_DEFINE = v.pipe(
|
|
|
90
94
|
[]
|
|
91
95
|
),
|
|
92
96
|
v.title("用例"),
|
|
93
|
-
v.description("回答问题之前,会参考定义的用例格式进行回复,用于规范回答")
|
|
94
|
-
condition({
|
|
95
|
-
environments: ["display"],
|
|
96
|
-
actions: [
|
|
97
|
-
renderConfig({
|
|
98
|
-
hidden: true
|
|
99
|
-
})
|
|
100
|
-
]
|
|
101
|
-
})
|
|
102
|
-
);
|
|
103
|
-
|
|
104
|
-
// packages/workflow/share/common/handle.define.ts
|
|
105
|
-
import * as v2 from "valibot";
|
|
106
|
-
import { renderConfig as renderConfig2, setComponent } from "@piying/view-angular-core";
|
|
107
|
-
import { condition as condition2 } from "@piying/valibot-visit";
|
|
108
|
-
var HiddenAction = condition2({
|
|
109
|
-
environments: ["display", "default"],
|
|
110
|
-
actions: [setComponent(""), renderConfig2({ hidden: true })]
|
|
111
|
-
});
|
|
112
|
-
var AnyHiddenList = v2.pipe(
|
|
113
|
-
v2.array(v2.pipe(v2.optional(v2.any()), HiddenAction)),
|
|
114
|
-
setComponent(""),
|
|
115
|
-
renderConfig2({ hidden: true })
|
|
116
|
-
);
|
|
117
|
-
var HandleDataDefine = v2.pipe(
|
|
118
|
-
v2.optional(
|
|
119
|
-
v2.object({
|
|
120
|
-
output: AnyHiddenList,
|
|
121
|
-
input: AnyHiddenList
|
|
122
|
-
})
|
|
123
|
-
),
|
|
124
|
-
HiddenAction
|
|
97
|
+
v.description("回答问题之前,会参考定义的用例格式进行回复,用于规范回答")
|
|
125
98
|
);
|
|
126
99
|
|
|
127
100
|
// packages/workflow/share/common/inline-template.define.ts
|
|
128
101
|
import { actions as actions3, disableWhen } from "@piying/view-angular-core";
|
|
129
102
|
import { map } from "rxjs";
|
|
130
|
-
import * as
|
|
131
|
-
var INLINE_Template =
|
|
132
|
-
|
|
133
|
-
enable:
|
|
103
|
+
import * as v2 from "valibot";
|
|
104
|
+
var INLINE_Template = v2.pipe(
|
|
105
|
+
v2.object({
|
|
106
|
+
enable: v2.optional(v2.boolean(), true),
|
|
134
107
|
// 经用条件
|
|
135
|
-
value:
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
108
|
+
value: v2.pipe(
|
|
109
|
+
v2.optional(v2.string(), "{{NODE.description}}"),
|
|
110
|
+
v2.title("模板"),
|
|
111
|
+
v2.description("允许使用变量:{{NODE.xxx}}(参考节点帮助)"),
|
|
139
112
|
actions3.wrappers.set(["tooltip", "label"]),
|
|
140
113
|
actions3.class.top("flex-1"),
|
|
141
114
|
disableWhen({
|
|
@@ -148,14 +121,14 @@ var INLINE_Template = v3.pipe(
|
|
|
148
121
|
actions3.wrappers.patch(["div"]),
|
|
149
122
|
actions3.class.top("flex gap-2")
|
|
150
123
|
);
|
|
151
|
-
var INLINE_Template2 =
|
|
152
|
-
|
|
153
|
-
enable:
|
|
124
|
+
var INLINE_Template2 = v2.pipe(
|
|
125
|
+
v2.object({
|
|
126
|
+
enable: v2.optional(v2.boolean(), false),
|
|
154
127
|
// 经用条件
|
|
155
|
-
value:
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
128
|
+
value: v2.pipe(
|
|
129
|
+
v2.optional(v2.string()),
|
|
130
|
+
v2.title("模板"),
|
|
131
|
+
v2.description("允许使用变量:{{ENTRY.xxx}}(参考节点帮助)"),
|
|
159
132
|
actions3.wrappers.set(["tooltip", "label"]),
|
|
160
133
|
actions3.class.top("flex-1"),
|
|
161
134
|
disableWhen({
|
|
@@ -173,53 +146,37 @@ var INLINE_Template2 = v3.pipe(
|
|
|
173
146
|
import {
|
|
174
147
|
asVirtualGroup,
|
|
175
148
|
actions as actions4,
|
|
176
|
-
setComponent
|
|
177
|
-
renderConfig as renderConfig3
|
|
149
|
+
setComponent
|
|
178
150
|
} from "@piying/view-angular-core";
|
|
179
|
-
import
|
|
180
|
-
import * as v4 from "valibot";
|
|
151
|
+
import * as v3 from "valibot";
|
|
181
152
|
function llmModelConfig(item) {
|
|
182
|
-
return
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
name:
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
153
|
+
return v3.pipe(
|
|
154
|
+
v3.intersect([
|
|
155
|
+
v3.pipe(
|
|
156
|
+
v3.intersect([
|
|
157
|
+
v3.pipe(
|
|
158
|
+
v3.object({
|
|
159
|
+
name: v3.pipe(
|
|
160
|
+
v3.optional(v3.string()),
|
|
161
|
+
v3.title("预定义模型配置"),
|
|
162
|
+
setComponent("select"),
|
|
192
163
|
actions4.inputs.patchAsync({
|
|
193
164
|
options: (field) => field.context.getModelList()
|
|
194
165
|
})
|
|
195
166
|
),
|
|
196
|
-
model:
|
|
167
|
+
model: v3.pipe(v3.optional(v3.string()), v3.title("模型")),
|
|
197
168
|
// todo 配置变化configuration层被去掉.这里应该更详细支持更多参数
|
|
198
|
-
baseURL:
|
|
169
|
+
baseURL: v3.pipe(v3.optional(v3.string()), v3.title("地址"))
|
|
199
170
|
}),
|
|
200
171
|
asColumn()
|
|
201
172
|
)
|
|
202
173
|
]),
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
environments: ["display", "config"],
|
|
206
|
-
actions: [asVirtualGroup()]
|
|
207
|
-
})
|
|
174
|
+
v3.title(item?.label ?? "对话模型"),
|
|
175
|
+
asVirtualGroup()
|
|
208
176
|
)
|
|
209
177
|
]),
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
actions: [asVirtualGroup()]
|
|
213
|
-
}),
|
|
214
|
-
condition3({
|
|
215
|
-
environments: ["display"],
|
|
216
|
-
actions: [
|
|
217
|
-
renderConfig3({
|
|
218
|
-
hidden: true
|
|
219
|
-
})
|
|
220
|
-
]
|
|
221
|
-
}),
|
|
222
|
-
setComponent2("accordion")
|
|
178
|
+
asVirtualGroup(),
|
|
179
|
+
setComponent("accordion")
|
|
223
180
|
);
|
|
224
181
|
}
|
|
225
182
|
|
|
@@ -228,7 +185,7 @@ var DEFAULT_CHAT_SCHEMA_KEY = `[JsonSchema]`;
|
|
|
228
185
|
var RUNNER_ORIGIN_OUTPUT_KEY = `[Origin]`;
|
|
229
186
|
|
|
230
187
|
// packages/workflow/share/type2.ts
|
|
231
|
-
import { v4
|
|
188
|
+
import { v4 } from "uuid";
|
|
232
189
|
import * as v6 from "valibot";
|
|
233
190
|
var extraData = v6.looseObject({
|
|
234
191
|
references: v6.optional(v6.array(v6.custom(Boolean)))
|
|
@@ -236,7 +193,7 @@ var extraData = v6.looseObject({
|
|
|
236
193
|
var baseDataDefine = v6.object({
|
|
237
194
|
node: v6.object({ type: v6.string(), id: v6.string() }),
|
|
238
195
|
nodeResult: v6.pipe(v6.optional(v6.boolean(), false)),
|
|
239
|
-
dataId: v6.optional(v6.string(), () =>
|
|
196
|
+
dataId: v6.optional(v6.string(), () => v4()),
|
|
240
197
|
extra: v6.optional(extraData)
|
|
241
198
|
});
|
|
242
199
|
var CommonDataDefine = v6.object({
|
|
@@ -290,7 +247,6 @@ export {
|
|
|
290
247
|
DEFAULT_CHAT_SCHEMA_KEY,
|
|
291
248
|
DEFAULT_INPUT_KEY,
|
|
292
249
|
EXAMPLES_DEFINE,
|
|
293
|
-
HandleDataDefine,
|
|
294
250
|
HelpObj,
|
|
295
251
|
INLINE_Template,
|
|
296
252
|
INLINE_Template2,
|
package/share/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../packages/workflow/share/const.ts", "../../../packages/workflow/share/handle-node.ts", "../../../packages/workflow/share/util.ts", "../../../packages/workflow/share/workflow.const.ts", "../../../packages/workflow/share/common/examples.define.ts", "../../../packages/workflow/share/util/layout.ts", "../../../packages/workflow/share/common/
|
|
4
|
-
"sourcesContent": ["export const DEFAULT_INPUT_KEY = `[INPUT]`;\nexport const HelpObj = {\n templateVarLine: `- 变量定义格式: {{xx}},{{xx.yy}}`,\n pathTodoLine: `- **TODO** 接收传入路径而不是指定`,\n};\n", "import { ChatInput2, ChatInputType } from './type';\nimport { WorkflowNodeType } from './workflow.const';\nimport type { Node, ReactFlowJsonObject } from '@xyflow/react';\n\nexport interface HandleNode {\n id: string;\n /** 真正赋值使用 */\n value: string;\n /** 应该应用于tooltip显示,不应该被其他显示 */\n label: string;\n type?: 'connect';\n\n inputType?: ChatInputType;\n /** 是否可选,用于某些不用传入的参数 */\n optional?: boolean;\n}\n/** 将handle节点全部拍平 */\nexport function flatFilterHandleList(list: HandleNode[][] | undefined) {\n if (!list) {\n return [];\n }\n return list.flat().filter(Boolean) as HandleNode[];\n}\n/** 继承 handleNode */\nexport type ResolvedInputNode = Omit<HandleNode, 'label'> & {\n nodeId?: string;\n outputName?: string;\n};\nexport interface WorkflowNodeData {\n value?: any;\n\n handle?: {\n input: HandleNode[][];\n output: HandleNode[][];\n };\n config?: Record<string, any>;\n title?: string;\n outputName?: string;\n /** 在工作流中禁止使用 @internal */\n excludeUsage?: boolean;\n [name: string]: any;\n}\n/** 工作流定义 */\nexport interface WorkflowData {\n flow: ReactFlowJsonObject<Node<WorkflowNodeData>>;\n version: number;\n}\nexport type RawWorkflowNode = Omit<Node<WorkflowNodeData>, 'position'>;\nexport interface ParsedNode {\n id: string;\n type: WorkflowNodeType;\n // todo 因为加上Omit会导致类型不识别\n data: WorkflowNodeData;\n /** 所有输入是都是需要节点连接的,如果没有节点连接会酌情处理 handleinput过来的 */\n inputs: ResolvedInputNode[];\n /** 可能是多出口 */\n outputs: HandleNode[];\n subFlowList?: { key: any; flow: ResolvedWorkflow; startId?: string }[];\n}\nexport interface ResolvedWorkflow {\n nodes: Record<string, ParsedNode>;\n /** 出口 */\n end: string;\n inputList: ChatInput2[];\n}\n", "import { v5 } from 'uuid';\nconst UUID_NS = '404cfae8-94e7-41a6-acec-1037dd1fdaad';\nexport function generateHandle(value: string, label = value) {\n return { id: v5(value, UUID_NS), label: label, value: value };\n}\n", "export const enum WorkflowNodeType {\n 'iteration' = 'iteration',\n 'iterationStart' = 'iteration-start',\n 'inputParams' = 'input-params',\n 'serialize' = 'serialize',\n parameters = 'parameters',\n inlineInputItem = 'inlineInputItem',\n}\n", "import {\n actions,\n condition,\n renderConfig,\n} from '@piying/view-angular-core';\nimport * as v from 'valibot';\nimport { asColumn } from '../util/layout';\n\nexport const EXAMPLES_DEFINE = v.pipe(\n v.optional(\n v.array(\n v.pipe(\n v.object({\n input: v.pipe(\n v.object({\n format: v.pipe(\n v.optional(v.boolean(), false),\n v.description(\n '选中后会尝试使用yaml解析为对象,再序列化为对应的响应类型',\n ),\n actions.wrappers.set(['tooltip']),\n ),\n value: v.pipe(v.string(), v.title('问题'), actions.class.top('flex-1')),\n }),\n // todo 待修复\n actions.class.top('flex gap-2 items-center'),\n ),\n\n output: v.pipe(\n v.object({\n format: v.pipe(\n v.optional(v.boolean(), false),\n v.description('是否需要格式化'),\n actions.wrappers.set(['tooltip']),\n ),\n value: v.pipe(v.string(), v.title('回答'), actions.class.top('flex-1')),\n }),\n actions.class.top('flex gap-2 items-center'),\n ),\n }),\n asColumn(),\n ),\n ),\n [],\n ),\n v.title('用例'),\n v.description('回答问题之前,会参考定义的用例格式进行回复,用于规范回答'),\n condition({\n environments: ['display'],\n actions: [\n renderConfig({\n hidden: true,\n }),\n ],\n }),\n);\n", "import { actions } from '@piying/view-angular-core';\n\nexport function asRow<TInput>(count?: number) {\n return actions.wrappers.patch<TInput>([\n {\n type: 'div',\n attributes: {\n class:\n typeof count === 'number'\n ? `grid gap-2 grid-cols-${count}`\n : 'flex gap-2 *:flex-1 items-center',\n },\n },\n ]);\n}\nexport function asColumn<TInput>() {\n return actions.wrappers.patch<TInput>([\n {\n type: 'div',\n attributes: {\n class: 'grid gap-2',\n },\n },\n ]);\n}\n", "import * as v from 'valibot';\nimport { renderConfig, setComponent } from '@piying/view-angular-core';\nimport { condition } from '@piying/valibot-visit';\nconst HiddenAction = condition<any>({\n environments: ['display', 'default'],\n actions: [setComponent(''), renderConfig({ hidden: true })],\n});\nconst AnyHiddenList = v.pipe(\n v.array(v.pipe(v.optional(v.any()), HiddenAction)),\n setComponent(''),\n renderConfig({ hidden: true }),\n);\nexport const HandleDataDefine = v.pipe(\n v.optional(\n v.object({\n output: AnyHiddenList,\n input: AnyHiddenList,\n }),\n ),\n HiddenAction,\n);\n", "import { actions, disableWhen } from '@piying/view-angular-core';\nimport { map } from 'rxjs';\nimport * as v from 'valibot';\n\nexport const INLINE_Template = v.pipe(\n v.object({\n enable: v.optional(v.boolean(), true),\n // 经用条件\n value: v.pipe(\n v.optional(v.string(), '{{NODE.description}}'),\n v.title('模板'),\n v.description('允许使用变量:{{NODE.xxx}}(参考节点帮助)'),\n actions.wrappers.set(['tooltip', 'label']),\n actions.class.top('flex-1'),\n\n disableWhen({\n listen: (fn) =>\n fn({\n list: [['..', 'enable']],\n }).pipe(map(({ list }) => !list[0])),\n }),\n ),\n }),\n actions.wrappers.patch(['div']),\n actions.class.top('flex gap-2'),\n);\nexport const INLINE_Template2 = v.pipe(\n v.object({\n enable: v.optional(v.boolean(), false),\n // 经用条件\n value: v.pipe(\n v.optional(v.string()),\n v.title('模板'),\n v.description('允许使用变量:{{ENTRY.xxx}}(参考节点帮助)'),\n actions.wrappers.set(['tooltip', 'label']),\n\n actions.class.top('flex-1'),\n\n disableWhen({\n listen: (fn) =>\n fn({\n list: [['..', 'enable']],\n }).pipe(map(({ list }) => !list[0])),\n }),\n ),\n }),\n actions.wrappers.patch(['div']),\n actions.class.top('flex gap-2 items-center'),\n);\n", "import {\n asVirtualGroup,\n actions,\n setComponent,\n renderConfig,\n} from '@piying/view-angular-core';\nimport { condition } from '@piying/valibot-visit';\nimport * as v from 'valibot';\nimport { asColumn } from '../util/layout';\nexport function llmModelConfig(item?: { label: string }) {\n return v.pipe(\n v.intersect([\n v.pipe(\n v.intersect([\n v.pipe(\n v.object({\n name: v.pipe(\n v.optional(v.string()),\n v.title('预定义模型配置'),\n setComponent('select'),\n actions.inputs.patchAsync({\n options: (field) => field.context!.getModelList(),\n }),\n ),\n model: v.pipe(v.optional(v.string()), v.title('模型')),\n // todo 配置变化configuration层被去掉.这里应该更详细支持更多参数\n\n baseURL: v.pipe(v.optional(v.string()), v.title('地址')),\n }),\n asColumn(),\n ),\n ]),\n v.title(item?.label ?? '对话模型'),\n condition({\n environments: ['display', 'config'],\n actions: [asVirtualGroup()],\n }),\n ),\n ]),\n condition({\n environments: ['display', 'config'],\n actions: [asVirtualGroup()],\n }),\n condition({\n environments: ['display'],\n actions: [\n renderConfig({\n hidden: true,\n }),\n ],\n }),\n setComponent('accordion'),\n );\n}\n\nexport type ModelInputConfig = v.InferOutput<ReturnType<typeof llmModelConfig>>;\n", "export const DEFAULT_CHAT_SCHEMA_KEY = `[JsonSchema]`;\nexport const RUNNER_ORIGIN_OUTPUT_KEY = `[Origin]`;\n", "import { v4 } from 'uuid';\nimport type { ChatMessageListOutputType } from '@shenghuabi/openai';\nimport type { ChatModelOptions } from '@shenghuabi/openai';\nimport * as v from 'valibot';\nimport { ChatMetadata } from './type';\nexport type WorkflowRunnerInputs = Map<\n string | symbol,\n { value: any; extra?: any }\n>;\nexport type WorkflowRunnerEnvironmentParams = Record<string, any>;\nexport type WorkflowRunnerInputsWithContext = {\n input: WorkflowRunnerInputs;\n environmentParameters?: WorkflowRunnerEnvironmentParams;\n modelOptions?: ChatModelOptions;\n};\n\nexport interface WorkflowExtraMetadata {\n metadata: ChatMetadata;\n}\nconst extraData = v.looseObject({\n references: v.optional(v.array(v.custom<ChatMetadata>(Boolean))),\n});\nconst baseDataDefine = v.object({\n node: v.object({ type: v.string(), id: v.string() }),\n nodeResult: v.pipe(v.optional(v.boolean(), false)),\n dataId: v.optional(v.string(), () => v4()),\n extra: v.optional(extraData),\n});\nexport const CommonDataDefine = v.object({\n ...baseDataDefine.entries,\n value: v.any(),\n});\nexport type CommonDataType = v.InferOutput<typeof CommonDataDefine>;\n\nexport const LLMDataDefine = v.object({\n ...baseDataDefine.entries,\n type: v.optional(v.literal('chat-stream'), 'chat-stream'),\n // 用来进行普通查询\n value: v.string(),\n extra: v.object({\n ...extraData.entries,\n content: v.string(),\n thinkContent: v.optional(v.string()),\n isThinking: v.optional(v.boolean()),\n delta: v.string(),\n historyList: v.custom<ChatMessageListOutputType>(Boolean),\n }),\n});\nexport type LLMWorkflowData = v.InferOutput<typeof LLMDataDefine>;\nexport function createLLMData(data: v.InferInput<typeof LLMDataDefine>) {\n return v.parse(LLMDataDefine, data);\n}\nexport function createResultData(data: v.InferInput<typeof CommonDataDefine>) {\n const result = v.parse(CommonDataDefine, data);\n result.nodeResult = true;\n return result;\n}\nexport type WorkflowStreamData =\n | v.InferOutput<typeof CommonDataDefine>\n | v.InferOutput<typeof LLMDataDefine>;\n\nexport function isChatStream(\n data: WorkflowStreamData,\n): data is LLMWorkflowData {\n return (\n !!data.extra && 'content' in data.extra && 'thinkContent' in data.extra\n );\n}\n", "import { Observer } from './type';\nimport { createLLMData, WorkflowStreamData } from './type2';\n\nexport class WorkflowEmitter {\n #ob?: Observer<WorkflowStreamData, any>;\n setObserver(ob: Observer<any, any>) {\n this.#ob = ob;\n }\n getObserver() {\n return this.#ob;\n }\n\n createLLMData = createLLMData;\n send(data: WorkflowStreamData) {\n if (this.#ob) {\n this.#ob.next(data);\n }\n }\n}\n"],
|
|
5
|
-
"mappings": ";AAAO,IAAM,oBAAoB;AAC1B,IAAM,UAAU;AAAA,EACrB,iBAAiB;AAAA,EACjB,cAAc;AAChB;;;ACaO,SAAS,qBAAqB,MAAkC;AACrE,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;AAAA,EACV;AACA,SAAO,KAAK,KAAK,EAAE,OAAO,OAAO;AACnC;;;ACtBA,SAAS,UAAU;AACnB,IAAM,UAAU;AACT,SAAS,eAAe,OAAe,QAAQ,OAAO;AAC3D,SAAO,EAAE,IAAI,GAAG,OAAO,OAAO,GAAG,OAAc,MAAa;AAC9D;;;ACJO,IAAW,mBAAX,kBAAWA,sBAAX;AACL,EAAAA,kBAAA,eAAc;AACd,EAAAA,kBAAA,oBAAmB;AACnB,EAAAA,kBAAA,iBAAgB;AAChB,EAAAA,kBAAA,eAAc;AACd,EAAAA,kBAAA,gBAAa;AACb,EAAAA,kBAAA,qBAAkB;AANF,SAAAA;AAAA,GAAA;;;ACAlB
|
|
6
|
-
"names": ["WorkflowNodeType", "actions", "actions", "
|
|
3
|
+
"sources": ["../../../packages/workflow/share/const.ts", "../../../packages/workflow/share/handle-node.ts", "../../../packages/workflow/share/util.ts", "../../../packages/workflow/share/workflow.const.ts", "../../../packages/workflow/share/common/examples.define.ts", "../../../packages/workflow/share/util/layout.ts", "../../../packages/workflow/share/common/inline-template.define.ts", "../../../packages/workflow/share/common/llm.define.ts", "../../../packages/workflow/share/common/const.ts", "../../../packages/workflow/share/type2.ts", "../../../packages/workflow/share/workflow.emit.ts"],
|
|
4
|
+
"sourcesContent": ["export const DEFAULT_INPUT_KEY = `[INPUT]`;\nexport const HelpObj = {\n templateVarLine: `- 变量定义格式: {{xx}},{{xx.yy}}`,\n pathTodoLine: `- **TODO** 接收传入路径而不是指定`,\n};\n", "import { ChatInput2, ChatInputType } from './type';\nimport { WorkflowNodeType } from './workflow.const';\nimport type { Node, ReactFlowJsonObject } from '@xyflow/react';\n\nexport interface HandleNode {\n id: string;\n /** 真正赋值使用 */\n value: string;\n /** 应该应用于tooltip显示,不应该被其他显示 */\n label: string;\n type?: 'connect';\n\n inputType?: ChatInputType;\n /** 是否可选,用于某些不用传入的参数 */\n optional?: boolean;\n}\n/** 将handle节点全部拍平 */\nexport function flatFilterHandleList(list: HandleNode[][] | undefined) {\n if (!list) {\n return [];\n }\n return list.flat().filter(Boolean) as HandleNode[];\n}\n/** 继承 handleNode */\nexport type ResolvedInputNode = Omit<HandleNode, 'label'> & {\n nodeId?: string;\n outputName?: string;\n};\nexport interface WorkflowNodeData {\n value?: any;\n\n handle?: {\n input: HandleNode[][];\n output: HandleNode[][];\n };\n config?: Record<string, any>;\n title?: string;\n outputName?: string;\n /** 在工作流中禁止使用 @internal */\n excludeUsage?: boolean;\n [name: string]: any;\n}\n/** 工作流定义 */\nexport interface WorkflowData {\n flow: ReactFlowJsonObject<Node<WorkflowNodeData>>;\n version: number;\n}\nexport type RawWorkflowNode = Omit<Node<WorkflowNodeData>, 'position'>;\nexport interface ParsedNode {\n id: string;\n type: WorkflowNodeType;\n // todo 因为加上Omit会导致类型不识别\n data: WorkflowNodeData;\n /** 所有输入是都是需要节点连接的,如果没有节点连接会酌情处理 handleinput过来的 */\n inputs: ResolvedInputNode[];\n /** 可能是多出口 */\n outputs: HandleNode[];\n subFlowList?: { key: any; flow: ResolvedWorkflow; startId?: string }[];\n}\nexport interface ResolvedWorkflow {\n nodes: Record<string, ParsedNode>;\n /** 出口 */\n end: string;\n inputList: ChatInput2[];\n}\n", "import { v5 } from 'uuid';\nconst UUID_NS = '404cfae8-94e7-41a6-acec-1037dd1fdaad';\nexport function generateHandle(value: string, label = value) {\n return { id: v5(value, UUID_NS), label: label, value: value };\n}\n", "export const enum WorkflowNodeType {\n 'iteration' = 'iteration',\n 'iterationStart' = 'iteration-start',\n 'inputParams' = 'input-params',\n 'serialize' = 'serialize',\n parameters = 'parameters',\n inlineInputItem = 'inlineInputItem',\n}\n", "import { actions } from '@piying/view-angular-core';\nimport * as v from 'valibot';\nimport { asColumn } from '../util/layout';\n\nexport const EXAMPLES_DEFINE = v.pipe(\n v.optional(\n v.array(\n v.pipe(\n v.object({\n input: v.pipe(\n v.object({\n format: v.pipe(\n v.optional(v.boolean(), false),\n v.description(\n '选中后会尝试使用yaml解析为对象,再序列化为对应的响应类型',\n ),\n actions.wrappers.set(['tooltip']),\n ),\n value: v.pipe(\n v.string(),\n v.title('问题'),\n actions.class.top('flex-1'),\n ),\n }),\n // todo 待修复\n actions.class.top('flex gap-2 items-center'),\n ),\n\n output: v.pipe(\n v.object({\n format: v.pipe(\n v.optional(v.boolean(), false),\n v.description('是否需要格式化'),\n actions.wrappers.set(['tooltip']),\n ),\n value: v.pipe(\n v.string(),\n v.title('回答'),\n actions.class.top('flex-1'),\n ),\n }),\n actions.class.top('flex gap-2 items-center'),\n ),\n }),\n asColumn(),\n ),\n ),\n [],\n ),\n v.title('用例'),\n v.description('回答问题之前,会参考定义的用例格式进行回复,用于规范回答'),\n);\n", "import { actions } from '@piying/view-angular-core';\n\nexport function asRow<TInput>(count?: number) {\n return actions.wrappers.patch<TInput>([\n {\n type: 'div',\n attributes: {\n class:\n typeof count === 'number'\n ? `grid gap-2 grid-cols-${count}`\n : 'flex gap-2 *:flex-1 items-center',\n },\n },\n ]);\n}\nexport function asColumn<TInput>() {\n return actions.wrappers.patch<TInput>([\n {\n type: 'div',\n attributes: {\n class: 'grid gap-2',\n },\n },\n ]);\n}\n", "import { actions, disableWhen } from '@piying/view-angular-core';\nimport { map } from 'rxjs';\nimport * as v from 'valibot';\n\nexport const INLINE_Template = v.pipe(\n v.object({\n enable: v.optional(v.boolean(), true),\n // 经用条件\n value: v.pipe(\n v.optional(v.string(), '{{NODE.description}}'),\n v.title('模板'),\n v.description('允许使用变量:{{NODE.xxx}}(参考节点帮助)'),\n actions.wrappers.set(['tooltip', 'label']),\n actions.class.top('flex-1'),\n\n disableWhen({\n listen: (fn) =>\n fn({\n list: [['..', 'enable']],\n }).pipe(map(({ list }) => !list[0])),\n }),\n ),\n }),\n actions.wrappers.patch(['div']),\n actions.class.top('flex gap-2'),\n);\nexport const INLINE_Template2 = v.pipe(\n v.object({\n enable: v.optional(v.boolean(), false),\n // 经用条件\n value: v.pipe(\n v.optional(v.string()),\n v.title('模板'),\n v.description('允许使用变量:{{ENTRY.xxx}}(参考节点帮助)'),\n actions.wrappers.set(['tooltip', 'label']),\n\n actions.class.top('flex-1'),\n\n disableWhen({\n listen: (fn) =>\n fn({\n list: [['..', 'enable']],\n }).pipe(map(({ list }) => !list[0])),\n }),\n ),\n }),\n actions.wrappers.patch(['div']),\n actions.class.top('flex gap-2 items-center'),\n);\n", "import {\n asVirtualGroup,\n actions,\n setComponent,\n} from '@piying/view-angular-core';\nimport * as v from 'valibot';\nimport { asColumn } from '../util/layout';\nexport function llmModelConfig(item?: { label: string }) {\n return v.pipe(\n v.intersect([\n v.pipe(\n v.intersect([\n v.pipe(\n v.object({\n name: v.pipe(\n v.optional(v.string()),\n v.title('预定义模型配置'),\n setComponent('select'),\n actions.inputs.patchAsync({\n options: (field) => field.context!.getModelList(),\n }),\n ),\n model: v.pipe(v.optional(v.string()), v.title('模型')),\n // todo 配置变化configuration层被去掉.这里应该更详细支持更多参数\n\n baseURL: v.pipe(v.optional(v.string()), v.title('地址')),\n }),\n asColumn(),\n ),\n ]),\n v.title(item?.label ?? '对话模型'),\n asVirtualGroup(),\n ),\n ]),\n asVirtualGroup(),\n setComponent('accordion'),\n );\n}\n\nexport type ModelInputConfig = v.InferOutput<ReturnType<typeof llmModelConfig>>;\n", "export const DEFAULT_CHAT_SCHEMA_KEY = `[JsonSchema]`;\nexport const RUNNER_ORIGIN_OUTPUT_KEY = `[Origin]`;\n", "import { v4 } from 'uuid';\nimport type { ChatMessageListOutputType } from '@shenghuabi/openai';\nimport type { ChatModelOptions } from '@shenghuabi/openai';\nimport * as v from 'valibot';\nimport { ChatMetadata } from './type';\nexport type WorkflowRunnerInputs = Map<\n string | symbol,\n { value: any; extra?: any }\n>;\nexport type WorkflowRunnerEnvironmentParams = Record<string, any>;\nexport type WorkflowRunnerInputsWithContext = {\n input: WorkflowRunnerInputs;\n environmentParameters?: WorkflowRunnerEnvironmentParams;\n modelOptions?: ChatModelOptions;\n};\n\nexport interface WorkflowExtraMetadata {\n metadata: ChatMetadata;\n}\nconst extraData = v.looseObject({\n references: v.optional(v.array(v.custom<ChatMetadata>(Boolean))),\n});\nconst baseDataDefine = v.object({\n node: v.object({ type: v.string(), id: v.string() }),\n nodeResult: v.pipe(v.optional(v.boolean(), false)),\n dataId: v.optional(v.string(), () => v4()),\n extra: v.optional(extraData),\n});\nexport const CommonDataDefine = v.object({\n ...baseDataDefine.entries,\n value: v.any(),\n});\nexport type CommonDataType = v.InferOutput<typeof CommonDataDefine>;\n\nexport const LLMDataDefine = v.object({\n ...baseDataDefine.entries,\n type: v.optional(v.literal('chat-stream'), 'chat-stream'),\n // 用来进行普通查询\n value: v.string(),\n extra: v.object({\n ...extraData.entries,\n content: v.string(),\n thinkContent: v.optional(v.string()),\n isThinking: v.optional(v.boolean()),\n delta: v.string(),\n historyList: v.custom<ChatMessageListOutputType>(Boolean),\n }),\n});\nexport type LLMWorkflowData = v.InferOutput<typeof LLMDataDefine>;\nexport function createLLMData(data: v.InferInput<typeof LLMDataDefine>) {\n return v.parse(LLMDataDefine, data);\n}\nexport function createResultData(data: v.InferInput<typeof CommonDataDefine>) {\n const result = v.parse(CommonDataDefine, data);\n result.nodeResult = true;\n return result;\n}\nexport type WorkflowStreamData =\n | v.InferOutput<typeof CommonDataDefine>\n | v.InferOutput<typeof LLMDataDefine>;\n\nexport function isChatStream(\n data: WorkflowStreamData,\n): data is LLMWorkflowData {\n return (\n !!data.extra && 'content' in data.extra && 'thinkContent' in data.extra\n );\n}\n", "import { Observer } from './type';\nimport { createLLMData, WorkflowStreamData } from './type2';\n\nexport class WorkflowEmitter {\n #ob?: Observer<WorkflowStreamData, any>;\n setObserver(ob: Observer<any, any>) {\n this.#ob = ob;\n }\n getObserver() {\n return this.#ob;\n }\n\n createLLMData = createLLMData;\n send(data: WorkflowStreamData) {\n if (this.#ob) {\n this.#ob.next(data);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["WorkflowNodeType", "actions", "actions", "actions", "v", "actions", "v", "actions", "v"]
|
|
7
7
|
}
|
package/webview/index.js
CHANGED
|
@@ -77,7 +77,11 @@ var EXAMPLES_DEFINE = v.pipe(
|
|
|
77
77
|
),
|
|
78
78
|
import_view_angular_core2.actions.wrappers.set(["tooltip"])
|
|
79
79
|
),
|
|
80
|
-
value: v.pipe(
|
|
80
|
+
value: v.pipe(
|
|
81
|
+
v.string(),
|
|
82
|
+
v.title("问题"),
|
|
83
|
+
import_view_angular_core2.actions.class.top("flex-1")
|
|
84
|
+
)
|
|
81
85
|
}),
|
|
82
86
|
// todo 待修复
|
|
83
87
|
import_view_angular_core2.actions.class.top("flex gap-2 items-center")
|
|
@@ -89,7 +93,11 @@ var EXAMPLES_DEFINE = v.pipe(
|
|
|
89
93
|
v.description("是否需要格式化"),
|
|
90
94
|
import_view_angular_core2.actions.wrappers.set(["tooltip"])
|
|
91
95
|
),
|
|
92
|
-
value: v.pipe(
|
|
96
|
+
value: v.pipe(
|
|
97
|
+
v.string(),
|
|
98
|
+
v.title("回答"),
|
|
99
|
+
import_view_angular_core2.actions.class.top("flex-1")
|
|
100
|
+
)
|
|
93
101
|
}),
|
|
94
102
|
import_view_angular_core2.actions.class.top("flex gap-2 items-center")
|
|
95
103
|
)
|
|
@@ -100,20 +108,11 @@ var EXAMPLES_DEFINE = v.pipe(
|
|
|
100
108
|
[]
|
|
101
109
|
),
|
|
102
110
|
v.title("用例"),
|
|
103
|
-
v.description("回答问题之前,会参考定义的用例格式进行回复,用于规范回答")
|
|
104
|
-
(0, import_view_angular_core2.condition)({
|
|
105
|
-
environments: ["display"],
|
|
106
|
-
actions: [
|
|
107
|
-
(0, import_view_angular_core2.renderConfig)({
|
|
108
|
-
hidden: true
|
|
109
|
-
})
|
|
110
|
-
]
|
|
111
|
-
})
|
|
111
|
+
v.description("回答问题之前,会参考定义的用例格式进行回复,用于规范回答")
|
|
112
112
|
);
|
|
113
113
|
|
|
114
114
|
// packages/workflow/share/common/llm.define.ts
|
|
115
115
|
var import_view_angular_core3 = require("@piying/view-angular-core");
|
|
116
|
-
var import_valibot_visit = require("@piying/valibot-visit");
|
|
117
116
|
var v2 = __toESM(require("valibot"), 1);
|
|
118
117
|
function llmModelConfig(item) {
|
|
119
118
|
return v2.pipe(
|
|
@@ -138,24 +137,10 @@ function llmModelConfig(item) {
|
|
|
138
137
|
)
|
|
139
138
|
]),
|
|
140
139
|
v2.title(item?.label ?? "对话模型"),
|
|
141
|
-
(0,
|
|
142
|
-
environments: ["display", "config"],
|
|
143
|
-
actions: [(0, import_view_angular_core3.asVirtualGroup)()]
|
|
144
|
-
})
|
|
140
|
+
(0, import_view_angular_core3.asVirtualGroup)()
|
|
145
141
|
)
|
|
146
142
|
]),
|
|
147
|
-
(0,
|
|
148
|
-
environments: ["display", "config"],
|
|
149
|
-
actions: [(0, import_view_angular_core3.asVirtualGroup)()]
|
|
150
|
-
}),
|
|
151
|
-
(0, import_valibot_visit.condition)({
|
|
152
|
-
environments: ["display"],
|
|
153
|
-
actions: [
|
|
154
|
-
(0, import_view_angular_core3.renderConfig)({
|
|
155
|
-
hidden: true
|
|
156
|
-
})
|
|
157
|
-
]
|
|
158
|
-
}),
|
|
143
|
+
(0, import_view_angular_core3.asVirtualGroup)(),
|
|
159
144
|
(0, import_view_angular_core3.setComponent)("accordion")
|
|
160
145
|
);
|
|
161
146
|
}
|
|
@@ -241,42 +226,36 @@ var CHAT_NODE_DEFINE = v3.looseObject({
|
|
|
241
226
|
),
|
|
242
227
|
value: v3.pipe(
|
|
243
228
|
v3.custom(Boolean),
|
|
244
|
-
(0, import_view_angular_core4.setComponent)(""),
|
|
245
|
-
(0, import_view_angular_core4.
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
inputType: `image`
|
|
275
|
-
}));
|
|
276
|
-
field.context.changeHandleData(field, "input", 3, list ?? []);
|
|
277
|
-
});
|
|
278
|
-
})
|
|
279
|
-
]
|
|
229
|
+
(0, import_view_angular_core4.setComponent)("prompt-list"),
|
|
230
|
+
(0, import_view_angular_core4.valueChange)((fn) => {
|
|
231
|
+
fn({ list: [void 0] }).subscribe(({ list: [value], field }) => {
|
|
232
|
+
if (!Array.isArray(value)) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const inputValue = value ?? [];
|
|
236
|
+
field.context.parseTemplate(
|
|
237
|
+
inputValue.flatMap(
|
|
238
|
+
(item) => item.content.map(
|
|
239
|
+
(item2) => item2.type === "text" ? item2.text : ""
|
|
240
|
+
)
|
|
241
|
+
)
|
|
242
|
+
).then((value2) => {
|
|
243
|
+
if (!value2) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
field.context.changeHandleData(field, "input", 1, value2);
|
|
247
|
+
});
|
|
248
|
+
const list = inputValue.flatMap(
|
|
249
|
+
(item) => item.content.map(
|
|
250
|
+
(item2) => item2.type === "image_url" ? item2.image_url.url : void 0
|
|
251
|
+
)
|
|
252
|
+
).filter(Boolean).map((item) => ({
|
|
253
|
+
value: `${item}`,
|
|
254
|
+
label: `${item}`,
|
|
255
|
+
inputType: `image`
|
|
256
|
+
}));
|
|
257
|
+
field.context.changeHandleData(field, "input", 3, list ?? []);
|
|
258
|
+
});
|
|
280
259
|
})
|
|
281
260
|
)
|
|
282
261
|
})
|
|
@@ -370,25 +349,19 @@ var TEXT_NODE_DEFINE = v4.looseObject({
|
|
|
370
349
|
data: v4.looseObject({
|
|
371
350
|
value: v4.pipe(
|
|
372
351
|
v4.string(),
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
(
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
}
|
|
387
|
-
field.context.changeHandleData(field, "input", 1, value2);
|
|
388
|
-
});
|
|
389
|
-
});
|
|
390
|
-
})
|
|
391
|
-
]
|
|
352
|
+
import_view_angular_core5.actions.class.top("nodrag"),
|
|
353
|
+
(0, import_view_angular_core5.valueChange)((fn) => {
|
|
354
|
+
fn({ list: [void 0] }).subscribe(({ list: [value], field }) => {
|
|
355
|
+
if (typeof value !== "string") {
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
field.context.parseTemplate([value]).then((value2) => {
|
|
359
|
+
if (!value2) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
field.context.changeHandleData(field, "input", 1, value2);
|
|
363
|
+
});
|
|
364
|
+
});
|
|
392
365
|
})
|
|
393
366
|
)
|
|
394
367
|
})
|
package/webview/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../packages/workflow/webview/index.ts", "../../../packages/workflow/inline/node/index.browser.ts", "../../../packages/workflow/inline/node/chat/chat.node.define.ts", "../../../packages/workflow/share/common/examples.define.ts", "../../../packages/workflow/share/util/layout.ts", "../../../packages/workflow/share/common/llm.define.ts", "../../../packages/workflow/share/common/const.ts", "../../../packages/workflow/share/const.ts", "../../../packages/workflow/inline/node/chat/common.ts", "../../../packages/workflow/inline/node/chat/util.ts", "../../../packages/workflow/inline/node/chat/webview/index.ts", "../../../packages/workflow/inline/node/text/common.ts", "../../../packages/workflow/inline/node/text/text.node.define.ts", "../../../packages/workflow/inline/node/text/webview/index.ts"],
|
|
4
|
-
"sourcesContent": ["export * as WebviewNodeMap from '../inline/node/index.browser';\n", "export * from './chat/webview';\nexport * from './text/webview';\n", "import * as v from 'valibot';\n\nimport {\n actions,\n condition,\n setComponent,\n valueChange,\n} from '@piying/view-angular-core';\nimport { ChatMessageListInputType } from '@shenghuabi/openai';\nimport { EXAMPLES_DEFINE, llmModelConfig } from '../../../share/common';\nexport const ResponseList = ['json', 'markdown', 'yaml'] as const;\nexport const ResponseFormat = ['text', 'json_object', 'json_schema'] as const;\nexport type ResponseType = (typeof ResponseList)[number];\nexport const CHAT_NODE_DEFINE = v.looseObject({\n data: v.looseObject({\n config: v.pipe(\n v.object({\n llm: v.optional(llmModelConfig()),\n /** 处理时解析 */\n responseFormat: v.pipe(\n v.optional(v.picklist(ResponseFormat)),\n actions.inputs.patch({\n options: [\n // 有输入json时\n {\n label: '自动',\n value: undefined,\n description: `传入JsonSchema时为[json_schema],否则为[text]`,\n },\n { label: '文本', value: 'text' },\n {\n label: 'JSON对象',\n value: 'json_object',\n description: '只限制返回类型为JSON对象,不对字段进行限制',\n },\n {\n label: 'JSON格式定义',\n value: 'json_schema',\n description:\n '限制返回类型为JSON对象,同时限制字段,不建议手动指定,传入JsonSchema后自动启用',\n },\n ],\n }),\n v.title('响应格式'),\n ),\n /** 处理后解析 */\n parseBy: v.pipe(\n v.optional(v.picklist(ResponseList)),\n actions.inputs.patch({\n options: [\n { label: '直接返回', value: undefined },\n {\n label: 'json',\n value: 'json',\n description: `将返回的json代码块内容或原始内容解析为对象`,\n },\n {\n label: 'markdown',\n value: 'markdown',\n description: `[需要提示词约束]将返回其中的markdown代码块内容或原始内容`,\n },\n {\n label: 'yaml',\n value: 'yaml',\n description: `[需要提示词约束]将返回的yaml代码块内容或原始内容解析为对象`,\n },\n ],\n }),\n v.title('返回解析'),\n valueChange((fn) => {\n fn({ list: [['..', 'responseFormat']] }).subscribe(\n ({ list: [value], field }) => {\n if ((value ?? '').startsWith('json')) {\n if (!field.form.control!.value) {\n field.form.control!.updateValue('json');\n }\n }\n },\n );\n }),\n ),\n examples: EXAMPLES_DEFINE,\n }),\n actions.wrappers.patch(['div']),\n actions.class.top('grid auto-rows-auto gap-2'),\n ),\n value: v.pipe(\n v.custom<ChatMessageListInputType>(Boolean),\n setComponent(''),\n condition({\n environments: ['display'],\n actions: [\n setComponent('prompt-list'),\n valueChange((fn) => {\n fn({ list: [undefined] }).subscribe(({ list: [value], field }) => {\n if (!Array.isArray(value)) {\n return;\n }\n const inputValue: ChatMessageListInputType = value ?? [];\n field.context\n .parseTemplate(\n inputValue.flatMap((item) =>\n item.content.map((item) =>\n item.type === 'text' ? item.text : '',\n ),\n ),\n )\n .then((value: any) => {\n if (!value) {\n return;\n }\n field.context.changeHandleData(field, 'input', 1, value);\n });\n\n const list = inputValue\n .flatMap((item) =>\n item.content.map((item) =>\n item.type === 'image_url' ? item.image_url.url : undefined,\n ),\n )\n .filter(Boolean)\n .map((item) => ({\n value: `${item}`,\n label: `${item}`,\n inputType: `image` as const,\n }));\n field.context.changeHandleData(field, 'input', 3, list ?? []);\n });\n }),\n ],\n }),\n ),\n }),\n});\n", "import {\n actions,\n condition,\n renderConfig,\n} from '@piying/view-angular-core';\nimport * as v from 'valibot';\nimport { asColumn } from '../util/layout';\n\nexport const EXAMPLES_DEFINE = v.pipe(\n v.optional(\n v.array(\n v.pipe(\n v.object({\n input: v.pipe(\n v.object({\n format: v.pipe(\n v.optional(v.boolean(), false),\n v.description(\n '选中后会尝试使用yaml解析为对象,再序列化为对应的响应类型',\n ),\n actions.wrappers.set(['tooltip']),\n ),\n value: v.pipe(v.string(), v.title('问题'), actions.class.top('flex-1')),\n }),\n // todo 待修复\n actions.class.top('flex gap-2 items-center'),\n ),\n\n output: v.pipe(\n v.object({\n format: v.pipe(\n v.optional(v.boolean(), false),\n v.description('是否需要格式化'),\n actions.wrappers.set(['tooltip']),\n ),\n value: v.pipe(v.string(), v.title('回答'), actions.class.top('flex-1')),\n }),\n actions.class.top('flex gap-2 items-center'),\n ),\n }),\n asColumn(),\n ),\n ),\n [],\n ),\n v.title('用例'),\n v.description('回答问题之前,会参考定义的用例格式进行回复,用于规范回答'),\n condition({\n environments: ['display'],\n actions: [\n renderConfig({\n hidden: true,\n }),\n ],\n }),\n);\n", "import { actions } from '@piying/view-angular-core';\n\nexport function asRow<TInput>(count?: number) {\n return actions.wrappers.patch<TInput>([\n {\n type: 'div',\n attributes: {\n class:\n typeof count === 'number'\n ? `grid gap-2 grid-cols-${count}`\n : 'flex gap-2 *:flex-1 items-center',\n },\n },\n ]);\n}\nexport function asColumn<TInput>() {\n return actions.wrappers.patch<TInput>([\n {\n type: 'div',\n attributes: {\n class: 'grid gap-2',\n },\n },\n ]);\n}\n", "import {\n asVirtualGroup,\n actions,\n setComponent,\n renderConfig,\n} from '@piying/view-angular-core';\nimport { condition } from '@piying/valibot-visit';\nimport * as v from 'valibot';\nimport { asColumn } from '../util/layout';\nexport function llmModelConfig(item?: { label: string }) {\n return v.pipe(\n v.intersect([\n v.pipe(\n v.intersect([\n v.pipe(\n v.object({\n name: v.pipe(\n v.optional(v.string()),\n v.title('预定义模型配置'),\n setComponent('select'),\n actions.inputs.patchAsync({\n options: (field) => field.context!.getModelList(),\n }),\n ),\n model: v.pipe(v.optional(v.string()), v.title('模型')),\n // todo 配置变化configuration层被去掉.这里应该更详细支持更多参数\n\n baseURL: v.pipe(v.optional(v.string()), v.title('地址')),\n }),\n asColumn(),\n ),\n ]),\n v.title(item?.label ?? '对话模型'),\n condition({\n environments: ['display', 'config'],\n actions: [asVirtualGroup()],\n }),\n ),\n ]),\n condition({\n environments: ['display', 'config'],\n actions: [asVirtualGroup()],\n }),\n condition({\n environments: ['display'],\n actions: [\n renderConfig({\n hidden: true,\n }),\n ],\n }),\n setComponent('accordion'),\n );\n}\n\nexport type ModelInputConfig = v.InferOutput<ReturnType<typeof llmModelConfig>>;\n", "export const DEFAULT_CHAT_SCHEMA_KEY = `[JsonSchema]`;\nexport const RUNNER_ORIGIN_OUTPUT_KEY = `[Origin]`;\n", "export const DEFAULT_INPUT_KEY = `[INPUT]`;\nexport const HelpObj = {\n templateVarLine: `- 变量定义格式: {{xx}},{{xx.yy}}`,\n pathTodoLine: `- **TODO** 接收传入路径而不是指定`,\n};\n", "import { HelpObj } from '../../../share';\nimport {\n DEFAULT_CHAT_SCHEMA_KEY,\n RUNNER_ORIGIN_OUTPUT_KEY,\n} from '../../../share';\nimport { NodeComponentType } from '../../../share';\n\nexport const NODE_COMMON: NodeComponentType = {\n priority: -100,\n type: 'chat',\n label: `对话`,\n icon: { fontIcon: 'chat' },\n disableHead: false,\n disableConnect: false,\n color: 'accent',\n help: [\n `- 点击输入框左侧图标可以切换或添加新行`,\n `${HelpObj.templateVarLine}`,\n '### 指定类型输出',\n '- `JsonSchema`为可选输入,需要使用`代码`节点生成',\n '> 设置后响应类型会自动变为json',\n '> 也可以使用任何符合`ChatJsonSchema`类型的数据结构传入(`代码`节点编辑时有声明)',\n '- 原始输出: 不进行任何格式化处理的输出',\n '### 定义图片变量',\n '- 只有支持图片传入的大语言模型才支持此选项',\n '> 如`minicpm-v:8b`',\n '- 定义后在对话中可以传入图片',\n '- 或者可以使用`图片输入`节点手动指定一张图片',\n '- 只有`用户提示词`可以使用图片输入',\n '> 不清楚是否所有模型都遵循此规则,所以并没有限制输入',\n ].join('\\n'),\n // config: defineConfig,\n inputs: [\n [],\n [\n {\n label: 'JsonSchema',\n value: DEFAULT_CHAT_SCHEMA_KEY,\n inputType: 'schema',\n optional: true,\n },\n ],\n ],\n outputs: [[{ label: '原始输出', value: RUNNER_ORIGIN_OUTPUT_KEY }]],\n};\n", "import { deepClone } from '@cyia/util';\n\nconst INIT_TEMPLATE = { role: 'user' as const, content: [] };\nexport function getHumanTemplate() {\n return deepClone(INIT_TEMPLATE);\n}\nexport function getSystemTemplate() {\n return deepClone({ ...INIT_TEMPLATE, role: 'system' });\n}\n", "import { WebviewNodeConfig } from '../../../../share/type';\nimport { CHAT_NODE_DEFINE } from '../chat.node.define';\nimport { NODE_COMMON } from '../common';\nimport { getSystemTemplate } from '../util';\n\nexport const ChatWebviewConfig: WebviewNodeConfig = {\n ...NODE_COMMON,\n displayConfig: CHAT_NODE_DEFINE,\n config: CHAT_NODE_DEFINE,\n initData: () => ({\n data: {\n transform: {\n resizable: true,\n },\n value: [getSystemTemplate()],\n },\n width: 300,\n }),\n};\n", "import { HelpObj } from '../../../share';\nimport { NodeComponentType } from '../../../share/type';\n\nexport const NODE_COMMON: NodeComponentType = {\n type: 'textarea',\n label: `文本模板`,\n icon: { fontIcon: 'text_snippet' },\n disableHead: false,\n disableConnect: false,\n color: 'primary',\n help: `${HelpObj.templateVarLine}`,\n priority: -98,\n};\n", "import {\n actions,\n condition,\n setComponent,\n valueChange,\n} from '@piying/view-angular-core';\nimport * as v from 'valibot';\nexport const TEXT_NODE_DEFINE = v.looseObject({\n data: v.looseObject({\n value: v.pipe(\n v.string(),\n condition({\n environments: ['display'],\n actions: [\n setComponent('string'),\n actions.class.top('nodrag'),\n\n valueChange((fn) => {\n fn({ list: [undefined] }).subscribe(({ list: [value], field }) => {\n if (typeof value !== 'string') {\n return;\n }\n field.context.parseTemplate([value]).then((value: any) => {\n if (!value) {\n return;\n }\n field.context.changeHandleData(field, 'input', 1, value);\n });\n });\n }),\n ],\n }),\n ),\n }),\n});\n", "import { WebviewNodeConfig } from '../../../../share/type';\nimport { NODE_COMMON } from '../common';\nimport { TEXT_NODE_DEFINE } from '../text.node.define';\n\nexport const TextWebviewConfig: WebviewNodeConfig = {\n ...NODE_COMMON,\n displayConfig: TEXT_NODE_DEFINE,\n initData: () => ({\n data: {\n transform: {\n resizable: true,\n },\n\n value: '',\n },\n width: 300,\n }),\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,KAAmB;AAEnB,IAAAC,
|
|
4
|
+
"sourcesContent": ["export * as WebviewNodeMap from '../inline/node/index.browser';\n", "export * from './chat/webview';\nexport * from './text/webview';\n", "import * as v from 'valibot';\n\nimport {\n actions,\n setComponent,\n valueChange,\n} from '@piying/view-angular-core';\nimport { ChatMessageListInputType } from '@shenghuabi/openai';\nimport { EXAMPLES_DEFINE, llmModelConfig } from '../../../share/common';\nexport const ResponseList = ['json', 'markdown', 'yaml'] as const;\nexport const ResponseFormat = ['text', 'json_object', 'json_schema'] as const;\nexport type ResponseType = (typeof ResponseList)[number];\nexport const CHAT_NODE_DEFINE = v.looseObject({\n data: v.looseObject({\n config: v.pipe(\n v.object({\n llm: v.optional(llmModelConfig()),\n /** 处理时解析 */\n responseFormat: v.pipe(\n v.optional(v.picklist(ResponseFormat)),\n actions.inputs.patch({\n options: [\n // 有输入json时\n {\n label: '自动',\n value: undefined,\n description: `传入JsonSchema时为[json_schema],否则为[text]`,\n },\n { label: '文本', value: 'text' },\n {\n label: 'JSON对象',\n value: 'json_object',\n description: '只限制返回类型为JSON对象,不对字段进行限制',\n },\n {\n label: 'JSON格式定义',\n value: 'json_schema',\n description:\n '限制返回类型为JSON对象,同时限制字段,不建议手动指定,传入JsonSchema后自动启用',\n },\n ],\n }),\n v.title('响应格式'),\n ),\n /** 处理后解析 */\n parseBy: v.pipe(\n v.optional(v.picklist(ResponseList)),\n actions.inputs.patch({\n options: [\n { label: '直接返回', value: undefined },\n {\n label: 'json',\n value: 'json',\n description: `将返回的json代码块内容或原始内容解析为对象`,\n },\n {\n label: 'markdown',\n value: 'markdown',\n description: `[需要提示词约束]将返回其中的markdown代码块内容或原始内容`,\n },\n {\n label: 'yaml',\n value: 'yaml',\n description: `[需要提示词约束]将返回的yaml代码块内容或原始内容解析为对象`,\n },\n ],\n }),\n v.title('返回解析'),\n valueChange((fn) => {\n fn({ list: [['..', 'responseFormat']] }).subscribe(\n ({ list: [value], field }) => {\n if ((value ?? '').startsWith('json')) {\n if (!field.form.control!.value) {\n field.form.control!.updateValue('json');\n }\n }\n },\n );\n }),\n ),\n examples: EXAMPLES_DEFINE,\n }),\n actions.wrappers.patch(['div']),\n actions.class.top('grid auto-rows-auto gap-2'),\n ),\n value: v.pipe(\n v.custom<ChatMessageListInputType>(Boolean),\n setComponent('prompt-list'),\n valueChange((fn) => {\n fn({ list: [undefined] }).subscribe(({ list: [value], field }) => {\n if (!Array.isArray(value)) {\n return;\n }\n const inputValue: ChatMessageListInputType = value ?? [];\n field.context\n .parseTemplate(\n inputValue.flatMap((item) =>\n item.content.map((item) =>\n item.type === 'text' ? item.text : '',\n ),\n ),\n )\n .then((value: any) => {\n if (!value) {\n return;\n }\n field.context.changeHandleData(field, 'input', 1, value);\n });\n\n const list = inputValue\n .flatMap((item) =>\n item.content.map((item) =>\n item.type === 'image_url' ? item.image_url.url : undefined,\n ),\n )\n .filter(Boolean)\n .map((item) => ({\n value: `${item}`,\n label: `${item}`,\n inputType: `image` as const,\n }));\n field.context.changeHandleData(field, 'input', 3, list ?? []);\n });\n }),\n ),\n }),\n});\n", "import { actions } from '@piying/view-angular-core';\nimport * as v from 'valibot';\nimport { asColumn } from '../util/layout';\n\nexport const EXAMPLES_DEFINE = v.pipe(\n v.optional(\n v.array(\n v.pipe(\n v.object({\n input: v.pipe(\n v.object({\n format: v.pipe(\n v.optional(v.boolean(), false),\n v.description(\n '选中后会尝试使用yaml解析为对象,再序列化为对应的响应类型',\n ),\n actions.wrappers.set(['tooltip']),\n ),\n value: v.pipe(\n v.string(),\n v.title('问题'),\n actions.class.top('flex-1'),\n ),\n }),\n // todo 待修复\n actions.class.top('flex gap-2 items-center'),\n ),\n\n output: v.pipe(\n v.object({\n format: v.pipe(\n v.optional(v.boolean(), false),\n v.description('是否需要格式化'),\n actions.wrappers.set(['tooltip']),\n ),\n value: v.pipe(\n v.string(),\n v.title('回答'),\n actions.class.top('flex-1'),\n ),\n }),\n actions.class.top('flex gap-2 items-center'),\n ),\n }),\n asColumn(),\n ),\n ),\n [],\n ),\n v.title('用例'),\n v.description('回答问题之前,会参考定义的用例格式进行回复,用于规范回答'),\n);\n", "import { actions } from '@piying/view-angular-core';\n\nexport function asRow<TInput>(count?: number) {\n return actions.wrappers.patch<TInput>([\n {\n type: 'div',\n attributes: {\n class:\n typeof count === 'number'\n ? `grid gap-2 grid-cols-${count}`\n : 'flex gap-2 *:flex-1 items-center',\n },\n },\n ]);\n}\nexport function asColumn<TInput>() {\n return actions.wrappers.patch<TInput>([\n {\n type: 'div',\n attributes: {\n class: 'grid gap-2',\n },\n },\n ]);\n}\n", "import {\n asVirtualGroup,\n actions,\n setComponent,\n} from '@piying/view-angular-core';\nimport * as v from 'valibot';\nimport { asColumn } from '../util/layout';\nexport function llmModelConfig(item?: { label: string }) {\n return v.pipe(\n v.intersect([\n v.pipe(\n v.intersect([\n v.pipe(\n v.object({\n name: v.pipe(\n v.optional(v.string()),\n v.title('预定义模型配置'),\n setComponent('select'),\n actions.inputs.patchAsync({\n options: (field) => field.context!.getModelList(),\n }),\n ),\n model: v.pipe(v.optional(v.string()), v.title('模型')),\n // todo 配置变化configuration层被去掉.这里应该更详细支持更多参数\n\n baseURL: v.pipe(v.optional(v.string()), v.title('地址')),\n }),\n asColumn(),\n ),\n ]),\n v.title(item?.label ?? '对话模型'),\n asVirtualGroup(),\n ),\n ]),\n asVirtualGroup(),\n setComponent('accordion'),\n );\n}\n\nexport type ModelInputConfig = v.InferOutput<ReturnType<typeof llmModelConfig>>;\n", "export const DEFAULT_CHAT_SCHEMA_KEY = `[JsonSchema]`;\nexport const RUNNER_ORIGIN_OUTPUT_KEY = `[Origin]`;\n", "export const DEFAULT_INPUT_KEY = `[INPUT]`;\nexport const HelpObj = {\n templateVarLine: `- 变量定义格式: {{xx}},{{xx.yy}}`,\n pathTodoLine: `- **TODO** 接收传入路径而不是指定`,\n};\n", "import { HelpObj } from '../../../share';\nimport {\n DEFAULT_CHAT_SCHEMA_KEY,\n RUNNER_ORIGIN_OUTPUT_KEY,\n} from '../../../share';\nimport { NodeComponentType } from '../../../share';\n\nexport const NODE_COMMON: NodeComponentType = {\n priority: -100,\n type: 'chat',\n label: `对话`,\n icon: { fontIcon: 'chat' },\n disableHead: false,\n disableConnect: false,\n color: 'accent',\n help: [\n `- 点击输入框左侧图标可以切换或添加新行`,\n `${HelpObj.templateVarLine}`,\n '### 指定类型输出',\n '- `JsonSchema`为可选输入,需要使用`代码`节点生成',\n '> 设置后响应类型会自动变为json',\n '> 也可以使用任何符合`ChatJsonSchema`类型的数据结构传入(`代码`节点编辑时有声明)',\n '- 原始输出: 不进行任何格式化处理的输出',\n '### 定义图片变量',\n '- 只有支持图片传入的大语言模型才支持此选项',\n '> 如`minicpm-v:8b`',\n '- 定义后在对话中可以传入图片',\n '- 或者可以使用`图片输入`节点手动指定一张图片',\n '- 只有`用户提示词`可以使用图片输入',\n '> 不清楚是否所有模型都遵循此规则,所以并没有限制输入',\n ].join('\\n'),\n // config: defineConfig,\n inputs: [\n [],\n [\n {\n label: 'JsonSchema',\n value: DEFAULT_CHAT_SCHEMA_KEY,\n inputType: 'schema',\n optional: true,\n },\n ],\n ],\n outputs: [[{ label: '原始输出', value: RUNNER_ORIGIN_OUTPUT_KEY }]],\n};\n", "import { deepClone } from '@cyia/util';\n\nconst INIT_TEMPLATE = { role: 'user' as const, content: [] };\nexport function getHumanTemplate() {\n return deepClone(INIT_TEMPLATE);\n}\nexport function getSystemTemplate() {\n return deepClone({ ...INIT_TEMPLATE, role: 'system' });\n}\n", "import { WebviewNodeConfig } from '../../../../share/type';\nimport { CHAT_NODE_DEFINE } from '../chat.node.define';\nimport { NODE_COMMON } from '../common';\nimport { getSystemTemplate } from '../util';\n\nexport const ChatWebviewConfig: WebviewNodeConfig = {\n ...NODE_COMMON,\n displayConfig: CHAT_NODE_DEFINE,\n config: CHAT_NODE_DEFINE,\n initData: () => ({\n data: {\n transform: {\n resizable: true,\n },\n value: [getSystemTemplate()],\n },\n width: 300,\n }),\n};\n", "import { HelpObj } from '../../../share';\nimport { NodeComponentType } from '../../../share/type';\n\nexport const NODE_COMMON: NodeComponentType = {\n type: 'textarea',\n label: `文本模板`,\n icon: { fontIcon: 'text_snippet' },\n disableHead: false,\n disableConnect: false,\n color: 'primary',\n help: `${HelpObj.templateVarLine}`,\n priority: -98,\n};\n", "import {\n actions,\n valueChange,\n} from '@piying/view-angular-core';\nimport * as v from 'valibot';\nexport const TEXT_NODE_DEFINE = v.looseObject({\n data: v.looseObject({\n value: v.pipe(\n v.string(),\n actions.class.top('nodrag'),\n valueChange((fn) => {\n fn({ list: [undefined] }).subscribe(({ list: [value], field }) => {\n if (typeof value !== 'string') {\n return;\n }\n field.context.parseTemplate([value]).then((value: any) => {\n if (!value) {\n return;\n }\n field.context.changeHandleData(field, 'input', 1, value);\n });\n });\n }),\n ),\n }),\n});\n", "import { WebviewNodeConfig } from '../../../../share/type';\nimport { NODE_COMMON } from '../common';\nimport { TEXT_NODE_DEFINE } from '../text.node.define';\n\nexport const TextWebviewConfig: WebviewNodeConfig = {\n ...NODE_COMMON,\n displayConfig: TEXT_NODE_DEFINE,\n initData: () => ({\n data: {\n transform: {\n resizable: true,\n },\n\n value: '',\n },\n width: 300,\n }),\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["v", "import_view_angular_core", "import_view_angular_core", "import_view_angular_core", "v", "item", "value", "NODE_COMMON", "import_view_angular_core", "v", "value", "NODE_COMMON"]
|
|
7
7
|
}
|