@seawork/server 1.0.12 → 1.0.13-rc.2

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.
Files changed (34) hide show
  1. package/dist/server/server/sac/generate.d.ts.map +1 -1
  2. package/dist/server/server/sac/generate.js.map +1 -1
  3. package/dist/server/server/sac/providers/alibaba.js +231 -249
  4. package/dist/server/server/sac/providers/alibaba.js.map +1 -1
  5. package/dist/server/server/sac/providers/audio.js +16 -19
  6. package/dist/server/server/sac/providers/audio.js.map +1 -1
  7. package/dist/server/server/sac/providers/kling.js +157 -184
  8. package/dist/server/server/sac/providers/kling.js.map +1 -1
  9. package/dist/server/server/sac/providers/nano.js +7 -9
  10. package/dist/server/server/sac/providers/nano.js.map +1 -1
  11. package/dist/server/server/sac/providers/pixverse.js +436 -425
  12. package/dist/server/server/sac/providers/pixverse.js.map +1 -1
  13. package/dist/server/server/sac/providers/seaart.d.ts.map +1 -1
  14. package/dist/server/server/sac/providers/seaart.js +6 -10
  15. package/dist/server/server/sac/providers/seaart.js.map +1 -1
  16. package/dist/server/server/sac/providers/store.d.ts +1 -1
  17. package/dist/server/server/sac/providers/tencent-3d.js +59 -57
  18. package/dist/server/server/sac/providers/tencent-3d.js.map +1 -1
  19. package/dist/server/server/sac/providers/tencent-image.js +39 -38
  20. package/dist/server/server/sac/providers/tencent-image.js.map +1 -1
  21. package/dist/server/server/sac/providers/tencent-video.js +58 -57
  22. package/dist/server/server/sac/providers/tencent-video.js.map +1 -1
  23. package/dist/server/server/sac/providers/tripo3d.js +135 -136
  24. package/dist/server/server/sac/providers/tripo3d.js.map +1 -1
  25. package/dist/server/server/sac/providers/vidu.js +470 -467
  26. package/dist/server/server/sac/providers/vidu.js.map +1 -1
  27. package/dist/server/server/sac/providers/volces-3d.js +30 -32
  28. package/dist/server/server/sac/providers/volces-3d.js.map +1 -1
  29. package/dist/server/server/sac/providers/volces-video.js +87 -83
  30. package/dist/server/server/sac/providers/volces-video.js.map +1 -1
  31. package/dist/server/server/sac/providers/volces.d.ts.map +1 -1
  32. package/dist/server/server/sac/providers/volces.js +44 -42
  33. package/dist/server/server/sac/providers/volces.js.map +1 -1
  34. package/package.json +3 -3
@@ -1,43 +1,25 @@
1
1
  import { SACError as CLIError, ExitCode } from "../errors.js";
2
2
  import { registerProvider } from "./store.js";
3
- const IMAGE_MODELS = [
4
- 'alibaba_wan27_image',
5
- 'alibaba_wan27_image_pro',
6
- ];
7
- const VIDEO_T2V_27_MODELS = [
8
- 'alibaba_wan27_t2v',
9
- ];
10
- const VIDEO_T2V_26_MODELS = [
11
- 'alibaba_wanx26_t2v',
12
- ];
13
- const VIDEO_I2V_27_MODELS = [
14
- 'alibaba_wan27_i2v',
15
- ];
16
- const VIDEO_I2V_26_MODELS = [
17
- 'alibaba_wanx26_i2v',
18
- 'alibaba_wanx26_i2v_flash',
19
- ];
20
- const VIDEO_REF_27_MODELS = [
21
- 'alibaba_wan27_r2v',
22
- ];
23
- const VIDEO_REF_26_MODELS = [
24
- 'alibaba_wanx26_reference',
25
- ];
26
- const VIDEO_EDIT_MODELS = [
27
- 'alibaba_wan27_videoedit',
28
- ];
29
- const WAN27_RATIOS = new Set(['16:9', '9:16', '1:1', '4:3', '3:4']);
30
- const WAN27_VIDEO_RESOLUTIONS = new Set(['720P', '1080P']);
3
+ const IMAGE_MODELS = ["alibaba_wan27_image", "alibaba_wan27_image_pro"];
4
+ const VIDEO_T2V_27_MODELS = ["alibaba_wan27_t2v"];
5
+ const VIDEO_T2V_26_MODELS = ["alibaba_wanx26_t2v"];
6
+ const VIDEO_I2V_27_MODELS = ["alibaba_wan27_i2v"];
7
+ const VIDEO_I2V_26_MODELS = ["alibaba_wanx26_i2v", "alibaba_wanx26_i2v_flash"];
8
+ const VIDEO_REF_27_MODELS = ["alibaba_wan27_r2v"];
9
+ const VIDEO_REF_26_MODELS = ["alibaba_wanx26_reference"];
10
+ const VIDEO_EDIT_MODELS = ["alibaba_wan27_videoedit"];
11
+ const WAN27_RATIOS = new Set(["16:9", "9:16", "1:1", "4:3", "3:4"]);
12
+ const WAN27_VIDEO_RESOLUTIONS = new Set(["720P", "1080P"]);
31
13
  function maybeString(value) {
32
- if (typeof value !== 'string' || value.length === 0)
14
+ if (typeof value !== "string" || value.length === 0)
33
15
  return undefined;
34
16
  return value;
35
17
  }
