bizydraft 0.2.67__py3-none-any.whl → 0.2.67.dev20250929023814__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.

@@ -2,41 +2,55 @@ import { app } from "../../scripts/app.js";
2
2
  import '../BizyAir/bizyair_frontend.js'
3
3
  import { hideWidget } from './tool.js'
4
4
 
5
- // 白名单配置 - 不符合正则表达式的节点名称和对应的模型类型
6
- const WHITELIST_NODES = {
7
- "LayerMask: YoloV8Detect": "Detection",
8
- "Lora Loader Stack (rgthree)": "LoRa",
9
- "easy loraNames": "LoRa",
10
- "easy loraStack": "LoRa",
11
- "Load Lora": "LoRa",
12
- "Intrinsic_lora_sampling": "LoRa",
13
- "ADE_LoadAnimateDiffModel": "Checkpoint",
14
- "ADE_AnimateDiffLoRALoader": "LoRa",
15
- "easy ultralyticsDetectorPipe": "Detection",
16
- "UltralyticsDetectorProvider": "Detection",
17
- "ONNXDetectorProvider": "Detection",
18
- "SAMLoader": "Detection",
19
- "easy samLoaderPipe": "Detection",
20
- "WanVideoModelLoader": "UNet",
21
- "LoadWanVideoT5TextEncoder": "CLIP",
22
- "WanVideoLoraSelect": "LoRa",
23
- "ReActorLoadFaceModel": "Detection",
24
- "ReActorMaskHelper": "Detection",
25
- "LoadAndApplyICLightUnet": "UNet",
26
- "SeedVR2": "UNet",
27
- "LoadLaMaModel": "Other",
28
- "Upscale Model Loader": "Upscaler",
29
- "CR Upscale Image": "Upscaler",
30
- "SUPIR_Upscale": "Upscaler",
31
- "CR Multi Upscale Stack": "Upscaler",
32
- "QuadrupleCLIPLoader": "CLIP",
33
- "LoadWanVideoClipTextEncoder": "CLIP",
34
- "SUPIR_model_loader_v2_clip": "CLIP",
35
- "LayerMask: LoadSAM2Model": "Detection",
36
- // "LayerMask: LoadCannyModel": "Detection",
37
- "LayerMask: SegmentAnythingUltra V2": "Detection",
38
- "LoadFramePackModel": "UNet"
39
- };
5
+ // 动态配置缓存
6
+ let nodeConfigCache = null;
7
+ let configLoadPromise = null;
8
+ let storageClearedOnce = false;
9
+
10
+ // API配置
11
+ const CONFIG_API_URL = 'https://uat87.bizyair.cn/api/special/comfyagent_node_config?t=' + Math.floor(Date.now() / 60000);
12
+
13
+ // 获取节点配置的API函数
14
+ async function fetchNodeConfig() {
15
+ if (nodeConfigCache) {
16
+ return nodeConfigCache;
17
+ }
18
+
19
+ if (configLoadPromise) {
20
+ return configLoadPromise;
21
+ }
22
+
23
+ configLoadPromise = (async () => {
24
+ try {
25
+ console.log('正在从API获取节点配置...');
26
+ const response = await fetch(CONFIG_API_URL);
27
+
28
+ if (!response.ok) {
29
+ throw new Error(`HTTP error! status: ${response.status}`);
30
+ }
31
+
32
+ const result = await response.json();
33
+
34
+ if (result.code === 20000 && result.data && result.data.weight_load_nodes) {
35
+ nodeConfigCache = result.data.weight_load_nodes;
36
+ console.log('节点配置加载成功:', Object.keys(nodeConfigCache).length, '个节点');
37
+ return nodeConfigCache;
38
+ } else {
39
+ throw new Error('API返回数据格式不正确');
40
+ }
41
+ } catch (error) {
42
+ console.error('获取节点配置失败:', error);
43
+ nodeConfigCache = null;
44
+ return null;
45
+ }
46
+ })();
47
+
48
+ return configLoadPromise;
49
+ }
50
+
51
+ // 启动时后台预取(不阻塞后续逻辑)
52
+ try { void fetchNodeConfig(); } catch (e) { /* noop */ }
53
+
40
54
  const HAZY_WHITELIST_NODES = {
41
55
 
42
56
  }
