@ai-sdk/minimax 3.0.2 → 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @ai-sdk/minimax
2
2
 
3
+ ## 3.0.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 79e133c: async APIs for generateVideo (poll, webhook)
8
+
9
+ Adds an asynchronous start/status flow to the experimental video model
10
+ interface (`VideoModelV4`): models may now implement `doStart`, `doStatus`,
11
+ and `handleWebhookOption` instead of (or in addition to) `doGenerate`, and
12
+ `experimental_generateVideo` accepts `poll` and `webhook` options to
13
+ orchestrate completion via polling or webhooks. Polling configuration can use
14
+ a custom delay implementation for durable workflow compatibility.
15
+
16
+ - Updated dependencies [9337ecd]
17
+ - Updated dependencies [79e133c]
18
+ - @ai-sdk/anthropic@4.0.28
19
+ - @ai-sdk/provider@4.0.5
20
+ - @ai-sdk/provider-utils@5.0.19
21
+
22
+ ## 3.0.3
23
+
24
+ ### Patch Changes
25
+
26
+ - 494f1ac: fix(provider/minimax): send a default `16:9` ratio for MiniMax-H3 text-to-video
27
+
3
28
  ## 3.0.2
4
29
 
5
30
  ### Patch Changes
package/dist/index.js CHANGED
@@ -73,6 +73,7 @@ var minimaxVideoModelOptionsSchema = lazySchema(
73
73
 
74
74
  // src/minimax-video-model.ts
75
75
  var DEFAULT_RESOLUTION = "2K";
76
+ var DEFAULT_ASPECT_RATIO = "16:9";
76
77
  var DEFAULT_POLL_INTERVAL_MS = 1e4;
77
78
  var DEFAULT_POLL_TIMEOUT_MS = 6e5;
78
79
  var MIN_DURATION_SECONDS = 5;
@@ -324,6 +325,7 @@ var MiniMaxVideoModel = class {
324
325
  }
325
326
  }
326
327
  }
328
+ const isTextToVideo = content.length === 1;
327
329
  let ratio = minimaxOptions == null ? void 0 : minimaxOptions.ratio;
