@seawork/server 1.0.7 → 1.0.10-rc.4

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 (178) hide show
  1. package/dist/server/client/daemon-client.d.ts +32 -1
  2. package/dist/server/client/daemon-client.d.ts.map +1 -1
  3. package/dist/server/client/daemon-client.js +69 -0
  4. package/dist/server/client/daemon-client.js.map +1 -1
  5. package/dist/server/server/agent/agent-management-mcp.d.ts.map +1 -1
  6. package/dist/server/server/agent/agent-management-mcp.js +6 -5
  7. package/dist/server/server/agent/agent-management-mcp.js.map +1 -1
  8. package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
  9. package/dist/server/server/agent/agent-response-loop.js +0 -1
  10. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  11. package/dist/server/server/agent/agent-storage.d.ts +68 -68
  12. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  13. package/dist/server/server/agent/mcp-server.js +6 -5
  14. package/dist/server/server/agent/mcp-server.js.map +1 -1
  15. package/dist/server/server/agent/mcp-shared.d.ts +30 -30
  16. package/dist/server/server/agent/provider-manifest.d.ts +2 -1
  17. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  18. package/dist/server/server/agent/provider-manifest.js +3 -64
  19. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  20. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  21. package/dist/server/server/agent/provider-registry.js +2 -10
  22. package/dist/server/server/agent/provider-registry.js.map +1 -1
  23. package/dist/server/server/agent/providers/claude/claude-models.d.ts.map +1 -1
  24. package/dist/server/server/agent/providers/claude/claude-models.js +3 -0
  25. package/dist/server/server/agent/providers/claude/claude-models.js.map +1 -1
  26. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
  27. package/dist/server/server/agent/providers/claude-agent.d.ts +2 -1
  28. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  29. package/dist/server/server/agent/providers/claude-agent.js +167 -22
  30. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  31. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  32. package/dist/server/server/agent/providers/codex-app-server-agent.js +106 -3
  33. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  34. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
  35. package/dist/server/server/agent/providers/codex-rollout-timeline.js +76 -0
  36. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
  37. package/dist/server/server/agent/providers/seawork-models.d.ts.map +1 -1
  38. package/dist/server/server/agent/providers/seawork-models.js +9 -0
  39. package/dist/server/server/agent/providers/seawork-models.js.map +1 -1
  40. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +16 -16
  41. package/dist/server/server/bug-report-handler.d.ts +9 -0
  42. package/dist/server/server/bug-report-handler.d.ts.map +1 -0
  43. package/dist/server/server/bug-report-handler.js +111 -0
  44. package/dist/server/server/bug-report-handler.js.map +1 -0
  45. package/dist/server/server/bug-report-redact.d.ts +12 -0
  46. package/dist/server/server/bug-report-redact.d.ts.map +1 -0
  47. package/dist/server/server/bug-report-redact.js +63 -0
  48. package/dist/server/server/bug-report-redact.js.map +1 -0
  49. package/dist/server/server/chat/chat-rpc-schemas.d.ts +26 -26
  50. package/dist/server/server/chat/chat-types.d.ts +2 -2
  51. package/dist/server/server/exports.d.ts +4 -2
  52. package/dist/server/server/exports.d.ts.map +1 -1
  53. package/dist/server/server/exports.js +3 -0
  54. package/dist/server/server/exports.js.map +1 -1
  55. package/dist/server/server/index.js +47 -0
  56. package/dist/server/server/index.js.map +1 -1
  57. package/dist/server/server/loop/rpc-schemas.d.ts +775 -775
  58. package/dist/server/server/loop-service.d.ts +108 -108
  59. package/dist/server/server/persisted-config.d.ts +121 -121
  60. package/dist/server/server/sac/errors.d.ts +1 -0
  61. package/dist/server/server/sac/errors.d.ts.map +1 -1
  62. package/dist/server/server/sac/errors.js +2 -1
  63. package/dist/server/server/sac/errors.js.map +1 -1
  64. package/dist/server/server/sac/generate.d.ts +19 -11
  65. package/dist/server/server/sac/generate.d.ts.map +1 -1
  66. package/dist/server/server/sac/generate.js +131 -36
  67. package/dist/server/server/sac/generate.js.map +1 -1
  68. package/dist/server/server/sac/index.d.ts +8 -10
  69. package/dist/server/server/sac/index.d.ts.map +1 -1
  70. package/dist/server/server/sac/index.js +5 -17
  71. package/dist/server/server/sac/index.js.map +1 -1
  72. package/dist/server/server/sac/providers/alibaba.d.ts +2 -0
  73. package/dist/server/server/sac/providers/alibaba.d.ts.map +1 -0
  74. package/dist/server/server/sac/providers/alibaba.js +506 -0
  75. package/dist/server/server/sac/providers/alibaba.js.map +1 -0
  76. package/dist/server/server/sac/providers/audio.d.ts +2 -0
  77. package/dist/server/server/sac/providers/audio.d.ts.map +1 -0
  78. package/dist/server/server/sac/providers/audio.js +57 -0
  79. package/dist/server/server/sac/providers/audio.js.map +1 -0
  80. package/dist/server/server/sac/providers/kling.d.ts +2 -0
  81. package/dist/server/server/sac/providers/kling.d.ts.map +1 -0
  82. package/dist/server/server/sac/providers/kling.js +589 -0
  83. package/dist/server/server/sac/providers/kling.js.map +1 -0
  84. package/dist/server/server/sac/providers/nano.d.ts +2 -0
  85. package/dist/server/server/sac/providers/nano.d.ts.map +1 -0
  86. package/dist/server/server/sac/providers/nano.js +37 -0
  87. package/dist/server/server/sac/providers/nano.js.map +1 -0
  88. package/dist/server/server/sac/providers/pixverse.d.ts +2 -0
  89. package/dist/server/server/sac/providers/pixverse.d.ts.map +1 -0
  90. package/dist/server/server/sac/providers/pixverse.js +1017 -0
  91. package/dist/server/server/sac/providers/pixverse.js.map +1 -0
  92. package/dist/server/server/sac/providers/registry.d.ts +34 -0
  93. package/dist/server/server/sac/providers/registry.d.ts.map +1 -0
  94. package/dist/server/server/sac/providers/registry.js +57 -0
  95. package/dist/server/server/sac/providers/registry.js.map +1 -0
  96. package/dist/server/server/sac/providers/seaart.d.ts +1 -4
  97. package/dist/server/server/sac/providers/seaart.d.ts.map +1 -1
  98. package/dist/server/server/sac/providers/seaart.js +8 -18
  99. package/dist/server/server/sac/providers/seaart.js.map +1 -1
  100. package/dist/server/server/sac/providers/store.d.ts +9 -5
  101. package/dist/server/server/sac/providers/store.d.ts.map +1 -1
  102. package/dist/server/server/sac/providers/store.js +0 -3
  103. package/dist/server/server/sac/providers/store.js.map +1 -1
  104. package/dist/server/server/sac/providers/tencent-3d.d.ts +2 -0
  105. package/dist/server/server/sac/providers/tencent-3d.d.ts.map +1 -0
  106. package/dist/server/server/sac/providers/tencent-3d.js +210 -0
  107. package/dist/server/server/sac/providers/tencent-3d.js.map +1 -0
  108. package/dist/server/server/sac/providers/tencent-image.d.ts +2 -0
  109. package/dist/server/server/sac/providers/tencent-image.d.ts.map +1 -0
  110. package/dist/server/server/sac/providers/tencent-image.js +90 -0
  111. package/dist/server/server/sac/providers/tencent-image.js.map +1 -0
  112. package/dist/server/server/sac/providers/tencent-video.d.ts +2 -0
  113. package/dist/server/server/sac/providers/tencent-video.d.ts.map +1 -0
  114. package/dist/server/server/sac/providers/tencent-video.js +103 -0
  115. package/dist/server/server/sac/providers/tencent-video.js.map +1 -0
  116. package/dist/server/server/sac/providers/tripo3d.d.ts +2 -0
  117. package/dist/server/server/sac/providers/tripo3d.d.ts.map +1 -0
  118. package/dist/server/server/sac/providers/tripo3d.js +302 -0
  119. package/dist/server/server/sac/providers/tripo3d.js.map +1 -0
  120. package/dist/server/server/sac/providers/vidu.d.ts +2 -0
  121. package/dist/server/server/sac/providers/vidu.d.ts.map +1 -0
  122. package/dist/server/server/sac/providers/vidu.js +965 -0
  123. package/dist/server/server/sac/providers/vidu.js.map +1 -0
  124. package/dist/server/server/sac/providers/volces-3d.d.ts +2 -0
  125. package/dist/server/server/sac/providers/volces-3d.d.ts.map +1 -0
  126. package/dist/server/server/sac/providers/volces-3d.js +77 -0
  127. package/dist/server/server/sac/providers/volces-3d.js.map +1 -0
  128. package/dist/server/server/sac/providers/volces-video.d.ts +2 -0
  129. package/dist/server/server/sac/providers/volces-video.d.ts.map +1 -0
  130. package/dist/server/server/sac/providers/volces-video.js +392 -0
  131. package/dist/server/server/sac/providers/volces-video.js.map +1 -0
  132. package/dist/server/server/sac/providers/volces.d.ts +1 -4
  133. package/dist/server/server/sac/providers/volces.d.ts.map +1 -1
  134. package/dist/server/server/sac/providers/volces.js +279 -66
  135. package/dist/server/server/sac/providers/volces.js.map +1 -1
  136. package/dist/server/server/sac/types.d.ts +13 -30
  137. package/dist/server/server/sac/types.d.ts.map +1 -1
  138. package/dist/server/server/schedule/rpc-schemas.d.ts +493 -493
  139. package/dist/server/server/schedule/types.d.ts +140 -140
  140. package/dist/server/server/session.d.ts +9 -2
  141. package/dist/server/server/session.d.ts.map +1 -1
  142. package/dist/server/server/session.js +137 -19
  143. package/dist/server/server/session.js.map +1 -1
  144. package/dist/server/server/speech/speech-types.d.ts +2 -2
  145. package/dist/server/server/workspace-registry.d.ts +4 -4
  146. package/dist/server/shared/messages.d.ts +17455 -15917
  147. package/dist/server/shared/messages.d.ts.map +1 -1
  148. package/dist/server/shared/messages.js +83 -0
  149. package/dist/server/shared/messages.js.map +1 -1
  150. package/dist/server/utils/spawn.d.ts.map +1 -1
  151. package/dist/server/utils/spawn.js +8 -3
  152. package/dist/server/utils/spawn.js.map +1 -1
  153. package/dist/server/utils/worktree-metadata.d.ts +4 -4
  154. package/package.json +7 -9
  155. package/dist/server/server/agent/providers/acp-agent.d.ts +0 -202
  156. package/dist/server/server/agent/providers/acp-agent.d.ts.map +0 -1
  157. package/dist/server/server/agent/providers/acp-agent.js +0 -1650
  158. package/dist/server/server/agent/providers/acp-agent.js.map +0 -1
  159. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +0 -16
  160. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +0 -1
  161. package/dist/server/server/agent/providers/copilot-acp-agent.js +0 -95
  162. package/dist/server/server/agent/providers/copilot-acp-agent.js.map +0 -1
  163. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +0 -3
  164. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +0 -1
  165. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +0 -39
  166. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +0 -1
  167. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +0 -13
  168. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +0 -1
  169. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +0 -144
  170. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +0 -1
  171. package/dist/server/server/agent/providers/opencode-agent.d.ts +0 -121
  172. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +0 -1
  173. package/dist/server/server/agent/providers/opencode-agent.js +0 -1649
  174. package/dist/server/server/agent/providers/opencode-agent.js.map +0 -1
  175. package/dist/server/server/agent/providers/pi-acp-agent.d.ts +0 -28
  176. package/dist/server/server/agent/providers/pi-acp-agent.d.ts.map +0 -1
  177. package/dist/server/server/agent/providers/pi-acp-agent.js +0 -302
  178. package/dist/server/server/agent/providers/pi-acp-agent.js.map +0 -1
