@ai-sdk/minimax 2.0.10 → 2.0.12

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @ai-sdk/minimax
2
2
 
3
+ ## 2.0.12
4
+
5
+ ### Patch Changes
6
+
7
+ - 658d7d9: Add model-aware MiniMax 480P and 768P video resolutions, duration limits, and reference-input validation.
8
+ - 658d7d9: Map MiniMax 480P and 768P frame sizes onto their named video resolution tiers, so a typed top-level `resolution` can reach them.
9
+ - Updated dependencies [cc23556]
10
+ - @ai-sdk/provider-utils@4.0.50
11
+ - @ai-sdk/anthropic@3.0.115
12
+
13
+ ## 2.0.11
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies [9a521b9]
18
+ - @ai-sdk/provider-utils@4.0.49
19
+ - @ai-sdk/anthropic@3.0.114
20
+
3
21
  ## 2.0.10
4
22
 
5
23
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -13,7 +13,7 @@ declare const minimaxLanguageModelOptions: z.ZodObject<{
13
13
  }, z.core.$strip>;
14
14
  type MiniMaxLanguageModelOptions = z.infer<typeof minimaxLanguageModelOptions>;
15
15
 
16
- type MiniMaxVideoModelId = 'MiniMax-H3' | (string & {});
16
+ type MiniMaxVideoModelId = 'MiniMax-H3' | 'MiniMax-H3-Max' | (string & {});
17
17
 
