bizydraft 0.1.28__py3-none-any.whl → 0.1.30__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/hijack_routes.py +4 -4
- bizydraft/server.py +2 -2
- bizydraft/static/js/hookLoadImage.js +5 -5
- bizydraft/static/js/postEvent.js +47 -47
- bizydraft/static/js/socket.js +1 -1
- bizydraft/static/js/tool.js +1 -1
- bizydraft/static/js/uploadFile.js +22 -22
- bizydraft/workflow_io.py +30 -2
- {bizydraft-0.1.28.dist-info → bizydraft-0.1.30.dist-info}/METADATA +1 -1
- bizydraft-0.1.30.dist-info/RECORD +19 -0
- bizydraft-0.1.28.dist-info/RECORD +0 -19
- {bizydraft-0.1.28.dist-info → bizydraft-0.1.30.dist-info}/WHEEL +0 -0
- {bizydraft-0.1.28.dist-info → bizydraft-0.1.30.dist-info}/top_level.txt +0 -0
bizydraft/hijack_routes.py
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import math
|
|
2
|
-
import os
|
|
3
1
|
import asyncio
|
|
2
|
+
import math
|
|
4
3
|
import mimetypes
|
|
4
|
+
import os
|
|
5
5
|
import uuid
|
|
6
6
|
|
|
7
|
-
from aiohttp import
|
|
7
|
+
from aiohttp import ClientSession, ClientTimeout, web
|
|
8
8
|
from loguru import logger
|
|
9
9
|
|
|
10
10
|
try:
|
|
11
|
-
from server import PromptServer
|
|
12
11
|
import execution
|
|
12
|
+
from server import PromptServer
|
|
13
13
|
|
|
14
14
|
comfy_server = PromptServer.instance
|
|
15
15
|
except ImportError:
|
bizydraft/server.py
CHANGED
|
@@ -2,6 +2,7 @@ import os
|
|
|
2
2
|
from typing import Union
|
|
3
3
|
|
|
4
4
|
from loguru import logger
|
|
5
|
+
|
|
5
6
|
from .workflow_io import parse_workflow_io
|
|
6
7
|
|
|
7
8
|
try:
|
|
@@ -12,7 +13,7 @@ except ImportError:
|
|
|
12
13
|
)
|
|
13
14
|
exit(1)
|
|
14
15
|
|
|
15
|
-
from .resp import
|
|
16
|
+
from .resp import ErrResponse, JsonResponse, OKResponse
|
|
16
17
|
|
|
17
18
|
_API_PREFIX = "bizyair"
|
|
18
19
|
_SERVER_MODE_HC_FLAG = True
|
|
@@ -53,7 +54,6 @@ class BizyDraftServer:
|
|
|
53
54
|
except Exception as e:
|
|
54
55
|
logger.error(f"解析 request.json() 失败: {e}")
|
|
55
56
|
return ErrResponse(400)
|
|
56
|
-
|
|
57
57
|
try:
|
|
58
58
|
response = parse_workflow_io(data)
|
|
59
59
|
return JsonResponse(200, response)
|
|
@@ -43,7 +43,7 @@ app.registerExtension({
|
|
|
43
43
|
// return item.url
|
|
44
44
|
})
|
|
45
45
|
const image_widget = this.widgets.find(w => w.name === 'image');
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
|
|
48
48
|
let image_path_widget = this.widgets.find(w => w.name === 'image_path');
|
|
49
49
|
if (!image_path_widget) {
|
|
@@ -64,7 +64,7 @@ app.registerExtension({
|
|
|
64
64
|
image_widget.value = image_list[0].name
|
|
65
65
|
const defaultImageUrl = decodeURIComponent(image_list[0].url);
|
|
66
66
|
image_path_widget.value = defaultImageUrl;
|
|
67
|
-
|
|
67
|
+
|
|
68
68
|
previewImage(node, defaultImageUrl)
|
|
69
69
|
}
|
|
70
70
|
image_widget.callback = function(e) {
|
|
@@ -74,7 +74,7 @@ app.registerExtension({
|
|
|
74
74
|
}
|
|
75
75
|
return true
|
|
76
76
|
}
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
await getData()
|
|
79
79
|
|
|
80
80
|
|
|
@@ -90,7 +90,7 @@ app.registerExtension({
|
|
|
90
90
|
image_widget.value = temp.name
|
|
91
91
|
image_widget.options.values = image_list.map(item => item.name)
|
|
92
92
|
previewImage(node, temp.url)
|
|
93
|
-
|
|
93
|
+
|
|
94
94
|
requestAnimationFrame(() => {
|
|
95
95
|
previewImage(node, temp.url)
|
|
96
96
|
})
|
|
@@ -123,7 +123,7 @@ function previewImage(node, image_url) {
|
|
|
123
123
|
} else {
|
|
124
124
|
console.warn('[BizyAir] 无法访问graph对象进行重绘');
|
|
125
125
|
}
|
|
126
|
-
|
|
126
|
+
|
|
127
127
|
console.log('[BizyAir] 图片预览加载成功');
|
|
128
128
|
};
|
|
129
129
|
img.onerror = function(err) {
|
bizydraft/static/js/postEvent.js
CHANGED
|
@@ -10,28 +10,28 @@ app.registerExtension({
|
|
|
10
10
|
socket: null,
|
|
11
11
|
isConnecting: false,
|
|
12
12
|
taskRunning: false,
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
// 心跳检测
|
|
15
15
|
pingInterval: 5000, // 5秒发送一次心跳
|
|
16
16
|
pingTimer: null,
|
|
17
17
|
pingTimeout: 3000,
|
|
18
|
-
pongReceived: false,
|
|
18
|
+
pongReceived: false,
|
|
19
19
|
pingTimeoutTimer: null, // ping超时计时器
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
/**
|
|
22
22
|
* 开始心跳检测
|
|
23
23
|
*/
|
|
24
24
|
startPing() {
|
|
25
25
|
this.stopPing();
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
// 立即发送一次ping消息
|
|
32
32
|
this.pongReceived = false;
|
|
33
33
|
this.socket.send('ping');
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
// 设置ping超时检测
|
|
36
36
|
this.pingTimeoutTimer = setTimeout(() => {
|
|
37
37
|
if (!this.pongReceived) {
|
|
@@ -39,12 +39,12 @@ app.registerExtension({
|
|
|
39
39
|
this.reconnect();
|
|
40
40
|
}
|
|
41
41
|
}, this.pingTimeout);
|
|
42
|
-
|
|
42
|
+
|
|
43
43
|
// 设置定时发送ping
|
|
44
44
|
this.pingTimer = setInterval(() => {
|
|
45
45
|
if (this.socket && this.socket.readyState === WebSocket.OPEN) {
|
|
46
46
|
this.pongReceived = false;
|
|
47
|
-
this.socket.send('ping');
|
|
47
|
+
this.socket.send('ping');
|
|
48
48
|
// 设置ping超时检测
|
|
49
49
|
this.pingTimeoutTimer = setTimeout(() => {
|
|
50
50
|
// 如果没有收到pong响应
|
|
@@ -59,7 +59,7 @@ app.registerExtension({
|
|
|
59
59
|
}
|
|
60
60
|
}, this.pingInterval);
|
|
61
61
|
},
|
|
62
|
-
|
|
62
|
+
|
|
63
63
|
/**
|
|
64
64
|
* 停止心跳检测
|
|
65
65
|
*/
|
|
@@ -68,25 +68,25 @@ app.registerExtension({
|
|
|
68
68
|
clearInterval(this.pingTimer);
|
|
69
69
|
this.pingTimer = null;
|
|
70
70
|
}
|
|
71
|
-
|
|
71
|
+
|
|
72
72
|
if (this.pingTimeoutTimer) {
|
|
73
73
|
clearTimeout(this.pingTimeoutTimer);
|
|
74
74
|
this.pingTimeoutTimer = null;
|
|
75
75
|
}
|
|
76
76
|
},
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
/**
|
|
79
79
|
* 重新连接
|
|
80
80
|
*/
|
|
81
81
|
reconnect() {
|
|
82
82
|
if (this.isConnecting) {
|
|
83
83
|
return;
|
|
84
|
-
}
|
|
85
|
-
const url = this.socket ? this.socket.url : app.api.socket.url;
|
|
86
|
-
this.closeSocket();
|
|
84
|
+
}
|
|
85
|
+
const url = this.socket ? this.socket.url : app.api.socket.url;
|
|
86
|
+
this.closeSocket();
|
|
87
87
|
this.createSocket(url);
|
|
88
88
|
},
|
|
89
|
-
|
|
89
|
+
|
|
90
90
|
/**
|
|
91
91
|
* 创建新的WebSocket连接
|
|
92
92
|
*/
|
|
@@ -96,21 +96,21 @@ app.registerExtension({
|
|
|
96
96
|
console.log('WebSocket连接已在创建中,避免重复创建');
|
|
97
97
|
return null;
|
|
98
98
|
}
|
|
99
|
-
|
|
99
|
+
|
|
100
100
|
// 标记为连接中
|
|
101
101
|
this.isConnecting = true;
|
|
102
|
-
|
|
102
|
+
|
|
103
103
|
// 先关闭现有连接
|
|
104
104
|
this.closeSocket();
|
|
105
|
-
|
|
105
|
+
|
|
106
106
|
const url = customUrl || app.api.socket.url;
|
|
107
107
|
console.log('创建WebSocket连接:', url);
|
|
108
|
-
|
|
108
|
+
|
|
109
109
|
try {
|
|
110
110
|
const socket = new WebSocket(url);
|
|
111
111
|
const dispatchCustomEvent = this.dispatchCustomEvent;
|
|
112
112
|
const self = this;
|
|
113
|
-
|
|
113
|
+
|
|
114
114
|
socket.onopen = function() {
|
|
115
115
|
console.log('WebSocket连接已打开');
|
|
116
116
|
// 清除连接中标志
|
|
@@ -122,19 +122,19 @@ app.registerExtension({
|
|
|
122
122
|
// 开始心跳检测
|
|
123
123
|
self.startPing();
|
|
124
124
|
};
|
|
125
|
-
|
|
125
|
+
|
|
126
126
|
socket.onmessage = function (event) {
|
|
127
127
|
try {
|
|
128
128
|
// 处理心跳响应
|
|
129
129
|
if (event.data === 'pong') {
|
|
130
130
|
// 标记收到pong响应
|
|
131
131
|
self.pongReceived = true;
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
134
|
if (event.data instanceof ArrayBuffer) {
|
|
135
135
|
const view = new DataView(event.data);
|
|
136
136
|
const eventType = view.getUint32(0);
|
|
137
|
-
|
|
137
|
+
|
|
138
138
|
let imageMime;
|
|
139
139
|
switch (eventType) {
|
|
140
140
|
case 3:
|
|
@@ -177,20 +177,20 @@ app.registerExtension({
|
|
|
177
177
|
self.closeSocket(1000);
|
|
178
178
|
return;
|
|
179
179
|
}
|
|
180
|
-
|
|
180
|
+
|
|
181
181
|
const msg = JSON.parse(event.data);
|
|
182
182
|
window.parent.postMessage({
|
|
183
183
|
type: 'functionResult',
|
|
184
184
|
method: 'progress_info_change',
|
|
185
185
|
result: msg.progress_info
|
|
186
186
|
}, '*');
|
|
187
|
-
|
|
187
|
+
|
|
188
188
|
switch (msg.type) {
|
|
189
189
|
case 'status':
|
|
190
190
|
if (msg.data.sid) {
|
|
191
191
|
const clientId = msg.data.sid;
|
|
192
|
-
window.name = clientId;
|
|
193
|
-
sessionStorage.setItem('clientId', clientId);
|
|
192
|
+
window.name = clientId;
|
|
193
|
+
sessionStorage.setItem('clientId', clientId);
|
|
194
194
|
socket.clientId = clientId;
|
|
195
195
|
}
|
|
196
196
|
dispatchCustomEvent('status', msg.data.status ?? null);
|
|
@@ -229,7 +229,7 @@ app.registerExtension({
|
|
|
229
229
|
default:
|
|
230
230
|
const registeredTypes = socket.registeredTypes || new Set();
|
|
231
231
|
const reportedUnknownMessageTypes = socket.reportedUnknownMessageTypes || new Set();
|
|
232
|
-
|
|
232
|
+
|
|
233
233
|
if (registeredTypes.has(msg.type)) {
|
|
234
234
|
app.dispatchEvent(
|
|
235
235
|
new CustomEvent(msg.type, { detail: msg.data })
|
|
@@ -244,7 +244,7 @@ app.registerExtension({
|
|
|
244
244
|
console.warn('Unhandled message:', event.data, error);
|
|
245
245
|
}
|
|
246
246
|
};
|
|
247
|
-
|
|
247
|
+
|
|
248
248
|
socket.onerror = function(error) {
|
|
249
249
|
console.log('WebSocket 错误:', error);
|
|
250
250
|
// 清除连接中标志
|
|
@@ -252,7 +252,7 @@ app.registerExtension({
|
|
|
252
252
|
// 停止心跳
|
|
253
253
|
self.stopPing();
|
|
254
254
|
};
|
|
255
|
-
|
|
255
|
+
|
|
256
256
|
socket.onclose = function(event) {
|
|
257
257
|
console.log('WebSocket 连接已关闭, 状态码:', event.code, event.reason);
|
|
258
258
|
// 清除连接中标志
|
|
@@ -264,10 +264,10 @@ app.registerExtension({
|
|
|
264
264
|
// 停止心跳
|
|
265
265
|
self.stopPing();
|
|
266
266
|
};
|
|
267
|
-
|
|
267
|
+
|
|
268
268
|
socket.registeredTypes = new Set();
|
|
269
269
|
socket.reportedUnknownMessageTypes = new Set();
|
|
270
|
-
|
|
270
|
+
|
|
271
271
|
// 返回创建的socket,但不要立即使用,等待onopen
|
|
272
272
|
return socket;
|
|
273
273
|
} catch (error) {
|
|
@@ -288,7 +288,7 @@ app.registerExtension({
|
|
|
288
288
|
resolve(this.socket);
|
|
289
289
|
return;
|
|
290
290
|
}
|
|
291
|
-
|
|
291
|
+
|
|
292
292
|
// 如果连接正在创建中,等待一段时间后检查
|
|
293
293
|
if (this.isConnecting) {
|
|
294
294
|
console.log('WebSocket连接创建中,等待...');
|
|
@@ -303,26 +303,26 @@ app.registerExtension({
|
|
|
303
303
|
}, 100); // 每100ms检查一次
|
|
304
304
|
return;
|
|
305
305
|
}
|
|
306
|
-
|
|
306
|
+
|
|
307
307
|
// 创建新连接
|
|
308
308
|
const socket = this.createSocket(customUrl);
|
|
309
309
|
if (!socket) {
|
|
310
310
|
reject(new Error('创建WebSocket连接失败'));
|
|
311
311
|
return;
|
|
312
312
|
}
|
|
313
|
-
|
|
313
|
+
|
|
314
314
|
// 监听连接打开事件
|
|
315
315
|
socket.addEventListener('open', () => {
|
|
316
316
|
resolve(socket);
|
|
317
317
|
});
|
|
318
|
-
|
|
318
|
+
|
|
319
319
|
// 监听错误事件
|
|
320
320
|
socket.addEventListener('error', (error) => {
|
|
321
321
|
reject(error);
|
|
322
322
|
});
|
|
323
323
|
});
|
|
324
324
|
},
|
|
325
|
-
|
|
325
|
+
|
|
326
326
|
/**
|
|
327
327
|
* 获取可用的socket连接,如果不存在则创建
|
|
328
328
|
* 同步版本,可能返回尚未就绪的连接
|
|
@@ -332,7 +332,7 @@ app.registerExtension({
|
|
|
332
332
|
if (this.socket && this.socket.readyState === WebSocket.OPEN) {
|
|
333
333
|
return this.socket;
|
|
334
334
|
}
|
|
335
|
-
|
|
335
|
+
|
|
336
336
|
// 创建新连接
|
|
337
337
|
return this.createSocket(customUrl);
|
|
338
338
|
},
|
|
@@ -344,7 +344,7 @@ app.registerExtension({
|
|
|
344
344
|
closeSocket(code) {
|
|
345
345
|
// 先停止心跳
|
|
346
346
|
this.stopPing();
|
|
347
|
-
|
|
347
|
+
|
|
348
348
|
if (this.socket) {
|
|
349
349
|
if (this.socket.readyState === WebSocket.OPEN || this.socket.readyState === WebSocket.CONNECTING) {
|
|
350
350
|
console.log('关闭WebSocket连接');
|
|
@@ -352,10 +352,10 @@ app.registerExtension({
|
|
|
352
352
|
}
|
|
353
353
|
this.socket = null;
|
|
354
354
|
}
|
|
355
|
-
|
|
355
|
+
|
|
356
356
|
// 重置任务状态
|
|
357
357
|
this.taskRunning = false;
|
|
358
|
-
|
|
358
|
+
|
|
359
359
|
return true;
|
|
360
360
|
},
|
|
361
361
|
|
|
@@ -365,7 +365,7 @@ app.registerExtension({
|
|
|
365
365
|
changeSocketUrl(newUrl) {
|
|
366
366
|
const clientId = sessionStorage.getItem("clientId");
|
|
367
367
|
const fullUrl = newUrl + "?clientId=" + clientId + "&a=1";
|
|
368
|
-
|
|
368
|
+
|
|
369
369
|
return this.createSocket(fullUrl);
|
|
370
370
|
},
|
|
371
371
|
|
|
@@ -402,7 +402,7 @@ app.registerExtension({
|
|
|
402
402
|
return false;
|
|
403
403
|
}
|
|
404
404
|
},
|
|
405
|
-
|
|
405
|
+
|
|
406
406
|
getCookie(name) {
|
|
407
407
|
const value = `; ${document.cookie}`;
|
|
408
408
|
const parts = value.split(`; ${name}=`);
|
|
@@ -502,8 +502,8 @@ app.registerExtension({
|
|
|
502
502
|
|
|
503
503
|
loadWorkflow: function (params) {
|
|
504
504
|
app.graph.clear();
|
|
505
|
-
document.dispatchEvent(new CustomEvent('workflowLoaded', {
|
|
506
|
-
detail: params
|
|
505
|
+
document.dispatchEvent(new CustomEvent('workflowLoaded', {
|
|
506
|
+
detail: params
|
|
507
507
|
}));
|
|
508
508
|
if (params.json.version) {
|
|
509
509
|
app.loadGraphData(params.json);
|
|
@@ -559,7 +559,7 @@ app.registerExtension({
|
|
|
559
559
|
try {
|
|
560
560
|
// 确保有连接
|
|
561
561
|
// await getSocketAsync();
|
|
562
|
-
|
|
562
|
+
|
|
563
563
|
const graph = await app.graphToPrompt();
|
|
564
564
|
const clientId = sessionStorage.getItem("clientId");
|
|
565
565
|
const resPrompt = await fetch("api/prompt", {
|
bizydraft/static/js/socket.js
CHANGED
bizydraft/static/js/tool.js
CHANGED
|
@@ -10,7 +10,7 @@ export async function fileToOss(file) {
|
|
|
10
10
|
if (!authToken) {
|
|
11
11
|
throw new Error('未找到认证Token,请先登录');
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
// 获取上传凭证
|
|
15
15
|
const uploadToken = await fetch(`${apiHost}/special/community/upload_token?file_name=${encodeURIComponent(file.name)}&file_type=inputs`, {
|
|
16
16
|
method: 'GET',
|
|
@@ -19,17 +19,17 @@ export async function fileToOss(file) {
|
|
|
19
19
|
'Authorization': `Bearer ${authToken}`
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
// 检查响应状态
|
|
24
24
|
if (!uploadToken.ok) {
|
|
25
25
|
const errorText = await uploadToken.text();
|
|
26
26
|
console.error('获取上传凭证失败:', uploadToken.status, errorText);
|
|
27
27
|
throw new Error(`获取上传凭证失败: ${uploadToken.status} ${uploadToken.statusText}`);
|
|
28
28
|
}
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
const {data} = await uploadToken.json();
|
|
31
31
|
// console.log('上传凭证响应:', data);
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
// 使用STS凭证上传
|
|
34
34
|
const ossConfig = {
|
|
35
35
|
accessKeyId: data.data.file.access_key_id,
|
|
@@ -39,16 +39,16 @@ export async function fileToOss(file) {
|
|
|
39
39
|
region: data.data.storage.region,
|
|
40
40
|
objectKey: data.data.file.object_key
|
|
41
41
|
};
|
|
42
|
-
|
|
42
|
+
|
|
43
43
|
// console.log('OSS配置:', ossConfig);
|
|
44
|
-
|
|
44
|
+
|
|
45
45
|
// 改用官方推荐的表单上传方式
|
|
46
46
|
const formData = new FormData();
|
|
47
|
-
|
|
47
|
+
|
|
48
48
|
// 构建Policy
|
|
49
49
|
const expiration = new Date();
|
|
50
50
|
expiration.setHours(expiration.getHours() + 1); // Policy过期时间1小时
|
|
51
|
-
|
|
51
|
+
|
|
52
52
|
const policyObj = {
|
|
53
53
|
expiration: expiration.toISOString(),
|
|
54
54
|
conditions: [
|
|
@@ -58,47 +58,47 @@ export async function fileToOss(file) {
|
|
|
58
58
|
['starts-with', '$key', ossConfig.objectKey.split('/')[0]]
|
|
59
59
|
]
|
|
60
60
|
};
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
// Policy Base64编码
|
|
63
63
|
const policy = btoa(JSON.stringify(policyObj));
|
|
64
64
|
// console.log('Policy:', policy);
|
|
65
|
-
|
|
65
|
+
|
|
66
66
|
// 构建表单字段
|
|
67
67
|
formData.append('key', ossConfig.objectKey);
|
|
68
68
|
formData.append('OSSAccessKeyId', ossConfig.accessKeyId);
|
|
69
69
|
formData.append('policy', policy);
|
|
70
70
|
formData.append('success_action_status', '200');
|
|
71
|
-
|
|
71
|
+
|
|
72
72
|
// 如果有临时token,需要添加
|
|
73
73
|
if (ossConfig.securityToken) {
|
|
74
74
|
formData.append('x-oss-security-token', ossConfig.securityToken);
|
|
75
75
|
}
|
|
76
|
-
|
|
76
|
+
|
|
77
77
|
// 计算签名 - 阿里云官方要求使用HMAC-SHA1
|
|
78
78
|
const signature = await hmacSha1(policy, ossConfig.accessKeySecret);
|
|
79
79
|
// console.log('计算的签名:', signature);
|
|
80
80
|
formData.append('signature', signature);
|
|
81
|
-
|
|
81
|
+
|
|
82
82
|
// 最后添加文件内容
|
|
83
83
|
formData.append('file', file);
|
|
84
|
-
|
|
84
|
+
|
|
85
85
|
// OSS服务端点
|
|
86
86
|
const host = `https://${ossConfig.bucket}.${ossConfig.region}.aliyuncs.com`;
|
|
87
87
|
// console.log('上传地址:', host);
|
|
88
|
-
|
|
88
|
+
|
|
89
89
|
// 开始上传
|
|
90
90
|
const uploadResponse = await fetch(host, {
|
|
91
91
|
method: 'POST',
|
|
92
92
|
body: formData
|
|
93
93
|
});
|
|
94
|
-
|
|
94
|
+
|
|
95
95
|
// 检查响应
|
|
96
96
|
if (!uploadResponse.ok) {
|
|
97
97
|
const errorText = await uploadResponse.text();
|
|
98
98
|
console.error('上传失败:', uploadResponse.status, errorText);
|
|
99
99
|
throw new Error(`上传失败: ${uploadResponse.status} ${uploadResponse.statusText}`);
|
|
100
100
|
}
|
|
101
|
-
|
|
101
|
+
|
|
102
102
|
// 构建公开访问URL
|
|
103
103
|
const fileUrl = `${host}/${ossConfig.objectKey}`;
|
|
104
104
|
|
|
@@ -121,7 +121,7 @@ export async function fileToOss(file) {
|
|
|
121
121
|
};
|
|
122
122
|
} catch (error) {
|
|
123
123
|
console.error('文件上传到OSS失败:', error);
|
|
124
|
-
|
|
124
|
+
|
|
125
125
|
throw error;
|
|
126
126
|
}
|
|
127
127
|
}
|
|
@@ -132,7 +132,7 @@ async function hmacSha1(message, key) {
|
|
|
132
132
|
const encoder = new TextEncoder();
|
|
133
133
|
const keyData = encoder.encode(key);
|
|
134
134
|
const messageData = encoder.encode(message);
|
|
135
|
-
|
|
135
|
+
|
|
136
136
|
// 导入密钥
|
|
137
137
|
const cryptoKey = await window.crypto.subtle.importKey(
|
|
138
138
|
'raw',
|
|
@@ -141,14 +141,14 @@ async function hmacSha1(message, key) {
|
|
|
141
141
|
false,
|
|
142
142
|
['sign']
|
|
143
143
|
);
|
|
144
|
-
|
|
144
|
+
|
|
145
145
|
// 计算签名
|
|
146
146
|
const signature = await window.crypto.subtle.sign(
|
|
147
147
|
'HMAC',
|
|
148
148
|
cryptoKey,
|
|
149
149
|
messageData
|
|
150
150
|
);
|
|
151
|
-
|
|
151
|
+
|
|
152
152
|
// 转换为Base64编码
|
|
153
153
|
const base64Signature = arrayBufferToBase64(signature);
|
|
154
154
|
return base64Signature;
|
|
@@ -162,4 +162,4 @@ function arrayBufferToBase64(buffer) {
|
|
|
162
162
|
binary += String.fromCharCode(bytes[i]);
|
|
163
163
|
}
|
|
164
164
|
return btoa(binary);
|
|
165
|
-
}
|
|
165
|
+
}
|
bizydraft/workflow_io.py
CHANGED
|
@@ -45,7 +45,9 @@ def get_leaf_nodes_from_prompt(prompt: Dict[str, Any]) -> Set[str]:
|
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
def summarize_params(
|
|
48
|
-
input_params: List[Dict[str, Any]],
|
|
48
|
+
input_params: List[Dict[str, Any]],
|
|
49
|
+
exclude_node_ids: Set[str],
|
|
50
|
+
wf_nodes: List[Dict[str, Any]],
|
|
49
51
|
) -> List[Dict[str, Any]]:
|
|
50
52
|
"""
|
|
51
53
|
按节点类型和参数名整理参数信息,便于输出。
|
|
@@ -56,6 +58,10 @@ def summarize_params(
|
|
|
56
58
|
node_id = param["node_id"]
|
|
57
59
|
if node_id in exclude_node_ids:
|
|
58
60
|
continue
|
|
61
|
+
wf_node = get_node_id_from_wf_nodes(wf_nodes, node_id)
|
|
62
|
+
title = param["class_type"]
|
|
63
|
+
if wf_node and wf_node.get("title", None):
|
|
64
|
+
title = wf_node.get("title")
|
|
59
65
|
key = (param["class_type"], node_id)
|
|
60
66
|
if key not in summary:
|
|
61
67
|
summary[key] = {
|
|
@@ -63,6 +69,7 @@ def summarize_params(
|
|
|
63
69
|
"displayName": param["class_type"],
|
|
64
70
|
"nodeId": node_id,
|
|
65
71
|
"params": [],
|
|
72
|
+
"title": title,
|
|
66
73
|
}
|
|
67
74
|
summary[key]["params"].append(
|
|
68
75
|
{
|
|
@@ -75,8 +82,22 @@ def summarize_params(
|
|
|
75
82
|
return list(summary.values())
|
|
76
83
|
|
|
77
84
|
|
|
85
|
+
def get_node_id_from_wf_nodes(
|
|
86
|
+
wf_nodes: List[Dict[str, Any]], node_id: int
|
|
87
|
+
) -> Dict[str, Any]:
|
|
88
|
+
for wf_node in wf_nodes:
|
|
89
|
+
if wf_node.get("id", 0) == node_id:
|
|
90
|
+
return wf_node
|
|
91
|
+
return None
|
|
92
|
+
|
|
93
|
+
|
|
78
94
|
def parse_workflow_io(request_data) -> Dict[str, Any]:
|
|
79
95
|
prompt = request_data.get("prompt", {})
|
|
96
|
+
extra_data = request_data.get("extra_data", {})
|
|
97
|
+
|
|
98
|
+
extra_pnginfo = extra_data.get("extra_pnginfo", {})
|
|
99
|
+
workflow = extra_pnginfo.get("workflow", {})
|
|
100
|
+
wf_nodes = workflow.get("nodes", [])
|
|
80
101
|
|
|
81
102
|
# 1. 输出参数(推断叶子节点)
|
|
82
103
|
leaf_nodes = get_leaf_nodes_from_prompt(prompt)
|
|
@@ -84,18 +105,25 @@ def parse_workflow_io(request_data) -> Dict[str, Any]:
|
|
|
84
105
|
for node_id in leaf_nodes:
|
|
85
106
|
node = prompt[node_id]
|
|
86
107
|
class_type = node.get("class_type")
|
|
108
|
+
wf_node = get_node_id_from_wf_nodes(wf_nodes, node_id)
|
|
109
|
+
title = class_type
|
|
110
|
+
if wf_node and wf_node.get("title", None):
|
|
111
|
+
title = wf_node.get("title")
|
|
87
112
|
output_nodes.append(
|
|
88
113
|
{
|
|
89
114
|
"nodeId": node_id,
|
|
90
115
|
"name": class_type,
|
|
91
116
|
"displayName": class_type,
|
|
117
|
+
"title": title,
|
|
92
118
|
"params": [],
|
|
93
119
|
}
|
|
94
120
|
)
|
|
95
121
|
|
|
96
122
|
# 2. 输入参数(排除已作为输出的节点)
|
|
97
123
|
input_params = get_input_params(prompt)
|
|
98
|
-
input_summary = summarize_params(
|
|
124
|
+
input_summary = summarize_params(
|
|
125
|
+
input_params, exclude_node_ids=leaf_nodes, wf_nodes=wf_nodes
|
|
126
|
+
)
|
|
99
127
|
|
|
100
128
|
# 3. 构造response_body.json格式
|
|
101
129
|
return {"data": {"inputs": input_summary, "outputs": output_nodes}}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
bizydraft/__init__.py,sha256=OM-sKCQrPh25nHVJIX-DgF1raMYyoWLSuyduIAHt0Gs,78
|
|
2
|
+
bizydraft/hijack_nodes.py,sha256=xPVLBBnRiJaI8ZbR80O8W4C9SlNAp7MxP7dKj_pRlYs,869
|
|
3
|
+
bizydraft/hijack_routes.py,sha256=EcO5uggc0mmyOuCk2VU7cAdtXrIN6eCriogQ0okiwq8,7417
|
|
4
|
+
bizydraft/postload.py,sha256=YfiFjJ7MLN6WNar19lLdAL_3IPr5GyI3G4rbZIiAgXU,562
|
|
5
|
+
bizydraft/prestartup_patch.py,sha256=Rh_D-rEUmPaojSrl8CEBMAhSgwtLSm6gH2Mzmk5NCuQ,316
|
|
6
|
+
bizydraft/resp.py,sha256=8INvKOe5Dgai3peKfqKjrhUoYeuXWXn358w30-_cY-A,369
|
|
7
|
+
bizydraft/server.py,sha256=L2zoJgOisr65IRphOyko74AdsLel59gh55peyMaUrO8,2102
|
|
8
|
+
bizydraft/workflow_io.py,sha256=Wu3wd3ZPIdoNihbCAhvOYA4Y0GHOVdpKefJx-MxPEds,4293
|
|
9
|
+
bizydraft/static/js/handleStyle.js,sha256=P2DNMiKHr--ekn3CGNOAHU46OJCCsifejxw97kLmb7Q,1676
|
|
10
|
+
bizydraft/static/js/hookLoadImage.js,sha256=Cl1FxJARZYF_qXbs-cv3ylLtoZPNVNCv4-xTtnFmI6E,5675
|
|
11
|
+
bizydraft/static/js/main.js,sha256=cZ-7wR9T8aNLzIrTjc-g9xVZf7z6TXWl1zhP_wXSSVo,150
|
|
12
|
+
bizydraft/static/js/postEvent.js,sha256=Os2J6X-0KNoUei918HheqXgmNVE64suslEdeNiNjemo,27582
|
|
13
|
+
bizydraft/static/js/socket.js,sha256=VE3fTAgEfM0FZhL526Skt7OCRokOa3mzTCAjAomI_tE,2432
|
|
14
|
+
bizydraft/static/js/tool.js,sha256=O96xFEWeHksUCBzv1buq8dtaNlb3hE3vSmtiFO2U8lg,757
|
|
15
|
+
bizydraft/static/js/uploadFile.js,sha256=WvglKzHMeOzDhOH3P-fLcPHxCLbKOJpo4DntoRxeJtI,4908
|
|
16
|
+
bizydraft-0.1.30.dist-info/METADATA,sha256=QGKRH-wykHbliY0KD-6fOmNXyAEOWEe99JnxLDphpNg,73
|
|
17
|
+
bizydraft-0.1.30.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
18
|
+
bizydraft-0.1.30.dist-info/top_level.txt,sha256=XtoBq6hjZhXIM7aas4GtPDtAiKo8FdLzMABXW8qqQ8M,10
|
|
19
|
+
bizydraft-0.1.30.dist-info/RECORD,,
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
bizydraft/__init__.py,sha256=OM-sKCQrPh25nHVJIX-DgF1raMYyoWLSuyduIAHt0Gs,78
|
|
2
|
-
bizydraft/hijack_nodes.py,sha256=xPVLBBnRiJaI8ZbR80O8W4C9SlNAp7MxP7dKj_pRlYs,869
|
|
3
|
-
bizydraft/hijack_routes.py,sha256=MlietlmTU-Lj7evZo5yZE-ghQJZ9_1vdpyHXAXYfoFw,7417
|
|
4
|
-
bizydraft/postload.py,sha256=YfiFjJ7MLN6WNar19lLdAL_3IPr5GyI3G4rbZIiAgXU,562
|
|
5
|
-
bizydraft/prestartup_patch.py,sha256=Rh_D-rEUmPaojSrl8CEBMAhSgwtLSm6gH2Mzmk5NCuQ,316
|
|
6
|
-
bizydraft/resp.py,sha256=8INvKOe5Dgai3peKfqKjrhUoYeuXWXn358w30-_cY-A,369
|
|
7
|
-
bizydraft/server.py,sha256=0Um4lA_UZN-SRD_nW0lo0pekI6hPNuDgQjKB21ZsXcw,2102
|
|
8
|
-
bizydraft/workflow_io.py,sha256=lqLWhqNs5uJZ0IlTGyoEfBk6WjsWm0Btl6bQY-nldLo,3364
|
|
9
|
-
bizydraft/static/js/handleStyle.js,sha256=P2DNMiKHr--ekn3CGNOAHU46OJCCsifejxw97kLmb7Q,1676
|
|
10
|
-
bizydraft/static/js/hookLoadImage.js,sha256=GklOwfIkXhSfCFrHBz4pPqaSnBiKjegbpDknrzvXYOc,5767
|
|
11
|
-
bizydraft/static/js/main.js,sha256=cZ-7wR9T8aNLzIrTjc-g9xVZf7z6TXWl1zhP_wXSSVo,150
|
|
12
|
-
bizydraft/static/js/postEvent.js,sha256=lXo35DUiBmzGFMtOL2ULcjbCscNb5eAZ98_eX7en3hM,27926
|
|
13
|
-
bizydraft/static/js/socket.js,sha256=vewGQLgdJSrjvqptEDxLirZRXZUjWTJDmDdjs4mbf4k,2436
|
|
14
|
-
bizydraft/static/js/tool.js,sha256=Ejyb5GiFhuoCp5_dBvu2suagbxGHCkR2Lg_4rMKN2ls,756
|
|
15
|
-
bizydraft/static/js/uploadFile.js,sha256=5OjLLaCHZkobLltNs27K5GgZBFHZJowBwS-oakLoNW4,4985
|
|
16
|
-
bizydraft-0.1.28.dist-info/METADATA,sha256=gj7ghFoGT71u0GqpFG-lMtXaRGE7spfbvug-GuLW2yY,73
|
|
17
|
-
bizydraft-0.1.28.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
18
|
-
bizydraft-0.1.28.dist-info/top_level.txt,sha256=XtoBq6hjZhXIM7aas4GtPDtAiKo8FdLzMABXW8qqQ8M,10
|
|
19
|
-
bizydraft-0.1.28.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|