Skip to content

Commit 5de94e7

Browse files
authored
feat(api-nodes): new Partner nodes for Wan2.7 (#13264)
Signed-off-by: bigcat88 <bigcat88@icloud.com>
1 parent 76b75f3 commit 5de94e7

2 files changed

Lines changed: 1089 additions & 148 deletions

File tree

comfy_api_nodes/apis/wan.py

Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
from pydantic import BaseModel, Field
2+
3+
4+
class Text2ImageInputField(BaseModel):
5+
prompt: str = Field(...)
6+
negative_prompt: str | None = Field(None)
7+
8+
9+
class Image2ImageInputField(BaseModel):
10+
prompt: str = Field(...)
11+
negative_prompt: str | None = Field(None)
12+
images: list[str] = Field(..., min_length=1, max_length=2)
13+
14+
15+
class Text2VideoInputField(BaseModel):
16+
prompt: str = Field(...)
17+
negative_prompt: str | None = Field(None)
18+
audio_url: str | None = Field(None)
19+
20+
21+
class Image2VideoInputField(BaseModel):
22+
prompt: str = Field(...)
23+
negative_prompt: str | None = Field(None)
24+
img_url: str = Field(...)
25+
audio_url: str | None = Field(None)
26+
27+
28+
class Reference2VideoInputField(BaseModel):
29+
prompt: str = Field(...)
30+
negative_prompt: str | None = Field(None)
31+
reference_video_urls: list[str] = Field(...)
32+
33+
34+
class Txt2ImageParametersField(BaseModel):
35+
size: str = Field(...)
36+
n: int = Field(1, description="Number of images to generate.") # we support only value=1
37+
seed: int = Field(..., ge=0, le=2147483647)
38+
prompt_extend: bool = Field(True)
39+
watermark: bool = Field(False)
40+
41+
42+
class Image2ImageParametersField(BaseModel):
43+
size: str | None = Field(None)
44+
n: int = Field(1, description="Number of images to generate.") # we support only value=1
45+
seed: int = Field(..., ge=0, le=2147483647)
46+
watermark: bool = Field(False)
47+
48+
49+
class Text2VideoParametersField(BaseModel):
50+
size: str = Field(...)
51+
seed: int = Field(..., ge=0, le=2147483647)
52+
duration: int = Field(5, ge=5, le=15)
53+
prompt_extend: bool = Field(True)
54+
watermark: bool = Field(False)
55+
audio: bool = Field(False, description="Whether to generate audio automatically.")
56+
shot_type: str = Field("single")
57+
58+
59+
class Image2VideoParametersField(BaseModel):
60+
resolution: str = Field(...)
61+
seed: int = Field(..., ge=0, le=2147483647)
62+
duration: int = Field(5, ge=5, le=15)
63+
prompt_extend: bool = Field(True)
64+
watermark: bool = Field(False)
65+
audio: bool = Field(False, description="Whether to generate audio automatically.")
66+
shot_type: str = Field("single")
67+
68+
69+
class Reference2VideoParametersField(BaseModel):
70+
size: str = Field(...)
71+
duration: int = Field(5, ge=5, le=15)
72+
shot_type: str = Field("single")
73+
seed: int = Field(..., ge=0, le=2147483647)
74+
watermark: bool = Field(False)
75+
76+
77+
class Text2ImageTaskCreationRequest(BaseModel):
78+
model: str = Field(...)
79+
input: Text2ImageInputField = Field(...)
80+
parameters: Txt2ImageParametersField = Field(...)
81+
82+
83+
class Image2ImageTaskCreationRequest(BaseModel):
84+
model: str = Field(...)
85+
input: Image2ImageInputField = Field(...)
86+
parameters: Image2ImageParametersField = Field(...)
87+
88+
89+
class Text2VideoTaskCreationRequest(BaseModel):
90+
model: str = Field(...)
91+
input: Text2VideoInputField = Field(...)
92+
parameters: Text2VideoParametersField = Field(...)
93+
94+
95+
class Image2VideoTaskCreationRequest(BaseModel):
96+
model: str = Field(...)
97+
input: Image2VideoInputField = Field(...)
98+
parameters: Image2VideoParametersField = Field(...)
99+
100+
101+
class Reference2VideoTaskCreationRequest(BaseModel):
102+
model: str = Field(...)
103+
input: Reference2VideoInputField = Field(...)
104+
parameters: Reference2VideoParametersField = Field(...)
105+
106+
107+
class Wan27MediaItem(BaseModel):
108+
type: str = Field(...)
109+
url: str = Field(...)
110+
111+
112+
class Wan27ReferenceVideoInputField(BaseModel):
113+
prompt: str = Field(...)
114+
negative_prompt: str | None = Field(None)
115+
media: list[Wan27MediaItem] = Field(...)
116+
117+
118+
class Wan27ReferenceVideoParametersField(BaseModel):
119+
resolution: str = Field(...)
120+
ratio: str | None = Field(None)
121+
duration: int = Field(5, ge=2, le=10)
122+
watermark: bool = Field(False)
123+
seed: int = Field(..., ge=0, le=2147483647)
124+
125+
126+
class Wan27ReferenceVideoTaskCreationRequest(BaseModel):
127+
model: str = Field(...)
128+
input: Wan27ReferenceVideoInputField = Field(...)
129+
parameters: Wan27ReferenceVideoParametersField = Field(...)
130+
131+
132+
class Wan27ImageToVideoInputField(BaseModel):
133+
prompt: str | None = Field(None)
134+
negative_prompt: str | None = Field(None)
135+
media: list[Wan27MediaItem] = Field(...)
136+
137+
138+
class Wan27ImageToVideoParametersField(BaseModel):
139+
resolution: str = Field(...)
140+
duration: int = Field(5, ge=2, le=15)
141+
prompt_extend: bool = Field(True)
142+
watermark: bool = Field(False)
143+
seed: int = Field(..., ge=0, le=2147483647)
144+
145+
146+
class Wan27ImageToVideoTaskCreationRequest(BaseModel):
147+
model: str = Field(...)
148+
input: Wan27ImageToVideoInputField = Field(...)
149+
parameters: Wan27ImageToVideoParametersField = Field(...)
150+
151+
152+
class Wan27VideoEditInputField(BaseModel):
153+
prompt: str = Field(...)
154+
media: list[Wan27MediaItem] = Field(...)
155+
156+
157+
class Wan27VideoEditParametersField(BaseModel):
158+
resolution: str = Field(...)
159+
ratio: str | None = Field(None)
160+
duration: int = Field(0)
161+
audio_setting: str = Field("auto")
162+
watermark: bool = Field(False)
163+
seed: int = Field(..., ge=0, le=2147483647)
164+
165+
166+
class Wan27VideoEditTaskCreationRequest(BaseModel):
167+
model: str = Field(...)
168+
input: Wan27VideoEditInputField = Field(...)
169+
parameters: Wan27VideoEditParametersField = Field(...)
170+
171+
172+
class Wan27Text2VideoParametersField(BaseModel):
173+
resolution: str = Field(...)
174+
ratio: str | None = Field(None)
175+
duration: int = Field(5, ge=2, le=15)
176+
prompt_extend: bool = Field(True)
177+
watermark: bool = Field(False)
178+
seed: int = Field(..., ge=0, le=2147483647)
179+
180+
181+
class Wan27Text2VideoTaskCreationRequest(BaseModel):
182+
model: str = Field(...)
183+
input: Text2VideoInputField = Field(...)
184+
parameters: Wan27Text2VideoParametersField = Field(...)
185+
186+
187+
class TaskCreationOutputField(BaseModel):
188+
task_id: str = Field(...)
189+
task_status: str = Field(...)
190+
191+
192+
class TaskCreationResponse(BaseModel):
193+
output: TaskCreationOutputField | None = Field(None)
194+
request_id: str = Field(...)
195+
code: str | None = Field(None, description="Error code for the failed request.")
196+
message: str | None = Field(None, description="Details about the failed request.")
197+
198+
199+
class TaskResult(BaseModel):
200+
url: str | None = Field(None)
201+
code: str | None = Field(None)
202+
message: str | None = Field(None)
203+
204+
205+
class ImageTaskStatusOutputField(TaskCreationOutputField):
206+
task_id: str = Field(...)
207+
task_status: str = Field(...)
208+
results: list[TaskResult] | None = Field(None)
209+
210+
211+
class VideoTaskStatusOutputField(TaskCreationOutputField):
212+
task_id: str = Field(...)
213+
task_status: str = Field(...)
214+
video_url: str | None = Field(None)
215+
code: str | None = Field(None)
216+
message: str | None = Field(None)
217+
218+
219+
class ImageTaskStatusResponse(BaseModel):
220+
output: ImageTaskStatusOutputField | None = Field(None)
221+
request_id: str = Field(...)
222+
223+
224+
class VideoTaskStatusResponse(BaseModel):
225+
output: VideoTaskStatusOutputField | None = Field(None)
226+
request_id: str = Field(...)

0 commit comments

Comments
 (0)