@ai-sdk/minimax 3.0.26 → 3.0.28
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 +15 -0
- package/dist/index.js +194 -107
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/minimax-video-model.ts +225 -109
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @ai-sdk/minimax
|
|
2
2
|
|
|
3
|
+
## 3.0.28
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [912fb01]
|
|
8
|
+
- @ai-sdk/provider@4.0.12
|
|
9
|
+
- @ai-sdk/anthropic@4.0.51
|
|
10
|
+
- @ai-sdk/provider-utils@5.0.38
|
|
11
|
+
|
|
12
|
+
## 3.0.27
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- 46cea63: Add asynchronous start/status support for MiniMax video generation while preserving existing polling behavior.
|
|
17
|
+
|
|
3
18
|
## 3.0.26
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -131,9 +131,8 @@ var MiniMaxVideoModel = class {
|
|
|
131
131
|
get provider() {
|
|
132
132
|
return this.config.provider;
|
|
133
133
|
}
|
|
134
|
-
async
|
|
135
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j
|
|
136
|
-
const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
|
|
134
|
+
async getArgs(options) {
|
|
135
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
137
136
|
const warnings = [];
|
|
138
137
|
const minimaxOptions = await parseProviderOptions({
|
|
139
138
|
provider: "minimax",
|
|
@@ -169,7 +168,7 @@ var MiniMaxVideoModel = class {
|
|
|
169
168
|
});
|
|
170
169
|
}
|
|
171
170
|
const resolutionSettings = modelResolutionSettings[this.modelId];
|
|
172
|
-
const supportedResolutions = (
|
|
171
|
+
const supportedResolutions = (_a = resolutionSettings == null ? void 0 : resolutionSettings.supported) != null ? _a : minimaxVideoResolutions;
|
|
173
172
|
const supportedResolutionSet = new Set(supportedResolutions);
|
|
174
173
|
const supportedResolutionNames = supportedResolutions.map((resolution2) => `"${resolution2}"`).join(" or ");
|
|
175
174
|
let resolution = minimaxOptions == null ? void 0 : minimaxOptions.resolution;
|
|
@@ -207,19 +206,19 @@ var MiniMaxVideoModel = class {
|
|
|
207
206
|
});
|
|
208
207
|
}
|
|
209
208
|
}
|
|
210
|
-
resolution != null ? resolution : resolution = (
|
|
209
|
+
resolution != null ? resolution : resolution = (_b = resolutionSettings == null ? void 0 : resolutionSettings.default) != null ? _b : DEFAULT_RESOLUTION;
|
|
211
210
|
const content = [
|
|
212
|
-
{ type: "text", text: (
|
|
211
|
+
{ type: "text", text: (_c = options.prompt) != null ? _c : "" }
|
|
213
212
|
];
|
|
214
213
|
let sentImageCount = 0;
|
|
215
|
-
const
|
|
216
|
-
const firstFrameImage = (
|
|
214
|
+
const sentReferenceVideoIndices = [];
|
|
215
|
+
const firstFrameImage = (_e = (_d = options.frameImages) == null ? void 0 : _d.find(
|
|
217
216
|
(frame) => frame.frameType === "first_frame"
|
|
218
|
-
)) == null ? void 0 :
|
|
217
|
+
)) == null ? void 0 : _e.image;
|
|
219
218
|
let firstFrame = firstFrameImage != null ? firstFrameImage : options.image;
|
|
220
|
-
let lastFrame = (
|
|
219
|
+
let lastFrame = (_g = (_f = options.frameImages) == null ? void 0 : _f.find(
|
|
221
220
|
(frame) => frame.frameType === "last_frame"
|
|
222
|
-
)) == null ? void 0 :
|
|
221
|
+
)) == null ? void 0 : _g.image;
|
|
223
222
|
const firstFrameMediaType = firstFrame != null ? nonImageFrameMediaType(firstFrame) : void 0;
|
|
224
223
|
if (firstFrame != null && firstFrameMediaType != null) {
|
|
225
224
|
warnings.push({
|
|
@@ -250,8 +249,8 @@ var MiniMaxVideoModel = class {
|
|
|
250
249
|
}
|
|
251
250
|
}
|
|
252
251
|
const usesFrameImages = firstFrame != null || lastFrame != null;
|
|
253
|
-
const referenceFiles = (
|
|
254
|
-
const referenceAudioUrls = (
|
|
252
|
+
const referenceFiles = (_h = options.inputReferences) != null ? _h : [];
|
|
253
|
+
const referenceAudioUrls = (_i = minimaxOptions == null ? void 0 : minimaxOptions.referenceAudioUrls) != null ? _i : [];
|
|
255
254
|
const supportsReferences = this.modelId !== "MiniMax-H3-Max";
|
|
256
255
|
if (!supportsReferences && referenceFiles.length > 0) {
|
|
257
256
|
warnings.push({
|
|
@@ -295,10 +294,10 @@ var MiniMaxVideoModel = class {
|
|
|
295
294
|
} else if (usesReferences) {
|
|
296
295
|
const referenceImages = [];
|
|
297
296
|
const referenceVideos = [];
|
|
298
|
-
for (const file of referenceFiles) {
|
|
297
|
+
for (const [index, file] of referenceFiles.entries()) {
|
|
299
298
|
const topLevelMediaType = file.mediaType != null ? getTopLevelMediaType(file.mediaType) : void 0;
|
|
300
299
|
if (topLevelMediaType === "video") {
|
|
301
|
-
referenceVideos.push(file);
|
|
300
|
+
referenceVideos.push({ file, index });
|
|
302
301
|
} else if (topLevelMediaType === "image") {
|
|
303
302
|
referenceImages.push(file);
|
|
304
303
|
} else if (topLevelMediaType == null) {
|
|
@@ -331,7 +330,10 @@ var MiniMaxVideoModel = class {
|
|
|
331
330
|
details: `MiniMax-H3 accepts at most ${MAX_REFERENCE_IMAGES} reference images. Extra images were ignored.`
|
|
332
331
|
});
|
|
333
332
|
}
|
|
334
|
-
for (const video of referenceVideos.slice(
|
|
333
|
+
for (const { file: video, index } of referenceVideos.slice(
|
|
334
|
+
0,
|
|
335
|
+
MAX_REFERENCE_VIDEOS
|
|
336
|
+
)) {
|
|
335
337
|
const url = convertImageModelFileToDataUri(video);
|
|
336
338
|
content.push({
|
|
337
339
|
type: "video_url",
|
|
@@ -339,7 +341,7 @@ var MiniMaxVideoModel = class {
|
|
|
339
341
|
role: "reference_video"
|
|
340
342
|
});
|
|
341
343
|
if (video.type === "url") {
|
|
342
|
-
|
|
344
|
+
sentReferenceVideoIndices.push(index);
|
|
343
345
|
}
|
|
344
346
|
}
|
|
345
347
|
if (referenceVideos.length > MAX_REFERENCE_VIDEOS) {
|
|
@@ -410,7 +412,7 @@ var MiniMaxVideoModel = class {
|
|
|
410
412
|
ratio = DEFAULT_ASPECT_RATIO;
|
|
411
413
|
}
|
|
412
414
|
const minDurationSeconds = this.modelId === "MiniMax-H3" ? 4 : 5;
|
|
413
|
-
let duration = (
|
|
415
|
+
let duration = (_j = options.duration) != null ? _j : DEFAULT_DURATION_SECONDS;
|
|
414
416
|
if (options.duration != null) {
|
|
415
417
|
if (!Number.isInteger(duration)) {
|
|
416
418
|
duration = Math.round(duration);
|
|
@@ -448,9 +450,21 @@ var MiniMaxVideoModel = class {
|
|
|
448
450
|
if ((minimaxOptions == null ? void 0 : minimaxOptions.aigcWatermark) != null) {
|
|
449
451
|
body.aigc_watermark = minimaxOptions.aigcWatermark;
|
|
450
452
|
}
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
453
|
+
return {
|
|
454
|
+
body,
|
|
455
|
+
warnings,
|
|
456
|
+
resolvedInputs: {
|
|
457
|
+
imageCount: sentImageCount,
|
|
458
|
+
referenceVideoIndices: sentReferenceVideoIndices
|
|
459
|
+
}
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
async doStart(options) {
|
|
463
|
+
var _a, _b, _c;
|
|
464
|
+
const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
|
|
465
|
+
const { body, warnings, resolvedInputs } = await this.getArgs(options);
|
|
466
|
+
const { value: createResponse, responseHeaders } = await postJsonToApi({
|
|
467
|
+
url: `${this.config.baseURL}/v2/video_generation`,
|
|
454
468
|
headers: combineHeaders(
|
|
455
469
|
await resolve(this.config.headers),
|
|
456
470
|
options.headers
|
|
@@ -470,102 +484,175 @@ var MiniMaxVideoModel = class {
|
|
|
470
484
|
message: `No task_id returned from the MiniMax API. Response: ${JSON.stringify(createResponse)}`
|
|
471
485
|
});
|
|
472
486
|
}
|
|
473
|
-
|
|
474
|
-
|
|
487
|
+
return {
|
|
488
|
+
operation: { taskId, resolvedInputs },
|
|
489
|
+
warnings,
|
|
490
|
+
response: {
|
|
491
|
+
timestamp: currentDate,
|
|
492
|
+
modelId: this.modelId,
|
|
493
|
+
headers: responseHeaders
|
|
494
|
+
}
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
async doStatus(options) {
|
|
498
|
+
const result = await this.getStatus(options);
|
|
499
|
+
return result.status === "error" ? { ...result, error: result.error.message } : result;
|
|
500
|
+
}
|
|
501
|
+
async getStatus(options) {
|
|
502
|
+
var _a, _b, _c, _d, _e, _f;
|
|
503
|
+
const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
|
|
504
|
+
const { taskId, resolvedInputs } = options.operation;
|
|
505
|
+
const baseURL = this.config.baseURL;
|
|
506
|
+
const { value: statusResponse, responseHeaders } = await getFromApi({
|
|
507
|
+
url: `${baseURL}/v2/query/video_generation/${encodeURIComponent(taskId)}`,
|
|
508
|
+
validateUrl: true,
|
|
509
|
+
trustedOrigin: baseURL,
|
|
510
|
+
headers: combineHeaders(
|
|
511
|
+
await resolve(this.config.headers),
|
|
512
|
+
options.headers
|
|
513
|
+
),
|
|
514
|
+
successfulResponseHandler: createJsonResponseHandler(
|
|
515
|
+
minimaxVideoStatusResponseSchema
|
|
516
|
+
),
|
|
517
|
+
failedResponseHandler: minimaxVideoFailedResponseHandler,
|
|
518
|
+
abortSignal: options.abortSignal,
|
|
519
|
+
fetch: this.config.fetch
|
|
520
|
+
});
|
|
521
|
+
const response = {
|
|
522
|
+
timestamp: currentDate,
|
|
523
|
+
modelId: this.modelId,
|
|
524
|
+
headers: responseHeaders
|
|
525
|
+
};
|
|
526
|
+
const task = statusResponse.task;
|
|
527
|
+
switch (task.status) {
|
|
528
|
+
case "succeeded": {
|
|
529
|
+
const url = (_d = task.content) == null ? void 0 : _d.url;
|
|
530
|
+
if (!url) {
|
|
531
|
+
throw new AISDKError({
|
|
532
|
+
name: "MINIMAX_VIDEO_GENERATION_ERROR",
|
|
533
|
+
message: `MiniMax video generation completed but no video URL was returned. Task ID: ${taskId}`
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
return {
|
|
537
|
+
status: "completed",
|
|
538
|
+
videos: [
|
|
539
|
+
{
|
|
540
|
+
type: "url",
|
|
541
|
+
url,
|
|
542
|
+
mediaType: "video/mp4"
|
|
543
|
+
}
|
|
544
|
+
],
|
|
545
|
+
warnings: [],
|
|
546
|
+
response,
|
|
547
|
+
providerMetadata: {
|
|
548
|
+
minimax: {
|
|
549
|
+
taskId,
|
|
550
|
+
videoUrl: url,
|
|
551
|
+
resolvedInputs,
|
|
552
|
+
...task.duration != null ? { duration: task.duration } : {},
|
|
553
|
+
...task.ratio != null ? { ratio: task.ratio } : {},
|
|
554
|
+
...task.resolution != null ? { resolution: task.resolution } : {},
|
|
555
|
+
...task.usage != null ? {
|
|
556
|
+
usage: {
|
|
557
|
+
totalSeconds: task.usage.total_seconds,
|
|
558
|
+
inputSeconds: task.usage.input_seconds,
|
|
559
|
+
outputSeconds: task.usage.output_seconds
|
|
560
|
+
}
|
|
561
|
+
} : {}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
case "failed": {
|
|
567
|
+
return {
|
|
568
|
+
status: "error",
|
|
569
|
+
response,
|
|
570
|
+
error: new AISDKError({
|
|
571
|
+
name: "MINIMAX_VIDEO_GENERATION_FAILED",
|
|
572
|
+
message: `MiniMax video generation failed${((_e = task.error) == null ? void 0 : _e.message) ? `: ${task.error.message}` : ""}${((_f = task.error) == null ? void 0 : _f.code) != null ? ` (${task.error.code})` : ""}. Task ID: ${taskId}`
|
|
573
|
+
})
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
case "cancelled": {
|
|
577
|
+
return {
|
|
578
|
+
status: "error",
|
|
579
|
+
response,
|
|
580
|
+
error: new AISDKError({
|
|
581
|
+
name: "MINIMAX_VIDEO_GENERATION_CANCELLED",
|
|
582
|
+
message: `MiniMax video generation was cancelled. Task ID: ${taskId}`
|
|
583
|
+
})
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
case "expired": {
|
|
587
|
+
return {
|
|
588
|
+
status: "error",
|
|
589
|
+
response,
|
|
590
|
+
error: new AISDKError({
|
|
591
|
+
name: "MINIMAX_VIDEO_GENERATION_EXPIRED",
|
|
592
|
+
message: `MiniMax video generation request expired. Task ID: ${taskId}`
|
|
593
|
+
})
|
|
594
|
+
};
|
|
595
|
+
}
|
|
596
|
+
// 'queued' | 'running' | unknown → keep polling.
|
|
597
|
+
default:
|
|
598
|
+
return { status: "pending", response };
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
async doGenerate(options) {
|
|
602
|
+
var _a, _b, _c;
|
|
603
|
+
const startResult = await this.doStart(options);
|
|
604
|
+
const operation = startResult.operation;
|
|
605
|
+
const minimaxOptions = await parseProviderOptions({
|
|
606
|
+
provider: "minimax",
|
|
607
|
+
providerOptions: options.providerOptions,
|
|
608
|
+
schema: minimaxVideoModelOptionsSchema
|
|
609
|
+
});
|
|
610
|
+
const pollIntervalMs = (_a = minimaxOptions == null ? void 0 : minimaxOptions.pollIntervalMs) != null ? _a : DEFAULT_POLL_INTERVAL_MS;
|
|
611
|
+
const pollTimeoutMs = (_b = minimaxOptions == null ? void 0 : minimaxOptions.pollTimeoutMs) != null ? _b : DEFAULT_POLL_TIMEOUT_MS;
|
|
475
612
|
const startTime = Date.now();
|
|
476
|
-
let responseHeaders;
|
|
477
613
|
while (true) {
|
|
478
614
|
await delay(pollIntervalMs, { abortSignal: options.abortSignal });
|
|
479
615
|
if (Date.now() - startTime > pollTimeoutMs) {
|
|
480
616
|
throw new AISDKError({
|
|
481
617
|
name: "MINIMAX_VIDEO_GENERATION_TIMEOUT",
|
|
482
|
-
message: `MiniMax video generation timed out after ${pollTimeoutMs}ms. Task ID: ${taskId}`
|
|
618
|
+
message: `MiniMax video generation timed out after ${pollTimeoutMs}ms. Task ID: ${operation.taskId}`
|
|
483
619
|
});
|
|
484
620
|
}
|
|
485
|
-
const
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
headers: combineHeaders(
|
|
490
|
-
await resolve(this.config.headers),
|
|
491
|
-
options.headers
|
|
492
|
-
),
|
|
493
|
-
successfulResponseHandler: createJsonResponseHandler(
|
|
494
|
-
minimaxVideoStatusResponseSchema
|
|
495
|
-
),
|
|
496
|
-
failedResponseHandler: minimaxVideoFailedResponseHandler,
|
|
497
|
-
abortSignal: options.abortSignal,
|
|
498
|
-
fetch: this.config.fetch
|
|
621
|
+
const result = await this.getStatus({
|
|
622
|
+
operation,
|
|
623
|
+
headers: options.headers,
|
|
624
|
+
abortSignal: options.abortSignal
|
|
499
625
|
});
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
modelId: this.modelId,
|
|
523
|
-
headers: responseHeaders
|
|
524
|
-
},
|
|
525
|
-
providerMetadata: {
|
|
526
|
-
minimax: {
|
|
527
|
-
taskId,
|
|
528
|
-
videoUrl: url,
|
|
529
|
-
resolvedInputs: {
|
|
530
|
-
imageCount: sentImageCount,
|
|
531
|
-
referenceVideoUrls: sentReferenceVideoUrls
|
|
532
|
-
},
|
|
533
|
-
...task.duration != null ? { duration: task.duration } : {},
|
|
534
|
-
...task.ratio != null ? { ratio: task.ratio } : {},
|
|
535
|
-
...task.resolution != null ? { resolution: task.resolution } : {},
|
|
536
|
-
...task.usage != null ? {
|
|
537
|
-
usage: {
|
|
538
|
-
totalSeconds: task.usage.total_seconds,
|
|
539
|
-
inputSeconds: task.usage.input_seconds,
|
|
540
|
-
outputSeconds: task.usage.output_seconds
|
|
541
|
-
}
|
|
542
|
-
} : {}
|
|
543
|
-
}
|
|
626
|
+
if (result.status === "pending") {
|
|
627
|
+
continue;
|
|
628
|
+
}
|
|
629
|
+
if (result.status === "error") {
|
|
630
|
+
throw result.error;
|
|
631
|
+
}
|
|
632
|
+
return {
|
|
633
|
+
videos: result.videos,
|
|
634
|
+
warnings: [...startResult.warnings, ...result.warnings],
|
|
635
|
+
providerMetadata: {
|
|
636
|
+
...result.providerMetadata,
|
|
637
|
+
minimax: {
|
|
638
|
+
...(_c = result.providerMetadata) == null ? void 0 : _c.minimax,
|
|
639
|
+
resolvedInputs: {
|
|
640
|
+
imageCount: operation.resolvedInputs.imageCount,
|
|
641
|
+
referenceVideoUrls: operation.resolvedInputs.referenceVideoIndices.flatMap(
|
|
642
|
+
(index) => {
|
|
643
|
+
var _a2;
|
|
644
|
+
const file = (_a2 = options.inputReferences) == null ? void 0 : _a2[index];
|
|
645
|
+
return (file == null ? void 0 : file.type) === "url" ? [file.url] : [];
|
|
646
|
+
}
|
|
647
|
+
)
|
|
544
648
|
}
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
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}`
|
|
551
|
-
});
|
|
552
|
-
}
|
|
553
|
-
case "cancelled": {
|
|
554
|
-
throw new AISDKError({
|
|
555
|
-
name: "MINIMAX_VIDEO_GENERATION_CANCELLED",
|
|
556
|
-
message: `MiniMax video generation was cancelled. Task ID: ${taskId}`
|
|
557
|
-
});
|
|
558
|
-
}
|
|
559
|
-
case "expired": {
|
|
560
|
-
throw new AISDKError({
|
|
561
|
-
name: "MINIMAX_VIDEO_GENERATION_EXPIRED",
|
|
562
|
-
message: `MiniMax video generation request expired. Task ID: ${taskId}`
|
|
563
|
-
});
|
|
649
|
+
}
|
|
650
|
+
},
|
|
651
|
+
response: {
|
|
652
|
+
...result.response,
|
|
653
|
+
timestamp: startResult.response.timestamp
|
|
564
654
|
}
|
|
565
|
-
|
|
566
|
-
default:
|
|
567
|
-
break;
|
|
568
|
-
}
|
|
655
|
+
};
|
|
569
656
|
}
|
|
570
657
|
}
|
|
571
658
|
};
|
|
@@ -611,7 +698,7 @@ var minimaxVideoFailedResponseHandler = createJsonErrorResponseHandler({
|
|
|
611
698
|
});
|
|
612
699
|
|
|
613
700
|
// src/version.ts
|
|
614
|
-
var VERSION = true ? "3.0.
|
|
701
|
+
var VERSION = true ? "3.0.28" : "0.0.0-test";
|
|
615
702
|
|
|
616
703
|
// src/minimax-provider.ts
|
|
617
704
|
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_VideoModelV4,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n generateId,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { AnthropicLanguageModel } 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 ProviderV4 {\n /**\n * Creates a MiniMax model for text generation.\n */\n (modelId: MiniMaxChatModelId): LanguageModelV4;\n\n /**\n * Creates a MiniMax language model for text generation.\n */\n languageModel(modelId: MiniMaxChatModelId): LanguageModelV4;\n\n /**\n * Creates a MiniMax chat model for text generation.\n */\n chat(modelId: MiniMaxChatModelId): LanguageModelV4;\n\n /**\n * Creates a MiniMax video model for video generation.\n */\n video(modelId: MiniMaxVideoModelId): Experimental_VideoModelV4;\n\n /**\n * Creates a MiniMax video model for video generation.\n */\n videoModel(modelId: MiniMaxVideoModelId): Experimental_VideoModelV4;\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 AnthropicLanguageModel(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 = 'v4' 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_VideoModelV4 as VideoModelV4,\n type Experimental_VideoModelV4File as VideoModelV4File,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n getTopLevelMediaType,\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 NonNullable<VideoModelV4['doGenerate']>\n>[0];\n\nconst DEFAULT_RESOLUTION = '2K';\nconst DEFAULT_ASPECT_RATIO = '16:9';\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// 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(file: VideoModelV4File): 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 VideoModelV4 {\n readonly specificationVersion = 'v4';\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<NonNullable<VideoModelV4['doGenerate']>>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV4Warning[] = [];\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: VideoModelV4File[] = [];\n const referenceVideos: VideoModelV4File[] = [];\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 const isTextToVideo = content.length === 1;\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: isTextToVideo\n ? `${this.modelId} does not support the aspect ratio \"${options.aspectRatio}\". Using the default (${DEFAULT_ASPECT_RATIO}).`\n : `${this.modelId} does not support the aspect ratio \"${options.aspectRatio}\". Using the provider default (adaptive).`,\n });\n if (isTextToVideo) {\n ratio = DEFAULT_ASPECT_RATIO;\n }\n }\n }\n if (ratio === 'adaptive' && isTextToVideo) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n `${this.modelId} text-to-video does not support the adaptive aspect ratio. ` +\n `Using the default (${DEFAULT_ASPECT_RATIO}).`,\n });\n ratio = DEFAULT_ASPECT_RATIO;\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 if (ratio == null && isTextToVideo) {\n ratio = DEFAULT_ASPECT_RATIO;\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 validateUrl: true,\n trustedOrigin: baseURL,\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"]}
|
|
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_VideoModelV4,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n generateId,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { AnthropicLanguageModel } 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 ProviderV4 {\n /**\n * Creates a MiniMax model for text generation.\n */\n (modelId: MiniMaxChatModelId): LanguageModelV4;\n\n /**\n * Creates a MiniMax language model for text generation.\n */\n languageModel(modelId: MiniMaxChatModelId): LanguageModelV4;\n\n /**\n * Creates a MiniMax chat model for text generation.\n */\n chat(modelId: MiniMaxChatModelId): LanguageModelV4;\n\n /**\n * Creates a MiniMax video model for video generation.\n */\n video(modelId: MiniMaxVideoModelId): Experimental_VideoModelV4;\n\n /**\n * Creates a MiniMax video model for video generation.\n */\n videoModel(modelId: MiniMaxVideoModelId): Experimental_VideoModelV4;\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 AnthropicLanguageModel(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 = 'v4' 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_VideoModelV4 as VideoModelV4,\n type Experimental_VideoModelV4File as VideoModelV4File,\n type Experimental_VideoModelV4OperationStartResult as VideoModelV4OperationStartResult,\n type Experimental_VideoModelV4OperationStatusResult as VideoModelV4OperationStatusResult,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n getTopLevelMediaType,\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 NonNullable<VideoModelV4['doGenerate']>\n>[0];\n\ntype MiniMaxVideoOperation = {\n taskId: string;\n resolvedInputs: {\n imageCount: number;\n referenceVideoIndices: number[];\n };\n};\n\n// Keep the synchronous API's named errors while exposing status errors as text.\ntype MiniMaxVideoStatusResult =\n | Exclude<VideoModelV4OperationStatusResult, { status: 'error' }>\n | {\n status: 'error';\n error: AISDKError;\n response: VideoModelV4OperationStatusResult['response'];\n };\n\nconst DEFAULT_RESOLUTION = '2K';\nconst DEFAULT_ASPECT_RATIO = '16:9';\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// 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(file: VideoModelV4File): 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 VideoModelV4 {\n readonly specificationVersion = 'v4';\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 private async getArgs(options: MiniMaxVideoDoGenerateOptions) {\n const warnings: SharedV4Warning[] = [];\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 sentReferenceVideoIndices: number[] = [];\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: VideoModelV4File[] = [];\n const referenceVideos: Array<{ file: VideoModelV4File; index: number }> =\n [];\n\n for (const [index, file] of referenceFiles.entries()) {\n const topLevelMediaType =\n file.mediaType != null\n ? getTopLevelMediaType(file.mediaType)\n : undefined;\n\n if (topLevelMediaType === 'video') {\n referenceVideos.push({ file, index });\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 { file: video, index } of referenceVideos.slice(\n 0,\n MAX_REFERENCE_VIDEOS,\n )) {\n const url = convertImageModelFileToDataUri(video);\n content.push({\n type: 'video_url',\n video_url: { url },\n role: 'reference_video',\n });\n // Retain input positions, not request URLs or inline data, in the operation.\n if (video.type === 'url') {\n sentReferenceVideoIndices.push(index);\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 const isTextToVideo = content.length === 1;\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: isTextToVideo\n ? `${this.modelId} does not support the aspect ratio \"${options.aspectRatio}\". Using the default (${DEFAULT_ASPECT_RATIO}).`\n : `${this.modelId} does not support the aspect ratio \"${options.aspectRatio}\". Using the provider default (adaptive).`,\n });\n if (isTextToVideo) {\n ratio = DEFAULT_ASPECT_RATIO;\n }\n }\n }\n if (ratio === 'adaptive' && isTextToVideo) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n `${this.modelId} text-to-video does not support the adaptive aspect ratio. ` +\n `Using the default (${DEFAULT_ASPECT_RATIO}).`,\n });\n ratio = DEFAULT_ASPECT_RATIO;\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 if (ratio == null && isTextToVideo) {\n ratio = DEFAULT_ASPECT_RATIO;\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 return {\n body,\n warnings,\n resolvedInputs: {\n imageCount: sentImageCount,\n referenceVideoIndices: sentReferenceVideoIndices,\n },\n };\n }\n\n async doStart(\n options: Parameters<NonNullable<VideoModelV4['doStart']>>[0],\n ): Promise<VideoModelV4OperationStartResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { body, warnings, resolvedInputs } = await this.getArgs(options);\n\n const { value: createResponse, responseHeaders } = await postJsonToApi({\n url: `${this.config.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 return {\n operation: { taskId, resolvedInputs } satisfies MiniMaxVideoOperation,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n async doStatus(\n options: Parameters<NonNullable<VideoModelV4['doStatus']>>[0],\n ): Promise<VideoModelV4OperationStatusResult> {\n const result = await this.getStatus(options);\n return result.status === 'error'\n ? { ...result, error: result.error.message }\n : result;\n }\n\n private async getStatus(\n options: Parameters<NonNullable<VideoModelV4['doStatus']>>[0],\n ): Promise<MiniMaxVideoStatusResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { taskId, resolvedInputs } =\n options.operation as MiniMaxVideoOperation;\n const baseURL = this.config.baseURL;\n const { value: statusResponse, responseHeaders } = await getFromApi({\n url: `${baseURL}/v2/query/video_generation/${encodeURIComponent(taskId)}`,\n validateUrl: true,\n trustedOrigin: baseURL,\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 const response = {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n };\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 status: 'completed',\n videos: [\n {\n type: 'url' as const,\n url,\n mediaType: 'video/mp4',\n },\n ],\n warnings: [],\n response,\n providerMetadata: {\n minimax: {\n taskId,\n videoUrl: url,\n resolvedInputs,\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 return {\n status: 'error',\n response,\n error: 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\n case 'cancelled': {\n return {\n status: 'error',\n response,\n error: new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_CANCELLED',\n message: `MiniMax video generation was cancelled. Task ID: ${taskId}`,\n }),\n };\n }\n\n case 'expired': {\n return {\n status: 'error',\n response,\n error: new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_EXPIRED',\n message: `MiniMax video generation request expired. Task ID: ${taskId}`,\n }),\n };\n }\n\n // 'queued' | 'running' | unknown → keep polling.\n default:\n return { status: 'pending', response };\n }\n }\n\n async doGenerate(\n options: MiniMaxVideoDoGenerateOptions,\n ): Promise<Awaited<ReturnType<NonNullable<VideoModelV4['doGenerate']>>>> {\n const startResult = await this.doStart(options);\n const operation = startResult.operation as MiniMaxVideoOperation;\n const minimaxOptions = await parseProviderOptions({\n provider: 'minimax',\n providerOptions: options.providerOptions,\n schema: minimaxVideoModelOptionsSchema,\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\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: ${operation.taskId}`,\n });\n }\n\n const result = await this.getStatus({\n operation,\n headers: options.headers,\n abortSignal: options.abortSignal,\n });\n if (result.status === 'pending') {\n continue;\n }\n if (result.status === 'error') {\n throw result.error;\n }\n return {\n videos: result.videos,\n warnings: [...startResult.warnings, ...result.warnings],\n providerMetadata: {\n ...result.providerMetadata,\n minimax: {\n ...result.providerMetadata?.minimax,\n resolvedInputs: {\n imageCount: operation.resolvedInputs.imageCount,\n referenceVideoUrls:\n operation.resolvedInputs.referenceVideoIndices.flatMap(\n index => {\n const file = options.inputReferences?.[index];\n return file?.type === 'url' ? [file.url] : [];\n },\n ),\n },\n },\n },\n response: {\n ...result.response,\n timestamp: startResult.response.timestamp,\n },\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":";AAAA;AAAA,EACE;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,8BAA8B;;;ACbvC;AAAA,EACE;AAAA,OAMK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,SAAS,KAAAA,UAAS;;;ACtBlB,SAAS,YAAY,iBAAiB;AACtC,SAAS,SAAS;AAKX,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,IAAM,0BAA0B,CAAC,QAAQ,QAAQ,IAAI;AAKrD,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;;;ADAA,IAAM,qBAAqB;AAC3B,IAAM,uBAAuB;AAC7B,IAAM,2BAA2B;AACjC,IAAM,0BAA0B;AAChC,IAAM,2BAA2B;AACjC,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAE7B,IAAM,gBAAgB,IAAI,IAAY,kBAAkB;AACxD,IAAM,qBAAqB,IAAI,IAAY,uBAAuB;AAClE,IAAM,0BAGF;AAAA,EACF,cAAc,EAAE,WAAW,CAAC,QAAQ,IAAI,GAAG,SAAS,mBAAmB;AAAA,EACvE,kBAAkB,EAAE,WAAW,CAAC,QAAQ,MAAM,GAAG,SAAS,OAAO;AACnE;AASA,IAAM,iBAAyC;AAAA;AAAA,EAE7C,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA;AAAA,EAEX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA,EAEZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AACf;AAIA,SAAS,0BAA0B,YAAwC;AACzE,QAAM,QAAQ,WAAW,YAAY;AACrC,SAAO,mBAAmB,IAAI,KAAK,IAAI,QAAQ,eAAe,UAAU;AAC1E;AAOA,SAAS,uBAAuB,MAA4C;AAC1E,MAAI,KAAK,aAAa,MAAM;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,qBAAqB,KAAK,SAAS;AAC7D,SAAO,sBAAsB,UAAU,SAAY;AACrD;AAEO,IAAM,oBAAN,MAAgD;AAAA,EAQrD,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,MAAc,QAAQ,SAAwC;AApJhE;AAqJI,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,GAAG,KAAK,OAAO;AAAA,MAC1B,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,QAAQ,MAAM;AACxB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,GAAG,KAAK,OAAO;AAAA,MAC1B,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,KAAK,QAAQ,QAAQ,IAAI,GAAG;AACtC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,GAAG,KAAK,OAAO;AAAA,MAC1B,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,iBAAiB,MAAM;AACjC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,OAAO,KAAK,OAAO;AAAA,MAC9B,CAAC;AAAA,IACH;AAEA,UAAM,qBAAqB,wBAAwB,KAAK,OAAO;AAC/D,UAAM,wBACJ,8DAAoB,cAApB,YAAiC;AACnC,UAAM,yBAAyB,IAAI,IAAY,oBAAoB;AACnE,UAAM,2BAA2B,qBAC9B,IAAI,CAAAC,gBAAc,IAAIA,WAAU,GAAG,EACnC,KAAK,MAAM;AAId,QAAI,aAAiC,iDAAgB;AACrD,QAAI,cAAc,QAAQ,CAAC,uBAAuB,IAAI,UAAU,GAAG;AACjE,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,GAAG,KAAK,OAAO,aAAa,wBAAwB,8BAA8B,UAAU;AAAA,MACvG,CAAC;AACD,mBAAa;AAAA,IACf;AAEA,QAAI,QAAQ,cAAc,MAAM;AAC9B,YAAM,SAAS,0BAA0B,QAAQ,UAAU;AAC3D,UAAI,cAAc,MAAM;AAItB,YAAI,UAAU,MAAM;AAClB,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SACE,4BAA4B,QAAQ,UAAU,MAAM,KAAK,OAAO,aAAa,wBAAwB,6CAC1D,UAAU;AAAA,UACzD,CAAC;AAAA,QACH,WAAW,WAAW,YAAY;AAChC,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SACE,mBAAmB,QAAQ,UAAU,aAAa,MAAM,8CAChB,UAAU;AAAA,UACtD,CAAC;AAAA,QACH;AAAA,MACF,WAAW,UAAU,QAAQ,uBAAuB,IAAI,MAAM,GAAG;AAC/D,qBAAa;AAAA,MACf,OAAO;AACL,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SACE,UAAU,OACN,4BAA4B,QAAQ,UAAU,MAAM,KAAK,OAAO,aAAa,wBAAwB,MACrG,GAAG,KAAK,OAAO,qCAAqC,MAAM,kBAAkB,wBAAwB;AAAA,QAC5G,CAAC;AAAA,MACH;AAAA,IACF;AACA,oDAAe,8DAAoB,YAApB,YAA+B;AAS9C,UAAM,UAA0C;AAAA,MAC9C,EAAE,MAAM,QAAQ,OAAM,aAAQ,WAAR,YAAkB,GAAG;AAAA,IAC7C;AAOA,QAAI,iBAAiB;AACrB,UAAM,4BAAsC,CAAC;AAM7C,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,GAAG,KAAK,OAAO,sEACf,GAAG,KAAK,OAAO,iDAAiD,WAAW,SAAS;AAAA,MAC5F,CAAC;AACD,mBAAa;AAAA,IACf;AAEA,QAAI,aAAa,MAAM;AACrB,UAAI,cAAc,MAAM;AACtB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,GAAG,KAAK,OAAO;AAAA,QAC1B,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,GAAG,KAAK,OAAO,iFACf,GAAG,KAAK,OAAO,iDAAiD,UAAU,SAAS;AAAA,UAC3F,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,qBAAqB,KAAK,YAAY;AAE5C,QAAI,CAAC,sBAAsB,eAAe,SAAS,GAAG;AACpD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,sBAAsB,mBAAmB,SAAS,GAAG;AACxD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,UAAM,iBACJ,uBACC,eAAe,SAAS,KAAK,mBAAmB,SAAS;AAE5D,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,kBAAsC,CAAC;AAC7C,YAAM,kBACJ,CAAC;AAEH,iBAAW,CAAC,OAAO,IAAI,KAAK,eAAe,QAAQ,GAAG;AACpD,cAAM,oBACJ,KAAK,aAAa,OACd,qBAAqB,KAAK,SAAS,IACnC;AAEN,YAAI,sBAAsB,SAAS;AACjC,0BAAgB,KAAK,EAAE,MAAM,MAAM,CAAC;AAAA,QACtC,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,EAAE,MAAM,OAAO,MAAM,KAAK,gBAAgB;AAAA,QACnD;AAAA,QACA;AAAA,MACF,GAAG;AACD,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,oCAA0B,KAAK,KAAK;AAAA,QACtC;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,UAAM,gBAAgB,QAAQ,WAAW;AACzC,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,SAAS,gBACL,GAAG,KAAK,OAAO,uCAAuC,QAAQ,WAAW,yBAAyB,oBAAoB,OACtH,GAAG,KAAK,OAAO,uCAAuC,QAAQ,WAAW;AAAA,QAC/E,CAAC;AACD,YAAI,eAAe;AACjB,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AACA,QAAI,UAAU,cAAc,eAAe;AACzC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE,GAAG,KAAK,OAAO,iFACO,oBAAoB;AAAA,MAC9C,CAAC;AACD,cAAQ;AAAA,IACV;AACA,QAAI,mBAAmB,SAAS,MAAM;AACpC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,GAAG,KAAK,OAAO;AAAA,MAC1B,CAAC;AACD,cAAQ;AAAA,IACV;AACA,QAAI,SAAS,QAAQ,eAAe;AAClC,cAAQ;AAAA,IACV;AAKA,UAAM,qBAAqB,KAAK,YAAY,eAAe,IAAI;AAC/D,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,GAAG,KAAK,OAAO,kEAAkE,QAAQ,QAAQ,mBAAmB,QAAQ;AAAA,QACvI,CAAC;AAAA,MACH;AAEA,UAAI,WAAW,sBAAsB;AACnC,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,GAAG,KAAK,OAAO,qBAAqB,oBAAoB,uCAAuC,QAAQ,QAAQ,mBAAmB,oBAAoB;AAAA,QACjK,CAAC;AACD,mBAAW;AAAA,MACb,WAAW,WAAW,oBAAoB;AACxC,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,GAAG,KAAK,OAAO,sBAAsB,kBAAkB,uCAAuC,QAAQ,QAAQ,mBAAmB,kBAAkB;AAAA,QAC9J,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,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,QACd,YAAY;AAAA,QACZ,uBAAuB;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,SAC2C;AAlkB/C;AAmkBI,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,EAAE,MAAM,UAAU,eAAe,IAAI,MAAM,KAAK,QAAQ,OAAO;AAErE,UAAM,EAAE,OAAO,gBAAgB,gBAAgB,IAAI,MAAM,cAAc;AAAA,MACrE,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,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,WAAO;AAAA,MACL,WAAW,EAAE,QAAQ,eAAe;AAAA,MACpC;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,SAC4C;AAC5C,UAAM,SAAS,MAAM,KAAK,UAAU,OAAO;AAC3C,WAAO,OAAO,WAAW,UACrB,EAAE,GAAG,QAAQ,OAAO,OAAO,MAAM,QAAQ,IACzC;AAAA,EACN;AAAA,EAEA,MAAc,UACZ,SACmC;AAnnBvC;AAonBI,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,EAAE,QAAQ,eAAe,IAC7B,QAAQ;AACV,UAAM,UAAU,KAAK,OAAO;AAC5B,UAAM,EAAE,OAAO,gBAAgB,gBAAgB,IAAI,MAAM,WAAW;AAAA,MAClE,KAAK,GAAG,OAAO,8BAA8B,mBAAmB,MAAM,CAAC;AAAA,MACvE,aAAa;AAAA,MACb,eAAe;AAAA,MACf,SAAS;AAAA,QACP,MAAM,QAAQ,KAAK,OAAO,OAAO;AAAA,QACjC,QAAQ;AAAA,MACV;AAAA,MACA,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,uBAAuB;AAAA,MACvB,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,WAAW;AAAA,MACf,WAAW;AAAA,MACX,SAAS,KAAK;AAAA,MACd,SAAS;AAAA,IACX;AACA,UAAM,OAAO,eAAe;AAE5B,YAAQ,KAAK,QAAQ;AAAA,MACnB,KAAK,aAAa;AAChB,cAAM,OAAM,UAAK,YAAL,mBAAc;AAC1B,YAAI,CAAC,KAAK;AACR,gBAAM,IAAI,WAAW;AAAA,YACnB,MAAM;AAAA,YACN,SAAS,8EAA8E,MAAM;AAAA,UAC/F,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN;AAAA,cACE,MAAM;AAAA,cACN;AAAA,cACA,WAAW;AAAA,YACb;AAAA,UACF;AAAA,UACA,UAAU,CAAC;AAAA,UACX;AAAA,UACA,kBAAkB;AAAA,YAChB,SAAS;AAAA,cACP;AAAA,cACA,UAAU;AAAA,cACV;AAAA,cACA,GAAI,KAAK,YAAY,OAAO,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,cAC3D,GAAI,KAAK,SAAS,OAAO,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,cAClD,GAAI,KAAK,cAAc,OACnB,EAAE,YAAY,KAAK,WAAW,IAC9B,CAAC;AAAA,cACL,GAAI,KAAK,SAAS,OACd;AAAA,gBACE,OAAO;AAAA,kBACL,cAAc,KAAK,MAAM;AAAA,kBACzB,cAAc,KAAK,MAAM;AAAA,kBACzB,eAAe,KAAK,MAAM;AAAA,gBAC5B;AAAA,cACF,IACA,CAAC;AAAA,YACP;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,KAAK,UAAU;AACb,eAAO;AAAA,UACL,QAAQ;AAAA,UACR;AAAA,UACA,OAAO,IAAI,WAAW;AAAA,YACpB,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,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,eAAO;AAAA,UACL,QAAQ;AAAA,UACR;AAAA,UACA,OAAO,IAAI,WAAW;AAAA,YACpB,MAAM;AAAA,YACN,SAAS,oDAAoD,MAAM;AAAA,UACrE,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEA,KAAK,WAAW;AACd,eAAO;AAAA,UACL,QAAQ;AAAA,UACR;AAAA,UACA,OAAO,IAAI,WAAW;AAAA,YACpB,MAAM;AAAA,YACN,SAAS,sDAAsD,MAAM;AAAA,UACvE,CAAC;AAAA,QACH;AAAA,MACF;AAAA;AAAA,MAGA;AACE,eAAO,EAAE,QAAQ,WAAW,SAAS;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,SACuE;AAvuB3E;AAwuBI,UAAM,cAAc,MAAM,KAAK,QAAQ,OAAO;AAC9C,UAAM,YAAY,YAAY;AAC9B,UAAM,iBAAiB,MAAM,qBAAqB;AAAA,MAChD,UAAU;AAAA,MACV,iBAAiB,QAAQ;AAAA,MACzB,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,kBACJ,sDAAgB,mBAAhB,YAAkC;AACpC,UAAM,iBACJ,sDAAgB,kBAAhB,YAAiC;AACnC,UAAM,YAAY,KAAK,IAAI;AAE3B,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,UAAU,MAAM;AAAA,QACpG,CAAC;AAAA,MACH;AAEA,YAAM,SAAS,MAAM,KAAK,UAAU;AAAA,QAClC;AAAA,QACA,SAAS,QAAQ;AAAA,QACjB,aAAa,QAAQ;AAAA,MACvB,CAAC;AACD,UAAI,OAAO,WAAW,WAAW;AAC/B;AAAA,MACF;AACA,UAAI,OAAO,WAAW,SAAS;AAC7B,cAAM,OAAO;AAAA,MACf;AACA,aAAO;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,UAAU,CAAC,GAAG,YAAY,UAAU,GAAG,OAAO,QAAQ;AAAA,QACtD,kBAAkB;AAAA,UAChB,GAAG,OAAO;AAAA,UACV,SAAS;AAAA,YACP,IAAG,YAAO,qBAAP,mBAAyB;AAAA,YAC5B,gBAAgB;AAAA,cACd,YAAY,UAAU,eAAe;AAAA,cACrC,oBACE,UAAU,eAAe,sBAAsB;AAAA,gBAC7C,WAAS;AArxB3B,sBAAAC;AAsxBoB,wBAAM,QAAOA,MAAA,QAAQ,oBAAR,gBAAAA,IAA0B;AACvC,0BAAO,6BAAM,UAAS,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;AAAA,gBAC9C;AAAA,cACF;AAAA,YACJ;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAU;AAAA,UACR,GAAG,OAAO;AAAA,UACV,WAAW,YAAY,SAAS;AAAA,QAClC;AAAA,MACF;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;AAp1BvB;AAq1BI,4BAAK,UAAL,mBAAY,YAAZ,YAAuB;AAAA;AAC3B,CAAC;;;AEp1BM,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,uBAAuB,SAAS;AAAA,IAClC,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","resolution","_a","z"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/minimax",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.28",
|
|
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": "4.0.
|
|
29
|
-
"@ai-sdk/provider": "4.0.
|
|
30
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
28
|
+
"@ai-sdk/anthropic": "4.0.51",
|
|
29
|
+
"@ai-sdk/provider": "4.0.12",
|
|
30
|
+
"@ai-sdk/provider-utils": "5.0.38"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@ai-sdk/test-server": "2.0.1",
|
|
@@ -2,6 +2,8 @@ import {
|
|
|
2
2
|
AISDKError,
|
|
3
3
|
type Experimental_VideoModelV4 as VideoModelV4,
|
|
4
4
|
type Experimental_VideoModelV4File as VideoModelV4File,
|
|
5
|
+
type Experimental_VideoModelV4OperationStartResult as VideoModelV4OperationStartResult,
|
|
6
|
+
type Experimental_VideoModelV4OperationStatusResult as VideoModelV4OperationStatusResult,
|
|
5
7
|
type SharedV4Warning,
|
|
6
8
|
} from '@ai-sdk/provider';
|
|
7
9
|
import {
|
|
@@ -42,6 +44,23 @@ type MiniMaxVideoDoGenerateOptions = Parameters<
|
|
|
42
44
|
NonNullable<VideoModelV4['doGenerate']>
|
|
43
45
|
>[0];
|
|
44
46
|
|
|
47
|
+
type MiniMaxVideoOperation = {
|
|
48
|
+
taskId: string;
|
|
49
|
+
resolvedInputs: {
|
|
50
|
+
imageCount: number;
|
|
51
|
+
referenceVideoIndices: number[];
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// Keep the synchronous API's named errors while exposing status errors as text.
|
|
56
|
+
type MiniMaxVideoStatusResult =
|
|
57
|
+
| Exclude<VideoModelV4OperationStatusResult, { status: 'error' }>
|
|
58
|
+
| {
|
|
59
|
+
status: 'error';
|
|
60
|
+
error: AISDKError;
|
|
61
|
+
response: VideoModelV4OperationStatusResult['response'];
|
|
62
|
+
};
|
|
63
|
+
|
|
45
64
|
const DEFAULT_RESOLUTION = '2K';
|
|
46
65
|
const DEFAULT_ASPECT_RATIO = '16:9';
|
|
47
66
|
const DEFAULT_POLL_INTERVAL_MS = 10_000;
|
|
@@ -127,10 +146,7 @@ export class MiniMaxVideoModel implements VideoModelV4 {
|
|
|
127
146
|
private config: MiniMaxVideoModelConfig,
|
|
128
147
|
) {}
|
|
129
148
|
|
|
130
|
-
async
|
|
131
|
-
options: MiniMaxVideoDoGenerateOptions,
|
|
132
|
-
): Promise<Awaited<ReturnType<NonNullable<VideoModelV4['doGenerate']>>>> {
|
|
133
|
-
const currentDate = this.config._internal?.currentDate?.() ?? new Date();
|
|
149
|
+
private async getArgs(options: MiniMaxVideoDoGenerateOptions) {
|
|
134
150
|
const warnings: SharedV4Warning[] = [];
|
|
135
151
|
|
|
136
152
|
const minimaxOptions = (await parseProviderOptions({
|
|
@@ -246,7 +262,7 @@ export class MiniMaxVideoModel implements VideoModelV4 {
|
|
|
246
262
|
// survived, which callers that meter usage need. Accumulated at the push
|
|
247
263
|
// sites rather than re-derived, so the two cannot disagree.
|
|
248
264
|
let sentImageCount = 0;
|
|
249
|
-
const
|
|
265
|
+
const sentReferenceVideoIndices: number[] = [];
|
|
250
266
|
|
|
251
267
|
// Resolve first/last frame inputs. A standalone `image` is treated as the
|
|
252
268
|
// first frame (image-to-video). The core sets `image` to the `first_frame`
|
|
@@ -357,16 +373,17 @@ export class MiniMaxVideoModel implements VideoModelV4 {
|
|
|
357
373
|
}
|
|
358
374
|
} else if (usesReferences) {
|
|
359
375
|
const referenceImages: VideoModelV4File[] = [];
|
|
360
|
-
const referenceVideos: VideoModelV4File
|
|
376
|
+
const referenceVideos: Array<{ file: VideoModelV4File; index: number }> =
|
|
377
|
+
[];
|
|
361
378
|
|
|
362
|
-
for (const file of referenceFiles) {
|
|
379
|
+
for (const [index, file] of referenceFiles.entries()) {
|
|
363
380
|
const topLevelMediaType =
|
|
364
381
|
file.mediaType != null
|
|
365
382
|
? getTopLevelMediaType(file.mediaType)
|
|
366
383
|
: undefined;
|
|
367
384
|
|
|
368
385
|
if (topLevelMediaType === 'video') {
|
|
369
|
-
referenceVideos.push(file);
|
|
386
|
+
referenceVideos.push({ file, index });
|
|
370
387
|
} else if (topLevelMediaType === 'image') {
|
|
371
388
|
referenceImages.push(file);
|
|
372
389
|
} else if (topLevelMediaType == null) {
|
|
@@ -409,16 +426,19 @@ export class MiniMaxVideoModel implements VideoModelV4 {
|
|
|
409
426
|
});
|
|
410
427
|
}
|
|
411
428
|
|
|
412
|
-
for (const video of referenceVideos.slice(
|
|
429
|
+
for (const { file: video, index } of referenceVideos.slice(
|
|
430
|
+
0,
|
|
431
|
+
MAX_REFERENCE_VIDEOS,
|
|
432
|
+
)) {
|
|
413
433
|
const url = convertImageModelFileToDataUri(video);
|
|
414
434
|
content.push({
|
|
415
435
|
type: 'video_url',
|
|
416
436
|
video_url: { url },
|
|
417
437
|
role: 'reference_video',
|
|
418
438
|
});
|
|
419
|
-
//
|
|
439
|
+
// Retain input positions, not request URLs or inline data, in the operation.
|
|
420
440
|
if (video.type === 'url') {
|
|
421
|
-
|
|
441
|
+
sentReferenceVideoIndices.push(index);
|
|
422
442
|
}
|
|
423
443
|
}
|
|
424
444
|
if (referenceVideos.length > MAX_REFERENCE_VIDEOS) {
|
|
@@ -544,10 +564,24 @@ export class MiniMaxVideoModel implements VideoModelV4 {
|
|
|
544
564
|
body.aigc_watermark = minimaxOptions.aigcWatermark;
|
|
545
565
|
}
|
|
546
566
|
|
|
547
|
-
|
|
567
|
+
return {
|
|
568
|
+
body,
|
|
569
|
+
warnings,
|
|
570
|
+
resolvedInputs: {
|
|
571
|
+
imageCount: sentImageCount,
|
|
572
|
+
referenceVideoIndices: sentReferenceVideoIndices,
|
|
573
|
+
},
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
async doStart(
|
|
578
|
+
options: Parameters<NonNullable<VideoModelV4['doStart']>>[0],
|
|
579
|
+
): Promise<VideoModelV4OperationStartResult> {
|
|
580
|
+
const currentDate = this.config._internal?.currentDate?.() ?? new Date();
|
|
581
|
+
const { body, warnings, resolvedInputs } = await this.getArgs(options);
|
|
548
582
|
|
|
549
|
-
const { value: createResponse } = await postJsonToApi({
|
|
550
|
-
url: `${baseURL}/v2/video_generation`,
|
|
583
|
+
const { value: createResponse, responseHeaders } = await postJsonToApi({
|
|
584
|
+
url: `${this.config.baseURL}/v2/video_generation`,
|
|
551
585
|
headers: combineHeaders(
|
|
552
586
|
await resolve(this.config.headers),
|
|
553
587
|
options.headers,
|
|
@@ -569,121 +603,203 @@ export class MiniMaxVideoModel implements VideoModelV4 {
|
|
|
569
603
|
});
|
|
570
604
|
}
|
|
571
605
|
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
606
|
+
return {
|
|
607
|
+
operation: { taskId, resolvedInputs } satisfies MiniMaxVideoOperation,
|
|
608
|
+
warnings,
|
|
609
|
+
response: {
|
|
610
|
+
timestamp: currentDate,
|
|
611
|
+
modelId: this.modelId,
|
|
612
|
+
headers: responseHeaders,
|
|
613
|
+
},
|
|
614
|
+
};
|
|
615
|
+
}
|
|
581
616
|
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
}
|
|
617
|
+
async doStatus(
|
|
618
|
+
options: Parameters<NonNullable<VideoModelV4['doStatus']>>[0],
|
|
619
|
+
): Promise<VideoModelV4OperationStatusResult> {
|
|
620
|
+
const result = await this.getStatus(options);
|
|
621
|
+
return result.status === 'error'
|
|
622
|
+
? { ...result, error: result.error.message }
|
|
623
|
+
: result;
|
|
624
|
+
}
|
|
588
625
|
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
626
|
+
private async getStatus(
|
|
627
|
+
options: Parameters<NonNullable<VideoModelV4['doStatus']>>[0],
|
|
628
|
+
): Promise<MiniMaxVideoStatusResult> {
|
|
629
|
+
const currentDate = this.config._internal?.currentDate?.() ?? new Date();
|
|
630
|
+
const { taskId, resolvedInputs } =
|
|
631
|
+
options.operation as MiniMaxVideoOperation;
|
|
632
|
+
const baseURL = this.config.baseURL;
|
|
633
|
+
const { value: statusResponse, responseHeaders } = await getFromApi({
|
|
634
|
+
url: `${baseURL}/v2/query/video_generation/${encodeURIComponent(taskId)}`,
|
|
635
|
+
validateUrl: true,
|
|
636
|
+
trustedOrigin: baseURL,
|
|
637
|
+
headers: combineHeaders(
|
|
638
|
+
await resolve(this.config.headers),
|
|
639
|
+
options.headers,
|
|
640
|
+
),
|
|
641
|
+
successfulResponseHandler: createJsonResponseHandler(
|
|
642
|
+
minimaxVideoStatusResponseSchema,
|
|
643
|
+
),
|
|
644
|
+
failedResponseHandler: minimaxVideoFailedResponseHandler,
|
|
645
|
+
abortSignal: options.abortSignal,
|
|
646
|
+
fetch: this.config.fetch,
|
|
647
|
+
});
|
|
605
648
|
|
|
606
|
-
|
|
607
|
-
|
|
649
|
+
const response = {
|
|
650
|
+
timestamp: currentDate,
|
|
651
|
+
modelId: this.modelId,
|
|
652
|
+
headers: responseHeaders,
|
|
653
|
+
};
|
|
654
|
+
const task = statusResponse.task;
|
|
608
655
|
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
656
|
+
switch (task.status) {
|
|
657
|
+
case 'succeeded': {
|
|
658
|
+
const url = task.content?.url;
|
|
659
|
+
if (!url) {
|
|
660
|
+
throw new AISDKError({
|
|
661
|
+
name: 'MINIMAX_VIDEO_GENERATION_ERROR',
|
|
662
|
+
message: `MiniMax video generation completed but no video URL was returned. Task ID: ${taskId}`,
|
|
663
|
+
});
|
|
664
|
+
}
|
|
618
665
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
],
|
|
627
|
-
warnings,
|
|
628
|
-
response: {
|
|
629
|
-
timestamp: currentDate,
|
|
630
|
-
modelId: this.modelId,
|
|
631
|
-
headers: responseHeaders,
|
|
666
|
+
return {
|
|
667
|
+
status: 'completed',
|
|
668
|
+
videos: [
|
|
669
|
+
{
|
|
670
|
+
type: 'url' as const,
|
|
671
|
+
url,
|
|
672
|
+
mediaType: 'video/mp4',
|
|
632
673
|
},
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
},
|
|
674
|
+
],
|
|
675
|
+
warnings: [],
|
|
676
|
+
response,
|
|
677
|
+
providerMetadata: {
|
|
678
|
+
minimax: {
|
|
679
|
+
taskId,
|
|
680
|
+
videoUrl: url,
|
|
681
|
+
resolvedInputs,
|
|
682
|
+
...(task.duration != null ? { duration: task.duration } : {}),
|
|
683
|
+
...(task.ratio != null ? { ratio: task.ratio } : {}),
|
|
684
|
+
...(task.resolution != null
|
|
685
|
+
? { resolution: task.resolution }
|
|
686
|
+
: {}),
|
|
687
|
+
...(task.usage != null
|
|
688
|
+
? {
|
|
689
|
+
usage: {
|
|
690
|
+
totalSeconds: task.usage.total_seconds,
|
|
691
|
+
inputSeconds: task.usage.input_seconds,
|
|
692
|
+
outputSeconds: task.usage.output_seconds,
|
|
693
|
+
},
|
|
694
|
+
}
|
|
695
|
+
: {}),
|
|
656
696
|
},
|
|
657
|
-
}
|
|
658
|
-
}
|
|
697
|
+
},
|
|
698
|
+
};
|
|
699
|
+
}
|
|
659
700
|
|
|
660
|
-
|
|
661
|
-
|
|
701
|
+
case 'failed': {
|
|
702
|
+
return {
|
|
703
|
+
status: 'error',
|
|
704
|
+
response,
|
|
705
|
+
error: new AISDKError({
|
|
662
706
|
name: 'MINIMAX_VIDEO_GENERATION_FAILED',
|
|
663
707
|
message: `MiniMax video generation failed${
|
|
664
708
|
task.error?.message ? `: ${task.error.message}` : ''
|
|
665
709
|
}${task.error?.code != null ? ` (${task.error.code})` : ''}. Task ID: ${taskId}`,
|
|
666
|
-
})
|
|
667
|
-
}
|
|
710
|
+
}),
|
|
711
|
+
};
|
|
712
|
+
}
|
|
668
713
|
|
|
669
|
-
|
|
670
|
-
|
|
714
|
+
case 'cancelled': {
|
|
715
|
+
return {
|
|
716
|
+
status: 'error',
|
|
717
|
+
response,
|
|
718
|
+
error: new AISDKError({
|
|
671
719
|
name: 'MINIMAX_VIDEO_GENERATION_CANCELLED',
|
|
672
720
|
message: `MiniMax video generation was cancelled. Task ID: ${taskId}`,
|
|
673
|
-
})
|
|
674
|
-
}
|
|
721
|
+
}),
|
|
722
|
+
};
|
|
723
|
+
}
|
|
675
724
|
|
|
676
|
-
|
|
677
|
-
|
|
725
|
+
case 'expired': {
|
|
726
|
+
return {
|
|
727
|
+
status: 'error',
|
|
728
|
+
response,
|
|
729
|
+
error: new AISDKError({
|
|
678
730
|
name: 'MINIMAX_VIDEO_GENERATION_EXPIRED',
|
|
679
731
|
message: `MiniMax video generation request expired. Task ID: ${taskId}`,
|
|
680
|
-
})
|
|
681
|
-
}
|
|
732
|
+
}),
|
|
733
|
+
};
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
// 'queued' | 'running' | unknown → keep polling.
|
|
737
|
+
default:
|
|
738
|
+
return { status: 'pending', response };
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
async doGenerate(
|
|
743
|
+
options: MiniMaxVideoDoGenerateOptions,
|
|
744
|
+
): Promise<Awaited<ReturnType<NonNullable<VideoModelV4['doGenerate']>>>> {
|
|
745
|
+
const startResult = await this.doStart(options);
|
|
746
|
+
const operation = startResult.operation as MiniMaxVideoOperation;
|
|
747
|
+
const minimaxOptions = await parseProviderOptions({
|
|
748
|
+
provider: 'minimax',
|
|
749
|
+
providerOptions: options.providerOptions,
|
|
750
|
+
schema: minimaxVideoModelOptionsSchema,
|
|
751
|
+
});
|
|
752
|
+
const pollIntervalMs =
|
|
753
|
+
minimaxOptions?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
754
|
+
const pollTimeoutMs =
|
|
755
|
+
minimaxOptions?.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;
|
|
756
|
+
const startTime = Date.now();
|
|
682
757
|
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
758
|
+
while (true) {
|
|
759
|
+
await delay(pollIntervalMs, { abortSignal: options.abortSignal });
|
|
760
|
+
|
|
761
|
+
if (Date.now() - startTime > pollTimeoutMs) {
|
|
762
|
+
throw new AISDKError({
|
|
763
|
+
name: 'MINIMAX_VIDEO_GENERATION_TIMEOUT',
|
|
764
|
+
message: `MiniMax video generation timed out after ${pollTimeoutMs}ms. Task ID: ${operation.taskId}`,
|
|
765
|
+
});
|
|
686
766
|
}
|
|
767
|
+
|
|
768
|
+
const result = await this.getStatus({
|
|
769
|
+
operation,
|
|
770
|
+
headers: options.headers,
|
|
771
|
+
abortSignal: options.abortSignal,
|
|
772
|
+
});
|
|
773
|
+
if (result.status === 'pending') {
|
|
774
|
+
continue;
|
|
775
|
+
}
|
|
776
|
+
if (result.status === 'error') {
|
|
777
|
+
throw result.error;
|
|
778
|
+
}
|
|
779
|
+
return {
|
|
780
|
+
videos: result.videos,
|
|
781
|
+
warnings: [...startResult.warnings, ...result.warnings],
|
|
782
|
+
providerMetadata: {
|
|
783
|
+
...result.providerMetadata,
|
|
784
|
+
minimax: {
|
|
785
|
+
...result.providerMetadata?.minimax,
|
|
786
|
+
resolvedInputs: {
|
|
787
|
+
imageCount: operation.resolvedInputs.imageCount,
|
|
788
|
+
referenceVideoUrls:
|
|
789
|
+
operation.resolvedInputs.referenceVideoIndices.flatMap(
|
|
790
|
+
index => {
|
|
791
|
+
const file = options.inputReferences?.[index];
|
|
792
|
+
return file?.type === 'url' ? [file.url] : [];
|
|
793
|
+
},
|
|
794
|
+
),
|
|
795
|
+
},
|
|
796
|
+
},
|
|
797
|
+
},
|
|
798
|
+
response: {
|
|
799
|
+
...result.response,
|
|
800
|
+
timestamp: startResult.response.timestamp,
|
|
801
|
+
},
|
|
802
|
+
};
|
|
687
803
|
}
|
|
688
804
|
}
|
|
689
805
|
}
|