bizydraft 0.2.57__py3-none-any.whl → 0.2.58__py3-none-any.whl
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.
Potentially problematic release.
This version of bizydraft might be problematic. Click here for more details.
- bizydraft/static/js/aiAppHandler.js +5 -11
- bizydraft/static/js/workflow_io.js +193 -0
- {bizydraft-0.2.57.dist-info → bizydraft-0.2.58.dist-info}/METADATA +1 -1
- {bizydraft-0.2.57.dist-info → bizydraft-0.2.58.dist-info}/RECORD +6 -5
- {bizydraft-0.2.57.dist-info → bizydraft-0.2.58.dist-info}/WHEEL +0 -0
- {bizydraft-0.2.57.dist-info → bizydraft-0.2.58.dist-info}/top_level.txt +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { app } from "../../scripts/app.js";
|
|
2
|
-
import { setNodeParams
|
|
2
|
+
import { setNodeParams } from "./nodeParamsFilter.js";
|
|
3
3
|
import { processGraphOutput } from './tool.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { freezeWorkflow, unfreezeWorkflow } from './freezeModeHandler.js';
|
|
5
|
+
import { parseWorkflowIO } from './workflow_io.js';
|
|
6
6
|
// 状态变量
|
|
7
7
|
let selectedInputNodes = [];
|
|
8
8
|
let activeMode = null; // 当前活动的模式: "aiapp" 或 "export"
|
|
@@ -39,14 +39,8 @@ function toggleMode(mode, enable, isworkflow = false) {
|
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
41
|
try {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
headers: {
|
|
45
|
-
'Content-Type': 'application/json'
|
|
46
|
-
},
|
|
47
|
-
body: JSON.stringify(formattedData)
|
|
48
|
-
});
|
|
49
|
-
const responseData = await response.json();
|
|
42
|
+
// 使用前端workflow_io模块处理数据
|
|
43
|
+
const responseData = parseWorkflowIO(formattedData);
|
|
50
44
|
|
|
51
45
|
// 保存节点参数信息
|
|
52
46
|
if (responseData && responseData.data && Array.isArray(responseData.data.inputs)) {
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// 基础类型检查
|
|
2
|
+
const BASIC_TYPES = ['number', 'string', 'boolean'];
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 检查值是否为基础类型
|
|
6
|
+
* @param {any} val - 要检查的值
|
|
7
|
+
* @returns {boolean} 是否为基础类型
|
|
8
|
+
*/
|
|
9
|
+
function isBasicType(val) {
|
|
10
|
+
const type = typeof val;
|
|
11
|
+
return BASIC_TYPES.includes(type);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 遍历所有节点inputs,保留基础类型参数
|
|
16
|
+
* @param {Object} prompt - prompt对象
|
|
17
|
+
* @returns {Array} 输入参数数组
|
|
18
|
+
*/
|
|
19
|
+
function getInputParams(prompt) {
|
|
20
|
+
const inputParams = [];
|
|
21
|
+
|
|
22
|
+
for (const [nodeId, node] of Object.entries(prompt)) {
|
|
23
|
+
const classType = node.class_type;
|
|
24
|
+
const inputs = node.inputs || {};
|
|
25
|
+
|
|
26
|
+
for (const [k, v] of Object.entries(inputs)) {
|
|
27
|
+
if (isBasicType(v)) {
|
|
28
|
+
inputParams.push({
|
|
29
|
+
node_id: nodeId,
|
|
30
|
+
class_type: classType,
|
|
31
|
+
param_name: k,
|
|
32
|
+
param_value: v
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return inputParams;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 通过prompt参数推断叶子节点(即没有被其他节点inputs引用的节点)
|
|
43
|
+
* @param {Object} prompt - prompt对象
|
|
44
|
+
* @returns {Set} 叶子节点id集合
|
|
45
|
+
*/
|
|
46
|
+
function getLeafNodesFromPrompt(prompt) {
|
|
47
|
+
const referenced = new Set();
|
|
48
|
+
|
|
49
|
+
for (const [nodeId, node] of Object.entries(prompt)) {
|
|
50
|
+
const inputs = node.inputs || {};
|
|
51
|
+
|
|
52
|
+
for (const v of Object.values(inputs)) {
|
|
53
|
+
// 如果是引用(如["4", 1]),则v为array且第一个元素为节点id
|
|
54
|
+
if (Array.isArray(v) && v.length > 0 && typeof v[0] === 'string') {
|
|
55
|
+
referenced.add(v[0]);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const allNodes = new Set(Object.keys(prompt));
|
|
61
|
+
const leafNodes = new Set([...allNodes].filter(x => !referenced.has(x)));
|
|
62
|
+
|
|
63
|
+
return leafNodes;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 从工作流节点中查找指定节点id的节点
|
|
68
|
+
* @param {Array} wfNodes - 工作流节点数组
|
|
69
|
+
* @param {string} nodeId - 节点id
|
|
70
|
+
* @returns {Object|null} 找到的节点或null
|
|
71
|
+
*/
|
|
72
|
+
function getNodeIdFromWfNodes(wfNodes, nodeId) {
|
|
73
|
+
for (const wfNode of wfNodes) {
|
|
74
|
+
if (String(wfNode.id || 0) === nodeId) {
|
|
75
|
+
return wfNode;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 按节点类型和参数名整理参数信息
|
|
83
|
+
* @param {Array} inputParams - 输入参数数组
|
|
84
|
+
* @param {Set} excludeNodeIds - 需要排除的节点id集合
|
|
85
|
+
* @param {Array} wfNodes - 工作流节点数组
|
|
86
|
+
* @returns {Array} 整理后的参数信息
|
|
87
|
+
*/
|
|
88
|
+
function summarizeParams(inputParams, excludeNodeIds, wfNodes) {
|
|
89
|
+
const summary = {};
|
|
90
|
+
|
|
91
|
+
for (const param of inputParams) {
|
|
92
|
+
const nodeId = param.node_id;
|
|
93
|
+
|
|
94
|
+
if (excludeNodeIds.has(nodeId)) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const wfNode = getNodeIdFromWfNodes(wfNodes, nodeId);
|
|
99
|
+
let title = param.class_type;
|
|
100
|
+
|
|
101
|
+
if (wfNode && wfNode.title) {
|
|
102
|
+
title = wfNode.title;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const key = `${param.class_type}_${nodeId}`;
|
|
106
|
+
|
|
107
|
+
if (!summary[key]) {
|
|
108
|
+
summary[key] = {
|
|
109
|
+
name: param.class_type,
|
|
110
|
+
displayName: param.class_type,
|
|
111
|
+
nodeId: nodeId,
|
|
112
|
+
params: [],
|
|
113
|
+
title: title
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// 获取参数值的类型
|
|
118
|
+
let paramType = typeof param.param_value;
|
|
119
|
+
if (paramType === 'number') {
|
|
120
|
+
paramType = Number.isInteger(param.param_value) ? 'INT' : 'FLOAT';
|
|
121
|
+
} else {
|
|
122
|
+
paramType = paramType.toUpperCase();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
summary[key].params.push({
|
|
126
|
+
name: param.param_name,
|
|
127
|
+
displayName: param.param_name,
|
|
128
|
+
type: paramType,
|
|
129
|
+
defaultValue: param.param_value
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return Object.values(summary);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* 解析工作流IO数据
|
|
138
|
+
* @param {Object} requestData - 请求数据
|
|
139
|
+
* @returns {Object} 解析结果
|
|
140
|
+
*/
|
|
141
|
+
function parseWorkflowIO(requestData) {
|
|
142
|
+
const prompt = requestData.prompt || {};
|
|
143
|
+
const extraData = requestData.extra_data || {};
|
|
144
|
+
|
|
145
|
+
const extraPnginfo = extraData.extra_pnginfo || {};
|
|
146
|
+
const workflow = extraPnginfo.workflow || {};
|
|
147
|
+
const wfNodes = workflow.nodes || [];
|
|
148
|
+
|
|
149
|
+
// 1. 输出参数(推断叶子节点)
|
|
150
|
+
const leafNodes = getLeafNodesFromPrompt(prompt);
|
|
151
|
+
const outputNodes = [];
|
|
152
|
+
|
|
153
|
+
for (const nodeId of leafNodes) {
|
|
154
|
+
const node = prompt[nodeId];
|
|
155
|
+
const classType = node.class_type;
|
|
156
|
+
const wfNode = getNodeIdFromWfNodes(wfNodes, nodeId);
|
|
157
|
+
|
|
158
|
+
let title = classType;
|
|
159
|
+
if (wfNode && wfNode.title) {
|
|
160
|
+
title = wfNode.title;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
outputNodes.push({
|
|
164
|
+
nodeId: nodeId,
|
|
165
|
+
name: classType,
|
|
166
|
+
displayName: classType,
|
|
167
|
+
title: title,
|
|
168
|
+
params: []
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// 2. 输入参数(排除已作为输出的节点)
|
|
173
|
+
const inputParams = getInputParams(prompt);
|
|
174
|
+
const inputSummary = summarizeParams(inputParams, leafNodes, wfNodes);
|
|
175
|
+
|
|
176
|
+
// 3. 构造response格式
|
|
177
|
+
return {
|
|
178
|
+
data: {
|
|
179
|
+
inputs: inputSummary,
|
|
180
|
+
outputs: outputNodes
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// 导出函数
|
|
186
|
+
export {
|
|
187
|
+
parseWorkflowIO,
|
|
188
|
+
isBasicType,
|
|
189
|
+
getInputParams,
|
|
190
|
+
getLeafNodesFromPrompt,
|
|
191
|
+
summarizeParams,
|
|
192
|
+
getNodeIdFromWfNodes
|
|
193
|
+
};
|
|
@@ -10,7 +10,7 @@ bizydraft/prestartup_patch.py,sha256=4FGjmRcDHELjtlQOrfTfk2Un5OS89QIqfq-gEcB9WDs
|
|
|
10
10
|
bizydraft/resp.py,sha256=8INvKOe5Dgai3peKfqKjrhUoYeuXWXn358w30-_cY-A,369
|
|
11
11
|
bizydraft/server.py,sha256=L2zoJgOisr65IRphOyko74AdsLel59gh55peyMaUrO8,2102
|
|
12
12
|
bizydraft/workflow_io.py,sha256=MYhJbpgkv8hrA5k_aolijOTrWpTtu62nzRznA4hv8JE,4298
|
|
13
|
-
bizydraft/static/js/aiAppHandler.js,sha256=
|
|
13
|
+
bizydraft/static/js/aiAppHandler.js,sha256=4PcrcD9gv-yqBelkIfuhoN0ZwuFv66f7-bmwqla_aPI,17428
|
|
14
14
|
bizydraft/static/js/freezeModeHandler.js,sha256=SjpHD2nYymR-E13B0YcqkA6e4WycZOVI3c48Ts9qvWE,18027
|
|
15
15
|
bizydraft/static/js/handleStyle.js,sha256=rUlgc-_vH76828Fv9zxTHq9UFj2AHANIUELArhl5lvU,2956
|
|
16
16
|
bizydraft/static/js/hookLoadImage.js,sha256=aFRWkgJW-Cp-YHjZh-3j-vsVcNaDZpBVoQqcFZ2Po0g,8186
|
|
@@ -22,7 +22,8 @@ bizydraft/static/js/postEvent.js,sha256=jzZcR238XyPdb5h6lICkarXCIf2gP8IV646dmWoM
|
|
|
22
22
|
bizydraft/static/js/socket.js,sha256=VE3fTAgEfM0FZhL526Skt7OCRokOa3mzTCAjAomI_tE,2432
|
|
23
23
|
bizydraft/static/js/tool.js,sha256=VupamUuh7tYiDnBTrL5Z_yLmhJinskhzRXwE3zfsKZM,2901
|
|
24
24
|
bizydraft/static/js/uploadFile.js,sha256=WvglKzHMeOzDhOH3P-fLcPHxCLbKOJpo4DntoRxeJtI,4908
|
|
25
|
-
bizydraft
|
|
26
|
-
bizydraft-0.2.
|
|
27
|
-
bizydraft-0.2.
|
|
28
|
-
bizydraft-0.2.
|
|
25
|
+
bizydraft/static/js/workflow_io.js,sha256=FWAjncvWhvy-3nN_legD2fpRwgnIncpRLHU5X016a-U,5236
|
|
26
|
+
bizydraft-0.2.58.dist-info/METADATA,sha256=YGxnA9eYvNPDi0NHUvHp6vTj8mBtOotBwETqpID2TxU,162
|
|
27
|
+
bizydraft-0.2.58.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
28
|
+
bizydraft-0.2.58.dist-info/top_level.txt,sha256=XtoBq6hjZhXIM7aas4GtPDtAiKo8FdLzMABXW8qqQ8M,10
|
|
29
|
+
bizydraft-0.2.58.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|