bizyengine 1.2.57__py3-none-any.whl → 1.2.59__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/bizyair_extras/__init__.py +2 -0
- bizyengine/bizyair_extras/nodes_gemini.py +1 -1
- bizyengine/bizyair_extras/nodes_sora2.py +217 -0
- bizyengine/bizyair_extras/nodes_veo3.py +297 -0
- bizyengine/bizyair_extras/nodes_wan_api.py +74 -64
- bizyengine/bizyair_extras/utils/aliyun_oss.py +17 -0
- bizyengine/core/common/client.py +1 -1
- bizyengine/misc/utils.py +1 -1
- bizyengine/version.txt +1 -1
- {bizyengine-1.2.57.dist-info → bizyengine-1.2.59.dist-info}/METADATA +1 -1
- {bizyengine-1.2.57.dist-info → bizyengine-1.2.59.dist-info}/RECORD +13 -11
- {bizyengine-1.2.57.dist-info → bizyengine-1.2.59.dist-info}/WHEEL +0 -0
- {bizyengine-1.2.57.dist-info → bizyengine-1.2.59.dist-info}/top_level.txt +0 -0
|
@@ -226,7 +226,7 @@ class NanoBanana(BizyAirBaseNode):
|
|
|
226
226
|
**kwargs,
|
|
227
227
|
):
|
|
228
228
|
try:
|
|
229
|
-
url = f"{BIZYAIR_SERVER_ADDRESS}/proxy_inference/VertexAI/gemini-2.5-flash-image
|
|
229
|
+
url = f"{BIZYAIR_SERVER_ADDRESS}/proxy_inference/VertexAI/gemini-2.5-flash-image"
|
|
230
230
|
extra_data = pop_api_key_and_prompt_id(kwargs)
|
|
231
231
|
|
|
232
232
|
parts = []
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import io
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
4
|
+
import time
|
|
5
|
+
|
|
6
|
+
import requests
|
|
7
|
+
from comfy_api.latest._input_impl import VideoFromFile
|
|
8
|
+
from comfy_api_nodes.apinode_utils import tensor_to_bytesio
|
|
9
|
+
|
|
10
|
+
from bizyengine.bizyair_extras.nodes_veo3 import _GRSAI_FAILED_STATUS
|
|
11
|
+
from bizyengine.bizyair_extras.utils.audio import save_audio
|
|
12
|
+
from bizyengine.core import BizyAirBaseNode, pop_api_key_and_prompt_id
|
|
13
|
+
from bizyengine.core.common import client
|
|
14
|
+
from bizyengine.core.common.client import send_request
|
|
15
|
+
from bizyengine.core.common.env_var import BIZYAIR_X_SERVER
|
|
16
|
+
|
|
17
|
+
from .utils.aliyun_oss import parse_upload_token, upload_file_without_sdk
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def sora2_create_task_and_wait_for_completion(data, model, prompt, headers):
|
|
21
|
+
# 创建任务
|
|
22
|
+
create_task_url = f"{BIZYAIR_X_SERVER}/proxy_inference/GRSAI/{model}"
|
|
23
|
+
json_payload = json.dumps(data).encode("utf-8")
|
|
24
|
+
logging.debug(f"json_payload: {json_payload}")
|
|
25
|
+
create_api_resp = send_request(
|
|
26
|
+
url=create_task_url,
|
|
27
|
+
data=json_payload,
|
|
28
|
+
headers=headers,
|
|
29
|
+
)
|
|
30
|
+
logging.debug(f"create task api resp: {create_api_resp}")
|
|
31
|
+
|
|
32
|
+
# 检查任务创建是否成功
|
|
33
|
+
if (
|
|
34
|
+
"code" not in create_api_resp
|
|
35
|
+
or create_api_resp["code"] != 0
|
|
36
|
+
or "data" not in create_api_resp
|
|
37
|
+
or "id" not in create_api_resp["data"]
|
|
38
|
+
):
|
|
39
|
+
raise ValueError(f"Invalid response: {create_api_resp}")
|
|
40
|
+
|
|
41
|
+
# 轮询获取结果,最多等待1小时
|
|
42
|
+
task_id = create_api_resp["data"]["id"]
|
|
43
|
+
logging.info(f"Sora2 task created, task_id: {task_id}")
|
|
44
|
+
start_time = time.time()
|
|
45
|
+
status_url = f"{BIZYAIR_X_SERVER}/proxy_inference/GRSAI/{model}/{task_id}"
|
|
46
|
+
while time.time() - start_time < 3600:
|
|
47
|
+
time.sleep(10)
|
|
48
|
+
try:
|
|
49
|
+
status_api_resp = send_request(
|
|
50
|
+
method="GET",
|
|
51
|
+
url=status_url,
|
|
52
|
+
headers=headers,
|
|
53
|
+
)
|
|
54
|
+
logging.debug(f"status api resp: {status_api_resp}")
|
|
55
|
+
except Exception as e:
|
|
56
|
+
logging.error(f"Sora2 task {task_id} status api error: {e}")
|
|
57
|
+
continue
|
|
58
|
+
|
|
59
|
+
if (
|
|
60
|
+
"data" in status_api_resp
|
|
61
|
+
and "status" in status_api_resp["data"]
|
|
62
|
+
and status_api_resp["data"]["status"] == "succeeded"
|
|
63
|
+
and "results" in status_api_resp["data"]
|
|
64
|
+
and len(status_api_resp["data"]["results"]) > 0
|
|
65
|
+
and "url" in status_api_resp["data"]["results"][0]
|
|
66
|
+
and status_api_resp["data"]["results"][0]["url"]
|
|
67
|
+
):
|
|
68
|
+
video_url = status_api_resp["data"]["results"][0]["url"]
|
|
69
|
+
logging.info(f"Sora2 task {task_id} success, video_url: {video_url}")
|
|
70
|
+
# 下载视频
|
|
71
|
+
video_resp = requests.get(video_url, stream=True, timeout=3600)
|
|
72
|
+
video_resp.raise_for_status() # 非 2xx 会抛异常
|
|
73
|
+
return (VideoFromFile(io.BytesIO(video_resp.content)),)
|
|
74
|
+
if (
|
|
75
|
+
"data" not in status_api_resp
|
|
76
|
+
or "status" not in status_api_resp["data"]
|
|
77
|
+
or "code" not in status_api_resp
|
|
78
|
+
or status_api_resp["code"] != 0
|
|
79
|
+
):
|
|
80
|
+
raise ValueError(f"Invalid response: {status_api_resp}")
|
|
81
|
+
if status_api_resp["data"]["status"] in _GRSAI_FAILED_STATUS:
|
|
82
|
+
raise ValueError(f"Sora2 task failed: {status_api_resp}")
|
|
83
|
+
logging.debug(
|
|
84
|
+
f"Sora2 task {task_id} status: {status_api_resp['data']['status']}"
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
raise ValueError(f"Sora2 task timed out, request ID: {task_id}")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class Sora_V2_I2V_API(BizyAirBaseNode):
|
|
91
|
+
@classmethod
|
|
92
|
+
def INPUT_TYPES(cls):
|
|
93
|
+
return {
|
|
94
|
+
"required": {
|
|
95
|
+
"prompt": (
|
|
96
|
+
"STRING",
|
|
97
|
+
{
|
|
98
|
+
"multiline": True,
|
|
99
|
+
"default": "",
|
|
100
|
+
},
|
|
101
|
+
),
|
|
102
|
+
"image": ("IMAGE", {"tooltip": "首帧图片"}),
|
|
103
|
+
"model": (["sora-2"], {"default": "sora-2"}),
|
|
104
|
+
},
|
|
105
|
+
"optional": {
|
|
106
|
+
"aspect_ratio": (
|
|
107
|
+
["9:16", "16:9"],
|
|
108
|
+
{"default": "16:9"},
|
|
109
|
+
),
|
|
110
|
+
"duration": ([10, 15], {"default": 10}),
|
|
111
|
+
"size": (["small", "large"], {"default": "small"}),
|
|
112
|
+
},
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
NODE_DISPLAY_NAME = "Sora2 Image To Video"
|
|
116
|
+
RETURN_TYPES = ("VIDEO",)
|
|
117
|
+
RETURN_NAMES = ("video",)
|
|
118
|
+
CATEGORY = "☁️BizyAir/External APIs/Sora"
|
|
119
|
+
FUNCTION = "api_call"
|
|
120
|
+
|
|
121
|
+
def api_call(self, image, model, prompt, **kwargs):
|
|
122
|
+
extra_data = pop_api_key_and_prompt_id(kwargs)
|
|
123
|
+
headers = client.headers(api_key=extra_data["api_key"])
|
|
124
|
+
prompt_id = extra_data["prompt_id"]
|
|
125
|
+
headers["X-BIZYAIR-PROMPT-ID"] = prompt_id
|
|
126
|
+
headers["X-Bizyair-Async-Result"] = "enable"
|
|
127
|
+
|
|
128
|
+
# 参数
|
|
129
|
+
aspect_ratio = kwargs.get("aspect_ratio", "16:9")
|
|
130
|
+
duration = kwargs.get("duration", 10)
|
|
131
|
+
size = kwargs.get("size", "small")
|
|
132
|
+
|
|
133
|
+
input = {
|
|
134
|
+
"webHook": "-1",
|
|
135
|
+
"aspectRatio": aspect_ratio,
|
|
136
|
+
"duration": duration,
|
|
137
|
+
"size": size,
|
|
138
|
+
"model": model,
|
|
139
|
+
}
|
|
140
|
+
if prompt is not None and prompt.strip() != "":
|
|
141
|
+
input["prompt"] = prompt
|
|
142
|
+
else:
|
|
143
|
+
raise ValueError("Prompt is required")
|
|
144
|
+
|
|
145
|
+
# 上传图片
|
|
146
|
+
if image is not None:
|
|
147
|
+
oss_token_url = f"{BIZYAIR_X_SERVER}/upload/token?file_name={prompt_id}.png&file_type=inputs"
|
|
148
|
+
token_resp = send_request("GET", oss_token_url, headers=headers)
|
|
149
|
+
auth_info = parse_upload_token(token_resp)
|
|
150
|
+
input["url"] = upload_file_without_sdk(
|
|
151
|
+
tensor_to_bytesio(image), **auth_info
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
# 调用API
|
|
155
|
+
return sora2_create_task_and_wait_for_completion(
|
|
156
|
+
data=input, model=model, prompt=prompt, headers=headers
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
class Sora_V2_T2V_API(BizyAirBaseNode):
|
|
161
|
+
@classmethod
|
|
162
|
+
def INPUT_TYPES(cls):
|
|
163
|
+
return {
|
|
164
|
+
"required": {
|
|
165
|
+
"prompt": (
|
|
166
|
+
"STRING",
|
|
167
|
+
{
|
|
168
|
+
"multiline": True,
|
|
169
|
+
"default": "",
|
|
170
|
+
},
|
|
171
|
+
),
|
|
172
|
+
"model": (["sora-2"], {"default": "sora-2"}),
|
|
173
|
+
},
|
|
174
|
+
"optional": {
|
|
175
|
+
"aspect_ratio": (
|
|
176
|
+
["9:16", "16:9"],
|
|
177
|
+
{"default": "16:9"},
|
|
178
|
+
),
|
|
179
|
+
"duration": ([10, 15], {"default": 10}),
|
|
180
|
+
"size": (["small", "large"], {"default": "small"}),
|
|
181
|
+
},
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
NODE_DISPLAY_NAME = "Sora2 Text To Video"
|
|
185
|
+
RETURN_TYPES = ("VIDEO",)
|
|
186
|
+
RETURN_NAMES = ("video",)
|
|
187
|
+
CATEGORY = "☁️BizyAir/External APIs/Sora"
|
|
188
|
+
FUNCTION = "api_call"
|
|
189
|
+
|
|
190
|
+
def api_call(self, prompt, model, **kwargs):
|
|
191
|
+
extra_data = pop_api_key_and_prompt_id(kwargs)
|
|
192
|
+
headers = client.headers(api_key=extra_data["api_key"])
|
|
193
|
+
prompt_id = extra_data["prompt_id"]
|
|
194
|
+
headers["X-BIZYAIR-PROMPT-ID"] = prompt_id
|
|
195
|
+
headers["X-Bizyair-Async-Result"] = "enable"
|
|
196
|
+
|
|
197
|
+
# 参数
|
|
198
|
+
aspect_ratio = kwargs.get("aspect_ratio", "16:9")
|
|
199
|
+
duration = kwargs.get("duration", 10)
|
|
200
|
+
size = kwargs.get("size", "small")
|
|
201
|
+
|
|
202
|
+
input = {
|
|
203
|
+
"webHook": "-1",
|
|
204
|
+
"aspectRatio": aspect_ratio,
|
|
205
|
+
"duration": duration,
|
|
206
|
+
"size": size,
|
|
207
|
+
"model": model,
|
|
208
|
+
}
|
|
209
|
+
if prompt is not None and prompt.strip() != "":
|
|
210
|
+
input["prompt"] = prompt
|
|
211
|
+
else:
|
|
212
|
+
raise ValueError("Prompt is required")
|
|
213
|
+
|
|
214
|
+
# 调用API
|
|
215
|
+
return sora2_create_task_and_wait_for_completion(
|
|
216
|
+
data=input, model=model, prompt=prompt, headers=headers
|
|
217
|
+
)
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import io
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
4
|
+
import time
|
|
5
|
+
|
|
6
|
+
import requests
|
|
7
|
+
from comfy_api.latest._input_impl import VideoFromFile
|
|
8
|
+
from comfy_api_nodes.apinode_utils import tensor_to_bytesio
|
|
9
|
+
|
|
10
|
+
from bizyengine.bizyair_extras.utils.audio import save_audio
|
|
11
|
+
from bizyengine.core import BizyAirBaseNode, pop_api_key_and_prompt_id
|
|
12
|
+
from bizyengine.core.common import client
|
|
13
|
+
from bizyengine.core.common.client import send_request
|
|
14
|
+
from bizyengine.core.common.env_var import BIZYAIR_X_SERVER
|
|
15
|
+
|
|
16
|
+
from .utils.aliyun_oss import parse_upload_token, upload_file_without_sdk
|
|
17
|
+
|
|
18
|
+
_GRSAI_FAILED_STATUS = ["failed"]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def veo_create_task_and_wait_for_completion(data, model, prompt, headers):
|
|
22
|
+
# 创建任务
|
|
23
|
+
create_task_url = f"{BIZYAIR_X_SERVER}/proxy_inference/GRSAI/{model}"
|
|
24
|
+
json_payload = json.dumps(data).encode("utf-8")
|
|
25
|
+
logging.debug(f"json_payload: {json_payload}")
|
|
26
|
+
create_api_resp = send_request(
|
|
27
|
+
url=create_task_url,
|
|
28
|
+
data=json_payload,
|
|
29
|
+
headers=headers,
|
|
30
|
+
)
|
|
31
|
+
logging.debug(f"create task api resp: {create_api_resp}")
|
|
32
|
+
|
|
33
|
+
# 检查任务创建是否成功
|
|
34
|
+
if (
|
|
35
|
+
"code" not in create_api_resp
|
|
36
|
+
or create_api_resp["code"] != 0
|
|
37
|
+
or "data" not in create_api_resp
|
|
38
|
+
or "id" not in create_api_resp["data"]
|
|
39
|
+
):
|
|
40
|
+
raise ValueError(f"Invalid response: {create_api_resp}")
|
|
41
|
+
|
|
42
|
+
# 轮询获取结果,最多等待1小时
|
|
43
|
+
task_id = create_api_resp["data"]["id"]
|
|
44
|
+
logging.info(f"Veo3.1 task created, task_id: {task_id}")
|
|
45
|
+
start_time = time.time()
|
|
46
|
+
status_url = f"{BIZYAIR_X_SERVER}/proxy_inference/GRSAI/{model}/{task_id}"
|
|
47
|
+
while time.time() - start_time < 3600:
|
|
48
|
+
time.sleep(10)
|
|
49
|
+
try:
|
|
50
|
+
status_api_resp = send_request(
|
|
51
|
+
method="GET",
|
|
52
|
+
url=status_url,
|
|
53
|
+
headers=headers,
|
|
54
|
+
)
|
|
55
|
+
logging.debug(f"status api resp: {status_api_resp}")
|
|
56
|
+
except Exception as e:
|
|
57
|
+
logging.error(f"Veo3.1 task {task_id} status api error: {e}")
|
|
58
|
+
continue
|
|
59
|
+
|
|
60
|
+
if (
|
|
61
|
+
"data" in status_api_resp
|
|
62
|
+
and "status" in status_api_resp["data"]
|
|
63
|
+
and status_api_resp["data"]["status"] == "succeeded"
|
|
64
|
+
and "url" in status_api_resp["data"]
|
|
65
|
+
and status_api_resp["data"]["url"]
|
|
66
|
+
):
|
|
67
|
+
video_url = status_api_resp["data"]["url"]
|
|
68
|
+
logging.info(f"Veo3.1 task {task_id} success, video_url: {video_url}")
|
|
69
|
+
# 下载视频
|
|
70
|
+
video_resp = requests.get(video_url, stream=True, timeout=3600)
|
|
71
|
+
video_resp.raise_for_status() # 非 2xx 会抛异常
|
|
72
|
+
return (VideoFromFile(io.BytesIO(video_resp.content)),)
|
|
73
|
+
if (
|
|
74
|
+
"data" not in status_api_resp
|
|
75
|
+
or "status" not in status_api_resp["data"]
|
|
76
|
+
or "code" not in status_api_resp
|
|
77
|
+
or status_api_resp["code"] != 0
|
|
78
|
+
):
|
|
79
|
+
raise ValueError(f"Invalid response: {status_api_resp}")
|
|
80
|
+
if status_api_resp["data"]["status"] in _GRSAI_FAILED_STATUS:
|
|
81
|
+
raise ValueError(f"Veo3.1 task failed: {status_api_resp}")
|
|
82
|
+
logging.debug(
|
|
83
|
+
f"Veo3.1 task {task_id} status: {status_api_resp['data']['status']}"
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
raise ValueError(f"Veo3.1 task timed out, request ID: {task_id}")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class Veo_V3_1_I2V_API(BizyAirBaseNode):
|
|
90
|
+
@classmethod
|
|
91
|
+
def INPUT_TYPES(cls):
|
|
92
|
+
return {
|
|
93
|
+
"required": {
|
|
94
|
+
"prompt": (
|
|
95
|
+
"STRING",
|
|
96
|
+
{
|
|
97
|
+
"multiline": True,
|
|
98
|
+
"default": "",
|
|
99
|
+
},
|
|
100
|
+
),
|
|
101
|
+
"first_frame_image": ("IMAGE", {"tooltip": "首帧图片"}),
|
|
102
|
+
"model": (["veo3.1-fast", "veo3.1-pro"], {"default": "veo3.1-fast"}),
|
|
103
|
+
},
|
|
104
|
+
"optional": {
|
|
105
|
+
"last_frame_image": ("IMAGE", {"tooltip": "尾帧图片"}),
|
|
106
|
+
"aspect_ratio": (
|
|
107
|
+
["9:16", "16:9"],
|
|
108
|
+
{"default": "16:9"},
|
|
109
|
+
),
|
|
110
|
+
},
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
NODE_DISPLAY_NAME = "Veo3.1 Image To Video"
|
|
114
|
+
RETURN_TYPES = ("VIDEO",)
|
|
115
|
+
RETURN_NAMES = ("video",)
|
|
116
|
+
CATEGORY = "☁️BizyAir/External APIs/Veo"
|
|
117
|
+
FUNCTION = "api_call"
|
|
118
|
+
|
|
119
|
+
def api_call(self, first_frame_image, model, prompt, **kwargs):
|
|
120
|
+
extra_data = pop_api_key_and_prompt_id(kwargs)
|
|
121
|
+
headers = client.headers(api_key=extra_data["api_key"])
|
|
122
|
+
prompt_id = extra_data["prompt_id"]
|
|
123
|
+
headers["X-BIZYAIR-PROMPT-ID"] = prompt_id
|
|
124
|
+
headers["X-Bizyair-Async-Result"] = "enable"
|
|
125
|
+
|
|
126
|
+
# 参数
|
|
127
|
+
aspect_ratio = kwargs.get("aspect_ratio", "16:9")
|
|
128
|
+
last_frame_image = kwargs.get("last_frame_image", None)
|
|
129
|
+
|
|
130
|
+
input = {
|
|
131
|
+
"webHook": "-1",
|
|
132
|
+
"aspectRatio": aspect_ratio,
|
|
133
|
+
"model": model,
|
|
134
|
+
}
|
|
135
|
+
if prompt is not None and prompt.strip() != "":
|
|
136
|
+
input["prompt"] = prompt
|
|
137
|
+
else:
|
|
138
|
+
raise ValueError("Prompt is required")
|
|
139
|
+
|
|
140
|
+
# 上传图片
|
|
141
|
+
if first_frame_image is not None:
|
|
142
|
+
oss_token_url = f"{BIZYAIR_X_SERVER}/upload/token?file_name={prompt_id}_first.png&file_type=inputs"
|
|
143
|
+
token_resp = send_request("GET", oss_token_url, headers=headers)
|
|
144
|
+
auth_info = parse_upload_token(token_resp)
|
|
145
|
+
input["firstFrameUrl"] = upload_file_without_sdk(
|
|
146
|
+
tensor_to_bytesio(first_frame_image), **auth_info
|
|
147
|
+
)
|
|
148
|
+
if last_frame_image is not None:
|
|
149
|
+
oss_token_url = f"{BIZYAIR_X_SERVER}/upload/token?file_name={prompt_id}_last.png&file_type=inputs"
|
|
150
|
+
token_resp = send_request("GET", oss_token_url, headers=headers)
|
|
151
|
+
auth_info = parse_upload_token(token_resp)
|
|
152
|
+
input["lastFrameUrl"] = upload_file_without_sdk(
|
|
153
|
+
tensor_to_bytesio(last_frame_image), **auth_info
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# 调用API
|
|
157
|
+
return veo_create_task_and_wait_for_completion(
|
|
158
|
+
data=input, model=model, prompt=prompt, headers=headers
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class Veo_V3_1_I2V_REF_API(BizyAirBaseNode):
|
|
163
|
+
@classmethod
|
|
164
|
+
def INPUT_TYPES(cls):
|
|
165
|
+
return {
|
|
166
|
+
"required": {
|
|
167
|
+
"prompt": (
|
|
168
|
+
"STRING",
|
|
169
|
+
{
|
|
170
|
+
"multiline": True,
|
|
171
|
+
"default": "",
|
|
172
|
+
},
|
|
173
|
+
),
|
|
174
|
+
"ref_image_1": ("IMAGE", {"tooltip": "参考图片1"}),
|
|
175
|
+
"model": (["veo3.1-fast"], {"default": "veo3.1-fast"}),
|
|
176
|
+
},
|
|
177
|
+
"optional": {
|
|
178
|
+
"ref_image_2": ("IMAGE", {"tooltip": "参考图片2"}),
|
|
179
|
+
"ref_image_3": ("IMAGE", {"tooltip": "参考图片3"}),
|
|
180
|
+
"aspect_ratio": (
|
|
181
|
+
["9:16", "16:9"],
|
|
182
|
+
{"default": "16:9"},
|
|
183
|
+
),
|
|
184
|
+
},
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
NODE_DISPLAY_NAME = "Veo3.1 Image To Video (Reference Images)"
|
|
188
|
+
RETURN_TYPES = ("VIDEO",)
|
|
189
|
+
RETURN_NAMES = ("video",)
|
|
190
|
+
CATEGORY = "☁️BizyAir/External APIs/Veo"
|
|
191
|
+
FUNCTION = "api_call"
|
|
192
|
+
|
|
193
|
+
def api_call(self, ref_image_1, model, prompt, **kwargs):
|
|
194
|
+
extra_data = pop_api_key_and_prompt_id(kwargs)
|
|
195
|
+
headers = client.headers(api_key=extra_data["api_key"])
|
|
196
|
+
prompt_id = extra_data["prompt_id"]
|
|
197
|
+
headers["X-BIZYAIR-PROMPT-ID"] = prompt_id
|
|
198
|
+
headers["X-Bizyair-Async-Result"] = "enable"
|
|
199
|
+
|
|
200
|
+
# 参数
|
|
201
|
+
aspect_ratio = kwargs.get("aspect_ratio", "16:9")
|
|
202
|
+
ref_image_2 = kwargs.get("ref_image_2", None)
|
|
203
|
+
ref_image_3 = kwargs.get("ref_image_3", None)
|
|
204
|
+
|
|
205
|
+
input = {
|
|
206
|
+
"webHook": "-1",
|
|
207
|
+
"aspectRatio": aspect_ratio,
|
|
208
|
+
"model": model,
|
|
209
|
+
}
|
|
210
|
+
if prompt is not None and prompt.strip() != "":
|
|
211
|
+
input["prompt"] = prompt
|
|
212
|
+
else:
|
|
213
|
+
raise ValueError("Prompt is required")
|
|
214
|
+
|
|
215
|
+
# 上传图片
|
|
216
|
+
ref_images = []
|
|
217
|
+
if ref_image_1 is not None:
|
|
218
|
+
oss_token_url = f"{BIZYAIR_X_SERVER}/upload/token?file_name={prompt_id}_ref_1.png&file_type=inputs"
|
|
219
|
+
token_resp = send_request("GET", oss_token_url, headers=headers)
|
|
220
|
+
auth_info = parse_upload_token(token_resp)
|
|
221
|
+
ref_images.append(
|
|
222
|
+
upload_file_without_sdk(tensor_to_bytesio(ref_image_1), **auth_info)
|
|
223
|
+
)
|
|
224
|
+
if ref_image_2 is not None:
|
|
225
|
+
oss_token_url = f"{BIZYAIR_X_SERVER}/upload/token?file_name={prompt_id}_ref_2.png&file_type=inputs"
|
|
226
|
+
token_resp = send_request("GET", oss_token_url, headers=headers)
|
|
227
|
+
auth_info = parse_upload_token(token_resp)
|
|
228
|
+
ref_images.append(
|
|
229
|
+
upload_file_without_sdk(tensor_to_bytesio(ref_image_2), **auth_info)
|
|
230
|
+
)
|
|
231
|
+
if ref_image_3 is not None:
|
|
232
|
+
oss_token_url = f"{BIZYAIR_X_SERVER}/upload/token?file_name={prompt_id}_ref_3.png&file_type=inputs"
|
|
233
|
+
token_resp = send_request("GET", oss_token_url, headers=headers)
|
|
234
|
+
auth_info = parse_upload_token(token_resp)
|
|
235
|
+
ref_images.append(
|
|
236
|
+
upload_file_without_sdk(tensor_to_bytesio(ref_image_3), **auth_info)
|
|
237
|
+
)
|
|
238
|
+
input["urls"] = ref_images
|
|
239
|
+
|
|
240
|
+
# 调用API
|
|
241
|
+
return veo_create_task_and_wait_for_completion(
|
|
242
|
+
data=input, model=model, prompt=prompt, headers=headers
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
class Veo_V3_1_T2V_API(BizyAirBaseNode):
|
|
247
|
+
@classmethod
|
|
248
|
+
def INPUT_TYPES(cls):
|
|
249
|
+
return {
|
|
250
|
+
"required": {
|
|
251
|
+
"prompt": (
|
|
252
|
+
"STRING",
|
|
253
|
+
{
|
|
254
|
+
"multiline": True,
|
|
255
|
+
"default": "",
|
|
256
|
+
},
|
|
257
|
+
),
|
|
258
|
+
"model": (["veo3.1-fast", "veo3.1-pro"], {"default": "veo3.1-fast"}),
|
|
259
|
+
},
|
|
260
|
+
"optional": {
|
|
261
|
+
"aspect_ratio": (
|
|
262
|
+
["9:16", "16:9"],
|
|
263
|
+
{"default": "16:9"},
|
|
264
|
+
),
|
|
265
|
+
},
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
NODE_DISPLAY_NAME = "Veo3.1 Text To Video"
|
|
269
|
+
RETURN_TYPES = ("VIDEO",)
|
|
270
|
+
RETURN_NAMES = ("video",)
|
|
271
|
+
CATEGORY = "☁️BizyAir/External APIs/Veo"
|
|
272
|
+
FUNCTION = "api_call"
|
|
273
|
+
|
|
274
|
+
def api_call(self, prompt, model, **kwargs):
|
|
275
|
+
extra_data = pop_api_key_and_prompt_id(kwargs)
|
|
276
|
+
headers = client.headers(api_key=extra_data["api_key"])
|
|
277
|
+
prompt_id = extra_data["prompt_id"]
|
|
278
|
+
headers["X-BIZYAIR-PROMPT-ID"] = prompt_id
|
|
279
|
+
headers["X-Bizyair-Async-Result"] = "enable"
|
|
280
|
+
|
|
281
|
+
# 参数
|
|
282
|
+
aspect_ratio = kwargs.get("aspect_ratio", "16:9")
|
|
283
|
+
|
|
284
|
+
input = {
|
|
285
|
+
"webHook": "-1",
|
|
286
|
+
"aspectRatio": aspect_ratio,
|
|
287
|
+
"model": model,
|
|
288
|
+
}
|
|
289
|
+
if prompt is not None and prompt.strip() != "":
|
|
290
|
+
input["prompt"] = prompt
|
|
291
|
+
else:
|
|
292
|
+
raise ValueError("Prompt is required")
|
|
293
|
+
|
|
294
|
+
# 调用API
|
|
295
|
+
return veo_create_task_and_wait_for_completion(
|
|
296
|
+
data=input, model=model, prompt=prompt, headers=headers
|
|
297
|
+
)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import io
|
|
2
2
|
import json
|
|
3
3
|
import logging
|
|
4
|
+
import time
|
|
4
5
|
|
|
5
6
|
import requests
|
|
6
7
|
from comfy_api.latest._input_impl import VideoFromFile
|
|
@@ -12,24 +13,74 @@ from bizyengine.core.common import client
|
|
|
12
13
|
from bizyengine.core.common.client import send_request
|
|
13
14
|
from bizyengine.core.common.env_var import BIZYAIR_X_SERVER
|
|
14
15
|
|
|
15
|
-
from .utils.aliyun_oss import upload_file_without_sdk
|
|
16
|
+
from .utils.aliyun_oss import parse_upload_token, upload_file_without_sdk
|
|
16
17
|
|
|
18
|
+
_FAILED_STATUS = ["FAILED", "CANCELED", "UNKNOWN"]
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
20
|
+
|
|
21
|
+
def wan_create_task_and_wait_for_completion(data, model, prompt, headers):
|
|
22
|
+
# 创建任务
|
|
23
|
+
create_task_url = f"{BIZYAIR_X_SERVER}/proxy_inference/Wan/{model}"
|
|
24
|
+
json_payload = json.dumps(data).encode("utf-8")
|
|
25
|
+
logging.debug(f"json_payload: {json_payload}")
|
|
26
|
+
create_api_resp = send_request(
|
|
27
|
+
url=create_task_url,
|
|
28
|
+
data=json_payload,
|
|
29
|
+
headers=headers,
|
|
30
|
+
)
|
|
31
|
+
logging.debug(f"create task api resp: {create_api_resp}")
|
|
32
|
+
|
|
33
|
+
# 检查任务创建是否成功
|
|
34
|
+
if (
|
|
35
|
+
"request_id" not in create_api_resp
|
|
36
|
+
or "output" not in create_api_resp
|
|
37
|
+
or "task_status" not in create_api_resp["output"]
|
|
38
|
+
or "task_id" not in create_api_resp["output"]
|
|
39
|
+
):
|
|
40
|
+
raise ValueError(f"Invalid response: {create_api_resp}")
|
|
41
|
+
# 检查任务状态,是否已经报错,如果报错则抛出异常
|
|
42
|
+
if create_api_resp["output"]["task_status"] in _FAILED_STATUS:
|
|
43
|
+
raise ValueError(f"Wan2.5 create task failed: {create_api_resp}")
|
|
44
|
+
|
|
45
|
+
# 轮询获取结果,最多等待1小时
|
|
46
|
+
task_id = create_api_resp["output"]["task_id"]
|
|
47
|
+
logging.info(
|
|
48
|
+
f'Wan2.5 task created, task_id: {task_id}, request_id: {create_api_resp["request_id"]}'
|
|
49
|
+
)
|
|
50
|
+
start_time = time.time()
|
|
51
|
+
status_url = f"{BIZYAIR_X_SERVER}/proxy_inference/Wan/{model}/{task_id}"
|
|
52
|
+
while time.time() - start_time < 3600:
|
|
53
|
+
time.sleep(10)
|
|
54
|
+
try:
|
|
55
|
+
status_api_resp = send_request(
|
|
56
|
+
method="GET",
|
|
57
|
+
url=status_url,
|
|
58
|
+
headers=headers,
|
|
59
|
+
)
|
|
60
|
+
except Exception as e:
|
|
61
|
+
logging.error(f"Wan2.5 task {task_id} status api error: {e}")
|
|
62
|
+
continue
|
|
63
|
+
|
|
64
|
+
if "output" in status_api_resp and "video_url" in status_api_resp["output"]:
|
|
65
|
+
video_url = status_api_resp["output"]["video_url"]
|
|
66
|
+
logging.info(f"Wan2.5 task {task_id} success, video_url: {video_url}")
|
|
67
|
+
actual_prompt = status_api_resp["output"].get("actual_prompt", prompt)
|
|
68
|
+
# 下载视频
|
|
69
|
+
video_resp = requests.get(video_url, stream=True, timeout=3600)
|
|
70
|
+
video_resp.raise_for_status() # 非 2xx 会抛异常
|
|
71
|
+
return (VideoFromFile(io.BytesIO(video_resp.content)), actual_prompt)
|
|
72
|
+
if (
|
|
73
|
+
"output" not in status_api_resp
|
|
74
|
+
or "task_status" not in status_api_resp["output"]
|
|
75
|
+
):
|
|
76
|
+
raise ValueError(f"Invalid response: {status_api_resp}")
|
|
77
|
+
if status_api_resp["output"]["task_status"] in _FAILED_STATUS:
|
|
78
|
+
raise ValueError(f"Wan2.5 task failed: {status_api_resp}")
|
|
79
|
+
logging.debug(
|
|
80
|
+
f"Wan2.5 task {task_id} status: {status_api_resp['output']['task_status']}"
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
raise ValueError(f"Wan2.5 task timed out, request ID: {task_id}")
|
|
33
84
|
|
|
34
85
|
|
|
35
86
|
class Wan_V2_5_I2V_API(BizyAirBaseNode):
|
|
@@ -88,6 +139,7 @@ class Wan_V2_5_I2V_API(BizyAirBaseNode):
|
|
|
88
139
|
headers = client.headers(api_key=extra_data["api_key"])
|
|
89
140
|
prompt_id = extra_data["prompt_id"]
|
|
90
141
|
headers["X-BIZYAIR-PROMPT-ID"] = prompt_id
|
|
142
|
+
headers["X-Bizyair-Async-Result"] = "enable"
|
|
91
143
|
|
|
92
144
|
# 参数
|
|
93
145
|
prompt = kwargs.get("prompt", "")
|
|
@@ -121,7 +173,6 @@ class Wan_V2_5_I2V_API(BizyAirBaseNode):
|
|
|
121
173
|
|
|
122
174
|
# 调用API
|
|
123
175
|
model = "wan2.5-i2v-preview"
|
|
124
|
-
api_url = f"{BIZYAIR_X_SERVER}/proxy_inference/Wan/{model}"
|
|
125
176
|
data = {
|
|
126
177
|
"model": model,
|
|
127
178
|
"input": input,
|
|
@@ -132,22 +183,10 @@ class Wan_V2_5_I2V_API(BizyAirBaseNode):
|
|
|
132
183
|
"audio": auto_audio,
|
|
133
184
|
},
|
|
134
185
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
url=api_url,
|
|
139
|
-
data=json_payload,
|
|
140
|
-
headers=headers,
|
|
186
|
+
|
|
187
|
+
return wan_create_task_and_wait_for_completion(
|
|
188
|
+
data=data, model=model, prompt=prompt, headers=headers
|
|
141
189
|
)
|
|
142
|
-
logging.debug(f"api resp: {api_resp}")
|
|
143
|
-
if "output" not in api_resp or "video_url" not in api_resp["output"]:
|
|
144
|
-
raise ValueError(f"Invalid response: {api_resp}")
|
|
145
|
-
video_url = api_resp["output"]["video_url"]
|
|
146
|
-
actual_prompt = api_resp["output"].get("actual_prompt", prompt)
|
|
147
|
-
# 下载视频
|
|
148
|
-
video_resp = requests.get(video_url, stream=True, timeout=30)
|
|
149
|
-
video_resp.raise_for_status() # 非 2xx 会抛异常
|
|
150
|
-
return (VideoFromFile(io.BytesIO(video_resp.content)), actual_prompt)
|
|
151
190
|
|
|
152
191
|
|
|
153
192
|
class Wan_V2_5_T2V_API(BizyAirBaseNode):
|
|
@@ -214,27 +253,12 @@ class Wan_V2_5_T2V_API(BizyAirBaseNode):
|
|
|
214
253
|
CATEGORY = "☁️BizyAir/External APIs/WanVideo"
|
|
215
254
|
FUNCTION = "api_call"
|
|
216
255
|
|
|
217
|
-
def parse_upload_token(self, resp) -> dict:
|
|
218
|
-
logging.debug(f"parsing token resp: {resp}")
|
|
219
|
-
if "data" not in resp:
|
|
220
|
-
logging.error(f"Invalid response, data not found: {resp}")
|
|
221
|
-
raise ValueError(f"Invalid response: {resp}")
|
|
222
|
-
data = resp["data"]
|
|
223
|
-
if "file" not in data:
|
|
224
|
-
logging.error(f"Invalid response, file not found: {resp}")
|
|
225
|
-
raise ValueError(f"Invalid response: {resp}")
|
|
226
|
-
file = data["file"]
|
|
227
|
-
if "storage" not in data:
|
|
228
|
-
logging.error(f"Invalid response, storage not found: {resp}")
|
|
229
|
-
raise ValueError(f"Invalid response: {resp}")
|
|
230
|
-
storage = data["storage"]
|
|
231
|
-
return file | storage
|
|
232
|
-
|
|
233
256
|
def api_call(self, prompt, **kwargs):
|
|
234
257
|
extra_data = pop_api_key_and_prompt_id(kwargs)
|
|
235
258
|
headers = client.headers(api_key=extra_data["api_key"])
|
|
236
259
|
prompt_id = extra_data["prompt_id"]
|
|
237
260
|
headers["X-BIZYAIR-PROMPT-ID"] = prompt_id
|
|
261
|
+
headers["X-Bizyair-Async-Result"] = "enable"
|
|
238
262
|
|
|
239
263
|
# 参数
|
|
240
264
|
negative_prompt = kwargs.get("negative_prompt", "")
|
|
@@ -260,7 +284,6 @@ class Wan_V2_5_T2V_API(BizyAirBaseNode):
|
|
|
260
284
|
|
|
261
285
|
# 调用API
|
|
262
286
|
model = "wan2.5-t2v-preview"
|
|
263
|
-
api_url = f"{BIZYAIR_X_SERVER}/proxy_inference/Wan/{model}"
|
|
264
287
|
data = {
|
|
265
288
|
"model": model,
|
|
266
289
|
"input": input,
|
|
@@ -271,19 +294,6 @@ class Wan_V2_5_T2V_API(BizyAirBaseNode):
|
|
|
271
294
|
"audio": auto_audio,
|
|
272
295
|
},
|
|
273
296
|
}
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
api_resp = send_request(
|
|
277
|
-
url=api_url,
|
|
278
|
-
data=json_payload,
|
|
279
|
-
headers=headers,
|
|
297
|
+
return wan_create_task_and_wait_for_completion(
|
|
298
|
+
data=data, model=model, prompt=prompt, headers=headers
|
|
280
299
|
)
|
|
281
|
-
logging.debug(f"api resp: {api_resp}")
|
|
282
|
-
if "output" not in api_resp or "video_url" not in api_resp["output"]:
|
|
283
|
-
raise ValueError(f"Invalid response: {api_resp}")
|
|
284
|
-
video_url = api_resp["output"]["video_url"]
|
|
285
|
-
actual_prompt = api_resp["output"].get("actual_prompt", prompt)
|
|
286
|
-
# 下载视频
|
|
287
|
-
video_resp = requests.get(video_url, stream=True, timeout=30)
|
|
288
|
-
video_resp.raise_for_status() # 非 2xx 会抛异常
|
|
289
|
-
return (VideoFromFile(io.BytesIO(video_resp.content)), actual_prompt)
|
|
@@ -73,3 +73,20 @@ def upload_file_without_sdk(
|
|
|
73
73
|
if response is not None:
|
|
74
74
|
logging.error(f"Response content: {response.text}")
|
|
75
75
|
raise e
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def parse_upload_token(resp) -> dict:
|
|
79
|
+
logging.debug(f"parsing token resp: {resp}")
|
|
80
|
+
if "data" not in resp:
|
|
81
|
+
logging.error(f"Invalid response, data not found: {resp}")
|
|
82
|
+
raise ValueError(f"Invalid response: {resp}")
|
|
83
|
+
data = resp["data"]
|
|
84
|
+
if "file" not in data:
|
|
85
|
+
logging.error(f"Invalid response, file not found: {resp}")
|
|
86
|
+
raise ValueError(f"Invalid response: {resp}")
|
|
87
|
+
file = data["file"]
|
|
88
|
+
if "storage" not in data:
|
|
89
|
+
logging.error(f"Invalid response, storage not found: {resp}")
|
|
90
|
+
raise ValueError(f"Invalid response: {resp}")
|
|
91
|
+
storage = data["storage"]
|
|
92
|
+
return file | storage
|
bizyengine/core/common/client.py
CHANGED
|
@@ -160,7 +160,7 @@ def send_request(
|
|
|
160
160
|
req = urllib.request.Request(
|
|
161
161
|
url, data=data, headers=headers, method=method, **kwargs
|
|
162
162
|
)
|
|
163
|
-
with urllib.request.urlopen(req, timeout=
|
|
163
|
+
with urllib.request.urlopen(req, timeout=3600) as response:
|
|
164
164
|
response_data = response.read().decode("utf-8")
|
|
165
165
|
|
|
166
166
|
except urllib.error.URLError as e:
|
bizyengine/misc/utils.py
CHANGED
|
@@ -43,7 +43,7 @@ def send_post_request(api_url, payload, headers):
|
|
|
43
43
|
try:
|
|
44
44
|
data = json.dumps(payload).encode("utf-8")
|
|
45
45
|
req = urllib.request.Request(api_url, data=data, headers=headers, method="POST")
|
|
46
|
-
with urllib.request.urlopen(req, timeout=
|
|
46
|
+
with urllib.request.urlopen(req, timeout=3600) as response:
|
|
47
47
|
response_data = response.read().decode("utf-8")
|
|
48
48
|
return response_data
|
|
49
49
|
except urllib.error.URLError as e:
|
bizyengine/version.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.2.
|
|
1
|
+
1.2.59
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bizyengine
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.59
|
|
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,5 +1,5 @@
|
|
|
1
1
|
bizyengine/__init__.py,sha256=GP9V-JM07fz7uv_qTB43QEA2rKdrVJxi5I7LRnn_3ZQ,914
|
|
2
|
-
bizyengine/version.txt,sha256=
|
|
2
|
+
bizyengine/version.txt,sha256=_GSvGEHdo_UgJSqo8uN6JMq8S1egBFMkDpw_HlzaeYM,7
|
|
3
3
|
bizyengine/bizy_server/__init__.py,sha256=SP9oSblnPo4KQyh7yOGD26YCskFAcQHAZy04nQBNRIw,200
|
|
4
4
|
bizyengine/bizy_server/api_client.py,sha256=Z7G5IjaEqSJkF6nLLw2R3bpgBAOi5ClQiUbel6NMXmE,43932
|
|
5
5
|
bizyengine/bizy_server/errno.py,sha256=RIyvegX3lzpx_1L1q2XVvu3on0kvYgKiUQ8U3ZtyF68,16823
|
|
@@ -10,7 +10,7 @@ bizyengine/bizy_server/resp.py,sha256=iOFT5Ud7VJBP2uqkojJIgc3y2ifMjjEXoj0ewneL9l
|
|
|
10
10
|
bizyengine/bizy_server/server.py,sha256=isOzHDk2kD6WjdlemeOA7j_xLnZ2vat_NvE1I0bsOFw,57490
|
|
11
11
|
bizyengine/bizy_server/stream_response.py,sha256=H2XHqlVRtQMhgdztAuG7l8-iV_Pm42u2x6WJ0gNVIW0,9654
|
|
12
12
|
bizyengine/bizy_server/utils.py,sha256=Kkn-AATZcdaDhg8Rg_EJW6aKqkyiSE2EYmuyOhUwXso,3863
|
|
13
|
-
bizyengine/bizyair_extras/__init__.py,sha256=
|
|
13
|
+
bizyengine/bizyair_extras/__init__.py,sha256=GNmQ3C0fG8pIGgAMV6M9Jp89fOOVd-YpsLOuIWgjxF4,1092
|
|
14
14
|
bizyengine/bizyair_extras/nodes_advanced_refluxcontrol.py,sha256=cecfjrtnjJAty9aNkhz8BlmHUC1NImkFlUDiA0COEa4,2242
|
|
15
15
|
bizyengine/bizyair_extras/nodes_cogview4.py,sha256=Ni0TDOycczyDhYPvSR68TxGV_wE2uhaxd8MIj-J4-3o,2031
|
|
16
16
|
bizyengine/bizyair_extras/nodes_comfyui_detail_daemon.py,sha256=i71it24tiGvZ3h-XFWISr4CpZszUtPuz3UrZARYluLk,6169
|
|
@@ -22,7 +22,7 @@ bizyengine/bizyair_extras/nodes_custom_sampler.py,sha256=NK-7sdcp8oxJisjTEFfBskk
|
|
|
22
22
|
bizyengine/bizyair_extras/nodes_dataset.py,sha256=htF0YZb_FHncLhLDEbJfNCVqJ6rvlo1ZLk7iY42Rylc,3440
|
|
23
23
|
bizyengine/bizyair_extras/nodes_differential_diffusion.py,sha256=nSrbD-w0XtrwktwzME5M0Vmi1sI7Z08AqwgymTdThqo,370
|
|
24
24
|
bizyengine/bizyair_extras/nodes_flux.py,sha256=ls94kGBuBNgW5c6uhG36iZLk1TTM2TIoTTcpERgEE5E,2683
|
|
25
|
-
bizyengine/bizyair_extras/nodes_gemini.py,sha256=
|
|
25
|
+
bizyengine/bizyair_extras/nodes_gemini.py,sha256=XWp3Y7aKF_TDSM2QthOhUqMQN1s4FWWac98JkL8Hxxc,10594
|
|
26
26
|
bizyengine/bizyair_extras/nodes_hunyuan3d.py,sha256=dWHLeqX68N7zKnfDMzm9nutmCNtFT6-wwt7P5cPDu7Q,2058
|
|
27
27
|
bizyengine/bizyair_extras/nodes_image_utils.py,sha256=BldF_CKD2M01K8-SnG-QV86u3HZqFz_GP5GrCQ5CFDQ,2875
|
|
28
28
|
bizyengine/bizyair_extras/nodes_ip2p.py,sha256=GSEFJvrs4f2tv0xwYkWqc8uhsXrzAJVPvvwcw0gTjR0,619
|
|
@@ -35,12 +35,14 @@ bizyengine/bizyair_extras/nodes_sd3.py,sha256=lZCxj0IFmuxk1fZTDcRKgVV5QWHjkUdpR4
|
|
|
35
35
|
bizyengine/bizyair_extras/nodes_seedream.py,sha256=-I22lrdR0S6oRCgN7e5HD8pOJhuGBxDMlhX2S-CyOhY,6855
|
|
36
36
|
bizyengine/bizyair_extras/nodes_segment_anything.py,sha256=x1ei2UggHnB8T6aUtK_ZcUehMALEyLUnDoD5SNJCbFU,7249
|
|
37
37
|
bizyengine/bizyair_extras/nodes_segment_anything_utils.py,sha256=ZefAqrFrevDH3XY_wipr_VwKfeXrgpZEUFaqg_JGOdU,4714
|
|
38
|
+
bizyengine/bizyair_extras/nodes_sora2.py,sha256=ehIZNZyh0Dgvf74LUSCq9FeqdCHzdU6CqcouQzjrAqQ,7703
|
|
38
39
|
bizyengine/bizyair_extras/nodes_testing_utils.py,sha256=lYmcyCIkTkQ7WOZfpEPU9wUbEvC_mL6_A46ks68WzZA,3988
|
|
39
40
|
bizyengine/bizyair_extras/nodes_trellis.py,sha256=GqSRM8FobuziOIxwyAs3BLztpjVIP4rFT0ZWbfqJAfY,6065
|
|
40
41
|
bizyengine/bizyair_extras/nodes_ultimatesdupscale.py,sha256=-_SsLTAWAQDv4uw-4Z7IGP2tXTe73BJ3N5D6RqVVAK4,4133
|
|
41
42
|
bizyengine/bizyair_extras/nodes_upscale_model.py,sha256=lrzA1BFI2w5aEPCmNPMh07s-WDzG-xTT49uU6WCnlP8,1151
|
|
42
43
|
bizyengine/bizyair_extras/nodes_utils.py,sha256=whog_tmV-q7JvLEdb03JL3KKsC7wKe3kImzx_jPaQD8,2613
|
|
43
|
-
bizyengine/bizyair_extras/
|
|
44
|
+
bizyengine/bizyair_extras/nodes_veo3.py,sha256=C3aS20yylRAvV9gTXUyhvnXWIRZshZzLbRll7vqYEOY,10936
|
|
45
|
+
bizyengine/bizyair_extras/nodes_wan_api.py,sha256=nPTbPf6NU5ykCk43O49gLnjzIfOBsR5jjL0ON95n-nM,11265
|
|
44
46
|
bizyengine/bizyair_extras/nodes_wan_i2v.py,sha256=3XwcxLHmgrihgXDEzcVOjU6VjqnZa3mErINlY014PFA,8435
|
|
45
47
|
bizyengine/bizyair_extras/nodes_wan_video.py,sha256=aE2JBF0ZT-6BOM0bGu9R4yZ_eMeMnnjCW-YzFe4qg8Q,2804
|
|
46
48
|
bizyengine/bizyair_extras/route_bizyair_tools.py,sha256=EiP5pS6xoE3tULoNSN2hYZA29vgt7yCErsbRp34gGEg,3898
|
|
@@ -48,7 +50,7 @@ bizyengine/bizyair_extras/nodes_ipadapter_plus/__init__.py,sha256=ECKATm_EKi_4G4
|
|
|
48
50
|
bizyengine/bizyair_extras/nodes_ipadapter_plus/nodes_ipadapter_plus.py,sha256=lOKRem7oiPs8ZkA_p68HxagAgiCSvn3Rk-L4fSXIjyE,54846
|
|
49
51
|
bizyengine/bizyair_extras/nodes_kolors_mz/__init__.py,sha256=HsCCCphW8q0SrWEiFlZKK_W2lQr1T0UJIJL7gEn37ME,3729
|
|
50
52
|
bizyengine/bizyair_extras/oauth_callback/main.py,sha256=KQOZWor3kyNx8xvUNHYNMoHfCF9g_ht13_iPk4K_5YM,3633
|
|
51
|
-
bizyengine/bizyair_extras/utils/aliyun_oss.py,sha256=
|
|
53
|
+
bizyengine/bizyair_extras/utils/aliyun_oss.py,sha256=H6wGZq1DqP7BHJ_frBJVvUVttgXprJprOnxytePIuos,3050
|
|
52
54
|
bizyengine/bizyair_extras/utils/audio.py,sha256=cCmX080jtxsHFa7mCgn13R6cyfqE-1Gq37ZnRJdZNU8,3183
|
|
53
55
|
bizyengine/bizybot/__init__.py,sha256=NINN_7QECKQwtAwKPBTrrSiAK6KbxaZCkIvJ-e1J1xk,262
|
|
54
56
|
bizyengine/bizybot/client.py,sha256=PWdcjslMaW4xmNaAq3TwRGV8twg9yPEfDNyfuZzpCyY,26029
|
|
@@ -75,7 +77,7 @@ bizyengine/core/commands/servers/model_server.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
|
|
|
75
77
|
bizyengine/core/commands/servers/prompt_server.py,sha256=e8JhtKRM8nw0kQwe2Ofl-zQtiVqQdbbWRxOqkFmSclM,10873
|
|
76
78
|
bizyengine/core/common/__init__.py,sha256=GicZw6YeAZk1PsKmFDt9dm1F75zPUlpia9Q_ki5vW1Y,179
|
|
77
79
|
bizyengine/core/common/caching.py,sha256=hRNsSrfNxgc1zzvBzLVjMY0iMkKqA0TBCr-iYhEpzik,6946
|
|
78
|
-
bizyengine/core/common/client.py,sha256=
|
|
80
|
+
bizyengine/core/common/client.py,sha256=5wp_gsyvnSQxETCjUayYe536taOhaVP0zonPvW_asdA,10701
|
|
79
81
|
bizyengine/core/common/env_var.py,sha256=1EAW3gOXY2bKouCqrGa583vTJRdDasQ1IsFTnzDg7Dk,3450
|
|
80
82
|
bizyengine/core/common/utils.py,sha256=Jxk4tCURbUhjYBFuHTiQgeUo2w13TYj4upnPTKNNucM,4215
|
|
81
83
|
bizyengine/core/configs/conf.py,sha256=D_UWG9SSJnK5EhbrfNFryJQ8hUwwdvhOGlq1TielwpI,3830
|
|
@@ -94,8 +96,8 @@ bizyengine/misc/nodes_controlnet_union_sdxl.py,sha256=fYyu_XMY7mcX1Ad9x30q1tYB8m
|
|
|
94
96
|
bizyengine/misc/route_sam.py,sha256=-bMIR2QalfnszipGxSxvDAHGJa5gPSrjkYPb5baaRg4,1561
|
|
95
97
|
bizyengine/misc/segment_anything.py,sha256=wNKYwlYPMszfwj23524geFZJjZaG4eye65SGaUnh77I,8941
|
|
96
98
|
bizyengine/misc/supernode.py,sha256=STN9gaxfTSErH8OiHeZa47d8z-G9S0I7fXuJvHQOBFM,4532
|
|
97
|
-
bizyengine/misc/utils.py,sha256=
|
|
98
|
-
bizyengine-1.2.
|
|
99
|
-
bizyengine-1.2.
|
|
100
|
-
bizyengine-1.2.
|
|
101
|
-
bizyengine-1.2.
|
|
99
|
+
bizyengine/misc/utils.py,sha256=nXXTPkj4WBvds4EWjI9c-ydeWwmXl8Vwrdu-4Fh62g8,12914
|
|
100
|
+
bizyengine-1.2.59.dist-info/METADATA,sha256=iHk2UvrrGQSIK6EfObzDh5pr_QGOwkD5KXjxeN1SBYg,734
|
|
101
|
+
bizyengine-1.2.59.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
102
|
+
bizyengine-1.2.59.dist-info/top_level.txt,sha256=2zapzqxX-we5cRyJkGf9bd5JinRtXp3-_uDI-xCAnc0,11
|
|
103
|
+
bizyengine-1.2.59.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|