diff --git a/src/app/api/generate/route.ts b/src/app/api/generate/route.ts index 4967a13a..5b4d9ddf 100644 --- a/src/app/api/generate/route.ts +++ b/src/app/api/generate/route.ts @@ -2199,9 +2199,11 @@ async function generateWithWaveSpeed( const outputArrayBuffer = await outputResponse.arrayBuffer(); const outputSizeMB = outputArrayBuffer.byteLength / (1024 * 1024); + const rawContentType = outputResponse.headers.get("content-type"); const contentType = - outputResponse.headers.get("content-type") || - (isVideoModel ? "video/mp4" : "image/png"); + (rawContentType && rawContentType !== "application/octet-stream") + ? rawContentType + : (isVideoModel ? "video/mp4" : "image/png"); console.log(`[API:${requestId}] Output: ${contentType}, ${outputSizeMB.toFixed(2)}MB`); @@ -2323,7 +2325,7 @@ export async function POST(request: NextRequest) { id: selectedModel!.modelId, name: selectedModel!.displayName, provider: "replicate", - capabilities: ["text-to-image"], + capabilities: mediaType === "video" ? ["text-to-video"] : ["text-to-image"], description: null, }, prompt: prompt || "", @@ -2411,7 +2413,7 @@ export async function POST(request: NextRequest) { id: selectedModel!.modelId, name: selectedModel!.displayName, provider: "fal", - capabilities: ["text-to-image"], + capabilities: mediaType === "video" ? ["text-to-video"] : ["text-to-image"], description: null, }, prompt: prompt || "", @@ -2502,7 +2504,7 @@ export async function POST(request: NextRequest) { id: selectedModel!.modelId, name: selectedModel!.displayName, provider: "kie", - capabilities: ["text-to-image"], + capabilities: mediaType === "video" ? ["text-to-video"] : ["text-to-image"], description: null, }, prompt: prompt || "", @@ -2593,7 +2595,7 @@ export async function POST(request: NextRequest) { id: selectedModel!.modelId, name: selectedModel!.displayName, provider: "wavespeed", - capabilities: ["text-to-image"], + capabilities: mediaType === "video" ? ["text-to-video"] : ["text-to-image"], description: null, }, prompt: prompt || "", diff --git a/src/app/api/save-generation/route.ts b/src/app/api/save-generation/route.ts index 41fff9f2..c9ce94df 100644 --- a/src/app/api/save-generation/route.ts +++ b/src/app/api/save-generation/route.ts @@ -165,7 +165,10 @@ export async function POST(request: NextRequest) { } } - const contentType = response.headers.get("content-type") || (isVideo ? "video/mp4" : "image/png"); + const rawSaveContentType = response.headers.get("content-type"); + const contentType = (rawSaveContentType && rawSaveContentType !== "application/octet-stream") + ? rawSaveContentType + : (isVideo ? "video/mp4" : "image/png"); extension = getExtensionFromMime(contentType); const arrayBuffer = await response.arrayBuffer(); @@ -198,6 +201,11 @@ export async function POST(request: NextRequest) { } } + // Safety net: if extension resolved to "bin" but we know the media type, use correct extension + if (extension === "bin") { + extension = isVideo ? "mp4" : "png"; + } + // Compute content hash for deduplication const contentHash = computeContentHash(buffer);