From 778fd065ec20a77963c9376e7c63fb312da8b2b7 Mon Sep 17 00:00:00 2001 From: HouYunFei <1844025705@qq.com> Date: Tue, 26 May 2026 10:19:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(image):=20=E4=BF=AE=E5=A4=8D=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E7=94=9F=E6=88=90=E5=92=8C=E7=BC=96=E8=BE=91=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E4=B8=AD=E5=B0=BA=E5=AF=B8=E5=8F=82=E6=95=B0=E4=BC=A0?= =?UTF-8?q?=E9=80=92=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 resolveRequestSize 函数处理尺寸参数解析逻辑 - 将 pixelSize 变量重命名为 requestSize 以提高代码可读性 - 修复当尺寸为 auto 时不发送 size 参数的功能 - 确保所有非 auto 尺寸值都会正确传递到请求中 - 更新图片生成和编辑函数中的尺寸参数处理逻辑 --- docs/pending-test.md | 1 + web/src/services/api/image.ts | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/docs/pending-test.md b/docs/pending-test.md index 453d3bb..6c58e61 100644 --- a/docs/pending-test.md +++ b/docs/pending-test.md @@ -1,5 +1,6 @@ # 待测试 +- 修复画布和生图工作台选择图片尺寸后,请求图片生成/编辑接口未携带 `size` 参数的问题;`auto` 不传,其余比例或像素尺寸会随请求发送。 - 修复生图工作台和画布生图请求中 `quality` 参数可能传入上游不支持值导致 400 的问题;请求前会归一化质量枚举,`auto` 或异常值不再发送给上游。 - 管理后台新增/编辑渠道时,渠道可用模型支持通过弹窗按“新获取、已有”分组选择,并可在弹窗内手动增加模型或拉取模型列表后再写回表单。 - 管理后台编辑渠道时,API Key 留空不再触发必填校验,表示沿用已保存的密钥;新增渠道仍要求填写 API Key。 diff --git a/web/src/services/api/image.ts b/web/src/services/api/image.ts index b5a1d4c..938fb85 100644 --- a/web/src/services/api/image.ts +++ b/web/src/services/api/image.ts @@ -63,6 +63,13 @@ function resolveSize(quality: string, ratio: string): string | undefined { return `${width}x${height}`; } +function resolveRequestSize(quality: string | undefined, size: string) { + const value = size.trim(); + if (!value || value === "auto") return undefined; + if (/^\d+x\d+$/.test(value)) return value; + return (quality && resolveSize(quality, value)) || value; +} + function resolveImageDataUrl(item: Record) { if (typeof item.b64_json === "string" && item.b64_json) { return `data:image/png;base64,${item.b64_json}`; @@ -146,7 +153,7 @@ function withSystemMessage(config: AiConfig, messages: ChatCompletionMessage[]) export async function requestGeneration(config: AiConfig, prompt: string) { const n = Math.max(1, Math.min(15, Math.floor(Math.abs(Number(config.count)) || 1))); const quality = normalizeQuality(config.quality); - const pixelSize = quality ? resolveSize(quality, config.size) : undefined; + const requestSize = resolveRequestSize(quality, config.size); try { const response = await axios.post( aiApiUrl(config, "/images/generations"), @@ -155,7 +162,7 @@ export async function requestGeneration(config: AiConfig, prompt: string) { prompt: withSystemPrompt(config, prompt), n, ...(quality ? { quality } : {}), - ...(pixelSize ? { size: pixelSize } : {}), + ...(requestSize ? { size: requestSize } : {}), response_format: "b64_json", }, { @@ -173,7 +180,7 @@ export async function requestGeneration(config: AiConfig, prompt: string) { export async function requestEdit(config: AiConfig, prompt: string, references: ReferenceImage[]) { const n = Math.max(1, Math.min(15, Math.floor(Math.abs(Number(config.count)) || 1))); const quality = normalizeQuality(config.quality); - const pixelSize = quality ? resolveSize(quality, config.size) : undefined; + const requestSize = resolveRequestSize(quality, config.size); const formData = new FormData(); formData.set("model", config.model); formData.set("prompt", withSystemPrompt(config, prompt)); @@ -182,8 +189,8 @@ export async function requestEdit(config: AiConfig, prompt: string, references: if (quality) { formData.set("quality", quality); } - if (pixelSize) { - formData.set("size", pixelSize); + if (requestSize) { + formData.set("size", requestSize); } const files = await Promise.all(references.map(async (image) => dataUrlToFile({ ...image, dataUrl: await imageToDataUrl(image) }))); files.forEach((file) => formData.append("image", file));