From d8cb1d6ed25b636587ce7c6112f865d44c594bdd Mon Sep 17 00:00:00 2001 From: HouYunFei <1844025705@qq.com> Date: Mon, 25 May 2026 16:15:10 +0800 Subject: [PATCH] =?UTF-8?q?fix(image):=20=E4=BF=AE=E5=A4=8D=E5=9B=BE?= =?UTF-8?q?=E5=83=8F=E7=94=9F=E6=88=90=E4=B8=ADquality=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E4=BC=A0=E9=80=92=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加QUALITY_ALIASES映射表支持质量别名 - 实现normalizeQuality函数进行参数归一化 - 在requestGeneration和requestEdit中验证quality参数 - 防止auto或异常值传递给上游API导致400错误 - 更新FormData和POST请求中的quality参数处理逻辑 --- docs/pending-test.md | 2 ++ web/src/services/api/image.ts | 26 ++++++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/docs/pending-test.md b/docs/pending-test.md index bcab4b0..ea3d339 100644 --- a/docs/pending-test.md +++ b/docs/pending-test.md @@ -1 +1,3 @@ # 待测试 + +- 修复生图工作台和画布生图请求中 `quality` 参数可能传入上游不支持值导致 400 的问题;请求前会归一化质量枚举,`auto` 或异常值不再发送给上游。 diff --git a/web/src/services/api/image.ts b/web/src/services/api/image.ts index 05925d9..b5a1d4c 100644 --- a/web/src/services/api/image.ts +++ b/web/src/services/api/image.ts @@ -23,7 +23,20 @@ const QUALITY_BASE: Record = { low: 1024, medium: 2048, high: 2880, + standard: 1024, + hd: 2048, }; +const QUALITY_ALIASES: Record = { + "1k": "low", + "2k": "medium", + "4k": "high", +}; + +function normalizeQuality(quality: string) { + const value = quality.trim().toLowerCase(); + const normalized = QUALITY_ALIASES[value] || value; + return QUALITY_BASE[normalized] ? normalized : undefined; +} /** Map "quality + ratio" to an explicit pixel dimension like "3840x2160". Returns undefined when quality is auto. */ function resolveSize(quality: string, ratio: string): string | undefined { @@ -132,7 +145,8 @@ 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 pixelSize = resolveSize(config.quality, config.size); + const quality = normalizeQuality(config.quality); + const pixelSize = quality ? resolveSize(quality, config.size) : undefined; try { const response = await axios.post( aiApiUrl(config, "/images/generations"), @@ -140,7 +154,8 @@ export async function requestGeneration(config: AiConfig, prompt: string) { model: config.model, prompt: withSystemPrompt(config, prompt), n, - ...(pixelSize ? { quality: config.quality, size: pixelSize } : {}), + ...(quality ? { quality } : {}), + ...(pixelSize ? { size: pixelSize } : {}), response_format: "b64_json", }, { @@ -157,14 +172,17 @@ 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 pixelSize = resolveSize(config.quality, config.size); + const quality = normalizeQuality(config.quality); + const pixelSize = quality ? resolveSize(quality, config.size) : undefined; const formData = new FormData(); formData.set("model", config.model); formData.set("prompt", withSystemPrompt(config, prompt)); formData.set("n", String(n)); formData.set("response_format", "b64_json"); + if (quality) { + formData.set("quality", quality); + } if (pixelSize) { - formData.set("quality", config.quality); formData.set("size", pixelSize); } const files = await Promise.all(references.map(async (image) => dataUrlToFile({ ...image, dataUrl: await imageToDataUrl(image) })));