Skip to content

Commit 52b8a71

Browse files
author
longgui0318
committed
support veo3 and kling v2.1
1 parent d15328c commit 52b8a71

19 files changed

Lines changed: 1185 additions & 4 deletions

examples/kling_v2_1.json

Lines changed: 263 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,263 @@
1+
{
2+
"id": "36cf237e-b8a4-429e-bf6f-edf252efa11d",
3+
"revision": 0,
4+
"last_node_id": 29,
5+
"last_link_id": 42,
6+
"nodes": [
7+
{
8+
"id": 12,
9+
"type": "LoadImage",
10+
"pos": [
11+
-343.32781982421875,
12+
2.9193222522735596
13+
],
14+
"size": [
15+
274.080078125,
16+
314
17+
],
18+
"flags": {},
19+
"order": 0,
20+
"mode": 0,
21+
"inputs": [],
22+
"outputs": [
23+
{
24+
"name": "IMAGE",
25+
"type": "IMAGE",
26+
"links": [
27+
30
28+
]
29+
},
30+
{
31+
"name": "MASK",
32+
"type": "MASK",
33+
"links": null
34+
}
35+
],
36+
"properties": {
37+
"Node name for S&R": "LoadImage"
38+
},
39+
"widgets_values": [
40+
"---.png",
41+
"image"
42+
]
43+
},
44+
{
45+
"id": 28,
46+
"type": "WaveSpeedAI Preview Video",
47+
"pos": [
48+
665.1029052734375,
49+
-140.30813598632812
50+
],
51+
"size": [
52+
282.0025329589844,
53+
82
54+
],
55+
"flags": {},
56+
"order": 4,
57+
"mode": 0,
58+
"inputs": [
59+
{
60+
"name": "video_url",
61+
"type": "STRING",
62+
"widget": {
63+
"name": "video_url"
64+
},
65+
"link": 42
66+
}
67+
],
68+
"outputs": [],
69+
"properties": {
70+
"Node name for S&R": "WaveSpeedAI Preview Video"
71+
},
72+
"widgets_values": [
73+
"",
74+
"wavespeed_video"
75+
]
76+
},
77+
{
78+
"id": 1,
79+
"type": "WaveSpeedAI Client",
80+
"pos": [
81+
-345.9893798828125,
82+
-133.24803161621094
83+
],
84+
"size": [
85+
270,
86+
58
87+
],
88+
"flags": {},
89+
"order": 1,
90+
"mode": 0,
91+
"inputs": [],
92+
"outputs": [
93+
{
94+
"name": "client",
95+
"type": "WAVESPEED_AI_API_CLIENT",
96+
"links": [
97+
12,
98+
40
99+
]
100+
}
101+
],
102+
"properties": {
103+
"Node name for S&R": "WaveSpeedAI Client"
104+
},
105+
"widgets_values": [
106+
""
107+
]
108+
},
109+
{
110+
"id": 13,
111+
"type": "WaveSpeedAI Upload Image",
112+
"pos": [
113+
-54.460533142089844,
114+
17.26516342163086
115+
],
116+
"size": [
117+
219.93124389648438,
118+
46
119+
],
120+
"flags": {},
121+
"order": 2,
122+
"mode": 0,
123+
"inputs": [
124+
{
125+
"name": "client",
126+
"type": "WAVESPEED_AI_API_CLIENT",
127+
"link": 12
128+
},
129+
{
130+
"name": "image",
131+
"type": "IMAGE",
132+
"link": 30
133+
}
134+
],
135+
"outputs": [
136+
{
137+
"name": "first_image_url",
138+
"type": "STRING",
139+
"links": [
140+
41
141+
]
142+
},
143+
{
144+
"name": "image_urls",
145+
"type": "STRING",
146+
"links": null
147+
}
148+
],
149+
"properties": {
150+
"Node name for S&R": "WaveSpeedAI Upload Image"
151+
},
152+
"widgets_values": []
153+
},
154+
{
155+
"id": 29,
156+
"type": "WaveSpeedAI KwaivgiKlingV21I2vStandardNode",
157+
"pos": [
158+
196.51742553710938,
159+
-127.96833801269531
160+
],
161+
"size": [
162+
400,
163+
214
164+
],
165+
"flags": {},
166+
"order": 3,
167+
"mode": 0,
168+
"inputs": [
169+
{
170+
"name": "client",
171+
"type": "WAVESPEED_AI_API_CLIENT",
172+
"link": 40
173+
},
174+
{
175+
"name": "image",
176+
"type": "STRING",
177+
"widget": {
178+
"name": "image"
179+
},
180+
"link": 41
181+
}
182+
],
183+
"outputs": [
184+
{
185+
"name": "video_url",
186+
"type": "STRING",
187+
"links": [
188+
42
189+
]
190+
}
191+
],
192+
"properties": {
193+
"Node name for S&R": "WaveSpeedAI KwaivgiKlingV21I2vStandardNode"
194+
},
195+
"widgets_values": [
196+
"",
197+
"The robot went on a rampage, smashing everything around it.",
198+
"",
199+
5,
200+
0.5
201+
]
202+
}
203+
],
204+
"links": [
205+
[
206+
12,
207+
1,
208+
0,
209+
13,
210+
0,
211+
"WAVESPEED_AI_API_CLIENT"
212+
],
213+
[
214+
30,
215+
12,
216+
0,
217+
13,
218+
1,
219+
"IMAGE"
220+
],
221+
[
222+
40,
223+
1,
224+
0,
225+
29,
226+
0,
227+
"WAVESPEED_AI_API_CLIENT"
228+
],
229+
[
230+
41,
231+
13,
232+
0,
233+
29,
234+
1,
235+
"STRING"
236+
],
237+
[
238+
42,
239+
29,
240+
0,
241+
28,
242+
0,
243+
"STRING"
244+
]
245+
],
246+
"groups": [],
247+
"config": {},
248+
"extra": {
249+
"ds": {
250+
"scale": 0.8712546788995775,
251+
"offset": [
252+
435.1049517309114,
253+
314.0554173859501
254+
]
255+
},
256+
"frontendVersion": "1.20.7",
257+
"VHS_latentpreview": false,
258+
"VHS_latentpreviewrate": 0,
259+
"VHS_MetadataImage": true,
260+
"VHS_KeepIntermediate": true
261+
},
262+
"version": 0.4
263+
}

