
























@@ -39,6 +39,13 @@ type OpenAIVideoRequestPolicy = {
39394040type OpenAIVideoStatus = "queued" | "in_progress" | "completed" | "failed";
414142+type OpenAIReferenceAsset = {
43+kind: "image" | "video";
44+file: File;
45+buffer: Buffer;
46+mimeType: string;
47+};
48+4249type OpenAIVideoResponse = {
4350id?: string;
4451model?: string;
@@ -99,7 +106,7 @@ function resolveSize(params: {
99106return undefined;
100107}
101108102-function resolveReferenceAsset(req: VideoGenerationRequest) {
109+function resolveReferenceAsset(req: VideoGenerationRequest): OpenAIReferenceAsset | null {
103110const allAssets = [...(req.inputImages ?? []), ...(req.inputVideos ?? [])];
104111if (allAssets.length === 0) {
105112return null;
@@ -113,15 +120,20 @@ function resolveReferenceAsset(req: VideoGenerationRequest) {
113120"OpenAI video generation currently requires local image/video uploads for reference assets.",
114121);
115122}
123+const kind = (req.inputVideos?.length ?? 0) > 0 ? "video" : "image";
116124const mimeType =
117-normalizeOptionalString(asset.mimeType) ||
118-((req.inputVideos?.length ?? 0) > 0 ? "video/mp4" : "image/png");
125+normalizeOptionalString(asset.mimeType) || (kind === "video" ? "video/mp4" : "image/png");
119126const extension =
120127extensionForMime(mimeType)?.slice(1) ?? (mimeType.startsWith("video/") ? "mp4" : "png");
121128const fileName =
122129normalizeOptionalString(asset.fileName) ||
123-`${(req.inputVideos?.length ?? 0) > 0 ? "reference-video" : "reference-image"}.${extension}`;
124-return new File([toBlobBytes(asset.buffer)], fileName, { type: mimeType });
130+`${kind === "video" ? "reference-video" : "reference-image"}.${extension}`;
131+return {
132+ kind,
133+file: new File([toBlobBytes(asset.buffer)], fileName, { type: mimeType }),
134+buffer: asset.buffer,
135+ mimeType,
136+};
125137}
126138127139async function pollOpenAIVideo(
@@ -285,10 +297,6 @@ export function buildOpenAIVideoGenerationProvider(): VideoGenerationProvider {
285297enabled: true,
286298maxVideos: 1,
287299maxInputVideos: 1,
288-maxDurationSeconds: 12,
289-supportedDurationSeconds: OPENAI_VIDEO_SECONDS,
290-supportsSize: true,
291-sizes: OPENAI_VIDEO_SIZES,
292300},
293301},
294302async generateVideo(req) {
@@ -328,27 +336,22 @@ export function buildOpenAIVideoGenerationProvider(): VideoGenerationProvider {
328336aspectRatio: req.aspectRatio,
329337resolution: req.resolution,
330338});
331-const inputImage = req.inputImages?.[0];
332339const referenceAsset = resolveReferenceAsset(req);
333-const requestUrl = `${baseUrl}/videos`;
334340const requestResult = referenceAsset
335- ? inputImage?.buffer
341+ ? referenceAsset.kind === "image"
336342 ? await (() => {
337343const jsonHeaders = new Headers(headers);
338344jsonHeaders.set("Content-Type", "application/json");
339345return postJsonRequest({
340-url: requestUrl,
346+url: `${baseUrl}/videos`,
341347headers: jsonHeaders,
342348body: {
343349prompt: req.prompt,
344350 model,
345351 ...(seconds ? { seconds } : {}),
346352 ...(size ? { size } : {}),
347353input_reference: {
348-image_url: toOpenAIDataUrl(
349-inputImage.buffer,
350-normalizeOptionalString(inputImage.mimeType) ?? "image/png",
351-),
354+image_url: toOpenAIDataUrl(referenceAsset.buffer, referenceAsset.mimeType),
352355},
353356},
354357timeoutMs: resolveProviderOperationTimeoutMs({
@@ -364,17 +367,11 @@ export function buildOpenAIVideoGenerationProvider(): VideoGenerationProvider {
364367const form = new FormData();
365368form.set("prompt", req.prompt);
366369form.set("model", model);
367-if (seconds) {
368-form.set("seconds", seconds);
369-}
370-if (size) {
371-form.set("size", size);
372-}
373-form.set("input_reference", referenceAsset);
370+form.set("video", referenceAsset.file);
374371const multipartHeaders = new Headers(headers);
375372multipartHeaders.delete("Content-Type");
376373return postMultipartRequest({
377-url: requestUrl,
374+url: `${baseUrl}/videos/edits`,
378375headers: multipartHeaders,
379376body: form,
380377timeoutMs: resolveProviderOperationTimeoutMs({
@@ -390,7 +387,7 @@ export function buildOpenAIVideoGenerationProvider(): VideoGenerationProvider {
390387const jsonHeaders = new Headers(headers);
391388jsonHeaders.set("Content-Type", "application/json");
392389return postJsonRequest({
393-url: requestUrl,
390+url: `${baseUrl}/videos`,
394391headers: jsonHeaders,
395392body: {
396393prompt: req.prompt,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。