18
18
  interface MiniMaxProviderSettings {
19
19
  /**
@@ -75,6 +75,8 @@ declare const minimax: MiniMaxProvider;
75
75
  */
76
76
  declare const minimaxVideoProviderOptions: z.ZodObject<{
77
77
  resolution: z.ZodOptional<z.ZodEnum<{
78
+ "480P": "480P";
79
+ "768P": "768P";
78
80
  "2K": "2K";
79
81
  }>>;
80
82
  ratio: z.ZodOptional<z.ZodEnum<{
package/dist/index.js CHANGED
@@ -39,7 +39,7 @@ var minimaxVideoRatios = [
39
39
  "3:4",
40
40
  "9:16"
41
41
  ];
42
- var minimaxVideoResolutions = ["2K"];
42
+ var minimaxVideoResolutions = ["480P", "768P", "2K"];
43
43
  var minimaxVideoProviderOptions = z.object({
44
44
  /**
45
45
  * Output resolution.
@@ -74,21 +74,37 @@ var minimaxVideoModelOptionsSchema = lazySchema(
74
74
  var DEFAULT_RESOLUTION = "2K";
75
75
  var DEFAULT_POLL_INTERVAL_MS = 1e4;
76
76
  var DEFAULT_POLL_TIMEOUT_MS = 6e5;
77
- var MIN_DURATION_SECONDS = 5;
77
+ var DEFAULT_DURATION_SECONDS = 5;
78
78
  var MAX_DURATION_SECONDS = 15;
79
79
  var MAX_REFERENCE_IMAGES = 9;
80
80
  var MAX_REFERENCE_VIDEOS = 3;
81
81
  var MAX_REFERENCE_AUDIOS = 3;
82
82
  var allowedRatios = new Set(minimaxVideoRatios);
83
83
  var allowedResolutions = new Set(minimaxVideoResolutions);
84
+ var modelResolutionSettings = {
85
+ "MiniMax-H3": { supported: ["768P", "2K"], default: DEFAULT_RESOLUTION },
86
+ "MiniMax-H3-Max": { supported: ["480P", "768P"], default: "768P" }
87
+ };
84
88
  var RESOLUTION_MAP = {
85
- // Square
89
+ // 480P — square, landscape, portrait
90
+ "480x480": "480P",
91
+ "1120x480": "480P",
92
+ "854x480": "480P",
93
+ "640x480": "480P",
94
+ "480x854": "480P",
95
+ "480x640": "480P",
96
+ // 768P — square, landscape, portrait
97
+ "768x768": "768P",
98
+ "1792x768": "768P",
99
+ "1366x768": "768P",
100
+ "1024x768": "768P",
101
+ "768x1366": "768P",
102
+ "768x1024": "768P",
103
+ // 2K — square, landscape, portrait
86
104
  "2048x2048": "2K",
87
- // Landscape
88
105
  "2560x1080": "2K",
89
106
  "2560x1440": "2K",
90
107
  "2048x1536": "2K",
91
- // Portrait
92
108
  "1440x2560": "2K",
93
109
  "1536x2048": "2K"
94
110
  };
@@ -118,7 +134,7 @@ var MiniMaxVideoModel = class {
118
134
  return this.config.provider;
119
135
  }
120
136
  async doGenerate(options) {
121
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
137
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
122
138
  const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
123
139
  const warnings = [];
124
140
  const minimaxOptions = await parseProviderOptions({
@@ -130,31 +146,43 @@ var MiniMaxVideoModel = class {
130
146
  warnings.push({
131
147
  type: "unsupported",
132
148
  feature: "fps",
133
- details: "MiniMax-H3 does not support a custom frame rate."
149
+ details: `${this.modelId} does not support a custom frame rate.`
134
150
  });
135
151
  }
136
152
  if (options.seed != null) {
137
153
  warnings.push({
138
154
  type: "unsupported",
139
155
  feature: "seed",
140
- details: "MiniMax-H3 does not support a seed."
156
+ details: `${this.modelId} does not support a seed.`
141
157
  });
142
158
  }
143
159
  if (options.n != null && options.n > 1) {
144
160
  warnings.push({
145
161
  type: "unsupported",
146
162
  feature: "n",
147
- details: "MiniMax-H3 generates a single video per call. Only 1 video will be generated."
163
+ details: `${this.modelId} generates a single video per call. Only 1 video will be generated.`
148
164
  });
149
165
  }
150
166
  if (options.generateAudio != null) {
151
167
  warnings.push({
152
168
  type: "unsupported",
153
169
  feature: "generateAudio",
154
- details: "The MiniMax-H3 API does not expose an audio parameter. The generateAudio option was ignored."
170
+ details: `The ${this.modelId} API does not expose an audio parameter. The generateAudio option was ignored.`
155
171
  });
156
172
  }
173
+ const resolutionSettings = modelResolutionSettings[this.modelId];
174
+ const supportedResolutions = (_d = resolutionSettings == null ? void 0 : resolutionSettings.supported) != null ? _d : minimaxVideoResolutions;
175
+ const supportedResolutionSet = new Set(supportedResolutions);
176
+ const supportedResolutionNames = supportedResolutions.map((resolution2) => `"${resolution2}"`).join(" or ");
157
177
  let resolution = minimaxOptions == null ? void 0 : minimaxOptions.resolution;
178
+ if (resolution != null && !supportedResolutionSet.has(resolution)) {
179
+ warnings.push({
180
+ type: "unsupported",
181
+ feature: "resolution",
182
+ details: `${this.modelId} supports ${supportedResolutionNames}. The provider resolution "${resolution}" was ignored.`
183
+ });
184
+ resolution = void 0;
185
+ }
158
186
  if (options.resolution != null) {
159
187
  const mapped = resolveTopLevelResolution(options.resolution);
160
188
  if (resolution != null) {
@@ -162,38 +190,44 @@ var MiniMaxVideoModel = class {
162
190
  warnings.push({
163
191
  type: "unsupported",
164
192
  feature: "resolution",
165
- details: `Unrecognized resolution "${options.resolution}". MiniMax-H3 only supports "2K", so providerOptions.minimax.resolution ("${resolution}") was used instead.`
193
+ details: `Unrecognized resolution "${options.resolution}". ${this.modelId} supports ${supportedResolutionNames}, so providerOptions.minimax.resolution ("${resolution}") was used instead.`
194
+ });
195
+ } else if (mapped !== resolution) {
196
+ warnings.push({
197
+ type: "unsupported",
198
+ feature: "resolution",
199
+ details: `The resolution "${options.resolution}" selects ${mapped}, but providerOptions.minimax.resolution ("${resolution}") was used instead.`
166
200
  });
167
201
  }
168
- } else if (mapped != null) {
202
+ } else if (mapped != null && supportedResolutionSet.has(mapped)) {
169
203
  resolution = mapped;
170
204
  } else {
171
205
  warnings.push({
172
206
  type: "unsupported",
173
207
  feature: "resolution",
174
- details: `Unrecognized resolution "${options.resolution}". MiniMax-H3 only supports "2K".`
208
+ details: mapped == null ? `Unrecognized resolution "${options.resolution}". ${this.modelId} supports ${supportedResolutionNames}.` : `${this.modelId} does not support the resolution "${mapped}". It supports ${supportedResolutionNames}.`
175
209
  });
176
210
  }
177
211
  }
178
- resolution != null ? resolution : resolution = DEFAULT_RESOLUTION;
212
+ resolution != null ? resolution : resolution = (_e = resolutionSettings == null ? void 0 : resolutionSettings.default) != null ? _e : DEFAULT_RESOLUTION;
179
213
  const content = [
180
- { type: "text", text: (_d = options.prompt) != null ? _d : "" }
214
+ { type: "text", text: (_f = options.prompt) != null ? _f : "" }
181
215
  ];
182
216
  let sentImageCount = 0;
183
217
  const sentReferenceVideoUrls = [];
184
- const firstFrameImage = (_f = (_e = options.frameImages) == null ? void 0 : _e.find(
218
+ const firstFrameImage = (_h = (_g = options.frameImages) == null ? void 0 : _g.find(
185
219
  (frame) => frame.frameType === "first_frame"
186
- )) == null ? void 0 : _f.image;
220
+ )) == null ? void 0 : _h.image;
187
221
  let firstFrame = firstFrameImage != null ? firstFrameImage : options.image;
188
- let lastFrame = (_h = (_g = options.frameImages) == null ? void 0 : _g.find(
222
+ let lastFrame = (_j = (_i = options.frameImages) == null ? void 0 : _i.find(
189
223
  (frame) => frame.frameType === "last_frame"
190
- )) == null ? void 0 : _h.image;
224
+ )) == null ? void 0 : _j.image;
191
225
  const firstFrameMediaType = firstFrame != null ? nonImageFrameMediaType(firstFrame) : void 0;
192
226
  if (firstFrame != null && firstFrameMediaType != null) {
193
227
  warnings.push({
194
228
  type: "unsupported",
195
229
  feature: firstFrameImage != null ? "frameImages" : "image",
196
- details: firstFrameMediaType === "video" ? "MiniMax-H3 does not accept a video as a frame image. The video was ignored." : `MiniMax-H3 only accepts an image as a frame image; the "${firstFrame.mediaType}" file was ignored.`
230
+ details: firstFrameMediaType === "video" ? `${this.modelId} does not accept a video as a frame image. The video was ignored.` : `${this.modelId} only accepts an image as a frame image; the "${firstFrame.mediaType}" file was ignored.`
197
231
  });
198
232
  firstFrame = void 0;
199
233
  }
@@ -202,7 +236,7 @@ var MiniMaxVideoModel = class {
202
236
  warnings.push({
203
237
  type: "unsupported",
204
238
  feature: "frameImages",
205
- details: "MiniMax-H3 requires a first_frame when a last_frame is provided. The last_frame was ignored."
239
+ details: `${this.modelId} requires a first_frame when a last_frame is provided. The last_frame was ignored.`
206
240
  });
207
241
  lastFrame = void 0;
208
242
  } else {
@@ -211,16 +245,31 @@ var MiniMaxVideoModel = class {
211
245
  warnings.push({
212
246
  type: "unsupported",
213
247
  feature: "frameImages",
214
- details: lastFrameMediaType === "video" ? "MiniMax-H3 does not accept a video as a frame image. The last_frame video was ignored." : `MiniMax-H3 only accepts an image as a frame image; the "${lastFrame.mediaType}" last_frame was ignored.`
248
+ details: lastFrameMediaType === "video" ? `${this.modelId} does not accept a video as a frame image. The last_frame video was ignored.` : `${this.modelId} only accepts an image as a frame image; the "${lastFrame.mediaType}" last_frame was ignored.`
215
249
  });
216
250
  lastFrame = void 0;
217
251
  }
218
252
  }
219
253
  }
220
254
  const usesFrameImages = firstFrame != null || lastFrame != null;
221
- const referenceFiles = (_i = options.inputReferences) != null ? _i : [];
222
- const referenceAudioUrls = (_j = minimaxOptions == null ? void 0 : minimaxOptions.referenceAudioUrls) != null ? _j : [];
223
- const usesReferences = referenceFiles.length > 0 || referenceAudioUrls.length > 0;
255
+ const referenceFiles = (_k = options.inputReferences) != null ? _k : [];
256
+ const referenceAudioUrls = (_l = minimaxOptions == null ? void 0 : minimaxOptions.referenceAudioUrls) != null ? _l : [];
257
+ const supportsReferences = this.modelId !== "MiniMax-H3-Max";
258
+ if (!supportsReferences && referenceFiles.length > 0) {
259
+ warnings.push({
260
+ type: "unsupported",
261
+ feature: "inputReferences",
262
+ details: "MiniMax-H3-Max does not support reference-to-video inputs. The references were ignored."
263
+ });
264
+ }
265
+ if (!supportsReferences && referenceAudioUrls.length > 0) {
266
+ warnings.push({
267
+ type: "unsupported",
268
+ feature: "referenceAudioUrls",
269
+ details: "MiniMax-H3-Max does not support reference audio. The audio was ignored."
270
+ });
271
+ }
272
+ const usesReferences = supportsReferences && (referenceFiles.length > 0 || referenceAudioUrls.length > 0);
224
273
  if (usesFrameImages) {
225
274
  if (firstFrame != null) {
226
275
  content.push({
@@ -335,7 +384,7 @@ var MiniMaxVideoModel = class {
335
384
  warnings.push({
336
385
  type: "unsupported",
337
386
  feature: "aspectRatio",
338
- details: `MiniMax-H3 does not support the aspect ratio "${options.aspectRatio}". Using the provider default (adaptive).`
387
+ details: `${this.modelId} does not support the aspect ratio "${options.aspectRatio}". Using the provider default (adaptive).`
339
388
  });
340
389
  }
341
390
  }
@@ -343,34 +392,35 @@ var MiniMaxVideoModel = class {
343
392
  warnings.push({
344
393
  type: "unsupported",
345
394
  feature: "aspectRatio",
346
- details: "MiniMax-H3 derives the aspect ratio from the frame image; the requested ratio was ignored."
395
+ details: `${this.modelId} derives the aspect ratio from the frame image; the requested ratio was ignored.`
347
396
  });
348
397
  ratio = void 0;
349
398
  }
350
- let duration = (_k = options.duration) != null ? _k : MIN_DURATION_SECONDS;
399
+ const minDurationSeconds = this.modelId === "MiniMax-H3" ? 4 : 5;
400
+ let duration = (_m = options.duration) != null ? _m : DEFAULT_DURATION_SECONDS;
351
401
  if (options.duration != null) {
352
402
  if (!Number.isInteger(duration)) {
353
403
  duration = Math.round(duration);
354
404
  warnings.push({
355
405
  type: "unsupported",
356
406
  feature: "duration",
357
- details: `MiniMax-H3 requires a whole number of seconds. The requested duration of ${options.duration} was rounded to ${duration}.`
407
+ details: `${this.modelId} requires a whole number of seconds. The requested duration of ${options.duration} was rounded to ${duration}.`
358
408
  });
359
409
  }
360
410
  if (duration > MAX_DURATION_SECONDS) {
361
411
  warnings.push({
362
412
  type: "unsupported",
363
413
  feature: "duration",
364
- details: `MiniMax-H3 supports at most ${MAX_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MAX_DURATION_SECONDS}.`
414
+ details: `${this.modelId} supports at most ${MAX_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MAX_DURATION_SECONDS}.`
365
415
  });
366
416
  duration = MAX_DURATION_SECONDS;
367
- } else if (duration < MIN_DURATION_SECONDS) {
417
+ } else if (duration < minDurationSeconds) {
368
418
  warnings.push({
369
419
  type: "unsupported",
370
420
  feature: "duration",
371
- details: `MiniMax-H3 requires at least ${MIN_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MIN_DURATION_SECONDS}.`
421
+ details: `${this.modelId} requires at least ${minDurationSeconds} seconds. The requested duration of ${options.duration} was clamped to ${minDurationSeconds}.`
372
422
  });
373
- duration = MIN_DURATION_SECONDS;
423
+ duration = minDurationSeconds;
374
424
  }
375
425
  }
376
426
  const body = {
@@ -407,8 +457,8 @@ var MiniMaxVideoModel = class {
407
457
  message: `No task_id returned from the MiniMax API. Response: ${JSON.stringify(createResponse)}`
408
458
  });
409
459
  }
410
- const pollIntervalMs = (_l = minimaxOptions == null ? void 0 : minimaxOptions.pollIntervalMs) != null ? _l : DEFAULT_POLL_INTERVAL_MS;
411
- const pollTimeoutMs = (_m = minimaxOptions == null ? void 0 : minimaxOptions.pollTimeoutMs) != null ? _m : DEFAULT_POLL_TIMEOUT_MS;
460
+ const pollIntervalMs = (_n = minimaxOptions == null ? void 0 : minimaxOptions.pollIntervalMs) != null ? _n : DEFAULT_POLL_INTERVAL_MS;
461
+ const pollTimeoutMs = (_o = minimaxOptions == null ? void 0 : minimaxOptions.pollTimeoutMs) != null ? _o : DEFAULT_POLL_TIMEOUT_MS;
412
462
  const startTime = Date.now();
413
463
  let responseHeaders;
414
464
  while (true) {
@@ -436,7 +486,7 @@ var MiniMaxVideoModel = class {
436
486
  const task = statusResponse.task;
437
487
  switch (task.status) {
438
488
  case "succeeded": {
439
- const url = (_n = task.content) == null ? void 0 : _n.url;
489
+ const url = (_p = task.content) == null ? void 0 : _p.url;
440
490
  if (!url) {
441
491
  throw new AISDKError({
442
492
  name: "MINIMAX_VIDEO_GENERATION_ERROR",
@@ -482,7 +532,7 @@ var MiniMaxVideoModel = class {
482
532
  case "failed": {
483
533
  throw new AISDKError({
484
534
  name: "MINIMAX_VIDEO_GENERATION_FAILED",
485
- message: `MiniMax video generation failed${((_o = task.error) == null ? void 0 : _o.message) ? `: ${task.error.message}` : ""}${((_p = task.error) == null ? void 0 : _p.code) != null ? ` (${task.error.code})` : ""}. Task ID: ${taskId}`
535
+ message: `MiniMax video generation failed${((_q = task.error) == null ? void 0 : _q.message) ? `: ${task.error.message}` : ""}${((_r = task.error) == null ? void 0 : _r.code) != null ? ` (${task.error.code})` : ""}. Task ID: ${taskId}`
486
536
  });
487
537
  }
488
538
  case "cancelled": {
@@ -546,7 +596,7 @@ var minimaxVideoFailedResponseHandler = createJsonErrorResponseHandler({
546
596
  });
547
597
 
548
598
  // src/version.ts
549
- var VERSION = true ? "2.0.10" : "0.0.0-test";
599
+ var VERSION = true ? "2.0.12" : "0.0.0-test";
550
600
 
551
601
  // src/minimax-provider.ts
552
602
  var defaultBaseURL = "https://api.minimax.io/anthropic/v1";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/minimax-provider.ts","../src/minimax-video-model.ts","../src/minimax-video-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type Experimental_VideoModelV3,\n type LanguageModelV3,\n type ProviderV3,\n} from '@ai-sdk/provider';\nimport {\n generateId,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { AnthropicMessagesLanguageModel } from '@ai-sdk/anthropic/internal';\nimport type { MiniMaxChatModelId } from './minimax-chat-options';\nimport { MiniMaxVideoModel } from './minimax-video-model';\nimport type { MiniMaxVideoModelId } from './minimax-video-settings';\nimport { VERSION } from './version';\n\nexport interface MiniMaxProviderSettings {\n /**\n * MiniMax API key. Default value is taken from the `MINIMAX_API_KEY`\n * environment variable.\n */\n apiKey?: string;\n /**\n * Base URL for the API calls. Defaults to MiniMax's Anthropic-compatible\n * endpoint (`https://api.minimax.io/anthropic/v1`).\n */\n baseURL?: string;\n /**\n * Use a different URL prefix for video generation API calls.\n * The default prefix is `https://api.minimax.io`.\n */\n videoBaseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface MiniMaxProvider extends ProviderV3 {\n /**\n * Creates a MiniMax model for text generation.\n */\n (modelId: MiniMaxChatModelId): LanguageModelV3;\n\n /**\n * Creates a MiniMax language model for text generation.\n */\n languageModel(modelId: MiniMaxChatModelId): LanguageModelV3;\n\n /**\n * Creates a MiniMax chat model for text generation.\n */\n chat(modelId: MiniMaxChatModelId): LanguageModelV3;\n\n /**\n * Creates a MiniMax video model for video generation.\n */\n video(modelId: MiniMaxVideoModelId): Experimental_VideoModelV3;\n\n /**\n * Creates a MiniMax video model for video generation.\n */\n videoModel(modelId: MiniMaxVideoModelId): Experimental_VideoModelV3;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nconst defaultBaseURL = 'https://api.minimax.io/anthropic/v1';\nconst defaultVideoBaseURL = 'https://api.minimax.io';\n\nexport function createMiniMax(\n options: MiniMaxProviderSettings = {},\n): MiniMaxProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL ?? defaultBaseURL) ?? defaultBaseURL;\n\n const videoBaseURL =\n withoutTrailingSlash(options.videoBaseURL ?? defaultVideoBaseURL) ??\n defaultVideoBaseURL;\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n 'anthropic-version': '2023-06-01',\n 'x-api-key': loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'MINIMAX_API_KEY',\n description: 'MiniMax API key',\n }),\n ...options.headers,\n },\n `ai-sdk/minimax/${VERSION}`,\n );\n\n const createChatModel = (modelId: MiniMaxChatModelId) =>\n new AnthropicMessagesLanguageModel(modelId, {\n provider: 'minimax.messages',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n generateId,\n supportedUrls: () => ({}),\n });\n\n const getVideoHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'MINIMAX_API_KEY',\n description: 'MiniMax API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/minimax/${VERSION}`,\n );\n\n const createVideoModel = (modelId: MiniMaxVideoModelId) =>\n new MiniMaxVideoModel(modelId, {\n provider: 'minimax.video',\n baseURL: videoBaseURL,\n headers: getVideoHeaders,\n fetch: options.fetch,\n });\n\n const provider = (modelId: MiniMaxChatModelId) => createChatModel(modelId);\n\n provider.specificationVersion = 'v3' as const;\n provider.languageModel = createChatModel;\n provider.chat = createChatModel;\n provider.video = createVideoModel;\n provider.videoModel = createVideoModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const minimax = createMiniMax();\n","import {\n AISDKError,\n type Experimental_VideoModelV3,\n type Experimental_VideoModelV3File,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n minimaxVideoModelOptionsSchema,\n minimaxVideoRatios,\n minimaxVideoResolutions,\n type MiniMaxVideoModelOptions,\n} from './minimax-video-model-options';\nimport type { MiniMaxVideoModelId } from './minimax-video-settings';\n\ninterface MiniMaxVideoModelConfig {\n provider: string;\n // API root without a version suffix, e.g. `https://api.minimax.io`.\n baseURL: string;\n headers: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\ntype MiniMaxVideoDoGenerateOptions = Parameters<\n Experimental_VideoModelV3['doGenerate']\n>[0];\n\nconst DEFAULT_RESOLUTION = '2K';\nconst DEFAULT_POLL_INTERVAL_MS = 10_000;\nconst DEFAULT_POLL_TIMEOUT_MS = 600_000;\nconst MIN_DURATION_SECONDS = 5;\nconst MAX_DURATION_SECONDS = 15;\nconst MAX_REFERENCE_IMAGES = 9;\nconst MAX_REFERENCE_VIDEOS = 3;\nconst MAX_REFERENCE_AUDIOS = 3;\n\nconst allowedRatios = new Set<string>(minimaxVideoRatios);\nconst allowedResolutions = new Set<string>(minimaxVideoResolutions);\n\n// The top-level `resolution` is `{width}x{height}`, but the API takes a named\n// tier, so map the canonical 2K frame sizes onto the single tier H3 supports.\n// Anything else can't be honored and warns.\n// One canonical frame size per ratio H3 supports, so a caller who pairs a\n// resolution with any supported ratio resolves to the tier instead of being\n// told 2K is unsupported.\nconst RESOLUTION_MAP: Record<string, string> = {\n // Square\n '2048x2048': '2K',\n // Landscape\n '2560x1080': '2K',\n '2560x1440': '2K',\n '2048x1536': '2K',\n // Portrait\n '1440x2560': '2K',\n '1536x2048': '2K',\n};\n\n// A caller may pass the named tier itself rather than a frame size — `2K` is\n// what the MiniMax API takes, so it is the natural thing to send. Accept it\n// case-insensitively instead of reporting it as unrecognized.\nfunction resolveTopLevelResolution(resolution: string): string | undefined {\n const named = resolution.toUpperCase();\n return allowedResolutions.has(named) ? named : RESOLUTION_MAP[resolution];\n}\n\n// The `type` half of a `type/subtype` media type, e.g. `image` for `image/png`.\nfunction getTopLevelMediaType(mediaType: string): string {\n const slashIndex = mediaType.indexOf('/');\n return slashIndex === -1 ? mediaType : mediaType.substring(0, slashIndex);\n}\n\n// Frame images must be images. Returns the offending top-level media type when\n// a frame is something else, so it can be rejected the way a reference input of\n// the wrong kind is. A frame with no media type is left alone: the core emits\n// URL inputs without one, and unlike a reference there is no routing decision\n// riding on it.\nfunction nonImageFrameMediaType(\n file: Experimental_VideoModelV3File,\n): string | undefined {\n if (file.mediaType == null) {\n return undefined;\n }\n\n const topLevelMediaType = getTopLevelMediaType(file.mediaType);\n return topLevelMediaType === 'image' ? undefined : topLevelMediaType;\n}\n\nexport class MiniMaxVideoModel implements Experimental_VideoModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: MiniMaxVideoModelId,\n private config: MiniMaxVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: MiniMaxVideoDoGenerateOptions,\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\n\n const minimaxOptions = (await parseProviderOptions({\n provider: 'minimax',\n providerOptions: options.providerOptions,\n schema: minimaxVideoModelOptionsSchema,\n })) as MiniMaxVideoModelOptions | undefined;\n\n if (options.fps != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'fps',\n details: 'MiniMax-H3 does not support a custom frame rate.',\n });\n }\n\n if (options.seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details: 'MiniMax-H3 does not support a seed.',\n });\n }\n\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'MiniMax-H3 generates a single video per call. Only 1 video will be generated.',\n });\n }\n\n if (options.generateAudio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'generateAudio',\n details:\n 'The MiniMax-H3 API does not expose an audio parameter. The generateAudio option was ignored.',\n });\n }\n\n // Resolution: the API takes a named tier, so an explicit provider option\n // wins and a top-level value is resolved to a tier.\n let resolution: string | undefined = minimaxOptions?.resolution;\n if (options.resolution != null) {\n const mapped = resolveTopLevelResolution(options.resolution);\n if (resolution != null) {\n // The provider option is already a tier, so the only way the two can\n // disagree is a top-level value that maps to no tier at all.\n if (mapped == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n `Unrecognized resolution \"${options.resolution}\". MiniMax-H3 only supports \"2K\", ` +\n `so providerOptions.minimax.resolution (\"${resolution}\") was used instead.`,\n });\n }\n } else if (mapped != null) {\n resolution = mapped;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n `Unrecognized resolution \"${options.resolution}\". MiniMax-H3 only ` +\n 'supports \"2K\".',\n });\n }\n }\n resolution ??= DEFAULT_RESOLUTION;\n\n // `convertImageModelFileToDataUri` passes `url` files through unchanged and\n // encodes inline data as a data URI. MiniMax `mm_file://…` handles survive\n // that pass-through, but not the core `generateVideo` path: it base64-decodes\n // any string that is not `http(s)://` or `data:`, so `mm_file://` only\n // reaches the API through `providerOptions.minimax.referenceAudioUrls`,\n // which is forwarded raw — not through `image`, `frameImages`, or\n // `inputReferences`.\n const content: Array<Record<string, unknown>> = [\n { type: 'text', text: options.prompt ?? '' },\n ];\n\n // The inputs that actually make it into `content` below, after the caps and\n // rejections H3 imposes. Reported as `providerMetadata.minimax\n // .resolvedInputs`: the warnings say an input was dropped, but not how many\n // survived, which callers that meter usage need. Accumulated at the push\n // sites rather than re-derived, so the two cannot disagree.\n let sentImageCount = 0;\n const sentReferenceVideoUrls: string[] = [];\n\n // Resolve first/last frame inputs. A standalone `image` is treated as the\n // first frame (image-to-video). The core sets `image` to the `first_frame`\n // frame image when there is one, so the frame-image entry is tracked\n // separately to report which input a warning came from.\n const firstFrameImage = options.frameImages?.find(\n frame => frame.frameType === 'first_frame',\n )?.image;\n let firstFrame = firstFrameImage ?? options.image;\n let lastFrame = options.frameImages?.find(\n frame => frame.frameType === 'last_frame',\n )?.image;\n\n // Reject unusable frames before deciding the generation mode.\n const firstFrameMediaType =\n firstFrame != null ? nonImageFrameMediaType(firstFrame) : undefined;\n if (firstFrame != null && firstFrameMediaType != null) {\n warnings.push({\n type: 'unsupported',\n feature: firstFrameImage != null ? 'frameImages' : 'image',\n details:\n firstFrameMediaType === 'video'\n ? 'MiniMax-H3 does not accept a video as a frame image. The video was ignored.'\n : `MiniMax-H3 only accepts an image as a frame image; the \"${firstFrame.mediaType}\" file was ignored.`,\n });\n firstFrame = undefined;\n }\n\n if (lastFrame != null) {\n if (firstFrame == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'MiniMax-H3 requires a first_frame when a last_frame is provided. The last_frame was ignored.',\n });\n lastFrame = undefined;\n } else {\n const lastFrameMediaType = nonImageFrameMediaType(lastFrame);\n if (lastFrameMediaType != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n lastFrameMediaType === 'video'\n ? 'MiniMax-H3 does not accept a video as a frame image. The last_frame video was ignored.'\n : `MiniMax-H3 only accepts an image as a frame image; the \"${lastFrame.mediaType}\" last_frame was ignored.`,\n });\n lastFrame = undefined;\n }\n }\n }\n\n const usesFrameImages = firstFrame != null || lastFrame != null;\n\n const referenceFiles = options.inputReferences ?? [];\n const referenceAudioUrls = minimaxOptions?.referenceAudioUrls ?? [];\n const usesReferences =\n referenceFiles.length > 0 || referenceAudioUrls.length > 0;\n\n if (usesFrameImages) {\n if (firstFrame != null) {\n content.push({\n type: 'image_url',\n image_url: { url: convertImageModelFileToDataUri(firstFrame) },\n role: 'first_frame',\n });\n sentImageCount++;\n }\n\n if (lastFrame != null) {\n content.push({\n type: 'image_url',\n image_url: { url: convertImageModelFileToDataUri(lastFrame) },\n role: 'last_frame',\n });\n sentImageCount++;\n }\n\n // Frame images and reference inputs are mutually exclusive.\n if (usesReferences) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'MiniMax-H3 cannot combine frame images with reference inputs. The references were ignored.',\n });\n }\n } else if (usesReferences) {\n const referenceImages: Experimental_VideoModelV3File[] = [];\n const referenceVideos: Experimental_VideoModelV3File[] = [];\n\n for (const file of referenceFiles) {\n const topLevelMediaType =\n file.mediaType != null\n ? getTopLevelMediaType(file.mediaType)\n : undefined;\n\n if (topLevelMediaType === 'video') {\n referenceVideos.push(file);\n } else if (topLevelMediaType === 'image') {\n referenceImages.push(file);\n } else if (topLevelMediaType == null) {\n // Only URL references can omit a media type.\n // Fall back to an image and warn\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'MiniMax-H3 requires an explicit mediaType to route URL references as ' +\n 'video or image. Pass { data: url, mediaType: \"video/mp4\" } for video ' +\n 'references. The reference was treated as an image.',\n });\n referenceImages.push(file);\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n `MiniMax-H3 only accepts image and video references; the \"${file.mediaType}\" ` +\n 'reference was ignored. Pass reference audio via ' +\n 'providerOptions.minimax.referenceAudioUrls.',\n });\n }\n }\n\n for (const image of referenceImages.slice(0, MAX_REFERENCE_IMAGES)) {\n content.push({\n type: 'image_url',\n image_url: { url: convertImageModelFileToDataUri(image) },\n role: 'reference_image',\n });\n sentImageCount++;\n }\n if (referenceImages.length > MAX_REFERENCE_IMAGES) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details: `MiniMax-H3 accepts at most ${MAX_REFERENCE_IMAGES} reference images. Extra images were ignored.`,\n });\n }\n\n for (const video of referenceVideos.slice(0, MAX_REFERENCE_VIDEOS)) {\n const url = convertImageModelFileToDataUri(video);\n content.push({\n type: 'video_url',\n video_url: { url },\n role: 'reference_video',\n });\n // Inline files become data URIs, which are not worth echoing back.\n if (video.type === 'url') {\n sentReferenceVideoUrls.push(url);\n }\n }\n if (referenceVideos.length > MAX_REFERENCE_VIDEOS) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details: `MiniMax-H3 accepts at most ${MAX_REFERENCE_VIDEOS} reference videos. Extra videos were ignored.`,\n });\n }\n\n // Reference audio must accompany at least one reference image or video.\n if (referenceAudioUrls.length > 0) {\n if (referenceImages.length === 0 && referenceVideos.length === 0) {\n warnings.push({\n type: 'unsupported',\n feature: 'referenceAudioUrls',\n details:\n 'MiniMax-H3 reference audio must be paired with at least one reference image or video. The audio was ignored.',\n });\n } else {\n for (const url of referenceAudioUrls.slice(0, MAX_REFERENCE_AUDIOS)) {\n content.push({\n type: 'audio_url',\n audio_url: { url },\n role: 'reference_audio',\n });\n }\n if (referenceAudioUrls.length > MAX_REFERENCE_AUDIOS) {\n warnings.push({\n type: 'unsupported',\n feature: 'referenceAudioUrls',\n details: `MiniMax-H3 accepts at most ${MAX_REFERENCE_AUDIOS} reference audios. Extra audios were ignored.`,\n });\n }\n }\n }\n }\n\n // Aspect ratio. In frame-image mode the ratio follows the supplied image,\n // so an explicit ratio is ignored.\n let ratio = minimaxOptions?.ratio as string | undefined;\n if (ratio == null && options.aspectRatio != null) {\n if (allowedRatios.has(options.aspectRatio)) {\n ratio = options.aspectRatio;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n `MiniMax-H3 does not support the aspect ratio \"${options.aspectRatio}\". ` +\n 'Using the provider default (adaptive).',\n });\n }\n }\n if (usesFrameImages && ratio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'MiniMax-H3 derives the aspect ratio from the frame image; the requested ratio was ignored.',\n });\n ratio = undefined;\n }\n\n // H3 takes an integer between 5 and 15, so round before clamping: a\n // fractional duration is rejected by the API just as an out-of-range one is.\n let duration = options.duration ?? MIN_DURATION_SECONDS;\n if (options.duration != null) {\n if (!Number.isInteger(duration)) {\n duration = Math.round(duration);\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `MiniMax-H3 requires a whole number of seconds. The requested duration of ${options.duration} was rounded to ${duration}.`,\n });\n }\n\n if (duration > MAX_DURATION_SECONDS) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `MiniMax-H3 supports at most ${MAX_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MAX_DURATION_SECONDS}.`,\n });\n duration = MAX_DURATION_SECONDS;\n } else if (duration < MIN_DURATION_SECONDS) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `MiniMax-H3 requires at least ${MIN_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MIN_DURATION_SECONDS}.`,\n });\n duration = MIN_DURATION_SECONDS;\n }\n }\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n content,\n resolution,\n duration,\n };\n if (ratio != null) {\n body.ratio = ratio;\n }\n if (minimaxOptions?.aigcWatermark != null) {\n body.aigc_watermark = minimaxOptions.aigcWatermark;\n }\n\n const baseURL = this.config.baseURL;\n\n const { value: createResponse } = await postJsonToApi({\n url: `${baseURL}/v2/video_generation`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body,\n failedResponseHandler: minimaxVideoFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n minimaxCreateVideoResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const taskId = createResponse.task_id;\n if (!taskId) {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_ERROR',\n message: `No task_id returned from the MiniMax API. Response: ${JSON.stringify(createResponse)}`,\n });\n }\n\n const pollIntervalMs =\n minimaxOptions?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const pollTimeoutMs =\n minimaxOptions?.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;\n const startTime = Date.now();\n let responseHeaders: Record<string, string> | undefined;\n\n while (true) {\n await delay(pollIntervalMs, { abortSignal: options.abortSignal });\n\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_TIMEOUT',\n message: `MiniMax video generation timed out after ${pollTimeoutMs}ms. Task ID: ${taskId}`,\n });\n }\n\n const { value: statusResponse, responseHeaders: pollHeaders } =\n await getFromApi({\n url: `${baseURL}/v2/query/video_generation/${taskId}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n minimaxVideoStatusResponseSchema,\n ),\n failedResponseHandler: minimaxVideoFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n responseHeaders = pollHeaders;\n const task = statusResponse.task;\n\n switch (task.status) {\n case 'succeeded': {\n const url = task.content?.url;\n if (!url) {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_ERROR',\n message: `MiniMax video generation completed but no video URL was returned. Task ID: ${taskId}`,\n });\n }\n\n return {\n videos: [\n {\n type: 'url' as const,\n url,\n mediaType: 'video/mp4',\n },\n ],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n minimax: {\n taskId,\n videoUrl: url,\n resolvedInputs: {\n imageCount: sentImageCount,\n referenceVideoUrls: sentReferenceVideoUrls,\n },\n ...(task.duration != null ? { duration: task.duration } : {}),\n ...(task.ratio != null ? { ratio: task.ratio } : {}),\n ...(task.resolution != null\n ? { resolution: task.resolution }\n : {}),\n ...(task.usage != null\n ? {\n usage: {\n totalSeconds: task.usage.total_seconds,\n inputSeconds: task.usage.input_seconds,\n outputSeconds: task.usage.output_seconds,\n },\n }\n : {}),\n },\n },\n };\n }\n\n case 'failed': {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_FAILED',\n message: `MiniMax video generation failed${\n task.error?.message ? `: ${task.error.message}` : ''\n }${task.error?.code != null ? ` (${task.error.code})` : ''}. Task ID: ${taskId}`,\n });\n }\n\n case 'cancelled': {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_CANCELLED',\n message: `MiniMax video generation was cancelled. Task ID: ${taskId}`,\n });\n }\n\n case 'expired': {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_EXPIRED',\n message: `MiniMax video generation request expired. Task ID: ${taskId}`,\n });\n }\n\n // 'queued' | 'running' | unknown → keep polling.\n default:\n break;\n }\n }\n }\n}\n\nconst minimaxCreateVideoResponseSchema = z.object({\n task_id: z.string().nullish(),\n});\n\nconst minimaxVideoStatusResponseSchema = z.object({\n task: z.object({\n id: z.string().nullish(),\n status: z.string().nullish(),\n content: z\n .object({\n url: z.string().nullish(),\n })\n .nullish(),\n resolution: z.string().nullish(),\n duration: z.number().nullish(),\n ratio: z.string().nullish(),\n usage: z\n .object({\n total_seconds: z.number().nullish(),\n input_seconds: z.number().nullish(),\n output_seconds: z.number().nullish(),\n })\n .nullish(),\n error: z\n .object({\n code: z.union([z.string(), z.number()]).nullish(),\n message: z.string().nullish(),\n })\n .nullish(),\n }),\n});\n\nconst minimaxVideoErrorSchema = z.object({\n type: z.string().nullish(),\n error: z\n .object({\n type: z.string().nullish(),\n message: z.string().nullish(),\n http_code: z.union([z.string(), z.number()]).nullish(),\n })\n .nullish(),\n request_id: z.string().nullish(),\n});\n\nconst minimaxVideoFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: minimaxVideoErrorSchema,\n errorToMessage: data =>\n data.error?.message ?? 'MiniMax video generation error',\n});\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Aspect ratios supported by the MiniMax-H3 video model.\n */\nexport const minimaxVideoRatios = [\n 'adaptive',\n '21:9',\n '16:9',\n '4:3',\n '1:1',\n '3:4',\n '9:16',\n] as const;\n\n/**\n * Output resolutions supported by the MiniMax-H3 video model.\n */\nexport const minimaxVideoResolutions = ['2K'] as const;\n\n/**\n * Provider options for MiniMax video generation.\n */\nexport const minimaxVideoProviderOptions = z.object({\n /**\n * Output resolution.\n */\n resolution: z.enum(minimaxVideoResolutions).optional(),\n\n /**\n * Aspect ratio of the generated video. Overrides the top-level `aspectRatio`.\n */\n ratio: z.enum(minimaxVideoRatios).optional(),\n\n /**\n * Reference audio URLs for reference-to-video generation.\n */\n referenceAudioUrls: z.array(z.string()).optional(),\n\n /**\n * Whether to embed an AIGC watermark in the output. Defaults to `false`.\n */\n aigcWatermark: z.boolean().optional(),\n\n /**\n * Interval in milliseconds between task status polls. Default: 10000.\n */\n pollIntervalMs: z.number().int().positive().optional(),\n\n /**\n * Maximum time in milliseconds to poll before timing out. Default: 600000.\n */\n pollTimeoutMs: z.number().int().positive().optional(),\n});\n\nexport type MiniMaxVideoModelOptions = z.infer<\n typeof minimaxVideoProviderOptions\n>;\n\nexport const minimaxVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(minimaxVideoProviderOptions),\n);\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":";AAAA;AAAA,EACE;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,sCAAsC;;;ACb/C;AAAA,EACE;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,SAAS,KAAAA,UAAS;;;ACnBlB,SAAS,YAAY,iBAAiB;AACtC,SAAS,SAAS;AAKX,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,IAAM,0BAA0B,CAAC,IAAI;AAKrC,IAAM,8BAA8B,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA,EAIlD,YAAY,EAAE,KAAK,uBAAuB,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKrD,OAAO,EAAE,KAAK,kBAAkB,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK3C,oBAAoB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKjD,eAAe,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKpC,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKrD,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AACtD,CAAC;AAMM,IAAM,iCAAiC;AAAA,EAAW,MACvD,UAAU,2BAA2B;AACvC;;;ADnBA,IAAM,qBAAqB;AAC3B,IAAM,2BAA2B;AACjC,IAAM,0BAA0B;AAChC,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAE7B,IAAM,gBAAgB,IAAI,IAAY,kBAAkB;AACxD,IAAM,qBAAqB,IAAI,IAAY,uBAAuB;AAQlE,IAAM,iBAAyC;AAAA;AAAA,EAE7C,aAAa;AAAA;AAAA,EAEb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAEb,aAAa;AAAA,EACb,aAAa;AACf;AAKA,SAAS,0BAA0B,YAAwC;AACzE,QAAM,QAAQ,WAAW,YAAY;AACrC,SAAO,mBAAmB,IAAI,KAAK,IAAI,QAAQ,eAAe,UAAU;AAC1E;AAGA,SAAS,qBAAqB,WAA2B;AACvD,QAAM,aAAa,UAAU,QAAQ,GAAG;AACxC,SAAO,eAAe,KAAK,YAAY,UAAU,UAAU,GAAG,UAAU;AAC1E;AAOA,SAAS,uBACP,MACoB;AACpB,MAAI,KAAK,aAAa,MAAM;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,qBAAqB,KAAK,SAAS;AAC7D,SAAO,sBAAsB,UAAU,SAAY;AACrD;AAEO,IAAM,oBAAN,MAA6D;AAAA,EAQlE,YACW,SACD,QACR;AAFS;AACD;AATV,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAAA,EASzB;AAAA,EAPH,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAOA,MAAM,WACJ,SACuE;AAtH3E;AAuHI,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,WAA8B,CAAC;AAErC,UAAM,iBAAkB,MAAM,qBAAqB;AAAA,MACjD,UAAU;AAAA,MACV,iBAAiB,QAAQ;AAAA,MACzB,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,QAAQ,OAAO,MAAM;AACvB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,QAAQ,MAAM;AACxB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,KAAK,QAAQ,QAAQ,IAAI,GAAG;AACtC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,iBAAiB,MAAM;AACjC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAIA,QAAI,aAAiC,iDAAgB;AACrD,QAAI,QAAQ,cAAc,MAAM;AAC9B,YAAM,SAAS,0BAA0B,QAAQ,UAAU;AAC3D,UAAI,cAAc,MAAM;AAGtB,YAAI,UAAU,MAAM;AAClB,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SACE,4BAA4B,QAAQ,UAAU,6EACH,UAAU;AAAA,UACzD,CAAC;AAAA,QACH;AAAA,MACF,WAAW,UAAU,MAAM;AACzB,qBAAa;AAAA,MACf,OAAO;AACL,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SACE,4BAA4B,QAAQ,UAAU;AAAA,QAElD,CAAC;AAAA,MACH;AAAA,IACF;AACA,mDAAe;AASf,UAAM,UAA0C;AAAA,MAC9C,EAAE,MAAM,QAAQ,OAAM,aAAQ,WAAR,YAAkB,GAAG;AAAA,IAC7C;AAOA,QAAI,iBAAiB;AACrB,UAAM,yBAAmC,CAAC;AAM1C,UAAM,mBAAkB,mBAAQ,gBAAR,mBAAqB;AAAA,MAC3C,WAAS,MAAM,cAAc;AAAA,UADP,mBAErB;AACH,QAAI,aAAa,4CAAmB,QAAQ;AAC5C,QAAI,aAAY,mBAAQ,gBAAR,mBAAqB;AAAA,MACnC,WAAS,MAAM,cAAc;AAAA,UADf,mBAEb;AAGH,UAAM,sBACJ,cAAc,OAAO,uBAAuB,UAAU,IAAI;AAC5D,QAAI,cAAc,QAAQ,uBAAuB,MAAM;AACrD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,mBAAmB,OAAO,gBAAgB;AAAA,QACnD,SACE,wBAAwB,UACpB,gFACA,2DAA2D,WAAW,SAAS;AAAA,MACvF,CAAC;AACD,mBAAa;AAAA,IACf;AAEA,QAAI,aAAa,MAAM;AACrB,UAAI,cAAc,MAAM;AACtB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SACE;AAAA,QACJ,CAAC;AACD,oBAAY;AAAA,MACd,OAAO;AACL,cAAM,qBAAqB,uBAAuB,SAAS;AAC3D,YAAI,sBAAsB,MAAM;AAC9B,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SACE,uBAAuB,UACnB,2FACA,2DAA2D,UAAU,SAAS;AAAA,UACtF,CAAC;AACD,sBAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,UAAM,kBAAkB,cAAc,QAAQ,aAAa;AAE3D,UAAM,kBAAiB,aAAQ,oBAAR,YAA2B,CAAC;AACnD,UAAM,sBAAqB,sDAAgB,uBAAhB,YAAsC,CAAC;AAClE,UAAM,iBACJ,eAAe,SAAS,KAAK,mBAAmB,SAAS;AAE3D,QAAI,iBAAiB;AACnB,UAAI,cAAc,MAAM;AACtB,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,WAAW,EAAE,KAAK,+BAA+B,UAAU,EAAE;AAAA,UAC7D,MAAM;AAAA,QACR,CAAC;AACD;AAAA,MACF;AAEA,UAAI,aAAa,MAAM;AACrB,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,WAAW,EAAE,KAAK,+BAA+B,SAAS,EAAE;AAAA,UAC5D,MAAM;AAAA,QACR,CAAC;AACD;AAAA,MACF;AAGA,UAAI,gBAAgB;AAClB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SACE;AAAA,QACJ,CAAC;AAAA,MACH;AAAA,IACF,WAAW,gBAAgB;AACzB,YAAM,kBAAmD,CAAC;AAC1D,YAAM,kBAAmD,CAAC;AAE1D,iBAAW,QAAQ,gBAAgB;AACjC,cAAM,oBACJ,KAAK,aAAa,OACd,qBAAqB,KAAK,SAAS,IACnC;AAEN,YAAI,sBAAsB,SAAS;AACjC,0BAAgB,KAAK,IAAI;AAAA,QAC3B,WAAW,sBAAsB,SAAS;AACxC,0BAAgB,KAAK,IAAI;AAAA,QAC3B,WAAW,qBAAqB,MAAM;AAGpC,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SACE;AAAA,UAGJ,CAAC;AACD,0BAAgB,KAAK,IAAI;AAAA,QAC3B,OAAO;AACL,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SACE,4DAA4D,KAAK,SAAS;AAAA,UAG9E,CAAC;AAAA,QACH;AAAA,MACF;AAEA,iBAAW,SAAS,gBAAgB,MAAM,GAAG,oBAAoB,GAAG;AAClE,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,WAAW,EAAE,KAAK,+BAA+B,KAAK,EAAE;AAAA,UACxD,MAAM;AAAA,QACR,CAAC;AACD;AAAA,MACF;AACA,UAAI,gBAAgB,SAAS,sBAAsB;AACjD,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,8BAA8B,oBAAoB;AAAA,QAC7D,CAAC;AAAA,MACH;AAEA,iBAAW,SAAS,gBAAgB,MAAM,GAAG,oBAAoB,GAAG;AAClE,cAAM,MAAM,+BAA+B,KAAK;AAChD,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,WAAW,EAAE,IAAI;AAAA,UACjB,MAAM;AAAA,QACR,CAAC;AAED,YAAI,MAAM,SAAS,OAAO;AACxB,iCAAuB,KAAK,GAAG;AAAA,QACjC;AAAA,MACF;AACA,UAAI,gBAAgB,SAAS,sBAAsB;AACjD,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,8BAA8B,oBAAoB;AAAA,QAC7D,CAAC;AAAA,MACH;AAGA,UAAI,mBAAmB,SAAS,GAAG;AACjC,YAAI,gBAAgB,WAAW,KAAK,gBAAgB,WAAW,GAAG;AAChE,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SACE;AAAA,UACJ,CAAC;AAAA,QACH,OAAO;AACL,qBAAW,OAAO,mBAAmB,MAAM,GAAG,oBAAoB,GAAG;AACnE,oBAAQ,KAAK;AAAA,cACX,MAAM;AAAA,cACN,WAAW,EAAE,IAAI;AAAA,cACjB,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AACA,cAAI,mBAAmB,SAAS,sBAAsB;AACpD,qBAAS,KAAK;AAAA,cACZ,MAAM;AAAA,cACN,SAAS;AAAA,cACT,SAAS,8BAA8B,oBAAoB;AAAA,YAC7D,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAIA,QAAI,QAAQ,iDAAgB;AAC5B,QAAI,SAAS,QAAQ,QAAQ,eAAe,MAAM;AAChD,UAAI,cAAc,IAAI,QAAQ,WAAW,GAAG;AAC1C,gBAAQ,QAAQ;AAAA,MAClB,OAAO;AACL,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SACE,iDAAiD,QAAQ,WAAW;AAAA,QAExE,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,mBAAmB,SAAS,MAAM;AACpC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AACD,cAAQ;AAAA,IACV;AAIA,QAAI,YAAW,aAAQ,aAAR,YAAoB;AACnC,QAAI,QAAQ,YAAY,MAAM;AAC5B,UAAI,CAAC,OAAO,UAAU,QAAQ,GAAG;AAC/B,mBAAW,KAAK,MAAM,QAAQ;AAC9B,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,4EAA4E,QAAQ,QAAQ,mBAAmB,QAAQ;AAAA,QAClI,CAAC;AAAA,MACH;AAEA,UAAI,WAAW,sBAAsB;AACnC,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,+BAA+B,oBAAoB,uCAAuC,QAAQ,QAAQ,mBAAmB,oBAAoB;AAAA,QAC5J,CAAC;AACD,mBAAW;AAAA,MACb,WAAW,WAAW,sBAAsB;AAC1C,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,gCAAgC,oBAAoB,uCAAuC,QAAQ,QAAQ,mBAAmB,oBAAoB;AAAA,QAC7J,CAAC;AACD,mBAAW;AAAA,MACb;AAAA,IACF;AAEA,UAAM,OAAgC;AAAA,MACpC,OAAO,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,SAAS,MAAM;AACjB,WAAK,QAAQ;AAAA,IACf;AACA,SAAI,iDAAgB,kBAAiB,MAAM;AACzC,WAAK,iBAAiB,eAAe;AAAA,IACvC;AAEA,UAAM,UAAU,KAAK,OAAO;AAE5B,UAAM,EAAE,OAAO,eAAe,IAAI,MAAM,cAAc;AAAA,MACpD,KAAK,GAAG,OAAO;AAAA,MACf,SAAS;AAAA,QACP,MAAM,QAAQ,KAAK,OAAO,OAAO;AAAA,QACjC,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA,uBAAuB;AAAA,MACvB,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,SAAS,eAAe;AAC9B,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,uDAAuD,KAAK,UAAU,cAAc,CAAC;AAAA,MAChG,CAAC;AAAA,IACH;AAEA,UAAM,kBACJ,sDAAgB,mBAAhB,YAAkC;AACpC,UAAM,iBACJ,sDAAgB,kBAAhB,YAAiC;AACnC,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AAEJ,WAAO,MAAM;AACX,YAAM,MAAM,gBAAgB,EAAE,aAAa,QAAQ,YAAY,CAAC;AAEhE,UAAI,KAAK,IAAI,IAAI,YAAY,eAAe;AAC1C,cAAM,IAAI,WAAW;AAAA,UACnB,MAAM;AAAA,UACN,SAAS,4CAA4C,aAAa,gBAAgB,MAAM;AAAA,QAC1F,CAAC;AAAA,MACH;AAEA,YAAM,EAAE,OAAO,gBAAgB,iBAAiB,YAAY,IAC1D,MAAM,WAAW;AAAA,QACf,KAAK,GAAG,OAAO,8BAA8B,MAAM;AAAA,QACnD,SAAS;AAAA,UACP,MAAM,QAAQ,KAAK,OAAO,OAAO;AAAA,UACjC,QAAQ;AAAA,QACV;AAAA,QACA,2BAA2B;AAAA,UACzB;AAAA,QACF;AAAA,QACA,uBAAuB;AAAA,QACvB,aAAa,QAAQ;AAAA,QACrB,OAAO,KAAK,OAAO;AAAA,MACrB,CAAC;AAEH,wBAAkB;AAClB,YAAM,OAAO,eAAe;AAE5B,cAAQ,KAAK,QAAQ;AAAA,QACnB,KAAK,aAAa;AAChB,gBAAM,OAAM,UAAK,YAAL,mBAAc;AAC1B,cAAI,CAAC,KAAK;AACR,kBAAM,IAAI,WAAW;AAAA,cACnB,MAAM;AAAA,cACN,SAAS,8EAA8E,MAAM;AAAA,YAC/F,CAAC;AAAA,UACH;AAEA,iBAAO;AAAA,YACL,QAAQ;AAAA,cACN;AAAA,gBACE,MAAM;AAAA,gBACN;AAAA,gBACA,WAAW;AAAA,cACb;AAAA,YACF;AAAA,YACA;AAAA,YACA,UAAU;AAAA,cACR,WAAW;AAAA,cACX,SAAS,KAAK;AAAA,cACd,SAAS;AAAA,YACX;AAAA,YACA,kBAAkB;AAAA,cAChB,SAAS;AAAA,gBACP;AAAA,gBACA,UAAU;AAAA,gBACV,gBAAgB;AAAA,kBACd,YAAY;AAAA,kBACZ,oBAAoB;AAAA,gBACtB;AAAA,gBACA,GAAI,KAAK,YAAY,OAAO,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,gBAC3D,GAAI,KAAK,SAAS,OAAO,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,gBAClD,GAAI,KAAK,cAAc,OACnB,EAAE,YAAY,KAAK,WAAW,IAC9B,CAAC;AAAA,gBACL,GAAI,KAAK,SAAS,OACd;AAAA,kBACE,OAAO;AAAA,oBACL,cAAc,KAAK,MAAM;AAAA,oBACzB,cAAc,KAAK,MAAM;AAAA,oBACzB,eAAe,KAAK,MAAM;AAAA,kBAC5B;AAAA,gBACF,IACA,CAAC;AAAA,cACP;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QAEA,KAAK,UAAU;AACb,gBAAM,IAAI,WAAW;AAAA,YACnB,MAAM;AAAA,YACN,SAAS,oCACP,UAAK,UAAL,mBAAY,WAAU,KAAK,KAAK,MAAM,OAAO,KAAK,EACpD,KAAG,UAAK,UAAL,mBAAY,SAAQ,OAAO,KAAK,KAAK,MAAM,IAAI,MAAM,EAAE,cAAc,MAAM;AAAA,UAChF,CAAC;AAAA,QACH;AAAA,QAEA,KAAK,aAAa;AAChB,gBAAM,IAAI,WAAW;AAAA,YACnB,MAAM;AAAA,YACN,SAAS,oDAAoD,MAAM;AAAA,UACrE,CAAC;AAAA,QACH;AAAA,QAEA,KAAK,WAAW;AACd,gBAAM,IAAI,WAAW;AAAA,YACnB,MAAM;AAAA,YACN,SAAS,sDAAsD,MAAM;AAAA,UACvE,CAAC;AAAA,QACH;AAAA;AAAA,QAGA;AACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,mCAAmCC,GAAE,OAAO;AAAA,EAChD,SAASA,GAAE,OAAO,EAAE,QAAQ;AAC9B,CAAC;AAED,IAAM,mCAAmCA,GAAE,OAAO;AAAA,EAChD,MAAMA,GAAE,OAAO;AAAA,IACb,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,QAAQA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC3B,SAASA,GACN,OAAO;AAAA,MACN,KAAKA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,CAAC,EACA,QAAQ;AAAA,IACX,YAAYA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC/B,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC7B,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,OAAOA,GACJ,OAAO;AAAA,MACN,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAClC,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAClC,gBAAgBA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACrC,CAAC,EACA,QAAQ;AAAA,IACX,OAAOA,GACJ,OAAO;AAAA,MACN,MAAMA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,CAAC,EAAE,QAAQ;AAAA,MAChD,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC9B,CAAC,EACA,QAAQ;AAAA,EACb,CAAC;AACH,CAAC;AAED,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EACvC,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACzB,OAAOA,GACJ,OAAO;AAAA,IACN,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACzB,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,WAAWA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,CAAC,EAAE,QAAQ;AAAA,EACvD,CAAC,EACA,QAAQ;AAAA,EACX,YAAYA,GAAE,OAAO,EAAE,QAAQ;AACjC,CAAC;AAED,IAAM,oCAAoC,+BAA+B;AAAA,EACvE,aAAa;AAAA,EACb,gBAAgB,UAAK;AAlpBvB;AAmpBI,4BAAK,UAAL,mBAAY,YAAZ,YAAuB;AAAA;AAC3B,CAAC;;;AElpBM,IAAM,UACX,OACI,WACA;;;AHyEN,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;AAErB,SAAS,cACd,UAAmC,CAAC,GACnB;AAnFnB;AAoFE,QAAM,WACJ,2BAAqB,aAAQ,YAAR,YAAmB,cAAc,MAAtD,YAA2D;AAE7D,QAAM,gBACJ,2BAAqB,aAAQ,iBAAR,YAAwB,mBAAmB,MAAhE,YACA;AAEF,QAAM,aAAa,MACjB;AAAA,IACE;AAAA,MACE,qBAAqB;AAAA,MACrB,aAAa,WAAW;AAAA,QACtB,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC;AAAA,MACD,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,kBAAkB,OAAO;AAAA,EAC3B;AAEF,QAAM,kBAAkB,CAAC,YACvB,IAAI,+BAA+B,SAAS;AAAA,IAC1C,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,IACf;AAAA,IACA,eAAe,OAAO,CAAC;AAAA,EACzB,CAAC;AAEH,QAAM,kBAAkB,MACtB;AAAA,IACE;AAAA,MACE,eAAe,UAAU,WAAW;AAAA,QAClC,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC,CAAC;AAAA,MACF,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,kBAAkB,OAAO;AAAA,EAC3B;AAEF,QAAM,mBAAmB,CAAC,YACxB,IAAI,kBAAkB,SAAS;AAAA,IAC7B,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,WAAW,CAAC,YAAgC,gBAAgB,OAAO;AAEzE,WAAS,uBAAuB;AAChC,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAChB,WAAS,QAAQ;AACjB,WAAS,aAAa;AAEtB,WAAS,iBAAiB,CAAC,YAAoB;AAC7C,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,iBAAiB,CAAC;AAAA,EACrE;AACA,WAAS,qBAAqB,SAAS;AACvC,WAAS,aAAa,CAAC,YAAoB;AACzC,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;AAEO,IAAM,UAAU,cAAc;","names":["z","z"]}
1
+ {"version":3,"sources":["../src/minimax-provider.ts","../src/minimax-video-model.ts","../src/minimax-video-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type Experimental_VideoModelV3,\n type LanguageModelV3,\n type ProviderV3,\n} from '@ai-sdk/provider';\nimport {\n generateId,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { AnthropicMessagesLanguageModel } from '@ai-sdk/anthropic/internal';\nimport type { MiniMaxChatModelId } from './minimax-chat-options';\nimport { MiniMaxVideoModel } from './minimax-video-model';\nimport type { MiniMaxVideoModelId } from './minimax-video-settings';\nimport { VERSION } from './version';\n\nexport interface MiniMaxProviderSettings {\n /**\n * MiniMax API key. Default value is taken from the `MINIMAX_API_KEY`\n * environment variable.\n */\n apiKey?: string;\n /**\n * Base URL for the API calls. Defaults to MiniMax's Anthropic-compatible\n * endpoint (`https://api.minimax.io/anthropic/v1`).\n */\n baseURL?: string;\n /**\n * Use a different URL prefix for video generation API calls.\n * The default prefix is `https://api.minimax.io`.\n */\n videoBaseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface MiniMaxProvider extends ProviderV3 {\n /**\n * Creates a MiniMax model for text generation.\n */\n (modelId: MiniMaxChatModelId): LanguageModelV3;\n\n /**\n * Creates a MiniMax language model for text generation.\n */\n languageModel(modelId: MiniMaxChatModelId): LanguageModelV3;\n\n /**\n * Creates a MiniMax chat model for text generation.\n */\n chat(modelId: MiniMaxChatModelId): LanguageModelV3;\n\n /**\n * Creates a MiniMax video model for video generation.\n */\n video(modelId: MiniMaxVideoModelId): Experimental_VideoModelV3;\n\n /**\n * Creates a MiniMax video model for video generation.\n */\n videoModel(modelId: MiniMaxVideoModelId): Experimental_VideoModelV3;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nconst defaultBaseURL = 'https://api.minimax.io/anthropic/v1';\nconst defaultVideoBaseURL = 'https://api.minimax.io';\n\nexport function createMiniMax(\n options: MiniMaxProviderSettings = {},\n): MiniMaxProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL ?? defaultBaseURL) ?? defaultBaseURL;\n\n const videoBaseURL =\n withoutTrailingSlash(options.videoBaseURL ?? defaultVideoBaseURL) ??\n defaultVideoBaseURL;\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n 'anthropic-version': '2023-06-01',\n 'x-api-key': loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'MINIMAX_API_KEY',\n description: 'MiniMax API key',\n }),\n ...options.headers,\n },\n `ai-sdk/minimax/${VERSION}`,\n );\n\n const createChatModel = (modelId: MiniMaxChatModelId) =>\n new AnthropicMessagesLanguageModel(modelId, {\n provider: 'minimax.messages',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n generateId,\n supportedUrls: () => ({}),\n });\n\n const getVideoHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'MINIMAX_API_KEY',\n description: 'MiniMax API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/minimax/${VERSION}`,\n );\n\n const createVideoModel = (modelId: MiniMaxVideoModelId) =>\n new MiniMaxVideoModel(modelId, {\n provider: 'minimax.video',\n baseURL: videoBaseURL,\n headers: getVideoHeaders,\n fetch: options.fetch,\n });\n\n const provider = (modelId: MiniMaxChatModelId) => createChatModel(modelId);\n\n provider.specificationVersion = 'v3' as const;\n provider.languageModel = createChatModel;\n provider.chat = createChatModel;\n provider.video = createVideoModel;\n provider.videoModel = createVideoModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const minimax = createMiniMax();\n","import {\n AISDKError,\n type Experimental_VideoModelV3,\n type Experimental_VideoModelV3File,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n minimaxVideoModelOptionsSchema,\n minimaxVideoRatios,\n minimaxVideoResolutions,\n type MiniMaxVideoModelOptions,\n} from './minimax-video-model-options';\nimport type { MiniMaxVideoModelId } from './minimax-video-settings';\n\ninterface MiniMaxVideoModelConfig {\n provider: string;\n // API root without a version suffix, e.g. `https://api.minimax.io`.\n baseURL: string;\n headers: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\ntype MiniMaxVideoDoGenerateOptions = Parameters<\n Experimental_VideoModelV3['doGenerate']\n>[0];\n\nconst DEFAULT_RESOLUTION = '2K';\nconst DEFAULT_POLL_INTERVAL_MS = 10_000;\nconst DEFAULT_POLL_TIMEOUT_MS = 600_000;\nconst DEFAULT_DURATION_SECONDS = 5;\nconst MAX_DURATION_SECONDS = 15;\nconst MAX_REFERENCE_IMAGES = 9;\nconst MAX_REFERENCE_VIDEOS = 3;\nconst MAX_REFERENCE_AUDIOS = 3;\n\nconst allowedRatios = new Set<string>(minimaxVideoRatios);\nconst allowedResolutions = new Set<string>(minimaxVideoResolutions);\nconst modelResolutionSettings: Record<\n string,\n { supported: readonly string[]; default: string }\n> = {\n 'MiniMax-H3': { supported: ['768P', '2K'], default: DEFAULT_RESOLUTION },\n 'MiniMax-H3-Max': { supported: ['480P', '768P'], default: '768P' },\n};\n\n// The top-level `resolution` is `{width}x{height}`, but the API takes a named\n// tier, so map canonical frame sizes onto the tiers. One frame size per ratio\n// per tier, so a caller who pairs a resolution with any supported ratio\n// resolves to the tier instead of being told the resolution is unsupported.\n// MiniMax does not publish tier dimensions, so this is a closed table rather\n// than a rule: 480P and 768P rows are named for the shorter side, the 2K rows\n// for the longer one. A frame size not listed here warns.\nconst RESOLUTION_MAP: Record<string, string> = {\n // 480P — square, landscape, portrait\n '480x480': '480P',\n '1120x480': '480P',\n '854x480': '480P',\n '640x480': '480P',\n '480x854': '480P',\n '480x640': '480P',\n // 768P — square, landscape, portrait\n '768x768': '768P',\n '1792x768': '768P',\n '1366x768': '768P',\n '1024x768': '768P',\n '768x1366': '768P',\n '768x1024': '768P',\n // 2K — square, landscape, portrait\n '2048x2048': '2K',\n '2560x1080': '2K',\n '2560x1440': '2K',\n '2048x1536': '2K',\n '1440x2560': '2K',\n '1536x2048': '2K',\n};\n\n// A caller may pass a named tier itself rather than a frame size. Normalize it\n// case-insensitively to the exact casing expected by the MiniMax API.\nfunction resolveTopLevelResolution(resolution: string): string | undefined {\n const named = resolution.toUpperCase();\n return allowedResolutions.has(named) ? named : RESOLUTION_MAP[resolution];\n}\n\n// The `type` half of a `type/subtype` media type, e.g. `image` for `image/png`.\nfunction getTopLevelMediaType(mediaType: string): string {\n const slashIndex = mediaType.indexOf('/');\n return slashIndex === -1 ? mediaType : mediaType.substring(0, slashIndex);\n}\n\n// Frame images must be images. Returns the offending top-level media type when\n// a frame is something else, so it can be rejected the way a reference input of\n// the wrong kind is. A frame with no media type is left alone: the core emits\n// URL inputs without one, and unlike a reference there is no routing decision\n// riding on it.\nfunction nonImageFrameMediaType(\n file: Experimental_VideoModelV3File,\n): string | undefined {\n if (file.mediaType == null) {\n return undefined;\n }\n\n const topLevelMediaType = getTopLevelMediaType(file.mediaType);\n return topLevelMediaType === 'image' ? undefined : topLevelMediaType;\n}\n\nexport class MiniMaxVideoModel implements Experimental_VideoModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: MiniMaxVideoModelId,\n private config: MiniMaxVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: MiniMaxVideoDoGenerateOptions,\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\n\n const minimaxOptions = (await parseProviderOptions({\n provider: 'minimax',\n providerOptions: options.providerOptions,\n schema: minimaxVideoModelOptionsSchema,\n })) as MiniMaxVideoModelOptions | undefined;\n\n if (options.fps != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'fps',\n details: `${this.modelId} does not support a custom frame rate.`,\n });\n }\n\n if (options.seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details: `${this.modelId} does not support a seed.`,\n });\n }\n\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details: `${this.modelId} generates a single video per call. Only 1 video will be generated.`,\n });\n }\n\n if (options.generateAudio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'generateAudio',\n details: `The ${this.modelId} API does not expose an audio parameter. The generateAudio option was ignored.`,\n });\n }\n\n const resolutionSettings = modelResolutionSettings[this.modelId];\n const supportedResolutions =\n resolutionSettings?.supported ?? minimaxVideoResolutions;\n const supportedResolutionSet = new Set<string>(supportedResolutions);\n const supportedResolutionNames = supportedResolutions\n .map(resolution => `\"${resolution}\"`)\n .join(' or ');\n\n // Resolution: the API takes a named tier, so an explicit provider option\n // wins and a top-level value is resolved to a tier.\n let resolution: string | undefined = minimaxOptions?.resolution;\n if (resolution != null && !supportedResolutionSet.has(resolution)) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details: `${this.modelId} supports ${supportedResolutionNames}. The provider resolution \"${resolution}\" was ignored.`,\n });\n resolution = undefined;\n }\n\n if (options.resolution != null) {\n const mapped = resolveTopLevelResolution(options.resolution);\n if (resolution != null) {\n // The provider option is already a tier and wins, so say so whenever\n // the top-level value is dropped — it either names no tier, or names a\n // different one now that every tier has frame sizes.\n if (mapped == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n `Unrecognized resolution \"${options.resolution}\". ${this.modelId} supports ${supportedResolutionNames}, ` +\n `so providerOptions.minimax.resolution (\"${resolution}\") was used instead.`,\n });\n } else if (mapped !== resolution) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n `The resolution \"${options.resolution}\" selects ${mapped}, but ` +\n `providerOptions.minimax.resolution (\"${resolution}\") was used instead.`,\n });\n }\n } else if (mapped != null && supportedResolutionSet.has(mapped)) {\n resolution = mapped;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n mapped == null\n ? `Unrecognized resolution \"${options.resolution}\". ${this.modelId} supports ${supportedResolutionNames}.`\n : `${this.modelId} does not support the resolution \"${mapped}\". It supports ${supportedResolutionNames}.`,\n });\n }\n }\n resolution ??= resolutionSettings?.default ?? DEFAULT_RESOLUTION;\n\n // `convertImageModelFileToDataUri` passes `url` files through unchanged and\n // encodes inline data as a data URI. MiniMax `mm_file://…` handles survive\n // that pass-through, but not the core `generateVideo` path: it base64-decodes\n // any string that is not `http(s)://` or `data:`, so `mm_file://` only\n // reaches the API through `providerOptions.minimax.referenceAudioUrls`,\n // which is forwarded raw — not through `image`, `frameImages`, or\n // `inputReferences`.\n const content: Array<Record<string, unknown>> = [\n { type: 'text', text: options.prompt ?? '' },\n ];\n\n // The inputs that actually make it into `content` below, after the caps and\n // rejections H3 imposes. Reported as `providerMetadata.minimax\n // .resolvedInputs`: the warnings say an input was dropped, but not how many\n // survived, which callers that meter usage need. Accumulated at the push\n // sites rather than re-derived, so the two cannot disagree.\n let sentImageCount = 0;\n const sentReferenceVideoUrls: string[] = [];\n\n // Resolve first/last frame inputs. A standalone `image` is treated as the\n // first frame (image-to-video). The core sets `image` to the `first_frame`\n // frame image when there is one, so the frame-image entry is tracked\n // separately to report which input a warning came from.\n const firstFrameImage = options.frameImages?.find(\n frame => frame.frameType === 'first_frame',\n )?.image;\n let firstFrame = firstFrameImage ?? options.image;\n let lastFrame = options.frameImages?.find(\n frame => frame.frameType === 'last_frame',\n )?.image;\n\n // Reject unusable frames before deciding the generation mode.\n const firstFrameMediaType =\n firstFrame != null ? nonImageFrameMediaType(firstFrame) : undefined;\n if (firstFrame != null && firstFrameMediaType != null) {\n warnings.push({\n type: 'unsupported',\n feature: firstFrameImage != null ? 'frameImages' : 'image',\n details:\n firstFrameMediaType === 'video'\n ? `${this.modelId} does not accept a video as a frame image. The video was ignored.`\n : `${this.modelId} only accepts an image as a frame image; the \"${firstFrame.mediaType}\" file was ignored.`,\n });\n firstFrame = undefined;\n }\n\n if (lastFrame != null) {\n if (firstFrame == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details: `${this.modelId} requires a first_frame when a last_frame is provided. The last_frame was ignored.`,\n });\n lastFrame = undefined;\n } else {\n const lastFrameMediaType = nonImageFrameMediaType(lastFrame);\n if (lastFrameMediaType != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n lastFrameMediaType === 'video'\n ? `${this.modelId} does not accept a video as a frame image. The last_frame video was ignored.`\n : `${this.modelId} only accepts an image as a frame image; the \"${lastFrame.mediaType}\" last_frame was ignored.`,\n });\n lastFrame = undefined;\n }\n }\n }\n\n const usesFrameImages = firstFrame != null || lastFrame != null;\n\n const referenceFiles = options.inputReferences ?? [];\n const referenceAudioUrls = minimaxOptions?.referenceAudioUrls ?? [];\n const supportsReferences = this.modelId !== 'MiniMax-H3-Max';\n\n if (!supportsReferences && referenceFiles.length > 0) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'MiniMax-H3-Max does not support reference-to-video inputs. The references were ignored.',\n });\n }\n\n if (!supportsReferences && referenceAudioUrls.length > 0) {\n warnings.push({\n type: 'unsupported',\n feature: 'referenceAudioUrls',\n details:\n 'MiniMax-H3-Max does not support reference audio. The audio was ignored.',\n });\n }\n\n const usesReferences =\n supportsReferences &&\n (referenceFiles.length > 0 || referenceAudioUrls.length > 0);\n\n if (usesFrameImages) {\n if (firstFrame != null) {\n content.push({\n type: 'image_url',\n image_url: { url: convertImageModelFileToDataUri(firstFrame) },\n role: 'first_frame',\n });\n sentImageCount++;\n }\n\n if (lastFrame != null) {\n content.push({\n type: 'image_url',\n image_url: { url: convertImageModelFileToDataUri(lastFrame) },\n role: 'last_frame',\n });\n sentImageCount++;\n }\n\n // Frame images and reference inputs are mutually exclusive.\n if (usesReferences) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'MiniMax-H3 cannot combine frame images with reference inputs. The references were ignored.',\n });\n }\n } else if (usesReferences) {\n const referenceImages: Experimental_VideoModelV3File[] = [];\n const referenceVideos: Experimental_VideoModelV3File[] = [];\n\n for (const file of referenceFiles) {\n const topLevelMediaType =\n file.mediaType != null\n ? getTopLevelMediaType(file.mediaType)\n : undefined;\n\n if (topLevelMediaType === 'video') {\n referenceVideos.push(file);\n } else if (topLevelMediaType === 'image') {\n referenceImages.push(file);\n } else if (topLevelMediaType == null) {\n // Only URL references can omit a media type.\n // Fall back to an image and warn\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'MiniMax-H3 requires an explicit mediaType to route URL references as ' +\n 'video or image. Pass { data: url, mediaType: \"video/mp4\" } for video ' +\n 'references. The reference was treated as an image.',\n });\n referenceImages.push(file);\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n `MiniMax-H3 only accepts image and video references; the \"${file.mediaType}\" ` +\n 'reference was ignored. Pass reference audio via ' +\n 'providerOptions.minimax.referenceAudioUrls.',\n });\n }\n }\n\n for (const image of referenceImages.slice(0, MAX_REFERENCE_IMAGES)) {\n content.push({\n type: 'image_url',\n image_url: { url: convertImageModelFileToDataUri(image) },\n role: 'reference_image',\n });\n sentImageCount++;\n }\n if (referenceImages.length > MAX_REFERENCE_IMAGES) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details: `MiniMax-H3 accepts at most ${MAX_REFERENCE_IMAGES} reference images. Extra images were ignored.`,\n });\n }\n\n for (const video of referenceVideos.slice(0, MAX_REFERENCE_VIDEOS)) {\n const url = convertImageModelFileToDataUri(video);\n content.push({\n type: 'video_url',\n video_url: { url },\n role: 'reference_video',\n });\n // Inline files become data URIs, which are not worth echoing back.\n if (video.type === 'url') {\n sentReferenceVideoUrls.push(url);\n }\n }\n if (referenceVideos.length > MAX_REFERENCE_VIDEOS) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details: `MiniMax-H3 accepts at most ${MAX_REFERENCE_VIDEOS} reference videos. Extra videos were ignored.`,\n });\n }\n\n // Reference audio must accompany at least one reference image or video.\n if (referenceAudioUrls.length > 0) {\n if (referenceImages.length === 0 && referenceVideos.length === 0) {\n warnings.push({\n type: 'unsupported',\n feature: 'referenceAudioUrls',\n details:\n 'MiniMax-H3 reference audio must be paired with at least one reference image or video. The audio was ignored.',\n });\n } else {\n for (const url of referenceAudioUrls.slice(0, MAX_REFERENCE_AUDIOS)) {\n content.push({\n type: 'audio_url',\n audio_url: { url },\n role: 'reference_audio',\n });\n }\n if (referenceAudioUrls.length > MAX_REFERENCE_AUDIOS) {\n warnings.push({\n type: 'unsupported',\n feature: 'referenceAudioUrls',\n details: `MiniMax-H3 accepts at most ${MAX_REFERENCE_AUDIOS} reference audios. Extra audios were ignored.`,\n });\n }\n }\n }\n }\n\n // Aspect ratio. In frame-image mode the ratio follows the supplied image,\n // so an explicit ratio is ignored.\n let ratio = minimaxOptions?.ratio as string | undefined;\n if (ratio == null && options.aspectRatio != null) {\n if (allowedRatios.has(options.aspectRatio)) {\n ratio = options.aspectRatio;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n `${this.modelId} does not support the aspect ratio \"${options.aspectRatio}\". ` +\n 'Using the provider default (adaptive).',\n });\n }\n }\n if (usesFrameImages && ratio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details: `${this.modelId} derives the aspect ratio from the frame image; the requested ratio was ignored.`,\n });\n ratio = undefined;\n }\n\n // Both H3 models take an integer duration, but H3 starts at 4 seconds while\n // H3-Max starts at 5. Round before clamping because the API rejects both\n // fractional and out-of-range values.\n const minDurationSeconds = this.modelId === 'MiniMax-H3' ? 4 : 5;\n let duration = options.duration ?? DEFAULT_DURATION_SECONDS;\n if (options.duration != null) {\n if (!Number.isInteger(duration)) {\n duration = Math.round(duration);\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `${this.modelId} requires a whole number of seconds. The requested duration of ${options.duration} was rounded to ${duration}.`,\n });\n }\n\n if (duration > MAX_DURATION_SECONDS) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `${this.modelId} supports at most ${MAX_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MAX_DURATION_SECONDS}.`,\n });\n duration = MAX_DURATION_SECONDS;\n } else if (duration < minDurationSeconds) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `${this.modelId} requires at least ${minDurationSeconds} seconds. The requested duration of ${options.duration} was clamped to ${minDurationSeconds}.`,\n });\n duration = minDurationSeconds;\n }\n }\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n content,\n resolution,\n duration,\n };\n if (ratio != null) {\n body.ratio = ratio;\n }\n if (minimaxOptions?.aigcWatermark != null) {\n body.aigc_watermark = minimaxOptions.aigcWatermark;\n }\n\n const baseURL = this.config.baseURL;\n\n const { value: createResponse } = await postJsonToApi({\n url: `${baseURL}/v2/video_generation`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body,\n failedResponseHandler: minimaxVideoFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n minimaxCreateVideoResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const taskId = createResponse.task_id;\n if (!taskId) {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_ERROR',\n message: `No task_id returned from the MiniMax API. Response: ${JSON.stringify(createResponse)}`,\n });\n }\n\n const pollIntervalMs =\n minimaxOptions?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const pollTimeoutMs =\n minimaxOptions?.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;\n const startTime = Date.now();\n let responseHeaders: Record<string, string> | undefined;\n\n while (true) {\n await delay(pollIntervalMs, { abortSignal: options.abortSignal });\n\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_TIMEOUT',\n message: `MiniMax video generation timed out after ${pollTimeoutMs}ms. Task ID: ${taskId}`,\n });\n }\n\n const { value: statusResponse, responseHeaders: pollHeaders } =\n await getFromApi({\n url: `${baseURL}/v2/query/video_generation/${taskId}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n minimaxVideoStatusResponseSchema,\n ),\n failedResponseHandler: minimaxVideoFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n responseHeaders = pollHeaders;\n const task = statusResponse.task;\n\n switch (task.status) {\n case 'succeeded': {\n const url = task.content?.url;\n if (!url) {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_ERROR',\n message: `MiniMax video generation completed but no video URL was returned. Task ID: ${taskId}`,\n });\n }\n\n return {\n videos: [\n {\n type: 'url' as const,\n url,\n mediaType: 'video/mp4',\n },\n ],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n minimax: {\n taskId,\n videoUrl: url,\n resolvedInputs: {\n imageCount: sentImageCount,\n referenceVideoUrls: sentReferenceVideoUrls,\n },\n ...(task.duration != null ? { duration: task.duration } : {}),\n ...(task.ratio != null ? { ratio: task.ratio } : {}),\n ...(task.resolution != null\n ? { resolution: task.resolution }\n : {}),\n ...(task.usage != null\n ? {\n usage: {\n totalSeconds: task.usage.total_seconds,\n inputSeconds: task.usage.input_seconds,\n outputSeconds: task.usage.output_seconds,\n },\n }\n : {}),\n },\n },\n };\n }\n\n case 'failed': {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_FAILED',\n message: `MiniMax video generation failed${\n task.error?.message ? `: ${task.error.message}` : ''\n }${task.error?.code != null ? ` (${task.error.code})` : ''}. Task ID: ${taskId}`,\n });\n }\n\n case 'cancelled': {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_CANCELLED',\n message: `MiniMax video generation was cancelled. Task ID: ${taskId}`,\n });\n }\n\n case 'expired': {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_EXPIRED',\n message: `MiniMax video generation request expired. Task ID: ${taskId}`,\n });\n }\n\n // 'queued' | 'running' | unknown → keep polling.\n default:\n break;\n }\n }\n }\n}\n\nconst minimaxCreateVideoResponseSchema = z.object({\n task_id: z.string().nullish(),\n});\n\nconst minimaxVideoStatusResponseSchema = z.object({\n task: z.object({\n id: z.string().nullish(),\n status: z.string().nullish(),\n content: z\n .object({\n url: z.string().nullish(),\n })\n .nullish(),\n resolution: z.string().nullish(),\n duration: z.number().nullish(),\n ratio: z.string().nullish(),\n usage: z\n .object({\n total_seconds: z.number().nullish(),\n input_seconds: z.number().nullish(),\n output_seconds: z.number().nullish(),\n })\n .nullish(),\n error: z\n .object({\n code: z.union([z.string(), z.number()]).nullish(),\n message: z.string().nullish(),\n })\n .nullish(),\n }),\n});\n\nconst minimaxVideoErrorSchema = z.object({\n type: z.string().nullish(),\n error: z\n .object({\n type: z.string().nullish(),\n message: z.string().nullish(),\n http_code: z.union([z.string(), z.number()]).nullish(),\n })\n .nullish(),\n request_id: z.string().nullish(),\n});\n\nconst minimaxVideoFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: minimaxVideoErrorSchema,\n errorToMessage: data =>\n data.error?.message ?? 'MiniMax video generation error',\n});\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Aspect ratios supported by the MiniMax video models.\n */\nexport const minimaxVideoRatios = [\n 'adaptive',\n '21:9',\n '16:9',\n '4:3',\n '1:1',\n '3:4',\n '9:16',\n] as const;\n\n/**\n * Output resolutions supported by MiniMax video models. Availability depends\n * on the selected model.\n */\nexport const minimaxVideoResolutions = ['480P', '768P', '2K'] as const;\n\n/**\n * Provider options for MiniMax video generation.\n */\nexport const minimaxVideoProviderOptions = z.object({\n /**\n * Output resolution.\n */\n resolution: z.enum(minimaxVideoResolutions).optional(),\n\n /**\n * Aspect ratio of the generated video. Overrides the top-level `aspectRatio`.\n */\n ratio: z.enum(minimaxVideoRatios).optional(),\n\n /**\n * Reference audio URLs for reference-to-video generation.\n */\n referenceAudioUrls: z.array(z.string()).optional(),\n\n /**\n * Whether to embed an AIGC watermark in the output. Defaults to `false`.\n */\n aigcWatermark: z.boolean().optional(),\n\n /**\n * Interval in milliseconds between task status polls. Default: 10000.\n */\n pollIntervalMs: z.number().int().positive().optional(),\n\n /**\n * Maximum time in milliseconds to poll before timing out. Default: 600000.\n */\n pollTimeoutMs: z.number().int().positive().optional(),\n});\n\nexport type MiniMaxVideoModelOptions = z.infer<\n typeof minimaxVideoProviderOptions\n>;\n\nexport const minimaxVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(minimaxVideoProviderOptions),\n);\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","resolution","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/minimax",
3
- "version": "2.0.10",
3
+ "version": "2.0.12",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
@@ -25,9 +25,9 @@
25
25
  }
26
26
  },
27
27
  "dependencies": {
28
- "@ai-sdk/anthropic": "3.0.113",
28
+ "@ai-sdk/anthropic": "3.0.115",
29
29
  "@ai-sdk/provider": "3.0.15",
30
- "@ai-sdk/provider-utils": "4.0.48"
30
+ "@ai-sdk/provider-utils": "4.0.50"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "22.19.19",
@@ -2,7 +2,7 @@ import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';
2
2
  import { z } from 'zod/v4';
3
3
 
4
4
  /**
5
- * Aspect ratios supported by the MiniMax-H3 video model.
5
+ * Aspect ratios supported by the MiniMax video models.
6
6
  */
7
7
  export const minimaxVideoRatios = [
8
8
  'adaptive',
@@ -15,9 +15,10 @@ export const minimaxVideoRatios = [
15
15
  ] as const;
16
16
 
17
17
  /**
18
- * Output resolutions supported by the MiniMax-H3 video model.
18
+ * Output resolutions supported by MiniMax video models. Availability depends
19
+ * on the selected model.
19
20
  */
20
- export const minimaxVideoResolutions = ['2K'] as const;
21
+ export const minimaxVideoResolutions = ['480P', '768P', '2K'] as const;
21
22
 
22
23
  /**
23
24
  * Provider options for MiniMax video generation.
@@ -44,7 +44,7 @@ type MiniMaxVideoDoGenerateOptions = Parameters<
44
44
  const DEFAULT_RESOLUTION = '2K';
45
45
  const DEFAULT_POLL_INTERVAL_MS = 10_000;
46
46
  const DEFAULT_POLL_TIMEOUT_MS = 600_000;
47
- const MIN_DURATION_SECONDS = 5;
47
+ const DEFAULT_DURATION_SECONDS = 5;
48
48
  const MAX_DURATION_SECONDS = 15;
49
49
  const MAX_REFERENCE_IMAGES = 9;
50
50
  const MAX_REFERENCE_VIDEOS = 3;
@@ -52,28 +52,47 @@ const MAX_REFERENCE_AUDIOS = 3;
52
52
 
53
53
  const allowedRatios = new Set<string>(minimaxVideoRatios);
54
54
  const allowedResolutions = new Set<string>(minimaxVideoResolutions);
55
+ const modelResolutionSettings: Record<
56
+ string,
57
+ { supported: readonly string[]; default: string }
58
+ > = {
59
+ 'MiniMax-H3': { supported: ['768P', '2K'], default: DEFAULT_RESOLUTION },
60
+ 'MiniMax-H3-Max': { supported: ['480P', '768P'], default: '768P' },
61
+ };
55
62
 
56
63
  // The top-level `resolution` is `{width}x{height}`, but the API takes a named
57
- // tier, so map the canonical 2K frame sizes onto the single tier H3 supports.
58
- // Anything else can't be honored and warns.
59
- // One canonical frame size per ratio H3 supports, so a caller who pairs a
60
- // resolution with any supported ratio resolves to the tier instead of being
61
- // told 2K is unsupported.
64
+ // tier, so map canonical frame sizes onto the tiers. One frame size per ratio
65
+ // per tier, so a caller who pairs a resolution with any supported ratio
66
+ // resolves to the tier instead of being told the resolution is unsupported.
67
+ // MiniMax does not publish tier dimensions, so this is a closed table rather
68
+ // than a rule: 480P and 768P rows are named for the shorter side, the 2K rows
69
+ // for the longer one. A frame size not listed here warns.
62
70
  const RESOLUTION_MAP: Record<string, string> = {
63
- // Square
71
+ // 480P — square, landscape, portrait
72
+ '480x480': '480P',
73
+ '1120x480': '480P',
74
+ '854x480': '480P',
75
+ '640x480': '480P',
76
+ '480x854': '480P',
77
+ '480x640': '480P',
78
+ // 768P — square, landscape, portrait
79
+ '768x768': '768P',
80
+ '1792x768': '768P',
81
+ '1366x768': '768P',
82
+ '1024x768': '768P',
83
+ '768x1366': '768P',
84
+ '768x1024': '768P',
85
+ // 2K — square, landscape, portrait
64
86
  '2048x2048': '2K',
65
- // Landscape
66
87
  '2560x1080': '2K',
67
88
  '2560x1440': '2K',
68
89
  '2048x1536': '2K',
69
- // Portrait
70
90
  '1440x2560': '2K',
71
91
  '1536x2048': '2K',
72
92
  };
73
93
 
74
- // A caller may pass the named tier itself rather than a frame size — `2K` is
75
- // what the MiniMax API takes, so it is the natural thing to send. Accept it
76
- // case-insensitively instead of reporting it as unrecognized.
94
+ // A caller may pass a named tier itself rather than a frame size. Normalize it
95
+ // case-insensitively to the exact casing expected by the MiniMax API.
77
96
  function resolveTopLevelResolution(resolution: string): string | undefined {
78
97
  const named = resolution.toUpperCase();
79
98
  return allowedResolutions.has(named) ? named : RESOLUTION_MAP[resolution];
@@ -130,7 +149,7 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV3 {
130
149
  warnings.push({
131
150
  type: 'unsupported',
132
151
  feature: 'fps',
133
- details: 'MiniMax-H3 does not support a custom frame rate.',
152
+ details: `${this.modelId} does not support a custom frame rate.`,
134
153
  });
135
154
  }
136
155
 
@@ -138,7 +157,7 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV3 {
138
157
  warnings.push({
139
158
  type: 'unsupported',
140
159
  feature: 'seed',
141
- details: 'MiniMax-H3 does not support a seed.',
160
+ details: `${this.modelId} does not support a seed.`,
142
161
  });
143
162
  }
144
163
 
@@ -146,8 +165,7 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV3 {
146
165
  warnings.push({
147
166
  type: 'unsupported',
148
167
  feature: 'n',
149
- details:
150
- 'MiniMax-H3 generates a single video per call. Only 1 video will be generated.',
168
+ details: `${this.modelId} generates a single video per call. Only 1 video will be generated.`,
151
169
  });
152
170
  }
153
171
 
@@ -155,41 +173,67 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV3 {
155
173
  warnings.push({
156
174
  type: 'unsupported',
157
175
  feature: 'generateAudio',
158
- details:
159
- 'The MiniMax-H3 API does not expose an audio parameter. The generateAudio option was ignored.',
176
+ details: `The ${this.modelId} API does not expose an audio parameter. The generateAudio option was ignored.`,
160
177
  });
161
178
  }
162
179
 
180
+ const resolutionSettings = modelResolutionSettings[this.modelId];
181
+ const supportedResolutions =
182
+ resolutionSettings?.supported ?? minimaxVideoResolutions;
183
+ const supportedResolutionSet = new Set<string>(supportedResolutions);
184
+ const supportedResolutionNames = supportedResolutions
185
+ .map(resolution => `"${resolution}"`)
186
+ .join(' or ');
187
+
163
188
  // Resolution: the API takes a named tier, so an explicit provider option
164
189
  // wins and a top-level value is resolved to a tier.
165
190
  let resolution: string | undefined = minimaxOptions?.resolution;
191
+ if (resolution != null && !supportedResolutionSet.has(resolution)) {
192
+ warnings.push({
193
+ type: 'unsupported',
194
+ feature: 'resolution',
195
+ details: `${this.modelId} supports ${supportedResolutionNames}. The provider resolution "${resolution}" was ignored.`,
196
+ });
197
+ resolution = undefined;
198
+ }
199
+
166
200
  if (options.resolution != null) {
167
201
  const mapped = resolveTopLevelResolution(options.resolution);
168
202
  if (resolution != null) {
169
- // The provider option is already a tier, so the only way the two can
170
- // disagree is a top-level value that maps to no tier at all.
203
+ // The provider option is already a tier and wins, so say so whenever
204
+ // the top-level value is dropped — it either names no tier, or names a
205
+ // different one now that every tier has frame sizes.
171
206
  if (mapped == null) {
172
207
  warnings.push({
173
208
  type: 'unsupported',
174
209
  feature: 'resolution',
175
210
  details:
176
- `Unrecognized resolution "${options.resolution}". MiniMax-H3 only supports "2K", ` +
211
+ `Unrecognized resolution "${options.resolution}". ${this.modelId} supports ${supportedResolutionNames}, ` +
177
212
  `so providerOptions.minimax.resolution ("${resolution}") was used instead.`,
178
213
  });
214
+ } else if (mapped !== resolution) {
215
+ warnings.push({
216
+ type: 'unsupported',
217
+ feature: 'resolution',
218
+ details:
219
+ `The resolution "${options.resolution}" selects ${mapped}, but ` +
220
+ `providerOptions.minimax.resolution ("${resolution}") was used instead.`,
221
+ });
179
222
  }
180
- } else if (mapped != null) {
223
+ } else if (mapped != null && supportedResolutionSet.has(mapped)) {
181
224
  resolution = mapped;
182
225
  } else {
183
226
  warnings.push({
184
227
  type: 'unsupported',
185
228
  feature: 'resolution',
186
229
  details:
187
- `Unrecognized resolution "${options.resolution}". MiniMax-H3 only ` +
188
- 'supports "2K".',
230
+ mapped == null
231
+ ? `Unrecognized resolution "${options.resolution}". ${this.modelId} supports ${supportedResolutionNames}.`
232
+ : `${this.modelId} does not support the resolution "${mapped}". It supports ${supportedResolutionNames}.`,
189
233
  });
190
234
  }
191
235
  }
192
- resolution ??= DEFAULT_RESOLUTION;
236
+ resolution ??= resolutionSettings?.default ?? DEFAULT_RESOLUTION;
193
237
 
194
238
  // `convertImageModelFileToDataUri` passes `url` files through unchanged and
195
239
  // encodes inline data as a data URI. MiniMax `mm_file://…` handles survive
@@ -231,8 +275,8 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV3 {
231
275
  feature: firstFrameImage != null ? 'frameImages' : 'image',
232
276
  details:
233
277
  firstFrameMediaType === 'video'
234
- ? 'MiniMax-H3 does not accept a video as a frame image. The video was ignored.'
235
- : `MiniMax-H3 only accepts an image as a frame image; the "${firstFrame.mediaType}" file was ignored.`,
278
+ ? `${this.modelId} does not accept a video as a frame image. The video was ignored.`
279
+ : `${this.modelId} only accepts an image as a frame image; the "${firstFrame.mediaType}" file was ignored.`,
236
280
  });
237
281
  firstFrame = undefined;
238
282
  }
@@ -242,8 +286,7 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV3 {
242
286
  warnings.push({
243
287
  type: 'unsupported',
244
288
  feature: 'frameImages',
245
- details:
246
- 'MiniMax-H3 requires a first_frame when a last_frame is provided. The last_frame was ignored.',
289
+ details: `${this.modelId} requires a first_frame when a last_frame is provided. The last_frame was ignored.`,
247
290
  });
248
291
  lastFrame = undefined;
249
292
  } else {
@@ -254,8 +297,8 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV3 {
254
297
  feature: 'frameImages',
255
298
  details:
256
299
  lastFrameMediaType === 'video'
257
- ? 'MiniMax-H3 does not accept a video as a frame image. The last_frame video was ignored.'
258
- : `MiniMax-H3 only accepts an image as a frame image; the "${lastFrame.mediaType}" last_frame was ignored.`,
300
+ ? `${this.modelId} does not accept a video as a frame image. The last_frame video was ignored.`
301
+ : `${this.modelId} only accepts an image as a frame image; the "${lastFrame.mediaType}" last_frame was ignored.`,
259
302
  });
260
303
  lastFrame = undefined;
261
304
  }
@@ -266,8 +309,29 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV3 {
266
309
 
267
310
  const referenceFiles = options.inputReferences ?? [];
268
311
  const referenceAudioUrls = minimaxOptions?.referenceAudioUrls ?? [];
312
+ const supportsReferences = this.modelId !== 'MiniMax-H3-Max';
313
+
314
+ if (!supportsReferences && referenceFiles.length > 0) {
315
+ warnings.push({
316
+ type: 'unsupported',
317
+ feature: 'inputReferences',
318
+ details:
319
+ 'MiniMax-H3-Max does not support reference-to-video inputs. The references were ignored.',
320
+ });
321
+ }
322
+
323
+ if (!supportsReferences && referenceAudioUrls.length > 0) {
324
+ warnings.push({
325
+ type: 'unsupported',
326
+ feature: 'referenceAudioUrls',
327
+ details:
328
+ 'MiniMax-H3-Max does not support reference audio. The audio was ignored.',
329
+ });
330
+ }
331
+
269
332
  const usesReferences =
270
- referenceFiles.length > 0 || referenceAudioUrls.length > 0;
333
+ supportsReferences &&
334
+ (referenceFiles.length > 0 || referenceAudioUrls.length > 0);
271
335
 
272
336
  if (usesFrameImages) {
273
337
  if (firstFrame != null) {
@@ -410,7 +474,7 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV3 {
410
474
  type: 'unsupported',
411
475
  feature: 'aspectRatio',
412
476
  details:
413
- `MiniMax-H3 does not support the aspect ratio "${options.aspectRatio}". ` +
477
+ `${this.modelId} does not support the aspect ratio "${options.aspectRatio}". ` +
414
478
  'Using the provider default (adaptive).',
415
479
  });
416
480
  }
@@ -419,22 +483,23 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV3 {
419
483
  warnings.push({
420
484
  type: 'unsupported',
421
485
  feature: 'aspectRatio',
422
- details:
423
- 'MiniMax-H3 derives the aspect ratio from the frame image; the requested ratio was ignored.',
486
+ details: `${this.modelId} derives the aspect ratio from the frame image; the requested ratio was ignored.`,
424
487
  });
425
488
  ratio = undefined;
426
489
  }
427
490
 
428
- // H3 takes an integer between 5 and 15, so round before clamping: a
429
- // fractional duration is rejected by the API just as an out-of-range one is.
430
- let duration = options.duration ?? MIN_DURATION_SECONDS;
491
+ // Both H3 models take an integer duration, but H3 starts at 4 seconds while
492
+ // H3-Max starts at 5. Round before clamping because the API rejects both
493
+ // fractional and out-of-range values.
494
+ const minDurationSeconds = this.modelId === 'MiniMax-H3' ? 4 : 5;
495
+ let duration = options.duration ?? DEFAULT_DURATION_SECONDS;
431
496
  if (options.duration != null) {
432
497
  if (!Number.isInteger(duration)) {
433
498
  duration = Math.round(duration);
434
499
  warnings.push({
435
500
  type: 'unsupported',
436
501
  feature: 'duration',
437
- details: `MiniMax-H3 requires a whole number of seconds. The requested duration of ${options.duration} was rounded to ${duration}.`,
502
+ details: `${this.modelId} requires a whole number of seconds. The requested duration of ${options.duration} was rounded to ${duration}.`,
438
503
  });
439
504
  }
440
505
 
@@ -442,16 +507,16 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV3 {
442
507
  warnings.push({
443
508
  type: 'unsupported',
444
509
  feature: 'duration',
445
- details: `MiniMax-H3 supports at most ${MAX_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MAX_DURATION_SECONDS}.`,
510
+ details: `${this.modelId} supports at most ${MAX_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MAX_DURATION_SECONDS}.`,
446
511
  });
447
512
  duration = MAX_DURATION_SECONDS;
448
- } else if (duration < MIN_DURATION_SECONDS) {
513
+ } else if (duration < minDurationSeconds) {
449
514
  warnings.push({
450
515
  type: 'unsupported',
451
516
  feature: 'duration',
452
- details: `MiniMax-H3 requires at least ${MIN_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MIN_DURATION_SECONDS}.`,
517
+ details: `${this.modelId} requires at least ${minDurationSeconds} seconds. The requested duration of ${options.duration} was clamped to ${minDurationSeconds}.`,
453
518
  });
454
- duration = MIN_DURATION_SECONDS;
519
+ duration = minDurationSeconds;
455
520
  }
456
521
  }
457
522
 
@@ -1,2 +1,5 @@
1
1
  // https://platform.minimax.io/docs
2
- export type MiniMaxVideoModelId = 'MiniMax-H3' | (string & {});
2
+ export type MiniMaxVideoModelId =
3
+ | 'MiniMax-H3'
4
+ | 'MiniMax-H3-Max'
5
+ | (string & {});