py/google_veo3.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
from .wavespeed_api.client import WaveSpeedClient
2+
from .wavespeed_api.requests.google_veo3 import GoogleVeo3
3+
4+
class GoogleVeo3Node:
5+
"""
6+
Google Veo3 Text-to-Video Node
7+
"""
8+
9+
@classmethod
10+
def INPUT_TYPES(s):
11+
return {
12+
"required": {
13+
"client": ("WAVESPEED_AI_API_CLIENT",),
14+
"prompt": ("STRING", {"multiline": True, "default": "", "tooltip": "Text prompt for generation; Cannot exceed 2500 characters"}),
15+
"seed": ("INT", {
16+
"default": -1,
17+
"min": -1,
18+
"max": 0xffffffffffffffff,
19+
"control_after_generate": True,
20+
"tooltip": "Random seed for reproducible results. -1 for random seed"
21+
}),
22+
},
23+
"optional": {
24+
25+
}
26+
}
27+
28+
RETURN_TYPES = ("STRING", )
29+
RETURN_NAMES = ("video_url", )
30+
31+
CATEGORY = "WaveSpeedAI"
32+
FUNCTION = "execute"
33+
34+
def execute(self,
35+
client,
36+
prompt,
37+
seed=-1):
38+
39+
if prompt is None or prompt == "":
40+
raise ValueError("Prompt is required")
41+
42+
request = GoogleVeo3(
43+
prompt=prompt,
44+
seed=seed
45+
)
46+
47+
waveSpeedClient = WaveSpeedClient(client["api_key"])
48+
response = waveSpeedClient.send_request(request, True, 3)
49+
50+
video_url = response.get("outputs", [])
51+
if not video_url or len(video_url) == 0:
52+
raise ValueError("No video URL in the generated result")
53+
54+
return (video_url[0],)
55+
56+
NODE_CLASS_MAPPINGS = {
57+
"WaveSpeedAI GoogleVeo3Node": GoogleVeo3Node
58+
}
59+
60+
NODE_DISPLAY_NAME_MAPPINGS = {
61+
"WaveSpeedAI GoogleVeo3Node": "WaveSpeedAI Google Veo3"
62+
}

0 commit comments

Comments
 (0)