328
330
  if (ratio == null && options.aspectRatio != null) {
329
331
  if (allowedRatios.has(options.aspectRatio)) {
@@ -332,10 +334,21 @@ var MiniMaxVideoModel = class {
332
334
  warnings.push({
333
335
  type: "unsupported",
334
336
  feature: "aspectRatio",
335
- details: `MiniMax-H3 does not support the aspect ratio "${options.aspectRatio}". Using the provider default (adaptive).`
337
+ details: isTextToVideo ? `MiniMax-H3 does not support the aspect ratio "${options.aspectRatio}". Using the default (${DEFAULT_ASPECT_RATIO}).` : `MiniMax-H3 does not support the aspect ratio "${options.aspectRatio}". Using the provider default (adaptive).`
336
338
  });
339
+ if (isTextToVideo) {
340
+ ratio = DEFAULT_ASPECT_RATIO;
341
+ }
337
342
  }
338
343
  }
344
+ if (ratio === "adaptive" && isTextToVideo) {
345
+ warnings.push({
346
+ type: "unsupported",
347
+ feature: "aspectRatio",
348
+ details: `MiniMax-H3 text-to-video does not support the adaptive aspect ratio. Using the default (${DEFAULT_ASPECT_RATIO}).`
349
+ });
350
+ ratio = DEFAULT_ASPECT_RATIO;
351
+ }
339
352
  if (usesFrameImages && ratio != null) {
340
353
  warnings.push({
341
354
  type: "unsupported",
@@ -344,6 +357,9 @@ var MiniMaxVideoModel = class {
344
357
  });
345
358
  ratio = void 0;
346
359
  }
360
+ if (ratio == null && isTextToVideo) {
361
+ ratio = DEFAULT_ASPECT_RATIO;
362
+ }
347
363
  let duration = (_k = options.duration) != null ? _k : MIN_DURATION_SECONDS;
348
364
  if (options.duration != null) {
349
365
  if (!Number.isInteger(duration)) {
@@ -544,7 +560,7 @@ var minimaxVideoFailedResponseHandler = createJsonErrorResponseHandler({
544
560
  });
545
561
 
546
562
  // src/version.ts
547
- var VERSION = true ? "3.0.2" : "0.0.0-test";
563
+ var VERSION = true ? "3.0.4" : "0.0.0-test";
548
564
 
549
565
  // src/minimax-provider.ts
550
566
  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,\n type Experimental_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 Experimental_VideoModelV4['doGenerate']\n>[0];\n\nconst DEFAULT_RESOLUTION = '2K';\nconst DEFAULT_POLL_INTERVAL_MS = 10_000;\nconst DEFAULT_POLL_TIMEOUT_MS = 600_000;\nconst MIN_DURATION_SECONDS = 5;\nconst MAX_DURATION_SECONDS = 15;\nconst MAX_REFERENCE_IMAGES = 9;\nconst MAX_REFERENCE_VIDEOS = 3;\nconst MAX_REFERENCE_AUDIOS = 3;\n\nconst allowedRatios = new Set<string>(minimaxVideoRatios);\nconst allowedResolutions = new Set<string>(minimaxVideoResolutions);\n\n// The top-level `resolution` is `{width}x{height}`, but the API takes a named\n// tier, so map the canonical 2K frame sizes onto the single tier H3 supports.\n// Anything else can't be honored and warns.\n// One canonical frame size per ratio H3 supports, so a caller who pairs a\n// resolution with any supported ratio resolves to the tier instead of being\n// told 2K is unsupported.\nconst RESOLUTION_MAP: Record<string, string> = {\n // Square\n '2048x2048': '2K',\n // Landscape\n '2560x1080': '2K',\n '2560x1440': '2K',\n '2048x1536': '2K',\n // Portrait\n '1440x2560': '2K',\n '1536x2048': '2K',\n};\n\n// A caller may pass the named tier itself rather than a frame size — `2K` is\n// what the MiniMax API takes, so it is the natural thing to send. Accept it\n// case-insensitively instead of reporting it as unrecognized.\nfunction resolveTopLevelResolution(resolution: string): string | undefined {\n const named = resolution.toUpperCase();\n return allowedResolutions.has(named) ? named : RESOLUTION_MAP[resolution];\n}\n\n// Frame images must be images. Returns the offending top-level media type when\n// a frame is something else, so it can be rejected the way a reference input of\n// the wrong kind is. A frame with no media type is left alone: the core emits\n// URL inputs without one, and unlike a reference there is no routing decision\n// riding on it.\nfunction nonImageFrameMediaType(\n file: Experimental_VideoModelV4File,\n): string | undefined {\n if (file.mediaType == null) {\n return undefined;\n }\n\n const topLevelMediaType = getTopLevelMediaType(file.mediaType);\n return topLevelMediaType === 'image' ? undefined : topLevelMediaType;\n}\n\nexport class MiniMaxVideoModel implements Experimental_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<Experimental_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: 'MiniMax-H3 does not support a custom frame rate.',\n });\n }\n\n if (options.seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details: 'MiniMax-H3 does not support a seed.',\n });\n }\n\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'MiniMax-H3 generates a single video per call. Only 1 video will be generated.',\n });\n }\n\n if (options.generateAudio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'generateAudio',\n details:\n 'The MiniMax-H3 API does not expose an audio parameter. The generateAudio option was ignored.',\n });\n }\n\n // Resolution: the API takes a named tier, so an explicit provider option\n // wins and a top-level value is resolved to a tier.\n let resolution: string | undefined = minimaxOptions?.resolution;\n if (options.resolution != null) {\n const mapped = resolveTopLevelResolution(options.resolution);\n if (resolution != null) {\n // The provider option is already a tier, so the only way the two can\n // disagree is a top-level value that maps to no tier at all.\n if (mapped == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n `Unrecognized resolution \"${options.resolution}\". MiniMax-H3 only supports \"2K\", ` +\n `so providerOptions.minimax.resolution (\"${resolution}\") was used instead.`,\n });\n }\n } else if (mapped != null) {\n resolution = mapped;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n `Unrecognized resolution \"${options.resolution}\". MiniMax-H3 only ` +\n 'supports \"2K\".',\n });\n }\n }\n resolution ??= DEFAULT_RESOLUTION;\n\n // `convertImageModelFileToDataUri` passes `url` files through unchanged and\n // encodes inline data as a data URI. MiniMax `mm_file://…` handles survive\n // that pass-through, but not the core `generateVideo` path: it base64-decodes\n // any string that is not `http(s)://` or `data:`, so `mm_file://` only\n // reaches the API through `providerOptions.minimax.referenceAudioUrls`,\n // which is forwarded raw — not through `image`, `frameImages`, or\n // `inputReferences`.\n const content: Array<Record<string, unknown>> = [\n { type: 'text', text: options.prompt ?? '' },\n ];\n\n // The inputs that actually make it into `content` below, after the caps and\n // rejections H3 imposes. Reported as `providerMetadata.minimax\n // .resolvedInputs`: the warnings say an input was dropped, but not how many\n // survived, which callers that meter usage need. Accumulated at the push\n // sites rather than re-derived, so the two cannot disagree.\n let sentImageCount = 0;\n const sentReferenceVideoUrls: string[] = [];\n\n // Resolve first/last frame inputs. A standalone `image` is treated as the\n // first frame (image-to-video). The core sets `image` to the `first_frame`\n // frame image when there is one, so the frame-image entry is tracked\n // separately to report which input a warning came from.\n const firstFrameImage = options.frameImages?.find(\n frame => frame.frameType === 'first_frame',\n )?.image;\n let firstFrame = firstFrameImage ?? options.image;\n let lastFrame = options.frameImages?.find(\n frame => frame.frameType === 'last_frame',\n )?.image;\n\n // Reject unusable frames before deciding the generation mode.\n const firstFrameMediaType =\n firstFrame != null ? nonImageFrameMediaType(firstFrame) : undefined;\n if (firstFrame != null && firstFrameMediaType != null) {\n warnings.push({\n type: 'unsupported',\n feature: firstFrameImage != null ? 'frameImages' : 'image',\n details:\n firstFrameMediaType === 'video'\n ? 'MiniMax-H3 does not accept a video as a frame image. The video was ignored.'\n : `MiniMax-H3 only accepts an image as a frame image; the \"${firstFrame.mediaType}\" file was ignored.`,\n });\n firstFrame = undefined;\n }\n\n if (lastFrame != null) {\n if (firstFrame == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'MiniMax-H3 requires a first_frame when a last_frame is provided. The last_frame was ignored.',\n });\n lastFrame = undefined;\n } else {\n const lastFrameMediaType = nonImageFrameMediaType(lastFrame);\n if (lastFrameMediaType != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n lastFrameMediaType === 'video'\n ? 'MiniMax-H3 does not accept a video as a frame image. The last_frame video was ignored.'\n : `MiniMax-H3 only accepts an image as a frame image; the \"${lastFrame.mediaType}\" last_frame was ignored.`,\n });\n lastFrame = undefined;\n }\n }\n }\n\n const usesFrameImages = firstFrame != null || lastFrame != null;\n\n const referenceFiles = options.inputReferences ?? [];\n const referenceAudioUrls = minimaxOptions?.referenceAudioUrls ?? [];\n const usesReferences =\n referenceFiles.length > 0 || referenceAudioUrls.length > 0;\n\n if (usesFrameImages) {\n if (firstFrame != null) {\n content.push({\n type: 'image_url',\n image_url: { url: convertImageModelFileToDataUri(firstFrame) },\n role: 'first_frame',\n });\n sentImageCount++;\n }\n\n if (lastFrame != null) {\n content.push({\n type: 'image_url',\n image_url: { url: convertImageModelFileToDataUri(lastFrame) },\n role: 'last_frame',\n });\n sentImageCount++;\n }\n\n // Frame images and reference inputs are mutually exclusive.\n if (usesReferences) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'MiniMax-H3 cannot combine frame images with reference inputs. The references were ignored.',\n });\n }\n } else if (usesReferences) {\n const referenceImages: Experimental_VideoModelV4File[] = [];\n const referenceVideos: Experimental_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 let ratio = minimaxOptions?.ratio as string | undefined;\n if (ratio == null && options.aspectRatio != null) {\n if (allowedRatios.has(options.aspectRatio)) {\n ratio = options.aspectRatio;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n `MiniMax-H3 does not support the aspect ratio \"${options.aspectRatio}\". ` +\n 'Using the provider default (adaptive).',\n });\n }\n }\n if (usesFrameImages && ratio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'MiniMax-H3 derives the aspect ratio from the frame image; the requested ratio was ignored.',\n });\n ratio = undefined;\n }\n\n // H3 takes an integer between 5 and 15, so round before clamping: a\n // fractional duration is rejected by the API just as an out-of-range one is.\n let duration = options.duration ?? MIN_DURATION_SECONDS;\n if (options.duration != null) {\n if (!Number.isInteger(duration)) {\n duration = Math.round(duration);\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `MiniMax-H3 requires a whole number of seconds. The requested duration of ${options.duration} was rounded to ${duration}.`,\n });\n }\n\n if (duration > MAX_DURATION_SECONDS) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `MiniMax-H3 supports at most ${MAX_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MAX_DURATION_SECONDS}.`,\n });\n duration = MAX_DURATION_SECONDS;\n } else if (duration < MIN_DURATION_SECONDS) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `MiniMax-H3 requires at least ${MIN_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MIN_DURATION_SECONDS}.`,\n });\n duration = MIN_DURATION_SECONDS;\n }\n }\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n content,\n resolution,\n duration,\n };\n if (ratio != null) {\n body.ratio = ratio;\n }\n if (minimaxOptions?.aigcWatermark != null) {\n body.aigc_watermark = minimaxOptions.aigcWatermark;\n }\n\n const baseURL = this.config.baseURL;\n\n const { value: createResponse } = await postJsonToApi({\n url: `${baseURL}/v2/video_generation`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body,\n failedResponseHandler: minimaxVideoFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n minimaxCreateVideoResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const taskId = createResponse.task_id;\n if (!taskId) {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_ERROR',\n message: `No task_id returned from the MiniMax API. Response: ${JSON.stringify(createResponse)}`,\n });\n }\n\n const pollIntervalMs =\n minimaxOptions?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const pollTimeoutMs =\n minimaxOptions?.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;\n const startTime = Date.now();\n let responseHeaders: Record<string, string> | undefined;\n\n while (true) {\n await delay(pollIntervalMs, { abortSignal: options.abortSignal });\n\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_TIMEOUT',\n message: `MiniMax video generation timed out after ${pollTimeoutMs}ms. Task ID: ${taskId}`,\n });\n }\n\n const { value: statusResponse, responseHeaders: pollHeaders } =\n await getFromApi({\n url: `${baseURL}/v2/query/video_generation/${taskId}`,\n validateUrl: false,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n minimaxVideoStatusResponseSchema,\n ),\n failedResponseHandler: minimaxVideoFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n responseHeaders = pollHeaders;\n const task = statusResponse.task;\n\n switch (task.status) {\n case 'succeeded': {\n const url = task.content?.url;\n if (!url) {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_ERROR',\n message: `MiniMax video generation completed but no video URL was returned. Task ID: ${taskId}`,\n });\n }\n\n return {\n videos: [\n {\n type: 'url' as const,\n url,\n mediaType: 'video/mp4',\n },\n ],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n minimax: {\n taskId,\n videoUrl: url,\n resolvedInputs: {\n imageCount: sentImageCount,\n referenceVideoUrls: sentReferenceVideoUrls,\n },\n ...(task.duration != null ? { duration: task.duration } : {}),\n ...(task.ratio != null ? { ratio: task.ratio } : {}),\n ...(task.resolution != null\n ? { resolution: task.resolution }\n : {}),\n ...(task.usage != null\n ? {\n usage: {\n totalSeconds: task.usage.total_seconds,\n inputSeconds: task.usage.input_seconds,\n outputSeconds: task.usage.output_seconds,\n },\n }\n : {}),\n },\n },\n };\n }\n\n case 'failed': {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_FAILED',\n message: `MiniMax video generation failed${\n task.error?.message ? `: ${task.error.message}` : ''\n }${task.error?.code != null ? ` (${task.error.code})` : ''}. Task ID: ${taskId}`,\n });\n }\n\n case 'cancelled': {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_CANCELLED',\n message: `MiniMax video generation was cancelled. Task ID: ${taskId}`,\n });\n }\n\n case 'expired': {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_EXPIRED',\n message: `MiniMax video generation request expired. Task ID: ${taskId}`,\n });\n }\n\n // 'queued' | 'running' | unknown → keep polling.\n default:\n break;\n }\n }\n }\n}\n\nconst minimaxCreateVideoResponseSchema = z.object({\n task_id: z.string().nullish(),\n});\n\nconst minimaxVideoStatusResponseSchema = z.object({\n task: z.object({\n id: z.string().nullish(),\n status: z.string().nullish(),\n content: z\n .object({\n url: z.string().nullish(),\n })\n .nullish(),\n resolution: z.string().nullish(),\n duration: z.number().nullish(),\n ratio: z.string().nullish(),\n usage: z\n .object({\n total_seconds: z.number().nullish(),\n input_seconds: z.number().nullish(),\n output_seconds: z.number().nullish(),\n })\n .nullish(),\n error: z\n .object({\n code: z.union([z.string(), z.number()]).nullish(),\n message: z.string().nullish(),\n })\n .nullish(),\n }),\n});\n\nconst minimaxVideoErrorSchema = z.object({\n type: z.string().nullish(),\n error: z\n .object({\n type: z.string().nullish(),\n message: z.string().nullish(),\n http_code: z.union([z.string(), z.number()]).nullish(),\n })\n .nullish(),\n request_id: z.string().nullish(),\n});\n\nconst minimaxVideoFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: minimaxVideoErrorSchema,\n errorToMessage: data =>\n data.error?.message ?? 'MiniMax video generation error',\n});\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Aspect ratios supported by the MiniMax-H3 video model.\n */\nexport const minimaxVideoRatios = [\n 'adaptive',\n '21:9',\n '16:9',\n '4:3',\n '1:1',\n '3:4',\n '9:16',\n] as const;\n\n/**\n * Output resolutions supported by the MiniMax-H3 video model.\n */\nexport const minimaxVideoResolutions = ['2K'] as const;\n\n/**\n * Provider options for MiniMax video generation.\n */\nexport const minimaxVideoProviderOptions = z.object({\n /**\n * Output resolution.\n */\n resolution: z.enum(minimaxVideoResolutions).optional(),\n\n /**\n * Aspect ratio of the generated video. Overrides the top-level `aspectRatio`.\n */\n ratio: z.enum(minimaxVideoRatios).optional(),\n\n /**\n * Reference audio URLs for reference-to-video generation.\n */\n referenceAudioUrls: z.array(z.string()).optional(),\n\n /**\n * Whether to embed an AIGC watermark in the output. Defaults to `false`.\n */\n aigcWatermark: z.boolean().optional(),\n\n /**\n * Interval in milliseconds between task status polls. Default: 10000.\n */\n pollIntervalMs: z.number().int().positive().optional(),\n\n /**\n * Maximum time in milliseconds to poll before timing out. Default: 600000.\n */\n pollTimeoutMs: z.number().int().positive().optional(),\n});\n\nexport type MiniMaxVideoModelOptions = z.infer<\n typeof minimaxVideoProviderOptions\n>;\n\nexport const minimaxVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(minimaxVideoProviderOptions),\n);\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z"]}
1
+ {"version":3,"sources":["../src/minimax-provider.ts","../src/minimax-video-model.ts","../src/minimax-video-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type Experimental_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,\n type Experimental_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<Experimental_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 MIN_DURATION_SECONDS = 5;\nconst MAX_DURATION_SECONDS = 15;\nconst MAX_REFERENCE_IMAGES = 9;\nconst MAX_REFERENCE_VIDEOS = 3;\nconst MAX_REFERENCE_AUDIOS = 3;\n\nconst allowedRatios = new Set<string>(minimaxVideoRatios);\nconst allowedResolutions = new Set<string>(minimaxVideoResolutions);\n\n// The top-level `resolution` is `{width}x{height}`, but the API takes a named\n// tier, so map the canonical 2K frame sizes onto the single tier H3 supports.\n// Anything else can't be honored and warns.\n// One canonical frame size per ratio H3 supports, so a caller who pairs a\n// resolution with any supported ratio resolves to the tier instead of being\n// told 2K is unsupported.\nconst RESOLUTION_MAP: Record<string, string> = {\n // Square\n '2048x2048': '2K',\n // Landscape\n '2560x1080': '2K',\n '2560x1440': '2K',\n '2048x1536': '2K',\n // Portrait\n '1440x2560': '2K',\n '1536x2048': '2K',\n};\n\n// A caller may pass the named tier itself rather than a frame size — `2K` is\n// what the MiniMax API takes, so it is the natural thing to send. Accept it\n// case-insensitively instead of reporting it as unrecognized.\nfunction resolveTopLevelResolution(resolution: string): string | undefined {\n const named = resolution.toUpperCase();\n return allowedResolutions.has(named) ? named : RESOLUTION_MAP[resolution];\n}\n\n// Frame images must be images. Returns the offending top-level media type when\n// a frame is something else, so it can be rejected the way a reference input of\n// the wrong kind is. A frame with no media type is left alone: the core emits\n// URL inputs without one, and unlike a reference there is no routing decision\n// riding on it.\nfunction nonImageFrameMediaType(\n file: Experimental_VideoModelV4File,\n): string | undefined {\n if (file.mediaType == null) {\n return undefined;\n }\n\n const topLevelMediaType = getTopLevelMediaType(file.mediaType);\n return topLevelMediaType === 'image' ? undefined : topLevelMediaType;\n}\n\nexport class MiniMaxVideoModel implements Experimental_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<\n Awaited<ReturnType<NonNullable<Experimental_VideoModelV4['doGenerate']>>>\n > {\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: 'MiniMax-H3 does not support a custom frame rate.',\n });\n }\n\n if (options.seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details: 'MiniMax-H3 does not support a seed.',\n });\n }\n\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'MiniMax-H3 generates a single video per call. Only 1 video will be generated.',\n });\n }\n\n if (options.generateAudio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'generateAudio',\n details:\n 'The MiniMax-H3 API does not expose an audio parameter. The generateAudio option was ignored.',\n });\n }\n\n // Resolution: the API takes a named tier, so an explicit provider option\n // wins and a top-level value is resolved to a tier.\n let resolution: string | undefined = minimaxOptions?.resolution;\n if (options.resolution != null) {\n const mapped = resolveTopLevelResolution(options.resolution);\n if (resolution != null) {\n // The provider option is already a tier, so the only way the two can\n // disagree is a top-level value that maps to no tier at all.\n if (mapped == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n `Unrecognized resolution \"${options.resolution}\". MiniMax-H3 only supports \"2K\", ` +\n `so providerOptions.minimax.resolution (\"${resolution}\") was used instead.`,\n });\n }\n } else if (mapped != null) {\n resolution = mapped;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n `Unrecognized resolution \"${options.resolution}\". MiniMax-H3 only ` +\n 'supports \"2K\".',\n });\n }\n }\n resolution ??= DEFAULT_RESOLUTION;\n\n // `convertImageModelFileToDataUri` passes `url` files through unchanged and\n // encodes inline data as a data URI. MiniMax `mm_file://…` handles survive\n // that pass-through, but not the core `generateVideo` path: it base64-decodes\n // any string that is not `http(s)://` or `data:`, so `mm_file://` only\n // reaches the API through `providerOptions.minimax.referenceAudioUrls`,\n // which is forwarded raw — not through `image`, `frameImages`, or\n // `inputReferences`.\n const content: Array<Record<string, unknown>> = [\n { type: 'text', text: options.prompt ?? '' },\n ];\n\n // The inputs that actually make it into `content` below, after the caps and\n // rejections H3 imposes. Reported as `providerMetadata.minimax\n // .resolvedInputs`: the warnings say an input was dropped, but not how many\n // survived, which callers that meter usage need. Accumulated at the push\n // sites rather than re-derived, so the two cannot disagree.\n let sentImageCount = 0;\n const sentReferenceVideoUrls: string[] = [];\n\n // Resolve first/last frame inputs. A standalone `image` is treated as the\n // first frame (image-to-video). The core sets `image` to the `first_frame`\n // frame image when there is one, so the frame-image entry is tracked\n // separately to report which input a warning came from.\n const firstFrameImage = options.frameImages?.find(\n frame => frame.frameType === 'first_frame',\n )?.image;\n let firstFrame = firstFrameImage ?? options.image;\n let lastFrame = options.frameImages?.find(\n frame => frame.frameType === 'last_frame',\n )?.image;\n\n // Reject unusable frames before deciding the generation mode.\n const firstFrameMediaType =\n firstFrame != null ? nonImageFrameMediaType(firstFrame) : undefined;\n if (firstFrame != null && firstFrameMediaType != null) {\n warnings.push({\n type: 'unsupported',\n feature: firstFrameImage != null ? 'frameImages' : 'image',\n details:\n firstFrameMediaType === 'video'\n ? 'MiniMax-H3 does not accept a video as a frame image. The video was ignored.'\n : `MiniMax-H3 only accepts an image as a frame image; the \"${firstFrame.mediaType}\" file was ignored.`,\n });\n firstFrame = undefined;\n }\n\n if (lastFrame != null) {\n if (firstFrame == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'MiniMax-H3 requires a first_frame when a last_frame is provided. The last_frame was ignored.',\n });\n lastFrame = undefined;\n } else {\n const lastFrameMediaType = nonImageFrameMediaType(lastFrame);\n if (lastFrameMediaType != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n lastFrameMediaType === 'video'\n ? 'MiniMax-H3 does not accept a video as a frame image. The last_frame video was ignored.'\n : `MiniMax-H3 only accepts an image as a frame image; the \"${lastFrame.mediaType}\" last_frame was ignored.`,\n });\n lastFrame = undefined;\n }\n }\n }\n\n const usesFrameImages = firstFrame != null || lastFrame != null;\n\n const referenceFiles = options.inputReferences ?? [];\n const referenceAudioUrls = minimaxOptions?.referenceAudioUrls ?? [];\n const usesReferences =\n referenceFiles.length > 0 || referenceAudioUrls.length > 0;\n\n if (usesFrameImages) {\n if (firstFrame != null) {\n content.push({\n type: 'image_url',\n image_url: { url: convertImageModelFileToDataUri(firstFrame) },\n role: 'first_frame',\n });\n sentImageCount++;\n }\n\n if (lastFrame != null) {\n content.push({\n type: 'image_url',\n image_url: { url: convertImageModelFileToDataUri(lastFrame) },\n role: 'last_frame',\n });\n sentImageCount++;\n }\n\n // Frame images and reference inputs are mutually exclusive.\n if (usesReferences) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'MiniMax-H3 cannot combine frame images with reference inputs. The references were ignored.',\n });\n }\n } else if (usesReferences) {\n const referenceImages: Experimental_VideoModelV4File[] = [];\n const referenceVideos: Experimental_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 ? `MiniMax-H3 does not support the aspect ratio \"${options.aspectRatio}\". Using the default (${DEFAULT_ASPECT_RATIO}).`\n : `MiniMax-H3 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 'MiniMax-H3 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:\n 'MiniMax-H3 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 // H3 takes an integer between 5 and 15, so round before clamping: a\n // fractional duration is rejected by the API just as an out-of-range one is.\n let duration = options.duration ?? MIN_DURATION_SECONDS;\n if (options.duration != null) {\n if (!Number.isInteger(duration)) {\n duration = Math.round(duration);\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `MiniMax-H3 requires a whole number of seconds. The requested duration of ${options.duration} was rounded to ${duration}.`,\n });\n }\n\n if (duration > MAX_DURATION_SECONDS) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `MiniMax-H3 supports at most ${MAX_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MAX_DURATION_SECONDS}.`,\n });\n duration = MAX_DURATION_SECONDS;\n } else if (duration < MIN_DURATION_SECONDS) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `MiniMax-H3 requires at least ${MIN_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MIN_DURATION_SECONDS}.`,\n });\n duration = MIN_DURATION_SECONDS;\n }\n }\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n content,\n resolution,\n duration,\n };\n if (ratio != null) {\n body.ratio = ratio;\n }\n if (minimaxOptions?.aigcWatermark != null) {\n body.aigc_watermark = minimaxOptions.aigcWatermark;\n }\n\n const baseURL = this.config.baseURL;\n\n const { value: createResponse } = await postJsonToApi({\n url: `${baseURL}/v2/video_generation`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body,\n failedResponseHandler: minimaxVideoFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n minimaxCreateVideoResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const taskId = createResponse.task_id;\n if (!taskId) {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_ERROR',\n message: `No task_id returned from the MiniMax API. Response: ${JSON.stringify(createResponse)}`,\n });\n }\n\n const pollIntervalMs =\n minimaxOptions?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const pollTimeoutMs =\n minimaxOptions?.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;\n const startTime = Date.now();\n let responseHeaders: Record<string, string> | undefined;\n\n while (true) {\n await delay(pollIntervalMs, { abortSignal: options.abortSignal });\n\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_TIMEOUT',\n message: `MiniMax video generation timed out after ${pollTimeoutMs}ms. Task ID: ${taskId}`,\n });\n }\n\n const { value: statusResponse, responseHeaders: pollHeaders } =\n await getFromApi({\n url: `${baseURL}/v2/query/video_generation/${taskId}`,\n validateUrl: false,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n minimaxVideoStatusResponseSchema,\n ),\n failedResponseHandler: minimaxVideoFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n responseHeaders = pollHeaders;\n const task = statusResponse.task;\n\n switch (task.status) {\n case 'succeeded': {\n const url = task.content?.url;\n if (!url) {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_ERROR',\n message: `MiniMax video generation completed but no video URL was returned. Task ID: ${taskId}`,\n });\n }\n\n return {\n videos: [\n {\n type: 'url' as const,\n url,\n mediaType: 'video/mp4',\n },\n ],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n minimax: {\n taskId,\n videoUrl: url,\n resolvedInputs: {\n imageCount: sentImageCount,\n referenceVideoUrls: sentReferenceVideoUrls,\n },\n ...(task.duration != null ? { duration: task.duration } : {}),\n ...(task.ratio != null ? { ratio: task.ratio } : {}),\n ...(task.resolution != null\n ? { resolution: task.resolution }\n : {}),\n ...(task.usage != null\n ? {\n usage: {\n totalSeconds: task.usage.total_seconds,\n inputSeconds: task.usage.input_seconds,\n outputSeconds: task.usage.output_seconds,\n },\n }\n : {}),\n },\n },\n };\n }\n\n case 'failed': {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_FAILED',\n message: `MiniMax video generation failed${\n task.error?.message ? `: ${task.error.message}` : ''\n }${task.error?.code != null ? ` (${task.error.code})` : ''}. Task ID: ${taskId}`,\n });\n }\n\n case 'cancelled': {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_CANCELLED',\n message: `MiniMax video generation was cancelled. Task ID: ${taskId}`,\n });\n }\n\n case 'expired': {\n throw new AISDKError({\n name: 'MINIMAX_VIDEO_GENERATION_EXPIRED',\n message: `MiniMax video generation request expired. Task ID: ${taskId}`,\n });\n }\n\n // 'queued' | 'running' | unknown → keep polling.\n default:\n break;\n }\n }\n }\n}\n\nconst minimaxCreateVideoResponseSchema = z.object({\n task_id: z.string().nullish(),\n});\n\nconst minimaxVideoStatusResponseSchema = z.object({\n task: z.object({\n id: z.string().nullish(),\n status: z.string().nullish(),\n content: z\n .object({\n url: z.string().nullish(),\n })\n .nullish(),\n resolution: z.string().nullish(),\n duration: z.number().nullish(),\n ratio: z.string().nullish(),\n usage: z\n .object({\n total_seconds: z.number().nullish(),\n input_seconds: z.number().nullish(),\n output_seconds: z.number().nullish(),\n })\n .nullish(),\n error: z\n .object({\n code: z.union([z.string(), z.number()]).nullish(),\n message: z.string().nullish(),\n })\n .nullish(),\n }),\n});\n\nconst minimaxVideoErrorSchema = z.object({\n type: z.string().nullish(),\n error: z\n .object({\n type: z.string().nullish(),\n message: z.string().nullish(),\n http_code: z.union([z.string(), z.number()]).nullish(),\n })\n .nullish(),\n request_id: z.string().nullish(),\n});\n\nconst minimaxVideoFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: minimaxVideoErrorSchema,\n errorToMessage: data =>\n data.error?.message ?? 'MiniMax video generation error',\n});\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Aspect ratios supported by the MiniMax-H3 video model.\n */\nexport const minimaxVideoRatios = [\n 'adaptive',\n '21:9',\n '16:9',\n '4:3',\n '1:1',\n '3:4',\n '9:16',\n] as const;\n\n/**\n * Output resolutions supported by the MiniMax-H3 video model.\n */\nexport const minimaxVideoResolutions = ['2K'] as const;\n\n/**\n * Provider options for MiniMax video generation.\n */\nexport const minimaxVideoProviderOptions = z.object({\n /**\n * Output resolution.\n */\n resolution: z.enum(minimaxVideoResolutions).optional(),\n\n /**\n * Aspect ratio of the generated video. Overrides the top-level `aspectRatio`.\n */\n ratio: z.enum(minimaxVideoRatios).optional(),\n\n /**\n * Reference audio URLs for reference-to-video generation.\n */\n referenceAudioUrls: z.array(z.string()).optional(),\n\n /**\n * Whether to embed an AIGC watermark in the output. Defaults to `false`.\n */\n aigcWatermark: z.boolean().optional(),\n\n /**\n * Interval in milliseconds between task status polls. Default: 10000.\n */\n pollIntervalMs: z.number().int().positive().optional(),\n\n /**\n * Maximum time in milliseconds to poll before timing out. Default: 600000.\n */\n pollTimeoutMs: z.number().int().positive().optional(),\n});\n\nexport type MiniMaxVideoModelOptions = z.infer<\n typeof minimaxVideoProviderOptions\n>;\n\nexport const minimaxVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(minimaxVideoProviderOptions),\n);\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/minimax",
3
- "version": "3.0.2",
3
+ "version": "3.0.4",
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/provider": "4.0.4",
29
- "@ai-sdk/provider-utils": "5.0.18",
30
- "@ai-sdk/anthropic": "4.0.27"
28
+ "@ai-sdk/anthropic": "4.0.28",
29
+ "@ai-sdk/provider": "4.0.5",
30
+ "@ai-sdk/provider-utils": "5.0.19"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "22.19.19",
@@ -39,10 +39,11 @@ interface MiniMaxVideoModelConfig {
39
39
  }
40
40
 
41
41
  type MiniMaxVideoDoGenerateOptions = Parameters<
42
- Experimental_VideoModelV4['doGenerate']
42
+ NonNullable<Experimental_VideoModelV4['doGenerate']>
43
43
  >[0];
44
44
 
45
45
  const DEFAULT_RESOLUTION = '2K';
46
+ const DEFAULT_ASPECT_RATIO = '16:9';
46
47
  const DEFAULT_POLL_INTERVAL_MS = 10_000;
47
48
  const DEFAULT_POLL_TIMEOUT_MS = 600_000;
48
49
  const MIN_DURATION_SECONDS = 5;
@@ -111,7 +112,9 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV4 {
111
112
 
112
113
  async doGenerate(
113
114
  options: MiniMaxVideoDoGenerateOptions,
114
- ): Promise<Awaited<ReturnType<Experimental_VideoModelV4['doGenerate']>>> {
115
+ ): Promise<
116
+ Awaited<ReturnType<NonNullable<Experimental_VideoModelV4['doGenerate']>>>
117
+ > {
115
118
  const currentDate = this.config._internal?.currentDate?.() ?? new Date();
116
119
  const warnings: SharedV4Warning[] = [];
117
120
 
@@ -396,6 +399,7 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV4 {
396
399
 
397
400
  // Aspect ratio. In frame-image mode the ratio follows the supplied image,
398
401
  // so an explicit ratio is ignored.
402
+ const isTextToVideo = content.length === 1;
399
403
  let ratio = minimaxOptions?.ratio as string | undefined;
400
404
  if (ratio == null && options.aspectRatio != null) {
401
405
  if (allowedRatios.has(options.aspectRatio)) {
@@ -404,12 +408,25 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV4 {
404
408
  warnings.push({
405
409
  type: 'unsupported',
406
410
  feature: 'aspectRatio',
407
- details:
408
- `MiniMax-H3 does not support the aspect ratio "${options.aspectRatio}". ` +
409
- 'Using the provider default (adaptive).',
411
+ details: isTextToVideo
412
+ ? `MiniMax-H3 does not support the aspect ratio "${options.aspectRatio}". Using the default (${DEFAULT_ASPECT_RATIO}).`
413
+ : `MiniMax-H3 does not support the aspect ratio "${options.aspectRatio}". Using the provider default (adaptive).`,
410
414
  });
415
+ if (isTextToVideo) {
416
+ ratio = DEFAULT_ASPECT_RATIO;
417
+ }
411
418
  }
412
419
  }
420
+ if (ratio === 'adaptive' && isTextToVideo) {
421
+ warnings.push({
422
+ type: 'unsupported',
423
+ feature: 'aspectRatio',
424
+ details:
425
+ 'MiniMax-H3 text-to-video does not support the adaptive aspect ratio. ' +
426
+ `Using the default (${DEFAULT_ASPECT_RATIO}).`,
427
+ });
428
+ ratio = DEFAULT_ASPECT_RATIO;
429
+ }
413
430
  if (usesFrameImages && ratio != null) {
414
431
  warnings.push({
415
432
  type: 'unsupported',
@@ -419,6 +436,9 @@ export class MiniMaxVideoModel implements Experimental_VideoModelV4 {
419
436
  });
420
437
  ratio = undefined;
421
438
  }
439
+ if (ratio == null && isTextToVideo) {
440
+ ratio = DEFAULT_ASPECT_RATIO;
441
+ }
422
442
 
423
443
  // H3 takes an integer between 5 and 15, so round before clamping: a
424
444
  // fractional duration is rejected by the API just as an out-of-range one is.