


























@@ -198,6 +198,10 @@ describe("openai image generation provider", () => {
198198expect(provider.capabilities.geometry?.sizes).toEqual(
199199expect.arrayContaining(["2048x2048", "3840x2160", "2160x3840"]),
200200);
201+expect(provider.capabilities.output).toEqual({
202+formats: ["png", "jpeg", "webp"],
203+qualities: ["low", "medium", "high", "auto"],
204+});
201205});
202206203207it("reports configured when either OpenAI API key auth or Codex OAuth auth is available", () => {
@@ -339,6 +343,50 @@ describe("openai image generation provider", () => {
339343expect(result.images).toHaveLength(1);
340344});
341345346+it("forwards output and OpenAI-only options on direct generations", async () => {
347+mockGeneratedPngResponse();
348+349+const provider = buildOpenAIImageGenerationProvider();
350+const result = await provider.generateImage({
351+provider: "openai",
352+model: "gpt-image-2",
353+prompt: "Cheap JPEG preview",
354+cfg: {},
355+quality: "low",
356+outputFormat: "jpeg",
357+providerOptions: {
358+openai: {
359+background: "opaque",
360+moderation: "low",
361+outputCompression: 60,
362+user: "end-user-42",
363+},
364+},
365+});
366+367+expect(postJsonRequestMock).toHaveBeenCalledWith(
368+expect.objectContaining({
369+url: "https://api.openai.com/v1/images/generations",
370+body: {
371+model: "gpt-image-2",
372+prompt: "Cheap JPEG preview",
373+n: 1,
374+size: "1024x1024",
375+quality: "low",
376+output_format: "jpeg",
377+background: "opaque",
378+moderation: "low",
379+output_compression: 60,
380+user: "end-user-42",
381+},
382+}),
383+);
384+expect(result.images[0]).toMatchObject({
385+mimeType: "image/jpeg",
386+fileName: "image-1.jpg",
387+});
388+});
389+342390it("allows loopback image requests for the synthetic mock-openai provider", async () => {
343391mockGeneratedPngResponse();
344392@@ -463,6 +511,44 @@ describe("openai image generation provider", () => {
463511expect(result.images).toHaveLength(1);
464512});
465513514+it("forwards output and OpenAI-only options on multipart edits", async () => {
515+mockGeneratedPngResponse();
516+517+const provider = buildOpenAIImageGenerationProvider();
518+const result = await provider.generateImage({
519+provider: "openai",
520+model: "gpt-image-2",
521+prompt: "Edit as WebP",
522+cfg: {},
523+inputImages: [{ buffer: Buffer.from("png-bytes"), mimeType: "image/png" }],
524+quality: "high",
525+outputFormat: "webp",
526+providerOptions: {
527+openai: {
528+background: "transparent",
529+moderation: "auto",
530+outputCompression: 75,
531+user: "end-user-99",
532+},
533+},
534+});
535+536+const editCallArgs = postMultipartRequestMock.mock.calls[0]?.[0] as {
537+body: FormData;
538+};
539+const form = editCallArgs.body;
540+expect(form.get("quality")).toBe("high");
541+expect(form.get("output_format")).toBe("webp");
542+expect(form.get("background")).toBe("transparent");
543+expect(form.get("moderation")).toBe("auto");
544+expect(form.get("output_compression")).toBe("75");
545+expect(form.get("user")).toBe("end-user-99");
546+expect(result.images[0]).toMatchObject({
547+mimeType: "image/webp",
548+fileName: "image-1.webp",
549+});
550+});
551+466552it("falls back to Codex OAuth image generation through Responses streaming", async () => {
467553mockCodexAuthOnly();
468554mockCodexImageStream({ imageData: "codex-image", revisedPrompt: "revised codex prompt" });
@@ -477,6 +563,14 @@ describe("openai image generation provider", () => {
477563 authStore,
478564count: 1,
479565size: "1024x1536",
566+quality: "low",
567+outputFormat: "jpeg",
568+providerOptions: {
569+openai: {
570+background: "opaque",
571+outputCompression: 55,
572+},
573+},
480574});
481575482576expect(resolveApiKeyForProviderMock).toHaveBeenCalledWith(
@@ -517,6 +611,10 @@ describe("openai image generation provider", () => {
517611type: "image_generation",
518612model: "gpt-image-2",
519613size: "1024x1536",
614+quality: "low",
615+output_format: "jpeg",
616+background: "opaque",
617+output_compression: 55,
520618},
521619],
522620tool_choice: { type: "image_generation" },
@@ -530,8 +628,8 @@ describe("openai image generation provider", () => {
530628expect(result.images).toEqual([
531629{
532630buffer: Buffer.from("codex-image"),
533-mimeType: "image/png",
534-fileName: "image-1.png",
631+mimeType: "image/jpeg",
632+fileName: "image-1.jpg",
535633revisedPrompt: "revised codex prompt",
536634},
537635]);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。