

























@@ -13,6 +13,7 @@ import {
1313waitProviderOperationPollInterval,
1414type ProviderOperationTimeoutMs,
1515} from "openclaw/plugin-sdk/provider-http";
16+import { readResponseWithLimit } from "openclaw/plugin-sdk/response-limit-runtime";
1617import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
1718import type {
1819GeneratedVideoAsset,
@@ -26,6 +27,7 @@ const DEFAULT_TIMEOUT_MS = 120_000;
2627const DEFAULT_OPERATION_TIMEOUT_MS = 1_200_000;
2728const POLL_INTERVAL_MS = 10_000;
2829const MAX_POLL_ATTEMPTS = 120;
30+const DEFAULT_GENERATED_VIDEO_MAX_BYTES = 16 * 1024 * 1024;
2931const MINIMAX_MODEL_ALLOWED_DURATIONS: Readonly<Record<string, readonly number[]>> = {
3032"MiniMax-Hailuo-2.3": [6, 10],
3133"MiniMax-Hailuo-02": [6, 10],
@@ -78,6 +80,14 @@ function resolveMinimaxVideoBaseUrl(
7880}
7981}
808283+function resolveGeneratedVideoMaxBytes(req: VideoGenerationRequest): number {
84+const configured = req.cfg.agents?.defaults?.mediaMaxMb;
85+if (typeof configured === "number" && Number.isFinite(configured) && configured > 0) {
86+return Math.floor(configured * 1024 * 1024);
87+}
88+return DEFAULT_GENERATED_VIDEO_MAX_BYTES;
89+}
90+8191function assertMinimaxBaseResp(baseResp: MinimaxBaseResp | undefined, context: string): void {
8292if (!baseResp || typeof baseResp.status_code !== "number" || baseResp.status_code === 0) {
8393return;
@@ -213,6 +223,7 @@ async function downloadVideoFromUrl(params: {
213223url: string;
214224timeoutMs?: ProviderOperationTimeoutMs;
215225fetchFn: typeof fetch;
226+maxBytes: number;
216227}): Promise<GeneratedVideoAsset> {
217228const response = await fetchProviderDownloadResponse({
218229url: params.url,
@@ -223,9 +234,12 @@ async function downloadVideoFromUrl(params: {
223234requestFailedMessage: "MiniMax generated video download failed",
224235});
225236const mimeType = normalizeOptionalString(response.headers.get("content-type")) ?? "video/mp4";
226-const arrayBuffer = await response.arrayBuffer();
237+const buffer = await readResponseWithLimit(response, params.maxBytes, {
238+onOverflow: ({ maxBytes }) =>
239+new Error(`MiniMax generated video download exceeds ${maxBytes} bytes`),
240+});
227241return {
228-buffer: Buffer.from(arrayBuffer),
242+ buffer,
229243 mimeType,
230244fileName: `video-1.${extensionForMime(mimeType)?.slice(1) ?? "mp4"}`,
231245};
@@ -237,6 +251,7 @@ async function downloadVideoFromFileId(params: {
237251timeoutMs?: ProviderOperationTimeoutMs;
238252baseUrl: string;
239253fetchFn: typeof fetch;
254+maxBytes: number;
240255}): Promise<GeneratedVideoAsset> {
241256const url = new URL(`${params.baseUrl}/v1/files/retrieve`);
242257url.searchParams.set("file_id", params.fileId);
@@ -267,9 +282,12 @@ async function downloadVideoFromFileId(params: {
267282requestFailedMessage: "MiniMax generated video download failed",
268283});
269284const mimeType = normalizeOptionalString(response.headers.get("content-type")) ?? "video/mp4";
270-const arrayBuffer = await response.arrayBuffer();
285+const buffer = await readResponseWithLimit(response, params.maxBytes, {
286+onOverflow: ({ maxBytes }) =>
287+new Error(`MiniMax generated video download exceeds ${maxBytes} bytes`),
288+});
271289return {
272-buffer: Buffer.from(arrayBuffer),
290+ buffer,
273291 mimeType,
274292fileName:
275293normalizeOptionalString(metadata.file?.filename) ||
@@ -413,6 +431,7 @@ function buildMinimaxVideoProvider(providerId: string): VideoGenerationProvider
413431defaultTimeoutMs: DEFAULT_TIMEOUT_MS,
414432}),
415433 fetchFn,
434+maxBytes: resolveGeneratedVideoMaxBytes(req),
416435})
417436 : fileId
418437 ? await downloadVideoFromFileId({
@@ -424,6 +443,7 @@ function buildMinimaxVideoProvider(providerId: string): VideoGenerationProvider
424443}),
425444 baseUrl,
426445 fetchFn,
446+maxBytes: resolveGeneratedVideoMaxBytes(req),
427447})
428448 : (() => {
429449throw new Error(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。