@@ -0,0 +1,965 @@
1
+ import { SACError as CLIError, ExitCode } from "../errors.js";
2
+ import { registerProvider } from "./store.js";
3
+ const Q1_T2V_MODELS = ['vidu_q1'];
4
+ const Q2_T2V_MODELS = ['vidu_q2'];
5
+ const Q3_T2V_MODELS = ['vidu_q3_pro', 'vidu_q3_turbo'];
6
+ const Q1_I2V_MODELS = ['vidu_q1_i2v'];
7
+ const V20_I2V_MODELS = ['vidu_20_i2v'];
8
+ const Q3_I2V_MODELS = ['vidu_q3_pro_i2v', 'vidu_q3_turbo_i2v'];
9
+ const START_END_MODELS = ['vidu_q3_pro_start_end', 'vidu_q3_turbo_start_end'];
10
+ const REFERENCE_MODELS = ['vidu_q3_reference'];
11
+ const MIX_REFERENCE_MODELS = ['vidu_q3_mix_reference'];
12
+ const TEMPLATE_MODELS = ['vidu_template', 'vidu_template_v2'];
13
+ const AD_ONE_CLICK_MODELS = ['vidu_ad_one_click'];
14
+ const ONE_CLICK_MV_MODELS = ['vidu_one_click_mv'];
15
+ const TRENDING_REPLICATE_MODELS = ['vidu_trending_replicate'];
16
+ const TEMPLATE_NAMES = new Set([
17
+ 'turn_into_zombie',
18
+ 'head_to_balloon',
19
+ 'wednesdays_vibe',
20
+ 'covered_liquid_metal',
21
+ ]);
22
+ const Q1_STYLES = new Set(['general', 'anime']);
23
+ const Q1_ASPECT_RATIOS = new Set(['16:9', '9:16', '1:1']);
24
+ const Q2_Q3_ASPECT_RATIOS = new Set(['16:9', '9:16', '3:4', '4:3', '1:1']);
25
+ const Q3_REFERENCE_ASPECT_RATIOS = new Set(['1:1', '9:16', '16:9', '3:4', '4:3', 'auto']);
26
+ const ONE_CLICK_ASPECT_RATIOS = new Set(['1:1', '16:9', '9:16', '4:3', '3:4']);
27
+ const AD_ASPECT_RATIOS = new Set(['1:1', '16:9', '9:16']);
28
+ const MOVEMENT_AMPLITUDES = new Set(['auto', 'small', 'medium', 'large']);
29
+ const Q2_RESOLUTIONS = new Set(['540p', '720p', '1080p']);
30
+ const Q3_T2V_RESOLUTIONS = new Set(['360p', '540p', '720p', '1080p']);
31
+ const Q3_I2V_RESOLUTIONS = new Set(['360p', '540p', '720p', '1080p', '2K']);
32
+ const Q3_START_END_RESOLUTIONS = new Set(['540p', '720p', '1080p']);
33
+ const Q3_REFERENCE_RESOLUTIONS = new Set(['360p', '540p', '720p', '1080p']);
34
+ const Q3_MIX_RESOLUTIONS = new Set(['720p', '1080p']);
35
+ const V20_I2V_RESOLUTIONS = new Set(['360p', '720p', '1080p']);
36
+ const ONE_CLICK_RESOLUTIONS = new Set(['540p', '720p', '1080p']);
37
+ const AD_LANGUAGES = new Set(['zh', 'en']);
38
+ function buildEnvelope(model, params) {
39
+ return {
40
+ model,
41
+ dash_scope: true,
42
+ moderation: true,
43
+ input: [{ params }],
44
+ metadata: {},
45
+ };
46
+ }
47
+ function maybeString(value) {
48
+ if (typeof value !== 'string' || value.length === 0)
49
+ return undefined;
50
+ return value;
51
+ }
52
+ function maybeStringArray(value) {
53
+ if (Array.isArray(value)) {
54
+ return value.filter((item) => typeof item === 'string' && item.length > 0);
55
+ }
56
+ if (typeof value === 'string' && value.length > 0)
57
+ return [value];
58
+ return [];
59
+ }
60
+ function assertUnsupported(model, value, flagName, hint) {
61
+ if (value === undefined)
62
+ return;
63
+ throw new CLIError(hint ?? `Model "${model}" does not support --${flagName}.`, ExitCode.USAGE);
64
+ }
65
+ function parseInteger(model, value, flagName, options = {}) {
66
+ if (value === undefined)
67
+ return undefined;
68
+ if (typeof value !== 'number' || Number.isNaN(value) || !Number.isInteger(value)) {
69
+ throw new CLIError(`Model "${model}" requires --${flagName} to be an integer.`, ExitCode.USAGE);
70
+ }
71
+ if (options.min !== undefined && value < options.min) {
72
+ throw new CLIError(`Model "${model}" requires --${flagName} to be at least ${options.min}.`, ExitCode.USAGE);
73
+ }
74
+ if (options.max !== undefined && value > options.max) {
75
+ throw new CLIError(`Model "${model}" requires --${flagName} to be at most ${options.max}.`, ExitCode.USAGE);
76
+ }
77
+ return value;
78
+ }
79
+ function parseNumber(model, value, flagName, options = {}) {
80
+ if (value === undefined)
81
+ return undefined;
82
+ if (typeof value !== 'number' || Number.isNaN(value)) {
83
+ throw new CLIError(`Model "${model}" requires --${flagName} to be a number.`, ExitCode.USAGE);
84
+ }
85
+ if (options.min !== undefined && value < options.min) {
86
+ throw new CLIError(`Model "${model}" requires --${flagName} to be at least ${options.min}.`, ExitCode.USAGE);
87
+ }
88
+ if (options.max !== undefined && value > options.max) {
89
+ throw new CLIError(`Model "${model}" requires --${flagName} to be at most ${options.max}.`, ExitCode.USAGE);
90
+ }
91
+ return value;
92
+ }
93
+ function parseEnum(model, value, flagName, allowed) {
94
+ if (value === undefined)
95
+ return undefined;
96
+ if (typeof value !== 'string' || !allowed.has(value)) {
97
+ throw new CLIError(`Model "${model}" requires --${flagName} to be one of: ${Array.from(allowed).join(', ')}.`, ExitCode.USAGE);
98
+ }
99
+ return value;
100
+ }
101
+ function parseJsonObject(model, value, flagName) {
102
+ if (value === undefined)
103
+ return undefined;
104
+ if (typeof value !== 'string' || value.length === 0) {
105
+ throw new CLIError(`Model "${model}" requires --${flagName} to be a non-empty JSON object string.`, ExitCode.USAGE);
106
+ }
107
+ let parsed;
108
+ try {
109
+ parsed = JSON.parse(value);
110
+ }
111
+ catch {
112
+ throw new CLIError(`Model "${model}" requires --${flagName} to be valid JSON.`, ExitCode.USAGE);
113
+ }
114
+ if (!parsed || Array.isArray(parsed) || typeof parsed !== 'object') {
115
+ throw new CLIError(`Model "${model}" requires --${flagName} to be a JSON object.`, ExitCode.USAGE);
116
+ }
117
+ return parsed;
118
+ }
119
+ function collectImages(flags) {
120
+ const images = maybeStringArray(flags.imageUrls);
121
+ const imageUrl = maybeString(flags.imageUrl);
122
+ return imageUrl ? [imageUrl, ...images] : images;
123
+ }
124
+ function collectImageSet(model, flags, options = { min: 1, max: 7 }) {
125
+ if (!options.allowImageTail) {
126
+ assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
127
+ }
128
+ const images = collectImages(flags);
129
+ if (images.length < options.min || images.length > options.max) {
130
+ const expected = options.min === options.max ? `${options.min}` : `${options.min}-${options.max}`;
131
+ throw new CLIError(`Model "${model}" requires ${expected} input image${options.max === 1 ? '' : 's'} via --image-url/--image-urls.`, ExitCode.USAGE);
132
+ }
133
+ return images;
134
+ }
135
+ function requireSingleImage(model, flags) {
136
+ assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
137
+ return collectImageSet(model, flags, { min: 1, max: 1 });
138
+ }
139
+ function requireStartEndImages(model, flags) {
140
+ assertUnsupported(model, flags.imageUrls, 'image-urls');
141
+ const first = maybeString(flags.imageUrl);
142
+ const last = maybeString(flags.imageTailUrl);
143
+ if (!first || !last) {
144
+ throw new CLIError(`Model "${model}" requires both --image-url and --image-tail-url.`, ExitCode.USAGE);
145
+ }
146
+ return [first, last];
147
+ }
148
+ function requireVideoUrl(model, flags) {
149
+ const videoUrl = maybeString(flags.videoUrl);
150
+ if (!videoUrl) {
151
+ throw new CLIError(`Model "${model}" requires --video-url.`, ExitCode.USAGE);
152
+ }
153
+ return videoUrl;
154
+ }
155
+ function rejectReservedSounds(model, flags) {
156
+ assertUnsupported(model, flags.sounds, 'sounds', `Model "${model}" does not currently support --sounds; the upstream field is reserved.`);
157
+ }
158
+ function applyViduCommonUnsupported(model, flags) {
159
+ assertUnsupported(model, flags.short, 'short');
160
+ assertUnsupported(model, flags.size, 'size');
161
+ assertUnsupported(model, flags.fps, 'fps');
162
+ assertUnsupported(model, flags.frames, 'frames');
163
+ assertUnsupported(model, flags.serviceTier, 'service-tier');
164
+ assertUnsupported(model, flags.expiresAfter, 'expires-after');
165
+ assertUnsupported(model, flags.externalTaskId, 'external-task-id');
166
+ assertUnsupported(model, flags.elementIds, 'element-ids');
167
+ assertUnsupported(model, flags.effectScene, 'effect-scene');
168
+ assertUnsupported(model, flags.characterOrientation, 'character-orientation');
169
+ assertUnsupported(model, flags.keepOriginalSound, 'keep-original-sound');
170
+ assertUnsupported(model, flags.videoReferType, 'video-refer-type');
171
+ assertUnsupported(model, flags.lipsyncMode, 'lipsync-mode');
172
+ assertUnsupported(model, flags.cameraFixed, 'camera-fixed');
173
+ assertUnsupported(model, flags.returnLastFrame, 'return-last-frame');
174
+ assertUnsupported(model, flags.draft, 'draft');
175
+ assertUnsupported(model, flags.referenceUrls, 'reference-urls');
176
+ assertUnsupported(model, flags.videoId, 'video-id');
177
+ assertUnsupported(model, flags.draftTaskId, 'draft-task-id');
178
+ assertUnsupported(model, flags.maskUrls, 'mask-urls');
179
+ assertUnsupported(model, flags.mode, 'mode');
180
+ assertUnsupported(model, flags.shotType, 'shot-type');
181
+ assertUnsupported(model, flags.multiShot, 'multi-shot');
182
+ assertUnsupported(model, flags.negativePrompt, 'negative-prompt');
183
+ assertUnsupported(model, flags.cfgScale, 'cfg-scale');
184
+ assertUnsupported(model, flags.videoQuality, 'video-quality');
185
+ assertUnsupported(model, flags.peFastMode, 'pe-fast-mode');
186
+ assertUnsupported(model, flags.audioId, 'audio-id');
187
+ assertUnsupported(model, flags.voiceLanguage, 'voice-language');
188
+ assertUnsupported(model, flags.voiceSpeed, 'voice-speed');
189
+ assertUnsupported(model, flags.sound, 'sound');
190
+ assertUnsupported(model, flags.bitrate, 'bitrate');
191
+ assertUnsupported(model, flags.extensionType, 'extension-type');
192
+ assertUnsupported(model, flags.templateId, 'template-id');
193
+ assertUnsupported(model, flags.reqKey, 'req-key');
194
+ assertUnsupported(model, flags.subReqKey, 'sub-req-key');
195
+ }
196
+ function applyViduBasicParams(model, flags, options) {
197
+ const params = {};
198
+ if (options.duration) {
199
+ const duration = parseInteger(model, flags.duration, 'duration', {
200
+ min: options.duration.min,
201
+ max: options.duration.max,
202
+ });
203
+ if (duration !== undefined) {
204
+ if (options.duration.allowed && !options.duration.allowed.includes(duration)) {
205
+ throw new CLIError(`Model "${model}" requires --duration to be one of: ${options.duration.allowed.join(', ')}.`, ExitCode.USAGE);
206
+ }
207
+ params['duration'] = duration;
208
+ }
209
+ }
210
+ else {
211
+ assertUnsupported(model, flags.duration, 'duration');
212
+ }
213
+ if (options.resolution) {
214
+ const resolution = parseEnum(model, flags.resolution, 'resolution', options.resolution);
215
+ if (resolution)
216
+ params['resolution'] = resolution;
217
+ }
218
+ else {
219
+ assertUnsupported(model, flags.resolution, 'resolution');
220
+ }
221
+ if (flags.seed !== undefined) {
222
+ const seed = parseInteger(model, flags.seed, 'seed');
223
+ if (seed !== undefined)
224
+ params['seed'] = seed;
225
+ }
226
+ if (options.aspectRatio) {
227
+ const aspectRatio = parseEnum(model, flags.aspectRatio, 'aspect-ratio', options.aspectRatio);
228
+ if (aspectRatio)
229
+ params['aspect_ratio'] = aspectRatio;
230
+ }
231
+ else {
232
+ assertUnsupported(model, flags.aspectRatio, 'aspect-ratio');
233
+ }
234
+ if (options.movementAmplitude) {
235
+ const movementAmplitude = parseEnum(model, flags.movementAmplitude, 'movement-amplitude', MOVEMENT_AMPLITUDES);
236
+ if (movementAmplitude)
237
+ params['movement_amplitude'] = movementAmplitude;
238
+ }
239
+ else {
240
+ assertUnsupported(model, flags.movementAmplitude, 'movement-amplitude');
241
+ }
242
+ if (options.bgm) {
243
+ if (flags.bgm !== undefined)
244
+ params['bgm'] = flags.bgm;
245
+ }
246
+ else {
247
+ assertUnsupported(model, flags.bgm, 'bgm');
248
+ }
249
+ if (options.audio) {
250
+ if (flags.audio !== undefined)
251
+ params['audio'] = flags.audio;
252
+ }
253
+ else {
254
+ assertUnsupported(model, flags.audio, 'audio');
255
+ }
256
+ if (options.payload) {
257
+ const payload = maybeString(flags.payload);
258
+ if (payload)
259
+ params['payload'] = payload;
260
+ }
261
+ else {
262
+ assertUnsupported(model, flags.payload, 'payload');
263
+ }
264
+ if (options.callbackUrl) {
265
+ const callbackUrl = maybeString(flags.callbackUrl);
266
+ if (callbackUrl)
267
+ params['callback_url'] = callbackUrl;
268
+ }
269
+ else {
270
+ assertUnsupported(model, flags.callbackUrl, 'callback-url');
271
+ }
272
+ if (options.offPeak) {
273
+ if (flags.offPeak !== undefined)
274
+ params['off_peak'] = flags.offPeak;
275
+ }
276
+ else {
277
+ assertUnsupported(model, flags.offPeak, 'off-peak');
278
+ }
279
+ if (options.watermark) {
280
+ if (flags.watermark !== undefined)
281
+ params['watermark'] = flags.watermark;
282
+ }
283
+ else {
284
+ assertUnsupported(model, flags.watermark, 'watermark');
285
+ }
286
+ if (options.watermarkPosition) {
287
+ const watermarkPosition = parseInteger(model, flags.watermarkPosition, 'watermark-position', { min: 1, max: 4 });
288
+ if (watermarkPosition !== undefined)
289
+ params['wm_position'] = watermarkPosition;
290
+ }
291
+ else {
292
+ assertUnsupported(model, flags.watermarkPosition, 'watermark-position');
293
+ }
294
+ if (options.watermarkUrl) {
295
+ const watermarkUrl = maybeString(flags.watermarkUrl);
296
+ if (watermarkUrl)
297
+ params['wm_url'] = watermarkUrl;
298
+ }
299
+ else {
300
+ assertUnsupported(model, flags.watermarkUrl, 'watermark-url');
301
+ }
302
+ if (options.metaData) {
303
+ const metaData = maybeString(flags.metaData);
304
+ if (metaData)
305
+ params['meta_data'] = metaData;
306
+ }
307
+ else {
308
+ assertUnsupported(model, flags.metaData, 'meta-data');
309
+ }
310
+ if (options.style) {
311
+ const style = parseEnum(model, flags.style, 'style', options.style);
312
+ if (style)
313
+ params['style'] = style;
314
+ }
315
+ else {
316
+ assertUnsupported(model, flags.style, 'style');
317
+ }
318
+ return params;
319
+ }
320
+ registerProvider({
321
+ provider: 'vidu',
322
+ category: 'video',
323
+ models: Q1_T2V_MODELS,
324
+ buildBody(model, prompt, flags) {
325
+ applyViduCommonUnsupported(model, flags);
326
+ assertUnsupported(model, flags.imageUrl, 'image-url');
327
+ assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
328
+ assertUnsupported(model, flags.imageUrls, 'image-urls');
329
+ assertUnsupported(model, flags.videoUrl, 'video-url');
330
+ assertUnsupported(model, flags.audioUrl, 'audio-url');
331
+ assertUnsupported(model, flags.sounds, 'sounds');
332
+ assertUnsupported(model, flags.recommendPrompt, 'recommend-prompt');
333
+ assertUnsupported(model, flags.enhancePrompt, 'enhance-prompt');
334
+ assertUnsupported(model, flags.template, 'template');
335
+ assertUnsupported(model, flags.templateParams, 'template-params');
336
+ assertUnsupported(model, flags.language, 'language');
337
+ assertUnsupported(model, flags.creative, 'creative');
338
+ assertUnsupported(model, flags.addSubtitle, 'add-subtitle');
339
+ assertUnsupported(model, flags.removeAudio, 'remove-audio');
340
+ assertUnsupported(model, flags.characterReferenceUrl, 'character-reference-url');
341
+ assertUnsupported(model, flags.styleReferenceUrl, 'style-reference-url');
342
+ assertUnsupported(model, flags.characterReferenceWeight, 'character-reference-weight');
343
+ assertUnsupported(model, flags.styleReferenceWeight, 'style-reference-weight');
344
+ const params = applyViduBasicParams(model, flags, {
345
+ aspectRatio: Q1_ASPECT_RATIOS,
346
+ movementAmplitude: true,
347
+ bgm: true,
348
+ payload: true,
349
+ callbackUrl: true,
350
+ style: Q1_STYLES,
351
+ });
352
+ params['prompt'] = prompt;
353
+ return buildEnvelope(model, params);
354
+ },
355
+ });
356
+ registerProvider({
357
+ provider: 'vidu',
358
+ category: 'video',
359
+ models: Q2_T2V_MODELS,
360
+ buildBody(model, prompt, flags) {
361
+ applyViduCommonUnsupported(model, flags);
362
+ assertUnsupported(model, flags.imageUrl, 'image-url');
363
+ assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
364
+ assertUnsupported(model, flags.imageUrls, 'image-urls');
365
+ assertUnsupported(model, flags.videoUrl, 'video-url');
366
+ assertUnsupported(model, flags.audioUrl, 'audio-url');
367
+ assertUnsupported(model, flags.sounds, 'sounds');
368
+ assertUnsupported(model, flags.recommendPrompt, 'recommend-prompt');
369
+ assertUnsupported(model, flags.enhancePrompt, 'enhance-prompt');
370
+ assertUnsupported(model, flags.template, 'template');
371
+ assertUnsupported(model, flags.templateParams, 'template-params');
372
+ assertUnsupported(model, flags.language, 'language');
373
+ assertUnsupported(model, flags.creative, 'creative');
374
+ assertUnsupported(model, flags.addSubtitle, 'add-subtitle');
375
+ assertUnsupported(model, flags.removeAudio, 'remove-audio');
376
+ assertUnsupported(model, flags.characterReferenceUrl, 'character-reference-url');
377
+ assertUnsupported(model, flags.styleReferenceUrl, 'style-reference-url');
378
+ assertUnsupported(model, flags.characterReferenceWeight, 'character-reference-weight');
379
+ assertUnsupported(model, flags.styleReferenceWeight, 'style-reference-weight');
380
+ const params = applyViduBasicParams(model, flags, {
381
+ duration: { min: 1, max: 10 },
382
+ resolution: Q2_RESOLUTIONS,
383
+ aspectRatio: Q2_Q3_ASPECT_RATIOS,
384
+ bgm: true,
385
+ payload: true,
386
+ callbackUrl: true,
387
+ offPeak: true,
388
+ });
389
+ params['prompt'] = prompt;
390
+ return buildEnvelope(model, params);
391
+ },
392
+ });
393
+ registerProvider({
394
+ provider: 'vidu',
395
+ category: 'video',
396
+ models: Q3_T2V_MODELS,
397
+ buildBody(model, prompt, flags) {
398
+ applyViduCommonUnsupported(model, flags);
399
+ assertUnsupported(model, flags.imageUrl, 'image-url');
400
+ assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
401
+ assertUnsupported(model, flags.imageUrls, 'image-urls');
402
+ assertUnsupported(model, flags.videoUrl, 'video-url');
403
+ assertUnsupported(model, flags.audioUrl, 'audio-url');
404
+ rejectReservedSounds(model, flags);
405
+ assertUnsupported(model, flags.recommendPrompt, 'recommend-prompt');
406
+ assertUnsupported(model, flags.enhancePrompt, 'enhance-prompt');
407
+ assertUnsupported(model, flags.template, 'template');
408
+ assertUnsupported(model, flags.templateParams, 'template-params');
409
+ assertUnsupported(model, flags.language, 'language');
410
+ assertUnsupported(model, flags.creative, 'creative');
411
+ assertUnsupported(model, flags.addSubtitle, 'add-subtitle');
412
+ assertUnsupported(model, flags.removeAudio, 'remove-audio');
413
+ assertUnsupported(model, flags.characterReferenceUrl, 'character-reference-url');
414
+ assertUnsupported(model, flags.styleReferenceUrl, 'style-reference-url');
415
+ assertUnsupported(model, flags.characterReferenceWeight, 'character-reference-weight');
416
+ assertUnsupported(model, flags.styleReferenceWeight, 'style-reference-weight');
417
+ const params = applyViduBasicParams(model, flags, {
418
+ duration: { min: 1, max: 16 },
419
+ resolution: Q3_T2V_RESOLUTIONS,
420
+ aspectRatio: Q2_Q3_ASPECT_RATIOS,
421
+ movementAmplitude: true,
422
+ bgm: true,
423
+ audio: true,
424
+ payload: true,
425
+ callbackUrl: true,
426
+ offPeak: true,
427
+ watermark: true,
428
+ watermarkPosition: true,
429
+ watermarkUrl: true,
430
+ metaData: true,
431
+ });
432
+ params['prompt'] = prompt;
433
+ return buildEnvelope(model, params);
434
+ },
435
+ });
436
+ function buildQ3I2VBody(model, prompt, flags) {
437
+ applyViduCommonUnsupported(model, flags);
438
+ assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
439
+ assertUnsupported(model, flags.imageUrls, 'image-urls');
440
+ assertUnsupported(model, flags.videoUrl, 'video-url');
441
+ rejectReservedSounds(model, flags);
442
+ assertUnsupported(model, flags.recommendPrompt, 'recommend-prompt');
443
+ assertUnsupported(model, flags.enhancePrompt, 'enhance-prompt');
444
+ assertUnsupported(model, flags.template, 'template');
445
+ assertUnsupported(model, flags.templateParams, 'template-params');
446
+ assertUnsupported(model, flags.language, 'language');
447
+ assertUnsupported(model, flags.creative, 'creative');
448
+ assertUnsupported(model, flags.addSubtitle, 'add-subtitle');
449
+ assertUnsupported(model, flags.removeAudio, 'remove-audio');
450
+ assertUnsupported(model, flags.characterReferenceUrl, 'character-reference-url');
451
+ assertUnsupported(model, flags.styleReferenceUrl, 'style-reference-url');
452
+ assertUnsupported(model, flags.characterReferenceWeight, 'character-reference-weight');
453
+ assertUnsupported(model, flags.styleReferenceWeight, 'style-reference-weight');
454
+ const params = applyViduBasicParams(model, flags, {
455
+ duration: { min: 1, max: 16 },
456
+ resolution: Q3_I2V_RESOLUTIONS,
457
+ movementAmplitude: true,
458
+ bgm: true,
459
+ audio: true,
460
+ payload: true,
461
+ callbackUrl: true,
462
+ offPeak: true,
463
+ watermark: true,
464
+ watermarkPosition: true,
465
+ watermarkUrl: true,
466
+ metaData: true,
467
+ });
468
+ params['images'] = requireSingleImage(model, flags);
469
+ if (prompt.length > 0)
470
+ params['prompt'] = prompt;
471
+ const audioUrl = maybeString(flags.audioUrl);
472
+ if (audioUrl)
473
+ params['audio_url'] = audioUrl;
474
+ const voiceId = maybeString(flags.voiceId);
475
+ if (voiceId)
476
+ params['voice_id'] = voiceId;
477
+ return buildEnvelope(model, params);
478
+ }
479
+ registerProvider({
480
+ provider: 'vidu',
481
+ category: 'video',
482
+ models: Q3_I2V_MODELS,
483
+ requiresPrompt() {
484
+ return false;
485
+ },
486
+ buildBody: buildQ3I2VBody,
487
+ });
488
+ registerProvider({
489
+ provider: 'vidu',
490
+ category: 'video',
491
+ models: Q1_I2V_MODELS,
492
+ requiresPrompt() {
493
+ return false;
494
+ },
495
+ buildBody(model, prompt, flags) {
496
+ applyViduCommonUnsupported(model, flags);
497
+ assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
498
+ assertUnsupported(model, flags.imageUrls, 'image-urls');
499
+ assertUnsupported(model, flags.videoUrl, 'video-url');
500
+ assertUnsupported(model, flags.audioUrl, 'audio-url');
501
+ assertUnsupported(model, flags.sounds, 'sounds');
502
+ assertUnsupported(model, flags.offPeak, 'off-peak');
503
+ assertUnsupported(model, flags.watermark, 'watermark');
504
+ assertUnsupported(model, flags.watermarkPosition, 'watermark-position');
505
+ assertUnsupported(model, flags.watermarkUrl, 'watermark-url');
506
+ assertUnsupported(model, flags.metaData, 'meta-data');
507
+ assertUnsupported(model, flags.enhancePrompt, 'enhance-prompt');
508
+ assertUnsupported(model, flags.template, 'template');
509
+ assertUnsupported(model, flags.templateParams, 'template-params');
510
+ assertUnsupported(model, flags.language, 'language');
511
+ assertUnsupported(model, flags.creative, 'creative');
512
+ assertUnsupported(model, flags.addSubtitle, 'add-subtitle');
513
+ assertUnsupported(model, flags.removeAudio, 'remove-audio');
514
+ assertUnsupported(model, flags.characterReferenceUrl, 'character-reference-url');
515
+ assertUnsupported(model, flags.styleReferenceUrl, 'style-reference-url');
516
+ assertUnsupported(model, flags.characterReferenceWeight, 'character-reference-weight');
517
+ assertUnsupported(model, flags.styleReferenceWeight, 'style-reference-weight');
518
+ if (flags.recommendPrompt && prompt.length > 0) {
519
+ throw new CLIError(`Model "${model}" does not allow --prompt together with --recommend-prompt.`, ExitCode.USAGE);
520
+ }
521
+ const params = applyViduBasicParams(model, flags, {
522
+ duration: { allowed: [5] },
523
+ movementAmplitude: true,
524
+ bgm: true,
525
+ payload: true,
526
+ callbackUrl: true,
527
+ });
528
+ params['images'] = requireSingleImage(model, flags);
529
+ if (prompt.length > 0)
530
+ params['prompt'] = prompt;
531
+ if (flags.recommendPrompt)
532
+ params['is_rec'] = true;
533
+ return buildEnvelope(model, params);
534
+ },
535
+ });
536
+ registerProvider({
537
+ provider: 'vidu',
538
+ category: 'video',
539
+ models: V20_I2V_MODELS,
540
+ requiresPrompt() {
541
+ return false;
542
+ },
543
+ buildBody(model, prompt, flags) {
544
+ applyViduCommonUnsupported(model, flags);
545
+ assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
546
+ assertUnsupported(model, flags.imageUrls, 'image-urls');
547
+ assertUnsupported(model, flags.videoUrl, 'video-url');
548
+ assertUnsupported(model, flags.audioUrl, 'audio-url');
549
+ assertUnsupported(model, flags.sounds, 'sounds');
550
+ assertUnsupported(model, flags.recommendPrompt, 'recommend-prompt');
551
+ assertUnsupported(model, flags.watermark, 'watermark');
552
+ assertUnsupported(model, flags.watermarkPosition, 'watermark-position');
553
+ assertUnsupported(model, flags.watermarkUrl, 'watermark-url');
554
+ assertUnsupported(model, flags.metaData, 'meta-data');
555
+ assertUnsupported(model, flags.enhancePrompt, 'enhance-prompt');
556
+ assertUnsupported(model, flags.template, 'template');
557
+ assertUnsupported(model, flags.templateParams, 'template-params');
558
+ assertUnsupported(model, flags.language, 'language');
559
+ assertUnsupported(model, flags.creative, 'creative');
560
+ assertUnsupported(model, flags.addSubtitle, 'add-subtitle');
561
+ assertUnsupported(model, flags.removeAudio, 'remove-audio');
562
+ assertUnsupported(model, flags.characterReferenceUrl, 'character-reference-url');
563
+ assertUnsupported(model, flags.styleReferenceUrl, 'style-reference-url');
564
+ assertUnsupported(model, flags.characterReferenceWeight, 'character-reference-weight');
565
+ assertUnsupported(model, flags.styleReferenceWeight, 'style-reference-weight');
566
+ const params = applyViduBasicParams(model, flags, {
567
+ duration: { allowed: [4, 8] },
568
+ resolution: V20_I2V_RESOLUTIONS,
569
+ movementAmplitude: true,
570
+ payload: true,
571
+ callbackUrl: true,
572
+ offPeak: true,
573
+ });
574
+ params['images'] = requireSingleImage(model, flags);
575
+ if (prompt.length > 0)
576
+ params['prompt'] = prompt;
577
+ return buildEnvelope(model, params);
578
+ },
579
+ });
580
+ registerProvider({
581
+ provider: 'vidu',
582
+ category: 'video',
583
+ models: START_END_MODELS,
584
+ requiresPrompt() {
585
+ return false;
586
+ },
587
+ buildBody(model, prompt, flags) {
588
+ applyViduCommonUnsupported(model, flags);
589
+ assertUnsupported(model, flags.sounds, 'sounds');
590
+ assertUnsupported(model, flags.payload, 'payload');
591
+ assertUnsupported(model, flags.callbackUrl, 'callback-url');
592
+ assertUnsupported(model, flags.watermark, 'watermark');
593
+ assertUnsupported(model, flags.watermarkPosition, 'watermark-position');
594
+ assertUnsupported(model, flags.watermarkUrl, 'watermark-url');
595
+ assertUnsupported(model, flags.metaData, 'meta-data');
596
+ assertUnsupported(model, flags.enhancePrompt, 'enhance-prompt');
597
+ assertUnsupported(model, flags.template, 'template');
598
+ assertUnsupported(model, flags.templateParams, 'template-params');
599
+ assertUnsupported(model, flags.language, 'language');
600
+ assertUnsupported(model, flags.creative, 'creative');
601
+ assertUnsupported(model, flags.addSubtitle, 'add-subtitle');
602
+ assertUnsupported(model, flags.removeAudio, 'remove-audio');
603
+ assertUnsupported(model, flags.characterReferenceUrl, 'character-reference-url');
604
+ assertUnsupported(model, flags.styleReferenceUrl, 'style-reference-url');
605
+ assertUnsupported(model, flags.characterReferenceWeight, 'character-reference-weight');
606
+ assertUnsupported(model, flags.styleReferenceWeight, 'style-reference-weight');
607
+ assertUnsupported(model, flags.videoUrl, 'video-url');
608
+ assertUnsupported(model, flags.audioUrl, 'audio-url');
609
+ if (model === 'vidu_q3_pro_start_end') {
610
+ assertUnsupported(model, flags.recommendPrompt, 'recommend-prompt');
611
+ }
612
+ else if (flags.recommendPrompt && prompt.length > 0) {
613
+ throw new CLIError(`Model "${model}" does not allow --prompt together with --recommend-prompt.`, ExitCode.USAGE);
614
+ }
615
+ const params = applyViduBasicParams(model, flags, {
616
+ duration: { min: 1, max: 16 },
617
+ resolution: Q3_START_END_RESOLUTIONS,
618
+ aspectRatio: Q2_Q3_ASPECT_RATIOS,
619
+ bgm: true,
620
+ audio: true,
621
+ offPeak: true,
622
+ });
623
+ params['images'] = requireStartEndImages(model, flags);
624
+ if (prompt.length > 0)
625
+ params['prompt'] = prompt;
626
+ if (flags.recommendPrompt)
627
+ params['is_rec'] = true;
628
+ return buildEnvelope(model, params);
629
+ },
630
+ });
631
+ registerProvider({
632
+ provider: 'vidu',
633
+ category: 'video',
634
+ models: REFERENCE_MODELS,
635
+ buildBody(model, prompt, flags) {
636
+ applyViduCommonUnsupported(model, flags);
637
+ rejectReservedSounds(model, flags);
638
+ assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
639
+ assertUnsupported(model, flags.videoUrl, 'video-url');
640
+ assertUnsupported(model, flags.audioUrl, 'audio-url');
641
+ assertUnsupported(model, flags.recommendPrompt, 'recommend-prompt');
642
+ assertUnsupported(model, flags.enhancePrompt, 'enhance-prompt');
643
+ assertUnsupported(model, flags.template, 'template');
644
+ assertUnsupported(model, flags.templateParams, 'template-params');
645
+ assertUnsupported(model, flags.language, 'language');
646
+ assertUnsupported(model, flags.creative, 'creative');
647
+ assertUnsupported(model, flags.addSubtitle, 'add-subtitle');
648
+ assertUnsupported(model, flags.removeAudio, 'remove-audio');
649
+ assertUnsupported(model, flags.characterReferenceUrl, 'character-reference-url');
650
+ assertUnsupported(model, flags.styleReferenceUrl, 'style-reference-url');
651
+ assertUnsupported(model, flags.characterReferenceWeight, 'character-reference-weight');
652
+ assertUnsupported(model, flags.styleReferenceWeight, 'style-reference-weight');
653
+ const params = applyViduBasicParams(model, flags, {
654
+ duration: { min: 3, max: 16 },
655
+ resolution: Q3_REFERENCE_RESOLUTIONS,
656
+ aspectRatio: Q3_REFERENCE_ASPECT_RATIOS,
657
+ bgm: true,
658
+ audio: true,
659
+ payload: true,
660
+ callbackUrl: true,
661
+ offPeak: true,
662
+ watermark: true,
663
+ watermarkPosition: true,
664
+ watermarkUrl: true,
665
+ metaData: true,
666
+ });
667
+ assertUnsupported(model, flags.movementAmplitude, 'movement-amplitude');
668
+ const images = collectImages(flags);
669
+ if (images.length > 0)
670
+ params['images'] = images;
671
+ params['prompt'] = prompt;
672
+ return buildEnvelope(model, params);
673
+ },
674
+ });
675
+ registerProvider({
676
+ provider: 'vidu',
677
+ category: 'video',
678
+ models: MIX_REFERENCE_MODELS,
679
+ buildBody(model, prompt, flags) {
680
+ applyViduCommonUnsupported(model, flags);
681
+ rejectReservedSounds(model, flags);
682
+ assertUnsupported(model, flags.template, 'template');
683
+ assertUnsupported(model, flags.templateParams, 'template-params');
684
+ assertUnsupported(model, flags.language, 'language');
685
+ assertUnsupported(model, flags.creative, 'creative');
686
+ assertUnsupported(model, flags.addSubtitle, 'add-subtitle');
687
+ assertUnsupported(model, flags.removeAudio, 'remove-audio');
688
+ assertUnsupported(model, flags.videoUrl, 'video-url');
689
+ assertUnsupported(model, flags.audioUrl, 'audio-url');
690
+ assertUnsupported(model, flags.recommendPrompt, 'recommend-prompt');
691
+ assertUnsupported(model, flags.movementAmplitude, 'movement-amplitude');
692
+ const params = applyViduBasicParams(model, flags, {
693
+ duration: { min: 3, max: 16 },
694
+ resolution: Q3_MIX_RESOLUTIONS,
695
+ aspectRatio: Q3_REFERENCE_ASPECT_RATIOS,
696
+ audio: true,
697
+ payload: true,
698
+ callbackUrl: true,
699
+ offPeak: true,
700
+ watermark: true,
701
+ watermarkPosition: true,
702
+ watermarkUrl: true,
703
+ metaData: true,
704
+ });
705
+ const images = collectImages(flags);
706
+ if (images.length > 7) {
707
+ throw new CLIError(`Model "${model}" allows at most 7 reference images via --image-url/--image-urls.`, ExitCode.USAGE);
708
+ }
709
+ if (images.length > 0)
710
+ params['images'] = images;
711
+ const firstFrameImage = maybeString(flags.imageUrl);
712
+ if (firstFrameImage)
713
+ params['first_frame_image'] = firstFrameImage;
714
+ const lastFrameImage = maybeString(flags.imageTailUrl);
715
+ if (lastFrameImage)
716
+ params['last_frame_image'] = lastFrameImage;
717
+ const characterReferenceUrl = maybeString(flags.characterReferenceUrl);
718
+ if (characterReferenceUrl)
719
+ params['character_reference_image'] = characterReferenceUrl;
720
+ const styleReferenceUrl = maybeString(flags.styleReferenceUrl);
721
+ if (styleReferenceUrl)
722
+ params['style_reference_image'] = styleReferenceUrl;
723
+ const characterReferenceWeight = parseNumber(model, flags.characterReferenceWeight, 'character-reference-weight', {
724
+ min: 0,
725
+ max: 1,
726
+ });
727
+ if (characterReferenceWeight !== undefined) {
728
+ params['character_reference_weight'] = characterReferenceWeight;
729
+ }
730
+ const styleReferenceWeight = parseNumber(model, flags.styleReferenceWeight, 'style-reference-weight', {
731
+ min: 0,
732
+ max: 1,
733
+ });
734
+ if (styleReferenceWeight !== undefined) {
735
+ params['style_reference_weight'] = styleReferenceWeight;
736
+ }
737
+ if (flags.enhancePrompt !== undefined)
738
+ params['enhance_prompt'] = flags.enhancePrompt;
739
+ params['prompt'] = prompt;
740
+ return buildEnvelope(model, params);
741
+ },
742
+ });
743
+ registerProvider({
744
+ provider: 'vidu',
745
+ category: 'video',
746
+ models: TEMPLATE_MODELS,
747
+ requiresPrompt() {
748
+ return false;
749
+ },
750
+ buildBody(model, prompt, flags) {
751
+ applyViduCommonUnsupported(model, flags);
752
+ assertUnsupported(model, flags.duration, 'duration');
753
+ assertUnsupported(model, flags.aspectRatio, 'aspect-ratio');
754
+ assertUnsupported(model, flags.resolution, 'resolution');
755
+ assertUnsupported(model, flags.movementAmplitude, 'movement-amplitude');
756
+ assertUnsupported(model, flags.audio, 'audio');
757
+ assertUnsupported(model, flags.payload, 'payload');
758
+ assertUnsupported(model, flags.callbackUrl, 'callback-url');
759
+ assertUnsupported(model, flags.offPeak, 'off-peak');
760
+ assertUnsupported(model, flags.watermark, 'watermark');
761
+ assertUnsupported(model, flags.watermarkPosition, 'watermark-position');
762
+ assertUnsupported(model, flags.watermarkUrl, 'watermark-url');
763
+ assertUnsupported(model, flags.metaData, 'meta-data');
764
+ assertUnsupported(model, flags.enhancePrompt, 'enhance-prompt');
765
+ assertUnsupported(model, flags.style, 'style');
766
+ assertUnsupported(model, flags.language, 'language');
767
+ assertUnsupported(model, flags.creative, 'creative');
768
+ assertUnsupported(model, flags.addSubtitle, 'add-subtitle');
769
+ assertUnsupported(model, flags.removeAudio, 'remove-audio');
770
+ assertUnsupported(model, flags.characterReferenceUrl, 'character-reference-url');
771
+ assertUnsupported(model, flags.styleReferenceUrl, 'style-reference-url');
772
+ assertUnsupported(model, flags.characterReferenceWeight, 'character-reference-weight');
773
+ assertUnsupported(model, flags.styleReferenceWeight, 'style-reference-weight');
774
+ assertUnsupported(model, flags.videoUrl, 'video-url');
775
+ assertUnsupported(model, flags.audioUrl, 'audio-url');
776
+ assertUnsupported(model, flags.sounds, 'sounds');
777
+ assertUnsupported(model, flags.recommendPrompt, 'recommend-prompt');
778
+ assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
779
+ const template = parseEnum(model, flags.template, 'template', TEMPLATE_NAMES);
780
+ if (!template) {
781
+ throw new CLIError(`Model "${model}" requires --template.`, ExitCode.USAGE);
782
+ }
783
+ const params = {
784
+ template,
785
+ images: collectImageSet(model, flags, { min: 1, max: 7 }),
786
+ };
787
+ if (prompt.length > 0)
788
+ params['prompt'] = prompt;
789
+ const seed = parseInteger(model, flags.seed, 'seed');
790
+ if (seed !== undefined)
791
+ params['seed'] = seed;
792
+ if (flags.bgm !== undefined)
793
+ params['bgm'] = flags.bgm;
794
+ const templateParams = parseJsonObject(model, flags.templateParams, 'template-params');
795
+ if (templateParams)
796
+ params['extra_params'] = templateParams;
797
+ return buildEnvelope(model, params);
798
+ },
799
+ });
800
+ registerProvider({
801
+ provider: 'vidu',
802
+ category: 'video',
803
+ models: AD_ONE_CLICK_MODELS,
804
+ requiresPrompt() {
805
+ return false;
806
+ },
807
+ buildBody(model, prompt, flags) {
808
+ applyViduCommonUnsupported(model, flags);
809
+ assertUnsupported(model, flags.seed, 'seed');
810
+ assertUnsupported(model, flags.resolution, 'resolution');
811
+ assertUnsupported(model, flags.movementAmplitude, 'movement-amplitude');
812
+ assertUnsupported(model, flags.audio, 'audio');
813
+ assertUnsupported(model, flags.bgm, 'bgm');
814
+ assertUnsupported(model, flags.payload, 'payload');
815
+ assertUnsupported(model, flags.callbackUrl, 'callback-url');
816
+ assertUnsupported(model, flags.offPeak, 'off-peak');
817
+ assertUnsupported(model, flags.watermark, 'watermark');
818
+ assertUnsupported(model, flags.watermarkPosition, 'watermark-position');
819
+ assertUnsupported(model, flags.watermarkUrl, 'watermark-url');
820
+ assertUnsupported(model, flags.metaData, 'meta-data');
821
+ assertUnsupported(model, flags.enhancePrompt, 'enhance-prompt');
822
+ assertUnsupported(model, flags.style, 'style');
823
+ assertUnsupported(model, flags.template, 'template');
824
+ assertUnsupported(model, flags.templateParams, 'template-params');
825
+ assertUnsupported(model, flags.addSubtitle, 'add-subtitle');
826
+ assertUnsupported(model, flags.removeAudio, 'remove-audio');
827
+ assertUnsupported(model, flags.characterReferenceUrl, 'character-reference-url');
828
+ assertUnsupported(model, flags.styleReferenceUrl, 'style-reference-url');
829
+ assertUnsupported(model, flags.characterReferenceWeight, 'character-reference-weight');
830
+ assertUnsupported(model, flags.styleReferenceWeight, 'style-reference-weight');
831
+ assertUnsupported(model, flags.videoUrl, 'video-url');
832
+ assertUnsupported(model, flags.audioUrl, 'audio-url');
833
+ assertUnsupported(model, flags.sounds, 'sounds');
834
+ assertUnsupported(model, flags.recommendPrompt, 'recommend-prompt');
835
+ assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
836
+ const params = {
837
+ images: collectImageSet(model, flags, { min: 1, max: 7 }),
838
+ };
839
+ if (prompt.length > 0)
840
+ params['prompt'] = prompt;
841
+ const duration = parseInteger(model, flags.duration, 'duration', { min: 8, max: 60 });
842
+ if (duration !== undefined)
843
+ params['duration'] = duration;
844
+ const aspectRatio = parseEnum(model, flags.aspectRatio, 'aspect-ratio', AD_ASPECT_RATIOS);
845
+ if (aspectRatio)
846
+ params['aspect_ratio'] = aspectRatio;
847
+ const language = parseEnum(model, flags.language, 'language', AD_LANGUAGES);
848
+ if (language)
849
+ params['language'] = language;
850
+ if (flags.creative !== undefined)
851
+ params['creative'] = flags.creative;
852
+ return buildEnvelope(model, params);
853
+ },
854
+ });
855
+ registerProvider({
856
+ provider: 'vidu',
857
+ category: 'video',
858
+ models: ONE_CLICK_MV_MODELS,
859
+ requiresPrompt() {
860
+ return false;
861
+ },
862
+ buildBody(model, prompt, flags) {
863
+ applyViduCommonUnsupported(model, flags);
864
+ assertUnsupported(model, flags.duration, 'duration');
865
+ assertUnsupported(model, flags.seed, 'seed');
866
+ assertUnsupported(model, flags.movementAmplitude, 'movement-amplitude');
867
+ assertUnsupported(model, flags.audio, 'audio');
868
+ assertUnsupported(model, flags.bgm, 'bgm');
869
+ assertUnsupported(model, flags.payload, 'payload');
870
+ assertUnsupported(model, flags.callbackUrl, 'callback-url');
871
+ assertUnsupported(model, flags.offPeak, 'off-peak');
872
+ assertUnsupported(model, flags.watermark, 'watermark');
873
+ assertUnsupported(model, flags.watermarkPosition, 'watermark-position');
874
+ assertUnsupported(model, flags.watermarkUrl, 'watermark-url');
875
+ assertUnsupported(model, flags.metaData, 'meta-data');
876
+ assertUnsupported(model, flags.enhancePrompt, 'enhance-prompt');
877
+ assertUnsupported(model, flags.style, 'style');
878
+ assertUnsupported(model, flags.template, 'template');
879
+ assertUnsupported(model, flags.templateParams, 'template-params');
880
+ assertUnsupported(model, flags.language, 'language');
881
+ assertUnsupported(model, flags.creative, 'creative');
882
+ assertUnsupported(model, flags.removeAudio, 'remove-audio');
883
+ assertUnsupported(model, flags.characterReferenceUrl, 'character-reference-url');
884
+ assertUnsupported(model, flags.styleReferenceUrl, 'style-reference-url');
885
+ assertUnsupported(model, flags.characterReferenceWeight, 'character-reference-weight');
886
+ assertUnsupported(model, flags.styleReferenceWeight, 'style-reference-weight');
887
+ assertUnsupported(model, flags.videoUrl, 'video-url');
888
+ assertUnsupported(model, flags.sounds, 'sounds');
889
+ assertUnsupported(model, flags.recommendPrompt, 'recommend-prompt');
890
+ assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
891
+ const audioUrl = maybeString(flags.audioUrl);
892
+ if (!audioUrl) {
893
+ throw new CLIError(`Model "${model}" requires --audio-url.`, ExitCode.USAGE);
894
+ }
895
+ const params = {
896
+ images: collectImageSet(model, flags, { min: 1, max: 7 }),
897
+ audio_url: audioUrl,
898
+ };
899
+ if (prompt.length > 0)
900
+ params['prompt'] = prompt;
901
+ const aspectRatio = parseEnum(model, flags.aspectRatio, 'aspect-ratio', ONE_CLICK_ASPECT_RATIOS);
902
+ if (aspectRatio)
903
+ params['aspect_ratio'] = aspectRatio;
904
+ const resolution = parseEnum(model, flags.resolution, 'resolution', ONE_CLICK_RESOLUTIONS);
905
+ if (resolution)
906
+ params['resolution'] = resolution;
907
+ if (flags.addSubtitle !== undefined)
908
+ params['add_subtitle'] = flags.addSubtitle;
909
+ return buildEnvelope(model, params);
910
+ },
911
+ });
912
+ registerProvider({
913
+ provider: 'vidu',
914
+ category: 'video',
915
+ models: TRENDING_REPLICATE_MODELS,
916
+ requiresPrompt() {
917
+ return false;
918
+ },
919
+ buildBody(model, prompt, flags) {
920
+ applyViduCommonUnsupported(model, flags);
921
+ assertUnsupported(model, flags.duration, 'duration');
922
+ assertUnsupported(model, flags.seed, 'seed');
923
+ assertUnsupported(model, flags.movementAmplitude, 'movement-amplitude');
924
+ assertUnsupported(model, flags.audio, 'audio');
925
+ assertUnsupported(model, flags.bgm, 'bgm');
926
+ assertUnsupported(model, flags.payload, 'payload');
927
+ assertUnsupported(model, flags.callbackUrl, 'callback-url');
928
+ assertUnsupported(model, flags.offPeak, 'off-peak');
929
+ assertUnsupported(model, flags.watermark, 'watermark');
930
+ assertUnsupported(model, flags.watermarkPosition, 'watermark-position');
931
+ assertUnsupported(model, flags.watermarkUrl, 'watermark-url');
932
+ assertUnsupported(model, flags.metaData, 'meta-data');
933
+ assertUnsupported(model, flags.enhancePrompt, 'enhance-prompt');
934
+ assertUnsupported(model, flags.style, 'style');
935
+ assertUnsupported(model, flags.template, 'template');
936
+ assertUnsupported(model, flags.templateParams, 'template-params');
937
+ assertUnsupported(model, flags.language, 'language');
938
+ assertUnsupported(model, flags.creative, 'creative');
939
+ assertUnsupported(model, flags.addSubtitle, 'add-subtitle');
940
+ assertUnsupported(model, flags.characterReferenceUrl, 'character-reference-url');
941
+ assertUnsupported(model, flags.styleReferenceUrl, 'style-reference-url');
942
+ assertUnsupported(model, flags.characterReferenceWeight, 'character-reference-weight');
943
+ assertUnsupported(model, flags.styleReferenceWeight, 'style-reference-weight');
944
+ assertUnsupported(model, flags.audioUrl, 'audio-url');
945
+ assertUnsupported(model, flags.sounds, 'sounds');
946
+ assertUnsupported(model, flags.recommendPrompt, 'recommend-prompt');
947
+ assertUnsupported(model, flags.imageTailUrl, 'image-tail-url');
948
+ const params = {
949
+ video_url: requireVideoUrl(model, flags),
950
+ images: collectImageSet(model, flags, { min: 1, max: 7 }),
951
+ };
952
+ if (prompt.length > 0)
953
+ params['prompt'] = prompt;
954
+ const aspectRatio = parseEnum(model, flags.aspectRatio, 'aspect-ratio', ONE_CLICK_ASPECT_RATIOS);
955
+ if (aspectRatio)
956
+ params['aspect_ratio'] = aspectRatio;
957
+ const resolution = parseEnum(model, flags.resolution, 'resolution', ONE_CLICK_RESOLUTIONS);
958
+ if (resolution)
959
+ params['resolution'] = resolution;
960
+ if (flags.removeAudio !== undefined)
961
+ params['remove_audio'] = flags.removeAudio;
962
+ return buildEnvelope(model, params);
963
+ },
964
+ });
965
+ //# sourceMappingURL=vidu.js.map