diff --git a/lib/ai/providers/alibaba-image.ts b/lib/ai/providers/alibaba-image.ts index a59904d3a..b0ab61dc4 100644 --- a/lib/ai/providers/alibaba-image.ts +++ b/lib/ai/providers/alibaba-image.ts @@ -382,10 +382,15 @@ export function createAlibabaImage({ apiKey, baseURL }: AlibabaImageConfig) { // 根据宽高比计算实际分辨率 // 阿里云 API 要求宽高在 512-2048 之间 - const calculateSize = (ratio: string, base: number): string => { + const calculateSize = (ratio: string, base: number): string | null => { + // 如果是 auto 模式,返回 null,让 API 根据输入图片自动决定 + // 根据阿里云文档:默认(不指定时):总像素接近 1024*1024,宽高比与输入图(多图输入时为最后一张)一致 + if (ratio === "auto") { + return null; + } + // 解析宽高比 const ratioMap: Record = { - "auto": [1, 1], "1:1": [1, 1], "16:9": [16, 9], "9:16": [9, 16], @@ -446,16 +451,25 @@ export function createAlibabaImage({ apiKey, baseURL }: AlibabaImageConfig) { return `${width}*${height}`; }; - // 如果用户直接指定了 size,使用用户指定的 + // 处理 size 参数 + // 1. 如果用户直接指定了 size,使用用户指定的 + // 2. 如果是 auto 模式,不传 size,让 API 根据输入图片自动决定比例 + // 3. 如果指定了具体比例,根据 aspectRatio 和 imageSize 计算 if (options.imageParams?.size) { params.size = options.imageParams.size; + console.log(`[Alibaba Image] Using user-specified size: ${params.size}`); } else { - // 否则根据 aspectRatio 和 imageSize 计算 - params.size = calculateSize(aspectRatio, baseSize); + const calculatedSize = calculateSize(aspectRatio, baseSize); + if (calculatedSize) { + params.size = calculatedSize; + console.log(`[Alibaba Image] Calculated size: aspectRatio=${aspectRatio}, imageSize=${imageSize} => size=${params.size}`); + } else { + // auto 模式:不设置 size,让 API 根据输入图片自动决定 + // 阿里云会保持输入图片的宽高比,总像素接近 1024*1024 + console.log(`[Alibaba Image] Auto mode: not setting size, API will use input image's aspect ratio`); + } } - console.log(`[Alibaba Image] Calculated size: aspectRatio=${aspectRatio}, imageSize=${imageSize} => size=${params.size}`); - // 根据图片数量确定编辑模式 const editMode = imageUrls.length === 1 ? "单图编辑" : `多图融合 (${imageUrls.length}张)`; console.log("[Alibaba Image] 编辑模式:", editMode);