@@ -93,39 +107,86 @@ const possibleWidgetNames=[
93
107
  "grounding_dino_model"
94
108
  ]
95
109
 
96
- // 根据节点名称匹配模型类型
97
- function getModelTypeFromNodeName(nodeName) {
110
+ // 读取 mode_type(不再兼容旧的 modelType)
111
+ function getModelTypeFromInput(inputConfig) {
112
+ console.log('inputConfig', inputConfig);
113
+ if (!inputConfig) return undefined;
114
+ console.log('inputConfig', inputConfig);
115
+ return inputConfig.mode_type;
116
+ }
117
+
118
+ // 根据节点名称获取节点配置信息(名单优先,正则补充;不阻塞返回)
119
+ async function getNodeConfig(nodeName) {
98
120
  if (/bizyair/i.test(nodeName)) {
99
121
  return null;
100
122
  }
101
- // 首先检查白名单
102
- if (WHITELIST_NODES.hasOwnProperty(nodeName)) {
103
- console.log(`白名单匹配: ${nodeName} -> ${WHITELIST_NODES[nodeName]}`);
104
- return WHITELIST_NODES[nodeName];
105
- }
106
- const HAZY_WHITELIST_NODES_KEYS = Object.keys(HAZY_WHITELIST_NODES);
107
- const thisKey = HAZY_WHITELIST_NODES_KEYS.find(key => nodeName.toLowerCase().includes(key.toLowerCase()));
108
- if (thisKey) {
109
- console.log(`模糊白名单匹配: ${nodeName} -> ${HAZY_WHITELIST_NODES[thisKey]}`);
110
- return HAZY_WHITELIST_NODES[thisKey];
123
+
124
+ // 1) 名单(API)优先(仅用缓存,不等待网络)
125
+ if (nodeConfigCache && nodeConfigCache[nodeName]) {
126
+ return { nodeName, config: nodeConfigCache[nodeName] };
111
127
  }
112
128
 
129
+ // 若尚未发起请求,后台发起一次
130
+ if (!configLoadPromise) { try { void fetchNodeConfig(); } catch (e) {} }
113
131
 
114
- // 然后使用正则表达式匹配
132
+ // 2) 正则补充:如 XxxLoader => Xxx(立即返回,不等待API)
115
133
  const regex = /^(\w+).*Loader.*/i;
116
134
  const match = nodeName.match(regex);
117
135
  if (match) {
118
- return match[1];
136
+ const inferredType = match[1];
137
+ return { nodeName, config: { inputs: { [nodeName]: { mode_type: inferredType, required: true } } } };
119
138
  }
120
139
  return null;
121
140
  }
122
141
 
123
- function createSetWidgetCallback(modelType, selectedBaseModels = []) {
142
+ function createSetWidgetCallback(nodeConfig, selectedBaseModels = []) {
124
143
  return function setWidgetCallback() {
125
- const targetWidget = this.widgets.filter(widget => possibleWidgetNames.includes(widget.name));
126
- targetWidget.forEach((wdt, index) => {
127
- wdt.value = wdt.value || "to choose"
128
- wdt.mouse = function(e, pos, canvas) {
144
+ if (!nodeConfig || !nodeConfig.config || !nodeConfig.config.inputs) {
145
+ console.warn('节点配置无效:', nodeConfig);
146
+ return;
147
+ }
148
+
149
+ const inputs = nodeConfig.config.inputs;
150
+ const inputKeys = Object.keys(inputs);
151
+
152
+ // 根据API配置找到对应的widget
153
+ const targetWidgets = [];
154
+ inputKeys.forEach(inputKey => {
155
+ const widget = this.widgets.find(w => w.name === inputKey);
156
+ if (widget) {
157
+ targetWidgets.push({
158
+ widget: widget,
159
+ inputKey: inputKey,
160
+ inputConfig: inputs[inputKey]
161
+ });
162
+ }
163
+ });
164
+
165
+ // 如果没有找到匹配的widget,使用原来的逻辑作为备选
166
+ if (targetWidgets.length === 0) {
167
+ const fallbackWidgets = this.widgets.filter(widget => possibleWidgetNames.includes(widget.name));
168
+ fallbackWidgets.forEach((wdt, index) => {
169
+ const firstInput = Object.values(inputs)[0];
170
+ if (firstInput) {
171
+ targetWidgets.push({
172
+ widget: wdt,
173
+ inputKey: wdt.name,
174
+ inputConfig: firstInput,
175
+ index: index
176
+ });
177
+ }
178
+ });
179
+ }
180
+
181
+ targetWidgets.forEach(({ widget, inputKey, inputConfig, index }) => {
182
+ // 检查是否禁用comfyagent
183
+ if (inputConfig.disable_comfyagent) {
184
+ console.log(`跳过禁用的widget: ${inputKey}`);
185
+ return;
186
+ }
187
+
188
+ widget.value = widget.value || "to choose";
189
+ widget.mouse = function(e, pos, canvas) {
129
190
  try {
130
191
  if (e.type === "pointerdown" || e.type === "mousedown" || e.type === "click" || e.type === "pointerup") {
131
192
  e.preventDefault();
@@ -145,25 +206,23 @@ function createSetWidgetCallback(modelType, selectedBaseModels = []) {
145
206
 
146
207
  if (typeof bizyAirLib !== 'undefined' && typeof bizyAirLib.showModelSelect === 'function') {
147
208
  bizyAirLib.showModelSelect({
148
- modelType: [modelType],
209
+ modelType: [getModelTypeFromInput(inputConfig)],
149
210
  selectedBaseModels,
150
211
  onApply: (version, model) => {
151
212
  if (!currentNode || !currentNode.widgets) return;
152
213
 
153
- const currentLora = currentNode.widgets.filter(widget => possibleWidgetNames.includes(widget.name));
154
- let currentModel;
155
-
156
- if (index === 0) {
157
- currentModel = currentNode.widgets.find(w => w.name === "model_version_id");
158
- } else {
159
- const fieldName = `model_version_id${index + 1}`;
160
- currentModel = currentNode.widgets.find(w => w.name === fieldName);
161
- }
214
+ // 更新widget
215
+ widget.value = version.file_name;
162
216
 
163
- if (model && currentModel && version) {
164
- currentLora[index].value = version.file_name;
217
+ // 找到对应的隐藏字段(固定命名:model_version_id, model_version_id2...)
218
+ let modelVersionField;
219
+ // 真实绑定顺序应与targetWidgets相同,因此通过当前widget在targetWidgets的索引定位
220
+ const twIndex = targetWidgets.findIndex(tw => tw.widget === widget);
221
+ const fieldName = twIndex === 0 ? "model_version_id" : `model_version_id${twIndex + 1}`;
222
+ modelVersionField = currentNode.widgets.find(w => w.name === fieldName);
165
223
 
166
- currentModel.value = version.id;
224
+ if (model && modelVersionField && version) {
225
+ modelVersionField.value = version.id;
167
226
  currentNode.setDirtyCanvas(true);
168
227
 
169
228
  // 删除节点上的感叹号徽章
@@ -195,17 +254,17 @@ function createSetWidgetCallback(modelType, selectedBaseModels = []) {
195
254
  }
196
255
  };
197
256
 
198
- // wdt.node = this;
199
- wdt.options = wdt.options || {};
200
- wdt.options.values = () => [];
201
- wdt.options.editable = false;
202
- wdt.clickable = true;
203
- wdt.processMouse = true;
257
+ widget.options = widget.options || {};
258
+ widget.options.values = () => [];
259
+ widget.options.editable = false;
260
+ widget.clickable = true;
261
+ widget.processMouse = true;
204
262
  });
205
263
  }
206
264
  }
207
265
 
208
- function setupNodeMouseBehavior(node, modelType) {
266
+ function setupNodeMouseBehavior(node, nodeConfig) {
267
+ // 固定隐藏主版本ID字段(其余编号字段为hidden类型本身不可见)
209
268
  hideWidget(node, "model_version_id");
210
269
 
211
270
  // 只设置必要的状态信息,不修改onMouseDown(已在上面的扩展中处理)
@@ -213,7 +272,7 @@ function setupNodeMouseBehavior(node, modelType) {
213
272
  node._bizyairState = {
214
273
  lastClickTime: 0,
215
274
  DEBOUNCE_DELAY: 300,
216
- modelType: modelType
275
+ nodeConfig: nodeConfig
217
276
  };
218
277
  }
219
278
  }
@@ -227,6 +286,9 @@ function addBadge(node) {
227
286
  height: 20,
228
287
  cornerRadius: 10
229
288
  })
289
+ if (!Array.isArray(node.badges)) {
290
+ node.badges = []
291
+ }
230
292
  if (node.hasTips) {
231
293
  return
232
294
  }
@@ -237,71 +299,119 @@ app.registerExtension({
237
299
  name: "bizyair.hook.load.model",
238
300
  async beforeRegisterNodeDef(nodeType, nodeData, app) {
239
301
 
240
- // localStorage.removeItem('workflow')
241
- localStorage.clear()
242
- sessionStorage.clear()
302
+ if (!storageClearedOnce) {
303
+ // localStorage.removeItem('workflow')
304
+ localStorage.clear()
305
+ sessionStorage.clear()
306
+ storageClearedOnce = true;
307
+ }
243
308
  const interval = setInterval(() => {
244
309
  if (window.switchLanguage) {
245
310
  window.switchLanguage('zh')
246
311
  clearInterval(interval)
247
312
  }
248
313
  }, 100)
249
- const modelType = getModelTypeFromNodeName(nodeData.name);
250
- if (modelType) {
314
+
315
+ // 异步获取节点配置
316
+ const nodeConfig = await getNodeConfig(nodeData.name);
317
+ if (nodeConfig) {
251
318
  const onNodeCreated = nodeType.prototype.onNodeCreated;
252
319
  nodeType.prototype.onNodeCreated = function() {
253
320
  try {
254
- const targetWidget = this.widgets.filter(widget => possibleWidgetNames.includes(widget.name));
255
- // 为每个targetWidget添加对应的model_version_id字段
256
- targetWidget.forEach((widget, index) => {
257
- let model_version_id;
258
- if (index === 0) {
259
- // 第一个保持原名
260
- model_version_id = this.widgets.find(w => w.name === "model_version_id");
261
- if (!model_version_id) {
262
- model_version_id = this.addWidget("hidden", "model_version_id", "", function(){
263
- }, {
264
- serialize: true,
265
- values: []
266
- });
267
- }
268
- } else {
269
- // 从第二个开始使用新名称
270
- const fieldName = `model_version_id${index + 1}`;
271
- model_version_id = this.widgets.find(w => w.name === fieldName);
272
- if (!model_version_id) {
273
- model_version_id = this.addWidget("hidden", fieldName, "", function(){
274
- }, {
275
- serialize: true,
276
- values: []
277
- });
278
- }
321
+ const inputs = nodeConfig.config.inputs;
322
+ const inputKeys = Object.keys(inputs);
323
+
324
+ // 计算需处理的目标widgets(按禁用过滤后再确定数量和索引)
325
+ let targetWidgets = [];
326
+ // 优先按API字段名匹配
327
+ inputKeys.forEach((key) => {
328
+ const cfg = inputs[key];
329
+ if (cfg && !cfg.disable_comfyagent) {
330
+ const w = this.widgets.find(x => x.name === key);
331
+ if (w) targetWidgets.push(w);
279
332
  }
280
333
  });
334
+ // 如果一个都没匹配到,使用fallback列表
335
+ if (targetWidgets.length === 0) {
336
+ const fallback = this.widgets.filter(w => possibleWidgetNames.includes(w.name));
337
+ // fallback 不再过滤 disable 标记,因为此路径说明API key未命中
338
+ targetWidgets = fallback;
339
+ }
340
+
341
+ // 按目标widgets数量创建隐藏字段(model_version_id, model_version_id2...)
342
+ targetWidgets.forEach((_, idx) => {
343
+ const fieldName = idx === 0 ? "model_version_id" : `model_version_id${idx + 1}`;
344
+ let mv = this.widgets.find(w => w.name === fieldName);
345
+ if (!mv) {
346
+ mv = this.addWidget("hidden", fieldName, "", function(){}, { serialize: true, values: [] });
347
+ }
348
+ });
349
+
350
+ // 如果没有找到匹配的输入字段,使用兼容性逻辑
351
+ if (inputKeys.length === 0) {
352
+ const targetWidget = this.widgets.filter(widget => possibleWidgetNames.includes(widget.name));
353
+ targetWidget.forEach((widget, index) => {
354
+ let model_version_id;
355
+ if (index === 0) {
356
+ model_version_id = this.widgets.find(w => w.name === "model_version_id");
357
+ if (!model_version_id) {
358
+ model_version_id = this.addWidget("hidden", "model_version_id", "", function(){
359
+ }, {
360
+ serialize: true,
361
+ values: []
362
+ });
363
+ }
364
+ } else {
365
+ const fieldName = `model_version_id${index + 1}`;
366
+ model_version_id = this.widgets.find(w => w.name === fieldName);
367
+ if (!model_version_id) {
368
+ model_version_id = this.addWidget("hidden", fieldName, "", function(){
369
+ }, {
370
+ serialize: true,
371
+ values: []
372
+ });
373
+ }
374
+ }
375
+ });
376
+ }
281
377
 
282
378
  const result = onNodeCreated?.apply(this, arguments);
283
379
  let selectedBaseModels = [];
284
- targetWidget.forEach((widget, index) => {
285
- let model_version_id;
286
- if (index === 0) {
287
- model_version_id = this.widgets.find(w => w.name === "model_version_id");
288
- setTimeout(() => {
289
- if (widget.value != 'NONE' && model_version_id && !model_version_id.value) {
290
- addBadge(this);
291
- }
292
- }, 200)
293
- } else {
294
- const fieldName = `model_version_id${index + 1}`;
295
- model_version_id = this.widgets.find(w => w.name === fieldName);
380
+
381
+ // 检查是否需要添加徽章(与targetWidgets一致的索引规则)
382
+ targetWidgets.forEach((widget, idx) => {
383
+ const fieldName = idx === 0 ? "model_version_id" : `model_version_id${idx + 1}`;
384
+ const mv = this.widgets.find(w => w.name === fieldName);
385
+ if (mv) {
296
386
  setTimeout(() => {
297
- if (widget.value != 'NONE' && model_version_id && !model_version_id.value) {
298
- addBadge(this);
299
- }
300
- }, 200)
387
+ if (widget.value != 'NONE' && !mv.value) addBadge(this);
388
+ }, 200);
301
389
  }
302
390
  });
303
391
 
304
- createSetWidgetCallback(modelType, selectedBaseModels).call(this);
392
+ // 如果没有找到匹配的输入字段,使用兼容性逻辑检查徽章
393
+ if (inputKeys.length === 0) {
394
+ const targetWidget = this.widgets.filter(widget => possibleWidgetNames.includes(widget.name));
395
+ targetWidget.forEach((widget, index) => {
396
+ let model_version_id;
397
+ if (index === 0) {
398
+ model_version_id = this.widgets.find(w => w.name === "model_version_id");
399
+ } else {
400
+ const fieldName = `model_version_id${index + 1}`;
401
+ model_version_id = this.widgets.find(w => w.name === fieldName);
402
+ }
403
+
404
+ if (model_version_id) {
405
+ setTimeout(() => {
406
+ if (widget.value != 'NONE' && !model_version_id.value) {
407
+ addBadge(this);
408
+ }
409
+ }, 200);
410
+ }
411
+ });
412
+ }
413
+
414
+ createSetWidgetCallback(nodeConfig, selectedBaseModels).call(this);
305
415
  return result;
306
416
  } catch (error) {
307
417
  console.error("Error in node creation:", error);
@@ -310,10 +420,10 @@ app.registerExtension({
310
420
  }
311
421
  },
312
422
  async nodeCreated(node) {
313
- const modelType = getModelTypeFromNodeName(node?.comfyClass);
423
+ const nodeConfig = await getNodeConfig(node?.comfyClass);
314
424
 
315
- if (modelType) {
316
- setupNodeMouseBehavior(node, modelType);
425
+ if (nodeConfig) {
426
+ setupNodeMouseBehavior(node, nodeConfig);
317
427
  }
318
428
  }
319
429
  })
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bizydraft
3
- Version: 0.2.67
3
+ Version: 0.2.67.dev20250929023814
4
4
  Summary: bizydraft
5
5
  Requires-Dist: loguru
6
6
  Requires-Dist: aiohttp
@@ -14,7 +14,7 @@ bizydraft/static/js/aiAppHandler.js,sha256=4PcrcD9gv-yqBelkIfuhoN0ZwuFv66f7-bmwq
14
14
  bizydraft/static/js/freezeModeHandler.js,sha256=SjpHD2nYymR-E13B0YcqkA6e4WycZOVI3c48Ts9qvWE,18027
15
15
  bizydraft/static/js/handleStyle.js,sha256=liIzTu-wnV172g58gHWGLYTfd86xpJxL4A-HuHpFnq4,3616
16
16
  bizydraft/static/js/hookLoadImage.js,sha256=aFRWkgJW-Cp-YHjZh-3j-vsVcNaDZpBVoQqcFZ2Po0g,8186
17
- bizydraft/static/js/hookLoadModel.js,sha256=OHHTC1Hk8WXHlmDaNzMNGvT6BvQ6dGvxqALqboxUz84,12317
17
+ bizydraft/static/js/hookLoadModel.js,sha256=pVAiQ7EUy1c1FozPIECs8EpBj5mbSRg5fsSI2JAfWu4,17010
18
18
  bizydraft/static/js/main.js,sha256=oEsVEUZSo8ipx93oqs2WFQSRgp46XQ_D-Xao-wen2S8,121
19
19
  bizydraft/static/js/nodeFocusHandler.js,sha256=24xXbS4Q-GjJdRqf11i-1pBo8MkOJ24F7MHFV44EG6Q,4683
20
20
  bizydraft/static/js/nodeParamsFilter.js,sha256=H7lBB0G8HNqoGhOCH1hNXqPU-rPlrFyTxg_f_JgLEMk,4168
@@ -23,7 +23,7 @@ bizydraft/static/js/socket.js,sha256=VE3fTAgEfM0FZhL526Skt7OCRokOa3mzTCAjAomI_tE
23
23
  bizydraft/static/js/tool.js,sha256=VupamUuh7tYiDnBTrL5Z_yLmhJinskhzRXwE3zfsKZM,2901
24
24
  bizydraft/static/js/uploadFile.js,sha256=WvglKzHMeOzDhOH3P-fLcPHxCLbKOJpo4DntoRxeJtI,4908
25
25
  bizydraft/static/js/workflow_io.js,sha256=FWAjncvWhvy-3nN_legD2fpRwgnIncpRLHU5X016a-U,5236
26
- bizydraft-0.2.67.dist-info/METADATA,sha256=QRYlOd6JyU3IOLRON9niB1_aYAdiHeItchzWCUGJb5U,162
27
- bizydraft-0.2.67.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
28
- bizydraft-0.2.67.dist-info/top_level.txt,sha256=XtoBq6hjZhXIM7aas4GtPDtAiKo8FdLzMABXW8qqQ8M,10
29
- bizydraft-0.2.67.dist-info/RECORD,,
26
+ bizydraft-0.2.67.dev20250929023814.dist-info/METADATA,sha256=vNjWDqm890YJ_thI97f4Z7ZNOqsxcjwWOyjcJMEAtPo,180
27
+ bizydraft-0.2.67.dev20250929023814.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
28
+ bizydraft-0.2.67.dev20250929023814.dist-info/top_level.txt,sha256=XtoBq6hjZhXIM7aas4GtPDtAiKo8FdLzMABXW8qqQ8M,10
29
+ bizydraft-0.2.67.dev20250929023814.dist-info/RECORD,,