bizyengine 1.2.76__py3-none-any.whl → 1.2.78__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.
- bizyengine/bizy_server/api_client.py +53 -66
- bizyengine/bizy_server/errno.py +10 -0
- bizyengine/bizy_server/server.py +19 -0
- bizyengine/bizyair_extras/third_party_api/__init__.py +1 -0
- bizyengine/bizyair_extras/third_party_api/nodes_doubao.py +32 -16
- bizyengine/bizyair_extras/third_party_api/nodes_flux.py +9 -6
- bizyengine/bizyair_extras/third_party_api/nodes_gemini.py +26 -10
- bizyengine/bizyair_extras/third_party_api/nodes_gpt.py +6 -6
- bizyengine/bizyair_extras/third_party_api/nodes_hailuo.py +6 -6
- bizyengine/bizyair_extras/third_party_api/nodes_kling.py +308 -21
- bizyengine/bizyair_extras/third_party_api/nodes_sora.py +6 -6
- bizyengine/bizyair_extras/third_party_api/nodes_veo3.py +9 -9
- bizyengine/bizyair_extras/third_party_api/nodes_vidu.py +269 -0
- bizyengine/bizyair_extras/third_party_api/nodes_wan_api.py +222 -6
- bizyengine/bizyair_extras/third_party_api/trd_nodes_base.py +3 -2
- bizyengine/misc/utils.py +18 -4
- bizyengine/version.txt +1 -1
- {bizyengine-1.2.76.dist-info → bizyengine-1.2.78.dist-info}/METADATA +1 -1
- {bizyengine-1.2.76.dist-info → bizyengine-1.2.78.dist-info}/RECORD +21 -20
- {bizyengine-1.2.76.dist-info → bizyengine-1.2.78.dist-info}/WHEEL +0 -0
- {bizyengine-1.2.76.dist-info → bizyengine-1.2.78.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
from bizyairsdk import tensor_to_bytesio
|
|
2
|
+
|
|
3
|
+
from .trd_nodes_base import BizyAirTrdApiBaseNode
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class VIDU_Q1_T2V_API(BizyAirTrdApiBaseNode):
|
|
7
|
+
NODE_DISPLAY_NAME = "Vidu Q1 Text To Video"
|
|
8
|
+
RETURN_TYPES = ("VIDEO", """{"vidu-q1-text2video": "vidu-q1"}""")
|
|
9
|
+
RETURN_NAMES = ("video", "bizyair_model_name")
|
|
10
|
+
CATEGORY = "☁️BizyAir/External APIs/Vidu"
|
|
11
|
+
|
|
12
|
+
@classmethod
|
|
13
|
+
def INPUT_TYPES(cls):
|
|
14
|
+
return {
|
|
15
|
+
"required": {
|
|
16
|
+
"prompt": (
|
|
17
|
+
"STRING",
|
|
18
|
+
{
|
|
19
|
+
"multiline": True,
|
|
20
|
+
"default": "",
|
|
21
|
+
},
|
|
22
|
+
),
|
|
23
|
+
"seed": ("INT", {"default": 0, "min": 0, "max": 2147483647}),
|
|
24
|
+
"style": (["general", "anime"], {"default": "general"}),
|
|
25
|
+
"duration": ([5], {"default": 5}),
|
|
26
|
+
"aspect_ratio": (["16:9", "9:16", "1:1"], {"default": "16:9"}),
|
|
27
|
+
"resolution": (["1080p"], {"default": "1080p"}),
|
|
28
|
+
"movement_amplitude": (
|
|
29
|
+
["auto", "small", "medium", "large"],
|
|
30
|
+
{"default": "auto", "tooltip": "画面中物体的运动幅度。"},
|
|
31
|
+
),
|
|
32
|
+
"bgm": (
|
|
33
|
+
"BOOLEAN",
|
|
34
|
+
{
|
|
35
|
+
"default": False,
|
|
36
|
+
"tooltip": "当设置为 true 时,系统将自动添加合适的 BGM。BGM 无时长限制,系统会自动适配。",
|
|
37
|
+
},
|
|
38
|
+
),
|
|
39
|
+
},
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
def handle_inputs(self, headers, prompt_id, **kwargs):
|
|
43
|
+
prompt = kwargs.get("prompt", "")
|
|
44
|
+
seed = kwargs.get("seed", 0)
|
|
45
|
+
style = kwargs.get("style", "general")
|
|
46
|
+
duration = kwargs.get("duration", 5)
|
|
47
|
+
aspect_ratio = kwargs.get("aspect_ratio", "16:9")
|
|
48
|
+
resolution = kwargs.get("resolution", "1080p")
|
|
49
|
+
movement_amplitude = kwargs.get("movement_amplitude", "auto")
|
|
50
|
+
bgm = kwargs.get("bgm", False)
|
|
51
|
+
if len(prompt) > 1500:
|
|
52
|
+
raise ValueError("Prompt must be less than 1500 characters")
|
|
53
|
+
data = {
|
|
54
|
+
"prompt": prompt,
|
|
55
|
+
"seed": seed,
|
|
56
|
+
"style": style,
|
|
57
|
+
"duration": duration,
|
|
58
|
+
"aspect_ratio": aspect_ratio,
|
|
59
|
+
"resolution": resolution,
|
|
60
|
+
"movement_amplitude": movement_amplitude,
|
|
61
|
+
"bgm": bgm,
|
|
62
|
+
"model": "vidu-q1-text2video",
|
|
63
|
+
}
|
|
64
|
+
return data, "vidu-q1"
|
|
65
|
+
|
|
66
|
+
def handle_outputs(self, outputs):
|
|
67
|
+
return (outputs[0][0], "")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class VIDU_Q1_I2V_API(BizyAirTrdApiBaseNode):
|
|
71
|
+
NODE_DISPLAY_NAME = "Vidu Q1 Image To Video"
|
|
72
|
+
RETURN_TYPES = ("VIDEO", """{"vidu-q1-img2video": "vidu-q1"}""")
|
|
73
|
+
RETURN_NAMES = ("video", "bizyair_model_name")
|
|
74
|
+
CATEGORY = "☁️BizyAir/External APIs/Vidu"
|
|
75
|
+
|
|
76
|
+
@classmethod
|
|
77
|
+
def INPUT_TYPES(cls):
|
|
78
|
+
return {
|
|
79
|
+
"required": {
|
|
80
|
+
"prompt": (
|
|
81
|
+
"STRING",
|
|
82
|
+
{
|
|
83
|
+
"multiline": True,
|
|
84
|
+
"default": "",
|
|
85
|
+
},
|
|
86
|
+
),
|
|
87
|
+
"first_frame_image": ("IMAGE",),
|
|
88
|
+
"seed": ("INT", {"default": 0, "min": 0, "max": 2147483647}),
|
|
89
|
+
"duration": ([5], {"default": 5}),
|
|
90
|
+
"resolution": (["1080p"], {"default": "1080p"}),
|
|
91
|
+
"movement_amplitude": (
|
|
92
|
+
["auto", "small", "medium", "large"],
|
|
93
|
+
{"default": "auto", "tooltip": "画面中物体的运动幅度。"},
|
|
94
|
+
),
|
|
95
|
+
"bgm": (
|
|
96
|
+
"BOOLEAN",
|
|
97
|
+
{
|
|
98
|
+
"default": False,
|
|
99
|
+
"tooltip": "当设置为 true 时,系统将自动添加合适的 BGM。BGM 无时长限制,系统会自动适配。",
|
|
100
|
+
},
|
|
101
|
+
),
|
|
102
|
+
},
|
|
103
|
+
"optional": {
|
|
104
|
+
"last_frame_image": ("IMAGE",),
|
|
105
|
+
},
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
def handle_inputs(self, headers, prompt_id, **kwargs):
|
|
109
|
+
prompt = kwargs.get("prompt", "")
|
|
110
|
+
seed = kwargs.get("seed", 0)
|
|
111
|
+
duration = kwargs.get("duration", 5)
|
|
112
|
+
resolution = kwargs.get("resolution", "1080p")
|
|
113
|
+
movement_amplitude = kwargs.get("movement_amplitude", "auto")
|
|
114
|
+
bgm = kwargs.get("bgm", False)
|
|
115
|
+
first_frame_image = kwargs.get("first_frame_image", None)
|
|
116
|
+
last_frame_image = kwargs.get("last_frame_image", None)
|
|
117
|
+
if len(prompt) > 1500:
|
|
118
|
+
raise ValueError("Prompt must be less than 1500 characters")
|
|
119
|
+
if first_frame_image is None:
|
|
120
|
+
raise ValueError("First frame image is required")
|
|
121
|
+
images = []
|
|
122
|
+
total_size = 0
|
|
123
|
+
model = "vidu-q1-img2video"
|
|
124
|
+
# 上传首帧图片
|
|
125
|
+
bio = tensor_to_bytesio(image=first_frame_image, total_pixels=4096 * 4096)
|
|
126
|
+
length = bio.getbuffer().nbytes
|
|
127
|
+
total_size += length
|
|
128
|
+
if total_size > 50 * 1024 * 1024:
|
|
129
|
+
raise ValueError(
|
|
130
|
+
"Image size is too large, Vidu Q1 only supports images up to 50MB"
|
|
131
|
+
)
|
|
132
|
+
first_frame_image_url = self.upload_file(
|
|
133
|
+
bio,
|
|
134
|
+
f"{prompt_id}_first.png",
|
|
135
|
+
headers,
|
|
136
|
+
)
|
|
137
|
+
images.append(first_frame_image_url)
|
|
138
|
+
if last_frame_image is not None:
|
|
139
|
+
# 上传末帧图片
|
|
140
|
+
bio = tensor_to_bytesio(image=last_frame_image, total_pixels=4096 * 4096)
|
|
141
|
+
length = bio.getbuffer().nbytes
|
|
142
|
+
total_size += length
|
|
143
|
+
if total_size > 50 * 1024 * 1024:
|
|
144
|
+
raise ValueError(
|
|
145
|
+
"Image size is too large, Vidu Q1 only supports images up to 50MB"
|
|
146
|
+
)
|
|
147
|
+
last_frame_image_url = self.upload_file(
|
|
148
|
+
bio,
|
|
149
|
+
f"{prompt_id}_last.png",
|
|
150
|
+
headers,
|
|
151
|
+
)
|
|
152
|
+
images.append(last_frame_image_url)
|
|
153
|
+
model = "vidu-q1-startend2video"
|
|
154
|
+
|
|
155
|
+
data = {
|
|
156
|
+
"prompt": prompt,
|
|
157
|
+
"seed": seed,
|
|
158
|
+
"duration": duration,
|
|
159
|
+
"resolution": resolution,
|
|
160
|
+
"movement_amplitude": movement_amplitude,
|
|
161
|
+
"bgm": bgm,
|
|
162
|
+
"model": model,
|
|
163
|
+
"images": images,
|
|
164
|
+
}
|
|
165
|
+
return data, "vidu-q1"
|
|
166
|
+
|
|
167
|
+
def handle_outputs(self, outputs):
|
|
168
|
+
return (outputs[0][0], "")
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
class VIDU_Q1_I2V_REF_API(BizyAirTrdApiBaseNode):
|
|
172
|
+
NODE_DISPLAY_NAME = "Vidu Q1 Reference Images To Video"
|
|
173
|
+
RETURN_TYPES = ("VIDEO", """{"vidu-q1-reference2video": "vidu-q1"}""")
|
|
174
|
+
RETURN_NAMES = ("video", "bizyair_model_name")
|
|
175
|
+
CATEGORY = "☁️BizyAir/External APIs/Vidu"
|
|
176
|
+
|
|
177
|
+
@classmethod
|
|
178
|
+
def INPUT_TYPES(cls):
|
|
179
|
+
return {
|
|
180
|
+
"required": {
|
|
181
|
+
"prompt": (
|
|
182
|
+
"STRING",
|
|
183
|
+
{
|
|
184
|
+
"multiline": True,
|
|
185
|
+
"default": "",
|
|
186
|
+
},
|
|
187
|
+
),
|
|
188
|
+
"ref_image_1": ("IMAGE",),
|
|
189
|
+
"seed": ("INT", {"default": 0, "min": 0, "max": 2147483647}),
|
|
190
|
+
"duration": ([5], {"default": 5}),
|
|
191
|
+
"resolution": (["1080p"], {"default": "1080p"}),
|
|
192
|
+
"movement_amplitude": (
|
|
193
|
+
["auto", "small", "medium", "large"],
|
|
194
|
+
{"default": "auto", "tooltip": "画面中物体的运动幅度。"},
|
|
195
|
+
),
|
|
196
|
+
"bgm": (
|
|
197
|
+
"BOOLEAN",
|
|
198
|
+
{
|
|
199
|
+
"default": False,
|
|
200
|
+
"tooltip": "当设置为 true 时,系统将自动添加合适的 BGM。BGM 无时长限制,系统会自动适配。",
|
|
201
|
+
},
|
|
202
|
+
),
|
|
203
|
+
},
|
|
204
|
+
"optional": {
|
|
205
|
+
"ref_image_2": ("IMAGE",),
|
|
206
|
+
"ref_image_3": ("IMAGE",),
|
|
207
|
+
"ref_image_4": ("IMAGE",),
|
|
208
|
+
"ref_image_5": ("IMAGE",),
|
|
209
|
+
"ref_image_6": ("IMAGE",),
|
|
210
|
+
"ref_image_7": ("IMAGE",),
|
|
211
|
+
},
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
def handle_inputs(self, headers, prompt_id, **kwargs):
|
|
215
|
+
prompt = kwargs.get("prompt", "")
|
|
216
|
+
seed = kwargs.get("seed", 0)
|
|
217
|
+
duration = kwargs.get("duration", 5)
|
|
218
|
+
resolution = kwargs.get("resolution", "1080p")
|
|
219
|
+
movement_amplitude = kwargs.get("movement_amplitude", "auto")
|
|
220
|
+
bgm = kwargs.get("bgm", False)
|
|
221
|
+
if len(prompt) > 1500:
|
|
222
|
+
raise ValueError("Prompt must be less than 1500 characters")
|
|
223
|
+
bios = []
|
|
224
|
+
images = []
|
|
225
|
+
total_size = 0
|
|
226
|
+
# 上传图片
|
|
227
|
+
for i, img in enumerate(
|
|
228
|
+
[
|
|
229
|
+
kwargs.get("ref_image_1", None),
|
|
230
|
+
kwargs.get("ref_image_2", None),
|
|
231
|
+
kwargs.get("ref_image_3", None),
|
|
232
|
+
kwargs.get("ref_image_4", None),
|
|
233
|
+
kwargs.get("ref_image_5", None),
|
|
234
|
+
kwargs.get("ref_image_6", None),
|
|
235
|
+
kwargs.get("ref_image_7", None),
|
|
236
|
+
],
|
|
237
|
+
1,
|
|
238
|
+
):
|
|
239
|
+
if img is not None:
|
|
240
|
+
bio = tensor_to_bytesio(image=img, total_pixels=4096 * 4096)
|
|
241
|
+
length = bio.getbuffer().nbytes
|
|
242
|
+
total_size += length
|
|
243
|
+
if total_size > 50 * 1024 * 1024:
|
|
244
|
+
raise ValueError(
|
|
245
|
+
"Image size is too large, Vidu Q1 only supports images up to 50MB"
|
|
246
|
+
)
|
|
247
|
+
bios.append(bio)
|
|
248
|
+
for i, bio in enumerate(bios):
|
|
249
|
+
url = self.upload_file(
|
|
250
|
+
bio,
|
|
251
|
+
f"{prompt_id}_ref_{i+1}.png",
|
|
252
|
+
headers,
|
|
253
|
+
)
|
|
254
|
+
images.append(url)
|
|
255
|
+
|
|
256
|
+
data = {
|
|
257
|
+
"prompt": prompt,
|
|
258
|
+
"seed": seed,
|
|
259
|
+
"duration": duration,
|
|
260
|
+
"resolution": resolution,
|
|
261
|
+
"movement_amplitude": movement_amplitude,
|
|
262
|
+
"bgm": bgm,
|
|
263
|
+
"model": "vidu-q1-reference2video",
|
|
264
|
+
"images": images,
|
|
265
|
+
}
|
|
266
|
+
return data, "vidu-q1"
|
|
267
|
+
|
|
268
|
+
def handle_outputs(self, outputs):
|
|
269
|
+
return (outputs[0][0], "")
|
|
@@ -51,8 +51,12 @@ class Wan_V2_5_I2V_API(BizyAirTrdApiBaseNode):
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
NODE_DISPLAY_NAME = "Wan2.5 Image To Video"
|
|
54
|
-
RETURN_TYPES = (
|
|
55
|
-
|
|
54
|
+
RETURN_TYPES = (
|
|
55
|
+
"VIDEO",
|
|
56
|
+
"STRING",
|
|
57
|
+
"""{"wan2.5-i2v-preview": "wan2.5-i2v-preview"}""",
|
|
58
|
+
)
|
|
59
|
+
RETURN_NAMES = ("video", "actual_prompt", "bizyair_model_name")
|
|
56
60
|
CATEGORY = "☁️BizyAir/External APIs/WanVideo"
|
|
57
61
|
|
|
58
62
|
def handle_inputs(self, headers, prompt_id, **kwargs):
|
|
@@ -96,7 +100,7 @@ class Wan_V2_5_I2V_API(BizyAirTrdApiBaseNode):
|
|
|
96
100
|
return input, model
|
|
97
101
|
|
|
98
102
|
def handle_outputs(self, outputs):
|
|
99
|
-
return (outputs[0][0],)
|
|
103
|
+
return (outputs[0][0], "")
|
|
100
104
|
|
|
101
105
|
|
|
102
106
|
class Wan_V2_5_T2V_API(BizyAirTrdApiBaseNode):
|
|
@@ -158,8 +162,12 @@ class Wan_V2_5_T2V_API(BizyAirTrdApiBaseNode):
|
|
|
158
162
|
}
|
|
159
163
|
|
|
160
164
|
NODE_DISPLAY_NAME = "Wan2.5 Text To Video"
|
|
161
|
-
RETURN_TYPES = (
|
|
162
|
-
|
|
165
|
+
RETURN_TYPES = (
|
|
166
|
+
"VIDEO",
|
|
167
|
+
"STRING",
|
|
168
|
+
""""{"wan2.5-t2v-preview": "wan2.5-t2v-preview"}""",
|
|
169
|
+
)
|
|
170
|
+
RETURN_NAMES = ("video", "actual_prompt", "bizyair_model_name")
|
|
163
171
|
CATEGORY = "☁️BizyAir/External APIs/WanVideo"
|
|
164
172
|
|
|
165
173
|
def handle_inputs(self, headers, prompt_id, **kwargs):
|
|
@@ -195,4 +203,212 @@ class Wan_V2_5_T2V_API(BizyAirTrdApiBaseNode):
|
|
|
195
203
|
return input, model
|
|
196
204
|
|
|
197
205
|
def handle_outputs(self, outputs):
|
|
198
|
-
return (outputs[0][0],)
|
|
206
|
+
return (outputs[0][0], "")
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
class Wan_V2_6_I2V_API(BizyAirTrdApiBaseNode):
|
|
210
|
+
@classmethod
|
|
211
|
+
def INPUT_TYPES(cls):
|
|
212
|
+
return {
|
|
213
|
+
"required": {
|
|
214
|
+
"image": ("IMAGE",),
|
|
215
|
+
},
|
|
216
|
+
"optional": {
|
|
217
|
+
"audio": ("AUDIO",),
|
|
218
|
+
"prompt": (
|
|
219
|
+
"STRING",
|
|
220
|
+
{
|
|
221
|
+
"multiline": True,
|
|
222
|
+
"default": "",
|
|
223
|
+
},
|
|
224
|
+
),
|
|
225
|
+
"negative_prompt": (
|
|
226
|
+
"STRING",
|
|
227
|
+
{
|
|
228
|
+
"multiline": True,
|
|
229
|
+
"default": "",
|
|
230
|
+
},
|
|
231
|
+
),
|
|
232
|
+
"resolution": (
|
|
233
|
+
["720P", "1080P"],
|
|
234
|
+
{"default": "1080P"},
|
|
235
|
+
),
|
|
236
|
+
"duration": ([5, 10, 15], {"default": 5}),
|
|
237
|
+
"prompt_extend": (
|
|
238
|
+
"BOOLEAN",
|
|
239
|
+
{
|
|
240
|
+
"default": True,
|
|
241
|
+
"tooltip": "是否开启prompt智能改写。开启后使用大模型对输入prompt进行智能改写。对于较短的prompt生成效果提升明显,但会增加耗时。",
|
|
242
|
+
},
|
|
243
|
+
),
|
|
244
|
+
"shot_type": (
|
|
245
|
+
["single", "multi"],
|
|
246
|
+
{
|
|
247
|
+
"default": "single",
|
|
248
|
+
"tooltip": "指定生成视频的镜头类型,即视频是由一个连续镜头还是多个切换镜头组成。仅当prompt_extend: true时生效",
|
|
249
|
+
},
|
|
250
|
+
),
|
|
251
|
+
"auto_audio": (
|
|
252
|
+
"BOOLEAN",
|
|
253
|
+
{
|
|
254
|
+
"default": True,
|
|
255
|
+
"tooltip": "是否由模型自动生成声音,优先级低于audio参数。",
|
|
256
|
+
},
|
|
257
|
+
),
|
|
258
|
+
},
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
NODE_DISPLAY_NAME = "Wan2.6 Image To Video"
|
|
262
|
+
RETURN_TYPES = ("VIDEO", "STRING", """{"wan2.6-i2v": "wan2.6-i2v"}""")
|
|
263
|
+
RETURN_NAMES = ("video", "actual_prompt", "bizyair_model_name")
|
|
264
|
+
CATEGORY = "☁️BizyAir/External APIs/WanVideo"
|
|
265
|
+
|
|
266
|
+
def handle_inputs(self, headers, prompt_id, **kwargs):
|
|
267
|
+
# 参数
|
|
268
|
+
prompt = kwargs.get("prompt", "")
|
|
269
|
+
negative_prompt = kwargs.get("negative_prompt", "")
|
|
270
|
+
audio = kwargs.get("audio", None)
|
|
271
|
+
resolution = kwargs.get("resolution", "1080P")
|
|
272
|
+
duration = kwargs.get("duration", 5)
|
|
273
|
+
prompt_extend = kwargs.get("prompt_extend", True)
|
|
274
|
+
shot_type = kwargs.get("shot_type", "single")
|
|
275
|
+
auto_audio = kwargs.get("auto_audio", True)
|
|
276
|
+
image = kwargs.get("image", None)
|
|
277
|
+
|
|
278
|
+
model = "wan2.6-i2v"
|
|
279
|
+
input = {
|
|
280
|
+
"resolution": resolution,
|
|
281
|
+
"prompt_extend": prompt_extend,
|
|
282
|
+
"duration": duration,
|
|
283
|
+
"audio": auto_audio,
|
|
284
|
+
"model": model,
|
|
285
|
+
"shot_type": shot_type,
|
|
286
|
+
}
|
|
287
|
+
if prompt is not None and prompt.strip() != "":
|
|
288
|
+
input["prompt"] = prompt
|
|
289
|
+
if negative_prompt is not None and negative_prompt.strip() != "":
|
|
290
|
+
input["negative_prompt"] = negative_prompt
|
|
291
|
+
|
|
292
|
+
# 上传图片&音频
|
|
293
|
+
if image is not None:
|
|
294
|
+
image_url = self.upload_file(
|
|
295
|
+
tensor_to_bytesio(image=image, total_pixels=4096 * 4096),
|
|
296
|
+
f"{prompt_id}.png",
|
|
297
|
+
headers,
|
|
298
|
+
)
|
|
299
|
+
input["img_url"] = image_url
|
|
300
|
+
if audio is not None:
|
|
301
|
+
audio_url = self.upload_file(
|
|
302
|
+
save_audio(audio=audio, format="mp3"), f"{prompt_id}.mp3", headers
|
|
303
|
+
)
|
|
304
|
+
input["audio_url"] = audio_url
|
|
305
|
+
|
|
306
|
+
return input, model
|
|
307
|
+
|
|
308
|
+
def handle_outputs(self, outputs):
|
|
309
|
+
return (outputs[0][0], "")
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
class Wan_V2_6_T2V_API(BizyAirTrdApiBaseNode):
|
|
313
|
+
@classmethod
|
|
314
|
+
def INPUT_TYPES(cls):
|
|
315
|
+
return {
|
|
316
|
+
"required": {
|
|
317
|
+
"prompt": (
|
|
318
|
+
"STRING",
|
|
319
|
+
{
|
|
320
|
+
"multiline": True,
|
|
321
|
+
"default": "",
|
|
322
|
+
},
|
|
323
|
+
),
|
|
324
|
+
},
|
|
325
|
+
"optional": {
|
|
326
|
+
"audio": ("AUDIO",),
|
|
327
|
+
"negative_prompt": (
|
|
328
|
+
"STRING",
|
|
329
|
+
{
|
|
330
|
+
"multiline": True,
|
|
331
|
+
"default": "",
|
|
332
|
+
},
|
|
333
|
+
),
|
|
334
|
+
"size": (
|
|
335
|
+
[
|
|
336
|
+
"1280*720",
|
|
337
|
+
"720*1280",
|
|
338
|
+
"960*960",
|
|
339
|
+
"1088*832",
|
|
340
|
+
"832*1088",
|
|
341
|
+
"1920*1080",
|
|
342
|
+
"1080*1920",
|
|
343
|
+
"1440*1440",
|
|
344
|
+
"1632*1248",
|
|
345
|
+
"1248*1632",
|
|
346
|
+
],
|
|
347
|
+
{"default": "1920*1080"},
|
|
348
|
+
),
|
|
349
|
+
"duration": ([5, 10, 15], {"default": 5}),
|
|
350
|
+
"prompt_extend": (
|
|
351
|
+
"BOOLEAN",
|
|
352
|
+
{
|
|
353
|
+
"default": True,
|
|
354
|
+
"tooltip": "是否开启prompt智能改写。开启后使用大模型对输入prompt进行智能改写。对于较短的prompt生成效果提升明显,但会增加耗时。",
|
|
355
|
+
},
|
|
356
|
+
),
|
|
357
|
+
"shot_type": (
|
|
358
|
+
["single", "multi"],
|
|
359
|
+
{
|
|
360
|
+
"default": "single",
|
|
361
|
+
"tooltip": "指定生成视频的镜头类型,即视频是由一个连续镜头还是多个切换镜头组成。仅当prompt_extend: true时生效",
|
|
362
|
+
},
|
|
363
|
+
),
|
|
364
|
+
"auto_audio": (
|
|
365
|
+
"BOOLEAN",
|
|
366
|
+
{
|
|
367
|
+
"default": True,
|
|
368
|
+
"tooltip": "是否由模型自动生成声音,优先级低于audio参数。",
|
|
369
|
+
},
|
|
370
|
+
),
|
|
371
|
+
},
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
NODE_DISPLAY_NAME = "Wan2.6 Text To Video"
|
|
375
|
+
RETURN_TYPES = ("VIDEO", "STRING", """{"wan2.6-t2v": "wan2.6-t2v"}""")
|
|
376
|
+
RETURN_NAMES = ("video", "actual_prompt", "bizyair_model_name")
|
|
377
|
+
CATEGORY = "☁️BizyAir/External APIs/WanVideo"
|
|
378
|
+
|
|
379
|
+
def handle_inputs(self, headers, prompt_id, **kwargs):
|
|
380
|
+
# 参数
|
|
381
|
+
model = "wan2.6-t2v"
|
|
382
|
+
negative_prompt = kwargs.get("negative_prompt", "")
|
|
383
|
+
audio = kwargs.get("audio", None)
|
|
384
|
+
size = kwargs.get("size", "1920*1080")
|
|
385
|
+
duration = kwargs.get("duration", 5)
|
|
386
|
+
prompt_extend = kwargs.get("prompt_extend", True)
|
|
387
|
+
shot_type = kwargs.get("shot_type", "single")
|
|
388
|
+
auto_audio = kwargs.get("auto_audio", True)
|
|
389
|
+
prompt = kwargs.get("prompt", "")
|
|
390
|
+
|
|
391
|
+
input = {
|
|
392
|
+
"size": size,
|
|
393
|
+
"prompt_extend": prompt_extend,
|
|
394
|
+
"duration": duration,
|
|
395
|
+
"audio": auto_audio,
|
|
396
|
+
"model": model,
|
|
397
|
+
"shot_type": shot_type,
|
|
398
|
+
}
|
|
399
|
+
if prompt is not None and prompt.strip() != "":
|
|
400
|
+
input["prompt"] = prompt
|
|
401
|
+
if negative_prompt is not None and negative_prompt.strip() != "":
|
|
402
|
+
input["negative_prompt"] = negative_prompt
|
|
403
|
+
|
|
404
|
+
# 上传音频
|
|
405
|
+
if audio is not None:
|
|
406
|
+
audio_url = self.upload_file(
|
|
407
|
+
save_audio(audio=audio, format="mp3"), f"{prompt_id}.mp3", headers
|
|
408
|
+
)
|
|
409
|
+
input["audio_url"] = audio_url
|
|
410
|
+
|
|
411
|
+
return input, model
|
|
412
|
+
|
|
413
|
+
def handle_outputs(self, outputs):
|
|
414
|
+
return (outputs[0][0], "")
|
|
@@ -196,6 +196,7 @@ class BizyAirTrdApiBaseNode(BizyAirMiscBaseNode, TrdBase):
|
|
|
196
196
|
# 可以认为图片输入都是List[Batch]
|
|
197
197
|
images = kwargs.get(f"image_{i + 1}", None)
|
|
198
198
|
for _, img_batch in enumerate(images if images is not None else []):
|
|
199
|
-
|
|
200
|
-
|
|
199
|
+
if img_batch is not None:
|
|
200
|
+
total += img_batch.shape[0]
|
|
201
|
+
extra_images.append(img_batch)
|
|
201
202
|
return (extra_images, total)
|
bizyengine/misc/utils.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import base64
|
|
3
3
|
import concurrent.futures
|
|
4
|
+
import errno
|
|
4
5
|
import json
|
|
5
6
|
import logging
|
|
6
7
|
import os
|
|
@@ -373,8 +374,8 @@ class SingleFlight(Generic[R]):
|
|
|
373
374
|
# 读取结果
|
|
374
375
|
with call.mu:
|
|
375
376
|
if call.err is not None:
|
|
376
|
-
return call.result,
|
|
377
|
-
return call.result,
|
|
377
|
+
return call.result, not first, call.err
|
|
378
|
+
return call.result, not first, None
|
|
378
379
|
|
|
379
380
|
|
|
380
381
|
_MODELS_CACHE = TTLCache[str, list[str]](ttl_sec=600)
|
|
@@ -383,7 +384,20 @@ _SF = SingleFlight[None]()
|
|
|
383
384
|
|
|
384
385
|
def cache_models(request_api_key: str):
|
|
385
386
|
# TODO: 效果待验证,目前节点只会被ComfyUI串行执行,所以不会出现竞争
|
|
386
|
-
|
|
387
|
+
# 重试最多五次
|
|
388
|
+
max_retries = 5
|
|
389
|
+
for i in range(max_retries):
|
|
390
|
+
try:
|
|
391
|
+
_, shared, e = _SF.do(
|
|
392
|
+
"_cache_models", lambda: _cache_models(request_api_key)
|
|
393
|
+
)
|
|
394
|
+
if e is not None:
|
|
395
|
+
raise e
|
|
396
|
+
return
|
|
397
|
+
except Exception:
|
|
398
|
+
logging.error(f"Failed to cache models on try #{i+1}")
|
|
399
|
+
if i < max_retries - 1:
|
|
400
|
+
time.sleep(5)
|
|
387
401
|
|
|
388
402
|
|
|
389
403
|
def _cache_models(request_api_key: str):
|
|
@@ -394,7 +408,7 @@ def _cache_models(request_api_key: str):
|
|
|
394
408
|
asyncio.run, api_client.fetch_all_llm_models(request_api_key)
|
|
395
409
|
).result()
|
|
396
410
|
if len(all_models) == 0:
|
|
397
|
-
|
|
411
|
+
raise errno.NO_MODEL_FOUND
|
|
398
412
|
llm_models = [
|
|
399
413
|
model
|
|
400
414
|
for model in all_models
|
bizyengine/version.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.2.
|
|
1
|
+
1.2.78
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bizyengine
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.78
|
|
4
4
|
Summary: [a/BizyAir](https://github.com/siliconflow/BizyAir) Comfy Nodes that can run in any environment.
|
|
5
5
|
Author-email: SiliconFlow <yaochi@siliconflow.cn>
|
|
6
6
|
Project-URL: Repository, https://github.com/siliconflow/BizyAir
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
bizyengine/__init__.py,sha256=GP9V-JM07fz7uv_qTB43QEA2rKdrVJxi5I7LRnn_3ZQ,914
|
|
2
|
-
bizyengine/version.txt,sha256=
|
|
2
|
+
bizyengine/version.txt,sha256=NX2wLXhZUvOyCjFSI-YuxHfGMoPfQKB09K-V0V_vrUo,6
|
|
3
3
|
bizyengine/bizy_server/__init__.py,sha256=SP9oSblnPo4KQyh7yOGD26YCskFAcQHAZy04nQBNRIw,200
|
|
4
|
-
bizyengine/bizy_server/api_client.py,sha256=
|
|
5
|
-
bizyengine/bizy_server/errno.py,sha256=
|
|
4
|
+
bizyengine/bizy_server/api_client.py,sha256=vNBUkFNMjPI_F_wAGiN-ydCZO8oLdgyWBlMY1DQbHOk,43685
|
|
5
|
+
bizyengine/bizy_server/errno.py,sha256=8dzmtlqq0wBJguHAXKEDb_uUYUQ7qlZQK6FxOpMxqLg,17328
|
|
6
6
|
bizyengine/bizy_server/error_handler.py,sha256=MGrfO1AEqbfEgMWPL8B6Ypew_zHiQAdYGlhN9bZohrY,167
|
|
7
7
|
bizyengine/bizy_server/execution.py,sha256=ayaEf6eGJKQsVZV-1_UlGlvwwmlH7FEek31Uq-MbUjA,1644
|
|
8
8
|
bizyengine/bizy_server/profile.py,sha256=f4juAzJ73gCm0AhagYpt9WnG8HEI6xze_U96-omBLqU,3044
|
|
9
9
|
bizyengine/bizy_server/resp.py,sha256=iOFT5Ud7VJBP2uqkojJIgc3y2ifMjjEXoj0ewneL9lc,710
|
|
10
|
-
bizyengine/bizy_server/server.py,sha256=
|
|
10
|
+
bizyengine/bizy_server/server.py,sha256=cOoOEm7PtPUL38cnrxlG8VN83XEdyiwdNqbU-p4EUO4,58640
|
|
11
11
|
bizyengine/bizy_server/stream_response.py,sha256=H2XHqlVRtQMhgdztAuG7l8-iV_Pm42u2x6WJ0gNVIW0,9654
|
|
12
12
|
bizyengine/bizy_server/utils.py,sha256=t3y3ZTDzFa8K4wXlzgLVaFNCizgylsKsd9K3rLL4sGw,3986
|
|
13
13
|
bizyengine/bizyair_extras/__init__.py,sha256=9iPmEyR7F1IXbUaBNS90ivW9ul18GcuWFxRfFv2ieAw,1011
|
|
@@ -45,17 +45,18 @@ bizyengine/bizyair_extras/nodes_ipadapter_plus/__init__.py,sha256=ECKATm_EKi_4G4
|
|
|
45
45
|
bizyengine/bizyair_extras/nodes_ipadapter_plus/nodes_ipadapter_plus.py,sha256=lOKRem7oiPs8ZkA_p68HxagAgiCSvn3Rk-L4fSXIjyE,54846
|
|
46
46
|
bizyengine/bizyair_extras/nodes_kolors_mz/__init__.py,sha256=HsCCCphW8q0SrWEiFlZKK_W2lQr1T0UJIJL7gEn37ME,3729
|
|
47
47
|
bizyengine/bizyair_extras/oauth_callback/main.py,sha256=KQOZWor3kyNx8xvUNHYNMoHfCF9g_ht13_iPk4K_5YM,3633
|
|
48
|
-
bizyengine/bizyair_extras/third_party_api/__init__.py,sha256=
|
|
49
|
-
bizyengine/bizyair_extras/third_party_api/nodes_doubao.py,sha256=
|
|
50
|
-
bizyengine/bizyair_extras/third_party_api/nodes_flux.py,sha256=
|
|
51
|
-
bizyengine/bizyair_extras/third_party_api/nodes_gemini.py,sha256=
|
|
52
|
-
bizyengine/bizyair_extras/third_party_api/nodes_gpt.py,sha256=
|
|
53
|
-
bizyengine/bizyair_extras/third_party_api/nodes_hailuo.py,sha256=
|
|
54
|
-
bizyengine/bizyair_extras/third_party_api/nodes_kling.py,sha256=
|
|
55
|
-
bizyengine/bizyair_extras/third_party_api/nodes_sora.py,sha256=
|
|
56
|
-
bizyengine/bizyair_extras/third_party_api/nodes_veo3.py,sha256=
|
|
57
|
-
bizyengine/bizyair_extras/third_party_api/
|
|
58
|
-
bizyengine/bizyair_extras/third_party_api/
|
|
48
|
+
bizyengine/bizyair_extras/third_party_api/__init__.py,sha256=jAZrTdBSVg3TielWoAUWUqWonBwoKZQ-jLQ07JzOHx8,339
|
|
49
|
+
bizyengine/bizyair_extras/third_party_api/nodes_doubao.py,sha256=d_1HMZEJ0eMftp4Ln0EI6A53leClqnSCf3J6Fwb2pwM,21687
|
|
50
|
+
bizyengine/bizyair_extras/third_party_api/nodes_flux.py,sha256=iv9V7-ijKGgR5_n8BlIe4E7QjWSGvWkIIUDMOn_3t1s,6339
|
|
51
|
+
bizyengine/bizyair_extras/third_party_api/nodes_gemini.py,sha256=tRjAGNJsJkYPXhlBREJd3jxPr4lF533Q_XMMHNIeXNM,17910
|
|
52
|
+
bizyengine/bizyair_extras/third_party_api/nodes_gpt.py,sha256=IwIvMiKU1h917w42NNCXM7o7VF1Bjm7hPEhwGeWGTOw,3220
|
|
53
|
+
bizyengine/bizyair_extras/third_party_api/nodes_hailuo.py,sha256=KtiRYeV5uCjLrXwFJ4gyuSrVSUWXmVVVL-pQR0gw8sA,3912
|
|
54
|
+
bizyengine/bizyair_extras/third_party_api/nodes_kling.py,sha256=ZxQB99O7E41lA25fRTuBY0sgrfNTlw1hmYxFU3eBgnk,29290
|
|
55
|
+
bizyengine/bizyair_extras/third_party_api/nodes_sora.py,sha256=_-O37uRi5QHqJZqlJ3QzoNHYxZH4zv79-0cBYuZHer4,7132
|
|
56
|
+
bizyengine/bizyair_extras/third_party_api/nodes_veo3.py,sha256=LzZl-9iLMe5IzEAXYUVkb8RUPLAfZloTPxRgGcY7Hsg,6703
|
|
57
|
+
bizyengine/bizyair_extras/third_party_api/nodes_vidu.py,sha256=-Eo2su0-t9qNPa5J4Qt3fx8xM9NjFHmgl19gMcTU7nM,10012
|
|
58
|
+
bizyengine/bizyair_extras/third_party_api/nodes_wan_api.py,sha256=GNc616NNsXcZYtojO2XTHwU3AFiprX6tFJ7qu3s2jgc,14508
|
|
59
|
+
bizyengine/bizyair_extras/third_party_api/trd_nodes_base.py,sha256=xu1q3cMprsfhjQPTQvzS2HqkrteWAgBx-nzqqGsy4gA,7945
|
|
59
60
|
bizyengine/bizyair_extras/utils/aliyun_oss.py,sha256=H6wGZq1DqP7BHJ_frBJVvUVttgXprJprOnxytePIuos,3050
|
|
60
61
|
bizyengine/bizyair_extras/utils/audio.py,sha256=cCmX080jtxsHFa7mCgn13R6cyfqE-1Gq37ZnRJdZNU8,3183
|
|
61
62
|
bizyengine/bizybot/__init__.py,sha256=NINN_7QECKQwtAwKPBTrrSiAK6KbxaZCkIvJ-e1J1xk,262
|
|
@@ -102,8 +103,8 @@ bizyengine/misc/nodes_controlnet_union_sdxl.py,sha256=fYyu_XMY7mcX1Ad9x30q1tYB8m
|
|
|
102
103
|
bizyengine/misc/route_sam.py,sha256=-bMIR2QalfnszipGxSxvDAHGJa5gPSrjkYPb5baaRg4,1561
|
|
103
104
|
bizyengine/misc/segment_anything.py,sha256=wNKYwlYPMszfwj23524geFZJjZaG4eye65SGaUnh77I,8941
|
|
104
105
|
bizyengine/misc/supernode.py,sha256=STN9gaxfTSErH8OiHeZa47d8z-G9S0I7fXuJvHQOBFM,4532
|
|
105
|
-
bizyengine/misc/utils.py,sha256=
|
|
106
|
-
bizyengine-1.2.
|
|
107
|
-
bizyengine-1.2.
|
|
108
|
-
bizyengine-1.2.
|
|
109
|
-
bizyengine-1.2.
|
|
106
|
+
bizyengine/misc/utils.py,sha256=GMRWKhOP-MCueVyCO-doflb7dH5dM32DyLcSPEVOXWA,13333
|
|
107
|
+
bizyengine-1.2.78.dist-info/METADATA,sha256=ojYvqvOYFk5hNUltqCws4o4BE_PPhuJuMKTdUlGpE-A,735
|
|
108
|
+
bizyengine-1.2.78.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
109
|
+
bizyengine-1.2.78.dist-info/top_level.txt,sha256=2zapzqxX-we5cRyJkGf9bd5JinRtXp3-_uDI-xCAnc0,11
|
|
110
|
+
bizyengine-1.2.78.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|