36
18
  function maybeStringArray(value) {
37
19
  if (Array.isArray(value)) {
38
- return value.filter((item) => typeof item === 'string' && item.length > 0);
20
+ return value.filter((item) => typeof item === "string" && item.length > 0);
39
21
  }
40
- if (typeof value === 'string' && value.length > 0)
22
+ if (typeof value === "string" && value.length > 0)
41
23
  return [value];
42
24
  return [];
43
25
  }
@@ -49,8 +31,8 @@ function assertUnsupported(model, value, flagName, hint) {
49
31
  function parseEnum(model, value, flagName, allowed) {
50
32
  if (value === undefined)
51
33
  return undefined;
52
- if (typeof value !== 'string' || !allowed.has(value)) {
53
- throw new CLIError(`Model "${model}" requires --${flagName} to be one of: ${Array.from(allowed).join(', ')}.`, ExitCode.USAGE);
34
+ if (typeof value !== "string" || !allowed.has(value)) {
35
+ throw new CLIError(`Model "${model}" requires --${flagName} to be one of: ${Array.from(allowed).join(", ")}.`, ExitCode.USAGE);
54
36
  }
55
37
  return value;
56
38
  }
@@ -91,415 +73,415 @@ function buildMessageContent(prompt, flags) {
91
73
  return content;
92
74
  }
93
75
  function assertUnsupportedImageFlags(model, flags) {
94
- assertUnsupported(model, flags.modelVerNo, 'model-ver-no');
95
- assertUnsupported(model, flags.steps, 'steps');
96
- assertUnsupported(model, flags.cfgScale, 'cfg-scale');
97
- assertUnsupported(model, flags.denoise, 'denoise');
98
- assertUnsupported(model, flags.action, 'action');
99
- assertUnsupported(model, flags.width, 'width');
100
- assertUnsupported(model, flags.height, 'height');
101
- assertUnsupported(model, flags.aspectRatio, 'aspect-ratio');
102
- assertUnsupported(model, flags.resolution, 'resolution');
103
- assertUnsupported(model, flags.logoAdd, 'logo-add');
104
- assertUnsupported(model, flags.revise, 'revise');
105
- assertUnsupported(model, flags.negativePrompt, 'negative-prompt');
106
- assertUnsupported(model, flags.externalTaskId, 'external-task-id');
107
- assertUnsupported(model, flags.elementIds, 'element-ids');
108
- assertUnsupported(model, flags.resultType, 'result-type');
109
- assertUnsupported(model, flags.seriesAmount, 'series-amount');
110
- assertUnsupported(model, flags.scale, 'scale');
111
- assertUnsupported(model, flags.templateId, 'template-id');
112
- assertUnsupported(model, flags.reqKey, 'req-key');
113
- assertUnsupported(model, flags.subReqKey, 'sub-req-key');
114
- assertUnsupported(model, flags.refType, 'ref-type');
115
- assertUnsupported(model, flags.gpen, 'gpen');
116
- assertUnsupported(model, flags.skin, 'skin');
117
- assertUnsupported(model, flags.skinUnifi, 'skin-unifi');
118
- assertUnsupported(model, flags.genMode, 'gen-mode');
76
+ assertUnsupported(model, flags.modelVerNo, "model-ver-no");
77
+ assertUnsupported(model, flags.steps, "steps");
78
+ assertUnsupported(model, flags.cfgScale, "cfg-scale");
79
+ assertUnsupported(model, flags.denoise, "denoise");
80
+ assertUnsupported(model, flags.action, "action");
81
+ assertUnsupported(model, flags.width, "width");
82
+ assertUnsupported(model, flags.height, "height");
83
+ assertUnsupported(model, flags.aspectRatio, "aspect-ratio");
84
+ assertUnsupported(model, flags.resolution, "resolution");
85
+ assertUnsupported(model, flags.logoAdd, "logo-add");
86
+ assertUnsupported(model, flags.revise, "revise");
87
+ assertUnsupported(model, flags.negativePrompt, "negative-prompt");
88
+ assertUnsupported(model, flags.externalTaskId, "external-task-id");
89
+ assertUnsupported(model, flags.elementIds, "element-ids");
90
+ assertUnsupported(model, flags.resultType, "result-type");
91
+ assertUnsupported(model, flags.seriesAmount, "series-amount");
92
+ assertUnsupported(model, flags.scale, "scale");
93
+ assertUnsupported(model, flags.templateId, "template-id");
94
+ assertUnsupported(model, flags.reqKey, "req-key");
95
+ assertUnsupported(model, flags.subReqKey, "sub-req-key");
96
+ assertUnsupported(model, flags.refType, "ref-type");
97
+ assertUnsupported(model, flags.gpen, "gpen");
98
+ assertUnsupported(model, flags.skin, "skin");
99
+ assertUnsupported(model, flags.skinUnifi, "skin-unifi");
100
+ assertUnsupported(model, flags.genMode, "gen-mode");
119
101
  }
120
102
  function assertUnsupportedAlibabaVideoFlags(model, flags) {
121
103
  const entries = [
122
- ['short', flags.short],
123
- ['fps', flags.fps],
124
- ['frames', flags.frames],
125
- ['service-tier', flags.serviceTier],
126
- ['expires-after', flags.expiresAfter],
127
- ['style', flags.style],
128
- ['payload', flags.payload],
129
- ['callback-url', flags.callbackUrl],
130
- ['off-peak', flags.offPeak],
131
- ['recommend-prompt', flags.recommendPrompt],
132
- ['enhance-prompt', flags.enhancePrompt],
133
- ['template', flags.template],
134
- ['template-params', flags.templateParams],
135
- ['language', flags.language],
136
- ['creative', flags.creative],
137
- ['add-subtitle', flags.addSubtitle],
138
- ['remove-audio', flags.removeAudio],
139
- ['watermark-position', flags.watermarkPosition],
140
- ['watermark-url', flags.watermarkUrl],
141
- ['meta-data', flags.metaData],
142
- ['external-task-id', flags.externalTaskId],
143
- ['element-ids', flags.elementIds],
144
- ['effect-scene', flags.effectScene],
145
- ['character-orientation', flags.characterOrientation],
146
- ['keep-original-sound', flags.keepOriginalSound],
147
- ['video-refer-type', flags.videoReferType],
148
- ['lipsync-mode', flags.lipsyncMode],
149
- ['camera-fixed', flags.cameraFixed],
150
- ['return-last-frame', flags.returnLastFrame],
151
- ['draft', flags.draft],
152
- ['draft-task-id', flags.draftTaskId],
153
- ['mask-urls', flags.maskUrls],
154
- ['movement-amplitude', flags.movementAmplitude],
155
- ['mode', flags.mode],
156
- ['cfg-scale', flags.cfgScale],
157
- ['video-quality', flags.videoQuality],
158
- ['pe-fast-mode', flags.peFastMode],
159
- ['audio-id', flags.audioId],
160
- ['voice-id', flags.voiceId],
161
- ['voice-language', flags.voiceLanguage],
162
- ['voice-speed', flags.voiceSpeed],
163
- ['bgm', flags.bgm],
164
- ['sound', flags.sound],
165
- ['sounds', flags.sounds],
166
- ['bitrate', flags.bitrate],
167
- ['extension-type', flags.extensionType],
168
- ['character-reference-url', flags.characterReferenceUrl],
169
- ['style-reference-url', flags.styleReferenceUrl],
170
- ['character-reference-weight', flags.characterReferenceWeight],
171
- ['style-reference-weight', flags.styleReferenceWeight],
104
+ ["short", flags.short],
105
+ ["fps", flags.fps],
106
+ ["frames", flags.frames],
107
+ ["service-tier", flags.serviceTier],
108
+ ["expires-after", flags.expiresAfter],
109
+ ["style", flags.style],
110
+ ["payload", flags.payload],
111
+ ["callback-url", flags.callbackUrl],
112
+ ["off-peak", flags.offPeak],
113
+ ["recommend-prompt", flags.recommendPrompt],
114
+ ["enhance-prompt", flags.enhancePrompt],
115
+ ["template", flags.template],
116
+ ["template-params", flags.templateParams],
117
+ ["language", flags.language],
118
+ ["creative", flags.creative],
119
+ ["add-subtitle", flags.addSubtitle],
120
+ ["remove-audio", flags.removeAudio],
121
+ ["watermark-position", flags.watermarkPosition],
122
+ ["watermark-url", flags.watermarkUrl],
123
+ ["meta-data", flags.metaData],
124
+ ["external-task-id", flags.externalTaskId],
125
+ ["element-ids", flags.elementIds],
126
+ ["effect-scene", flags.effectScene],
127
+ ["character-orientation", flags.characterOrientation],
128
+ ["keep-original-sound", flags.keepOriginalSound],
129
+ ["video-refer-type", flags.videoReferType],
130
+ ["lipsync-mode", flags.lipsyncMode],
131
+ ["camera-fixed", flags.cameraFixed],
132
+ ["return-last-frame", flags.returnLastFrame],
133
+ ["draft", flags.draft],
134
+ ["draft-task-id", flags.draftTaskId],
135
+ ["mask-urls", flags.maskUrls],
136
+ ["movement-amplitude", flags.movementAmplitude],
137
+ ["mode", flags.mode],
138
+ ["cfg-scale", flags.cfgScale],
139
+ ["video-quality", flags.videoQuality],
140
+ ["pe-fast-mode", flags.peFastMode],
141
+ ["audio-id", flags.audioId],
142
+ ["voice-id", flags.voiceId],
143
+ ["voice-language", flags.voiceLanguage],
144
+ ["voice-speed", flags.voiceSpeed],
145
+ ["bgm", flags.bgm],
146
+ ["sound", flags.sound],
147
+ ["sounds", flags.sounds],
148
+ ["bitrate", flags.bitrate],
149
+ ["extension-type", flags.extensionType],
150
+ ["character-reference-url", flags.characterReferenceUrl],
151
+ ["style-reference-url", flags.styleReferenceUrl],
152
+ ["character-reference-weight", flags.characterReferenceWeight],
153
+ ["style-reference-weight", flags.styleReferenceWeight],
172
154
  ];
173
155
  for (const [flagName, value] of entries) {
174
156
  assertUnsupported(model, value, flagName);
175
157
  }
176
158
  }
177
159
  registerProvider({
178
- provider: 'alibaba',
179
- category: 'image',
160
+ provider: "alibaba",
161
+ category: "image",
180
162
  models: IMAGE_MODELS,
181
163
  buildBody(model, prompt, flags) {
182
164
  assertUnsupportedImageFlags(model, flags);
183
165
  const upstreamInput = {
184
- messages: [{ role: 'user', content: buildMessageContent(prompt, flags) }],
166
+ messages: [{ role: "user", content: buildMessageContent(prompt, flags) }],
185
167
  };
186
168
  const upstreamParameters = {};
187
169
  if (flags.size)
188
- upstreamParameters['size'] = flags.size;
170
+ upstreamParameters["size"] = flags.size;
189
171
  if (flags.n)
190
- upstreamParameters['n'] = flags.n;
172
+ upstreamParameters["n"] = flags.n;
191
173
  if (flags.seed !== undefined)
192
- upstreamParameters['seed'] = flags.seed;
174
+ upstreamParameters["seed"] = flags.seed;
193
175
  if (flags.watermark !== undefined)
194
- upstreamParameters['watermark'] = flags.watermark;
176
+ upstreamParameters["watermark"] = flags.watermark;
195
177
  const params = { input: upstreamInput };
196
178
  if (Object.keys(upstreamParameters).length > 0)
197
- params['parameters'] = upstreamParameters;
179
+ params["parameters"] = upstreamParameters;
198
180
  return buildEnvelope(model, params);
199
181
  },
200
182
  });
201
183
  registerProvider({
202
- provider: 'alibaba',
203
- category: 'video',
184
+ provider: "alibaba",
185
+ category: "video",
204
186
  models: VIDEO_T2V_27_MODELS,
205
187
  buildBody(model, prompt, flags) {
206
- assertUnsupported(model, flags.imageUrl, 'image-url');
207
- assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
208
- assertUnsupported(model, flags.imageUrls, 'image-urls');
209
- assertUnsupported(model, flags.referenceUrls, 'reference-urls');
210
- assertUnsupported(model, flags.videoUrl, 'video-url');
211
- assertUnsupported(model, flags.videoId, 'video-id');
212
- assertUnsupported(model, flags.size, 'size');
213
- assertUnsupported(model, flags.shotType, 'shot-type');
214
- assertUnsupported(model, flags.audio, 'audio');
188
+ assertUnsupported(model, flags.imageUrl, "image-url");
189
+ assertUnsupported(model, flags.imageTailUrl, "image-tail-url");
190
+ assertUnsupported(model, flags.imageUrls, "image-urls");
191
+ assertUnsupported(model, flags.referenceUrls, "reference-urls");
192
+ assertUnsupported(model, flags.videoUrl, "video-url");
193
+ assertUnsupported(model, flags.videoId, "video-id");
194
+ assertUnsupported(model, flags.size, "size");
195
+ assertUnsupported(model, flags.shotType, "shot-type");
196
+ assertUnsupported(model, flags.audio, "audio");
215
197
  assertUnsupportedAlibabaVideoFlags(model, flags);
216
198
  const upstreamInput = { prompt };
217
199
  if (flags.audioUrl)
218
- upstreamInput['audio_url'] = flags.audioUrl;
200
+ upstreamInput["audio_url"] = flags.audioUrl;
219
201
  const upstreamParameters = {};
220
202
  if (flags.resolution !== undefined) {
221
- upstreamParameters['resolution'] = parseEnum(model, flags.resolution, 'resolution', WAN27_VIDEO_RESOLUTIONS);
203
+ upstreamParameters["resolution"] = parseEnum(model, flags.resolution, "resolution", WAN27_VIDEO_RESOLUTIONS);
222
204
  }
223
205
  if (flags.aspectRatio !== undefined) {
224
- upstreamParameters['ratio'] = parseEnum(model, flags.aspectRatio, 'aspect-ratio', WAN27_RATIOS);
206
+ upstreamParameters["ratio"] = parseEnum(model, flags.aspectRatio, "aspect-ratio", WAN27_RATIOS);
225
207
  }
226
208
  if (flags.duration !== undefined)
227
- upstreamParameters['duration'] = flags.duration;
209
+ upstreamParameters["duration"] = flags.duration;
228
210
  if (flags.seed !== undefined)
229
- upstreamParameters['seed'] = flags.seed;
211
+ upstreamParameters["seed"] = flags.seed;
230
212
  if (flags.watermark !== undefined)
231
- upstreamParameters['watermark'] = flags.watermark;
213
+ upstreamParameters["watermark"] = flags.watermark;
232
214
  if (flags.negativePrompt)
233
- upstreamParameters['negative_prompt'] = flags.negativePrompt;
215
+ upstreamParameters["negative_prompt"] = flags.negativePrompt;
234
216
  const params = { input: upstreamInput };
235
217
  if (Object.keys(upstreamParameters).length > 0)
236
- params['parameters'] = upstreamParameters;
218
+ params["parameters"] = upstreamParameters;
237
219
  return buildEnvelope(model, params);
238
220
  },
239
221
  });
240
222
  registerProvider({
241
- provider: 'alibaba',
242
- category: 'video',
223
+ provider: "alibaba",
224
+ category: "video",
243
225
  models: VIDEO_T2V_26_MODELS,
244
226
  buildBody(model, prompt, flags) {
245
- assertUnsupported(model, flags.imageUrl, 'image-url');
246
- assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
247
- assertUnsupported(model, flags.imageUrls, 'image-urls');
248
- assertUnsupported(model, flags.referenceUrls, 'reference-urls');
249
- assertUnsupported(model, flags.videoUrl, 'video-url');
250
- assertUnsupported(model, flags.videoId, 'video-id');
251
- assertUnsupported(model, flags.aspectRatio, 'aspect-ratio');
252
- assertUnsupported(model, flags.resolution, 'resolution');
253
- assertUnsupported(model, flags.watermark, 'watermark');
227
+ assertUnsupported(model, flags.imageUrl, "image-url");
228
+ assertUnsupported(model, flags.imageTailUrl, "image-tail-url");
229
+ assertUnsupported(model, flags.imageUrls, "image-urls");
230
+ assertUnsupported(model, flags.referenceUrls, "reference-urls");
231
+ assertUnsupported(model, flags.videoUrl, "video-url");
232
+ assertUnsupported(model, flags.videoId, "video-id");
233
+ assertUnsupported(model, flags.aspectRatio, "aspect-ratio");
234
+ assertUnsupported(model, flags.resolution, "resolution");
235
+ assertUnsupported(model, flags.watermark, "watermark");
254
236
  assertUnsupportedAlibabaVideoFlags(model, flags);
255
237
  const upstreamInput = { prompt };
256
238
  if (flags.audioUrl)
257
- upstreamInput['audio_url'] = flags.audioUrl;
239
+ upstreamInput["audio_url"] = flags.audioUrl;
258
240
  const upstreamParameters = {};
259
241
  if (flags.duration !== undefined)
260
- upstreamParameters['duration'] = flags.duration;
242
+ upstreamParameters["duration"] = flags.duration;
261
243
  if (flags.size)
262
- upstreamParameters['size'] = flags.size;
244
+ upstreamParameters["size"] = flags.size;
263
245
  if (flags.shotType)
264
- upstreamParameters['shot_type'] = flags.shotType;
246
+ upstreamParameters["shot_type"] = flags.shotType;
265
247
  if (flags.seed !== undefined)
266
- upstreamParameters['seed'] = flags.seed;
248
+ upstreamParameters["seed"] = flags.seed;
267
249
  if (flags.audio !== undefined)
268
- upstreamParameters['audio'] = flags.audio;
250
+ upstreamParameters["audio"] = flags.audio;
269
251
  if (flags.negativePrompt)
270
- upstreamParameters['negative_prompt'] = flags.negativePrompt;
252
+ upstreamParameters["negative_prompt"] = flags.negativePrompt;
271
253
  const params = { input: upstreamInput };
272
254
  if (Object.keys(upstreamParameters).length > 0)
273
- params['parameters'] = upstreamParameters;
255
+ params["parameters"] = upstreamParameters;
274
256
  return buildEnvelope(model, params);
275
257
  },
276
258
  });
277
259
  registerProvider({
278
- provider: 'alibaba',
279
- category: 'video',
260
+ provider: "alibaba",
261
+ category: "video",
280
262
  models: VIDEO_I2V_27_MODELS,
281
263
  requiresPrompt() {
282
264
  return false;
283
265
  },
284
266
  buildBody(model, prompt, flags) {
285
267
  assertUnsupportedAlibabaVideoFlags(model, flags);
286
- assertUnsupported(model, flags.imageUrls, 'image-urls');
287
- assertUnsupported(model, flags.referenceUrls, 'reference-urls');
288
- assertUnsupported(model, flags.size, 'size');
289
- assertUnsupported(model, flags.shotType, 'shot-type');
290
- assertUnsupported(model, flags.audio, 'audio');
268
+ assertUnsupported(model, flags.imageUrls, "image-urls");
269
+ assertUnsupported(model, flags.referenceUrls, "reference-urls");
270
+ assertUnsupported(model, flags.size, "size");
271
+ assertUnsupported(model, flags.shotType, "shot-type");
272
+ assertUnsupported(model, flags.audio, "audio");
291
273
  const media = [
292
- { type: 'first_frame', url: requireSingleImage(model, flags) },
274
+ { type: "first_frame", url: requireSingleImage(model, flags) },
293
275
  ];
294
276
  const lastFrame = maybeString(flags.imageTailUrl);
295
277
  if (lastFrame)
296
- media.push({ type: 'last_frame', url: lastFrame });
278
+ media.push({ type: "last_frame", url: lastFrame });
297
279
  const drivingAudio = maybeString(flags.audioUrl);
298
280
  if (drivingAudio)
299
- media.push({ type: 'driving_audio', url: drivingAudio });
281
+ media.push({ type: "driving_audio", url: drivingAudio });
300
282
  const firstClip = maybeString(flags.videoUrl);
301
283
  if (firstClip)
302
- media.push({ type: 'first_clip', url: firstClip });
284
+ media.push({ type: "first_clip", url: firstClip });
303
285
  const upstreamInput = { media };
304
286
  if (prompt)
305
- upstreamInput['prompt'] = prompt;
287
+ upstreamInput["prompt"] = prompt;
306
288
  if (flags.negativePrompt)
307
- upstreamInput['negative_prompt'] = flags.negativePrompt;
289
+ upstreamInput["negative_prompt"] = flags.negativePrompt;
308
290
  const upstreamParameters = {};
309
291
  if (flags.resolution !== undefined) {
310
- upstreamParameters['resolution'] = parseEnum(model, flags.resolution, 'resolution', WAN27_VIDEO_RESOLUTIONS);
292
+ upstreamParameters["resolution"] = parseEnum(model, flags.resolution, "resolution", WAN27_VIDEO_RESOLUTIONS);
311
293
  }
312
294
  if (flags.duration !== undefined)
313
- upstreamParameters['duration'] = flags.duration;
295
+ upstreamParameters["duration"] = flags.duration;
314
296
  if (flags.seed !== undefined)
315
- upstreamParameters['seed'] = flags.seed;
297
+ upstreamParameters["seed"] = flags.seed;
316
298
  if (flags.watermark !== undefined)
317
- upstreamParameters['watermark'] = flags.watermark;
299
+ upstreamParameters["watermark"] = flags.watermark;
318
300
  const params = { input: upstreamInput };
319
301
  if (Object.keys(upstreamParameters).length > 0)
320
- params['parameters'] = upstreamParameters;
302
+ params["parameters"] = upstreamParameters;
321
303
  return buildEnvelope(model, params);
322
304
  },
323
305
  });
324
306
  registerProvider({
325
- provider: 'alibaba',
326
- category: 'video',
307
+ provider: "alibaba",
308
+ category: "video",
327
309
  models: VIDEO_I2V_26_MODELS,
328
310
  requiresPrompt() {
329
311
  return false;
330
312
  },
331
313
  buildBody(model, prompt, flags) {
332
314
  assertUnsupportedAlibabaVideoFlags(model, flags);
333
- assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
334
- assertUnsupported(model, flags.imageUrls, 'image-urls');
335
- assertUnsupported(model, flags.referenceUrls, 'reference-urls');
336
- assertUnsupported(model, flags.videoUrl, 'video-url');
337
- assertUnsupported(model, flags.videoId, 'video-id');
338
- assertUnsupported(model, flags.aspectRatio, 'aspect-ratio');
339
- assertUnsupported(model, flags.size, 'size');
340
- assertUnsupported(model, flags.audioUrl, 'audio-url');
341
- assertUnsupported(model, flags.audio, 'audio');
342
- assertUnsupported(model, flags.shotType, 'shot-type');
343
- assertUnsupported(model, flags.watermark, 'watermark');
315
+ assertUnsupported(model, flags.imageTailUrl, "image-tail-url");
316
+ assertUnsupported(model, flags.imageUrls, "image-urls");
317
+ assertUnsupported(model, flags.referenceUrls, "reference-urls");
318
+ assertUnsupported(model, flags.videoUrl, "video-url");
319
+ assertUnsupported(model, flags.videoId, "video-id");
320
+ assertUnsupported(model, flags.aspectRatio, "aspect-ratio");
321
+ assertUnsupported(model, flags.size, "size");
322
+ assertUnsupported(model, flags.audioUrl, "audio-url");
323
+ assertUnsupported(model, flags.audio, "audio");
324
+ assertUnsupported(model, flags.shotType, "shot-type");
325
+ assertUnsupported(model, flags.watermark, "watermark");
344
326
  const upstreamInput = { img_url: requireSingleImage(model, flags) };
345
327
  if (prompt)
346
- upstreamInput['prompt'] = prompt;
328
+ upstreamInput["prompt"] = prompt;
347
329
  const upstreamParameters = {};
348
330
  if (flags.resolution)
349
- upstreamParameters['resolution'] = flags.resolution;
331
+ upstreamParameters["resolution"] = flags.resolution;
350
332
  if (flags.duration !== undefined)
351
- upstreamParameters['duration'] = flags.duration;
333
+ upstreamParameters["duration"] = flags.duration;
352
334
  if (flags.seed !== undefined)
353
- upstreamParameters['seed'] = flags.seed;
335
+ upstreamParameters["seed"] = flags.seed;
354
336
  if (flags.negativePrompt)
355
- upstreamParameters['negative_prompt'] = flags.negativePrompt;
337
+ upstreamParameters["negative_prompt"] = flags.negativePrompt;
356
338
  const params = { input: upstreamInput };
357
339
  if (Object.keys(upstreamParameters).length > 0)
358
- params['parameters'] = upstreamParameters;
340
+ params["parameters"] = upstreamParameters;
359
341
  return buildEnvelope(model, params);
360
342
  },
361
343
  });
362
344
  registerProvider({
363
- provider: 'alibaba',
364
- category: 'video',
345
+ provider: "alibaba",
346
+ category: "video",
365
347
  models: VIDEO_REF_27_MODELS,
366
348
  requiresPrompt() {
367
349
  return false;
368
350
  },
369
351
  buildBody(model, prompt, flags) {
370
352
  assertUnsupportedAlibabaVideoFlags(model, flags);
371
- assertUnsupported(model, flags.referenceUrls, 'reference-urls');
372
- assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
373
- assertUnsupported(model, flags.audioUrl, 'audio-url');
374
- assertUnsupported(model, flags.audio, 'audio');
375
- assertUnsupported(model, flags.size, 'size');
376
- assertUnsupported(model, flags.shotType, 'shot-type');
377
- assertUnsupported(model, flags.videoId, 'video-id');
353
+ assertUnsupported(model, flags.referenceUrls, "reference-urls");
354
+ assertUnsupported(model, flags.imageTailUrl, "image-tail-url");
355
+ assertUnsupported(model, flags.audioUrl, "audio-url");
356
+ assertUnsupported(model, flags.audio, "audio");
357
+ assertUnsupported(model, flags.size, "size");
358
+ assertUnsupported(model, flags.shotType, "shot-type");
359
+ assertUnsupported(model, flags.videoId, "video-id");
378
360
  const media = [];
379
361
  const firstFrame = maybeString(flags.imageUrl);
380
362
  if (firstFrame)
381
- media.push({ type: 'first_frame', url: firstFrame });
363
+ media.push({ type: "first_frame", url: firstFrame });
382
364
  for (const image of maybeStringArray(flags.imageUrls)) {
383
- media.push({ type: 'reference_image', url: image });
365
+ media.push({ type: "reference_image", url: image });
384
366
  }
385
367
  const referenceVideo = maybeString(flags.videoUrl);
386
368
  if (referenceVideo)
387
- media.push({ type: 'reference_video', url: referenceVideo });
369
+ media.push({ type: "reference_video", url: referenceVideo });
388
370
  if (media.length === 0) {
389
371
  throw new CLIError(`Model "${model}" requires at least one media input via --image-url, --image-urls, or --video-url.`, ExitCode.USAGE);
390
372
  }
391
373
  const upstreamInput = { media };
392
374
  if (prompt)
393
- upstreamInput['prompt'] = prompt;
375
+ upstreamInput["prompt"] = prompt;
394
376
  if (flags.negativePrompt)
395
- upstreamInput['negative_prompt'] = flags.negativePrompt;
377
+ upstreamInput["negative_prompt"] = flags.negativePrompt;
396
378
  const upstreamParameters = {};
397
379
  if (flags.resolution !== undefined) {
398
- upstreamParameters['resolution'] = parseEnum(model, flags.resolution, 'resolution', WAN27_VIDEO_RESOLUTIONS);
380
+ upstreamParameters["resolution"] = parseEnum(model, flags.resolution, "resolution", WAN27_VIDEO_RESOLUTIONS);
399
381
  }
400
382
  if (flags.aspectRatio !== undefined) {
401
- upstreamParameters['ratio'] = parseEnum(model, flags.aspectRatio, 'aspect-ratio', WAN27_RATIOS);
383
+ upstreamParameters["ratio"] = parseEnum(model, flags.aspectRatio, "aspect-ratio", WAN27_RATIOS);
402
384
  }
403
385
  if (flags.duration !== undefined)
404
- upstreamParameters['duration'] = flags.duration;
386
+ upstreamParameters["duration"] = flags.duration;
405
387
  if (flags.seed !== undefined)
406
- upstreamParameters['seed'] = flags.seed;
388
+ upstreamParameters["seed"] = flags.seed;
407
389
  if (flags.watermark !== undefined)
408
- upstreamParameters['watermark'] = flags.watermark;
390
+ upstreamParameters["watermark"] = flags.watermark;
409
391
  const params = { input: upstreamInput };
410
392
  if (Object.keys(upstreamParameters).length > 0)
411
- params['parameters'] = upstreamParameters;
393
+ params["parameters"] = upstreamParameters;
412
394
  return buildEnvelope(model, params);
413
395
  },
414
396
  });
415
397
  registerProvider({
416
- provider: 'alibaba',
417
- category: 'video',
398
+ provider: "alibaba",
399
+ category: "video",
418
400
  models: VIDEO_REF_26_MODELS,
419
401
  requiresPrompt() {
420
402
  return false;
421
403
  },
422
404
  buildBody(model, prompt, flags) {
423
405
  assertUnsupportedAlibabaVideoFlags(model, flags);
424
- assertUnsupported(model, flags.imageUrl, 'image-url');
425
- assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
426
- assertUnsupported(model, flags.imageUrls, 'image-urls');
427
- assertUnsupported(model, flags.videoUrl, 'video-url');
428
- assertUnsupported(model, flags.videoId, 'video-id');
429
- assertUnsupported(model, flags.aspectRatio, 'aspect-ratio');
430
- assertUnsupported(model, flags.resolution, 'resolution');
431
- assertUnsupported(model, flags.watermark, 'watermark');
406
+ assertUnsupported(model, flags.imageUrl, "image-url");
407
+ assertUnsupported(model, flags.imageTailUrl, "image-tail-url");
408
+ assertUnsupported(model, flags.imageUrls, "image-urls");
409
+ assertUnsupported(model, flags.videoUrl, "video-url");
410
+ assertUnsupported(model, flags.videoId, "video-id");
411
+ assertUnsupported(model, flags.aspectRatio, "aspect-ratio");
412
+ assertUnsupported(model, flags.resolution, "resolution");
413
+ assertUnsupported(model, flags.watermark, "watermark");
432
414
  const upstreamInput = {
433
415
  reference_urls: requireReferenceUrls(model, flags),
434
416
  };
435
417
  if (prompt)
436
- upstreamInput['prompt'] = prompt;
418
+ upstreamInput["prompt"] = prompt;
437
419
  if (flags.audioUrl)
438
- upstreamInput['audio_url'] = flags.audioUrl;
420
+ upstreamInput["audio_url"] = flags.audioUrl;
439
421
  const upstreamParameters = {};
440
422
  if (flags.duration !== undefined)
441
- upstreamParameters['duration'] = flags.duration;
423
+ upstreamParameters["duration"] = flags.duration;
442
424
  if (flags.size)
443
- upstreamParameters['size'] = flags.size;
425
+ upstreamParameters["size"] = flags.size;
444
426
  if (flags.seed !== undefined)
445
- upstreamParameters['seed'] = flags.seed;
427
+ upstreamParameters["seed"] = flags.seed;
446
428
  if (flags.audio !== undefined)
447
- upstreamParameters['audio'] = flags.audio;
429
+ upstreamParameters["audio"] = flags.audio;
448
430
  if (flags.shotType)
449
- upstreamParameters['shot_type'] = flags.shotType;
431
+ upstreamParameters["shot_type"] = flags.shotType;
450
432
  if (flags.negativePrompt)
451
- upstreamParameters['negative_prompt'] = flags.negativePrompt;
433
+ upstreamParameters["negative_prompt"] = flags.negativePrompt;
452
434
  const params = { input: upstreamInput };
453
435
  if (Object.keys(upstreamParameters).length > 0)
454
- params['parameters'] = upstreamParameters;
436
+ params["parameters"] = upstreamParameters;
455
437
  return buildEnvelope(model, params);
456
438
  },
457
439
  });
458
440
  registerProvider({
459
- provider: 'alibaba',
460
- category: 'video',
441
+ provider: "alibaba",
442
+ category: "video",
461
443
  models: VIDEO_EDIT_MODELS,
462
444
  requiresPrompt() {
463
445
  return false;
464
446
  },
465
447
  buildBody(model, prompt, flags) {
466
448
  assertUnsupportedAlibabaVideoFlags(model, flags);
467
- assertUnsupported(model, flags.referenceUrls, 'reference-urls');
468
- assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
469
- assertUnsupported(model, flags.audioUrl, 'audio-url');
470
- assertUnsupported(model, flags.audio, 'audio');
471
- assertUnsupported(model, flags.size, 'size');
472
- assertUnsupported(model, flags.shotType, 'shot-type');
473
- assertUnsupported(model, flags.videoId, 'video-id');
449
+ assertUnsupported(model, flags.referenceUrls, "reference-urls");
450
+ assertUnsupported(model, flags.imageTailUrl, "image-tail-url");
451
+ assertUnsupported(model, flags.audioUrl, "audio-url");
452
+ assertUnsupported(model, flags.audio, "audio");
453
+ assertUnsupported(model, flags.size, "size");
454
+ assertUnsupported(model, flags.shotType, "shot-type");
455
+ assertUnsupported(model, flags.videoId, "video-id");
474
456
  const videoUrl = maybeString(flags.videoUrl);
475
457
  if (!videoUrl) {
476
458
  throw new CLIError(`Model "${model}" requires --video-url.`, ExitCode.USAGE);
477
459
  }
478
- const media = [{ type: 'video', url: videoUrl }];
460
+ const media = [{ type: "video", url: videoUrl }];
479
461
  for (const image of collectImageInputs(flags)) {
480
- media.push({ type: 'reference_image', url: image });
462
+ media.push({ type: "reference_image", url: image });
481
463
  }
482
464
  const upstreamInput = { media };
483
465
  if (prompt)
484
- upstreamInput['prompt'] = prompt;
466
+ upstreamInput["prompt"] = prompt;
485
467
  if (flags.negativePrompt)
486
- upstreamInput['negative_prompt'] = flags.negativePrompt;
468
+ upstreamInput["negative_prompt"] = flags.negativePrompt;
487
469
  const upstreamParameters = {};
488
470
  if (flags.resolution !== undefined) {
489
- upstreamParameters['resolution'] = parseEnum(model, flags.resolution, 'resolution', WAN27_VIDEO_RESOLUTIONS);
471
+ upstreamParameters["resolution"] = parseEnum(model, flags.resolution, "resolution", WAN27_VIDEO_RESOLUTIONS);
490
472
  }
491
473
  if (flags.aspectRatio !== undefined) {
492
- upstreamParameters['ratio'] = parseEnum(model, flags.aspectRatio, 'aspect-ratio', WAN27_RATIOS);
474
+ upstreamParameters["ratio"] = parseEnum(model, flags.aspectRatio, "aspect-ratio", WAN27_RATIOS);
493
475
  }
494
476
  if (flags.duration !== undefined)
495
- upstreamParameters['duration'] = flags.duration;
477
+ upstreamParameters["duration"] = flags.duration;
496
478
  if (flags.seed !== undefined)
497
- upstreamParameters['seed'] = flags.seed;
479
+ upstreamParameters["seed"] = flags.seed;
498
480
  if (flags.watermark !== undefined)
499
- upstreamParameters['watermark'] = flags.watermark;
481
+ upstreamParameters["watermark"] = flags.watermark;
500
482
  const params = { input: upstreamInput };
501
483
  if (Object.keys(upstreamParameters).length > 0)
502
- params['parameters'] = upstreamParameters;
484
+ params["parameters"] = upstreamParameters;
503
485
  return buildEnvelope(model, params);
504
486
  },
505
487
  });