


























@@ -194,7 +194,12 @@ describe("openai image generation provider", () => {
194194const provider = buildOpenAIImageGenerationProvider();
195195196196expect(provider.defaultModel).toBe("gpt-image-2");
197-expect(provider.models).toEqual(["gpt-image-2"]);
197+expect(provider.models).toEqual([
198+"gpt-image-2",
199+"gpt-image-1.5",
200+"gpt-image-1",
201+"gpt-image-1-mini",
202+]);
198203expect(provider.capabilities.geometry?.sizes).toEqual(
199204expect.arrayContaining(["2048x2048", "3840x2160", "2160x3840"]),
200205);
@@ -428,6 +433,74 @@ describe("openai image generation provider", () => {
428433});
429434});
430435436+it("routes transparent default-model requests to the OpenAI image model that supports alpha", async () => {
437+mockGeneratedPngResponse();
438+439+const provider = buildOpenAIImageGenerationProvider();
440+const result = await provider.generateImage({
441+provider: "openai",
442+model: "gpt-image-2",
443+prompt: "Transparent sticker",
444+cfg: {},
445+outputFormat: "png",
446+providerOptions: {
447+openai: {
448+background: "transparent",
449+},
450+},
451+});
452+453+expect(postJsonRequestMock).toHaveBeenCalledWith(
454+expect.objectContaining({
455+url: "https://api.openai.com/v1/images/generations",
456+body: expect.objectContaining({
457+model: "gpt-image-1.5",
458+output_format: "png",
459+background: "transparent",
460+}),
461+}),
462+);
463+expect(result.model).toBe("gpt-image-1.5");
464+});
465+466+it("does not reroute transparent requests for custom OpenAI-compatible endpoints", async () => {
467+mockGeneratedPngResponse();
468+469+const provider = buildOpenAIImageGenerationProvider();
470+await provider.generateImage({
471+provider: "openai",
472+model: "gpt-image-2",
473+prompt: "Transparent custom endpoint sticker",
474+cfg: {
475+models: {
476+providers: {
477+openai: {
478+baseUrl: "https://openai-compatible.example.com/v1",
479+models: [],
480+},
481+},
482+},
483+},
484+outputFormat: "png",
485+providerOptions: {
486+openai: {
487+background: "transparent",
488+},
489+},
490+});
491+492+expect(postJsonRequestMock).toHaveBeenCalledWith(
493+expect.objectContaining({
494+url: "https://openai-compatible.example.com/v1/images/generations",
495+body: expect.objectContaining({
496+model: "gpt-image-2",
497+output_format: "png",
498+background: "transparent",
499+}),
500+}),
501+);
502+});
503+431504it("allows loopback image requests for the synthetic mock-openai provider", async () => {
432505mockGeneratedPngResponse();
433506@@ -684,6 +757,43 @@ describe("openai image generation provider", () => {
684757});
685758});
686759760+it("routes transparent default-model Codex OAuth requests to the alpha-capable image model", async () => {
761+mockCodexAuthOnly();
762+mockCodexImageStream({ imageData: "codex-transparent-image" });
763+764+const provider = buildOpenAIImageGenerationProvider();
765+const result = await provider.generateImage({
766+provider: "openai",
767+model: "gpt-image-2",
768+prompt: "Draw a transparent Codex sticker",
769+cfg: {},
770+authStore: { version: 1, profiles: {} },
771+outputFormat: "png",
772+providerOptions: {
773+openai: {
774+background: "transparent",
775+},
776+},
777+});
778+779+expect(postJsonRequestMock).toHaveBeenCalledWith(
780+expect.objectContaining({
781+url: "https://chatgpt.com/backend-api/codex/responses",
782+body: expect.objectContaining({
783+tools: [
784+expect.objectContaining({
785+type: "image_generation",
786+model: "gpt-image-1.5",
787+output_format: "png",
788+background: "transparent",
789+}),
790+],
791+}),
792+}),
793+);
794+expect(result.model).toBe("gpt-image-1.5");
795+});
796+687797it("uses configured Codex OAuth directly instead of probing an available OpenAI API key", async () => {
688798resolveApiKeyForProviderMock.mockImplementation(async (params?: { provider?: string }) => {
689799if (params?.provider === "openai") {
@@ -1213,6 +1323,46 @@ describe("openai image generation provider", () => {
12131323);
12141324});
121513251326+it("does not reroute transparent background requests for Azure deployment names", async () => {
1327+mockGeneratedPngResponse();
1328+1329+const provider = buildOpenAIImageGenerationProvider();
1330+await provider.generateImage({
1331+provider: "openai",
1332+model: "gpt-image-2",
1333+prompt: "Transparent Azure sticker",
1334+cfg: {
1335+models: {
1336+providers: {
1337+openai: {
1338+baseUrl: "https://myresource.openai.azure.com",
1339+models: [],
1340+},
1341+},
1342+},
1343+},
1344+outputFormat: "png",
1345+providerOptions: {
1346+openai: {
1347+background: "transparent",
1348+},
1349+},
1350+});
1351+1352+expect(postJsonRequestMock).toHaveBeenCalledWith(
1353+expect.objectContaining({
1354+url: "https://myresource.openai.azure.com/openai/deployments/gpt-image-2/images/generations?api-version=2024-12-01-preview",
1355+body: {
1356+prompt: "Transparent Azure sticker",
1357+n: 1,
1358+size: "1024x1024",
1359+output_format: "png",
1360+background: "transparent",
1361+},
1362+}),
1363+);
1364+});
1365+12161366it("uses api-key header and deployment-scoped URL for .cognitiveservices.azure.com hosts", async () => {
12171367mockGeneratedPngResponse();
12181368此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。