diff --git a/CHANGELOG.md b/CHANGELOG.md index fb6be9d006b..ddb0af67436 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Docs: https://docs.openclaw.ai ### Changes +- OpenAI/images: default the bundled image-generation provider and live media smoke tests to `gpt-image-2`, and advertise the newer 2K/4K OpenAI size hints in image-generation docs and tool metadata. - Plugins/skills: add the Skill Workshop plugin, which captures reusable workflow corrections as pending or auto-applied workspace skills, runs threshold-based reviewer passes for stronger completion bias on reusable procedures, quarantines unsafe proposals, and refreshes skill availability after safe writes. - Plugin SDK/channels: add presentation and skills runtime contracts, decouple channel presentation rendering, and document message presentation cards so plugins can own richer interactive surfaces without channel-specific glue. - Fireworks/models: add Kimi K2.6 (`fireworks/accounts/fireworks/models/kimi-k2p6`) to the bundled catalog and live-model priority list, while keeping Kimi thinking disabled for Fireworks K2.6 requests. diff --git a/docs/cli/infer.md b/docs/cli/infer.md index 98cb7e8f190..0a4c9d3a53b 100644 --- a/docs/cli/infer.md +++ b/docs/cli/infer.md @@ -240,7 +240,7 @@ Infer commands normalize JSON output under a shared envelope: "capability": "image.generate", "transport": "local", "provider": "openai", - "model": "gpt-image-1", + "model": "gpt-image-2", "attempts": [], "outputs": [] } diff --git a/docs/concepts/model-providers.md b/docs/concepts/model-providers.md index 744ceec5ed0..1ee82baccaf 100644 --- a/docs/concepts/model-providers.md +++ b/docs/concepts/model-providers.md @@ -173,7 +173,7 @@ Current bundled examples: normalization (`input` / `output` and `prompt` / `completion` families), the shared `openai-responses-defaults` stream family for native OpenAI/Codex wrappers, provider-family metadata, bundled image-generation provider - registration for `gpt-image-1`, and bundled video-generation provider + registration for `gpt-image-2`, and bundled video-generation provider registration for `sora-2` - `google` and `google-gemini-cli`: Gemini 3.1 forward-compat fallback, native Gemini replay validation, bootstrap replay sanitation, tagged diff --git a/docs/gateway/configuration-reference.md b/docs/gateway/configuration-reference.md index 83a2dffa976..d5e9f7d204e 100644 --- a/docs/gateway/configuration-reference.md +++ b/docs/gateway/configuration-reference.md @@ -1177,7 +1177,7 @@ Time format in system prompt. Default: `auto` (OS preference). fallbacks: ["openrouter/google/gemini-2.0-flash-vision:free"], }, imageGenerationModel: { - primary: "openai/gpt-image-1", + primary: "openai/gpt-image-2", fallbacks: ["google/gemini-3.1-flash-image-preview"], }, videoGenerationModel: { @@ -1215,7 +1215,7 @@ Time format in system prompt. Default: `auto` (OS preference). - Also used as fallback routing when the selected/default model cannot accept image input. - `imageGenerationModel`: accepts either a string (`"provider/model"`) or an object (`{ primary, fallbacks }`). - Used by the shared image-generation capability and any future tool/plugin surface that generates images. - - Typical values: `google/gemini-3.1-flash-image-preview` for native Gemini image generation, `fal/fal-ai/flux/dev` for fal, or `openai/gpt-image-1` for OpenAI Images. + - Typical values: `google/gemini-3.1-flash-image-preview` for native Gemini image generation, `fal/fal-ai/flux/dev` for fal, or `openai/gpt-image-2` for OpenAI Images. - If you select a provider/model directly, configure the matching provider auth/API key too (for example `GEMINI_API_KEY` or `GOOGLE_API_KEY` for `google/*`, `OPENAI_API_KEY` for `openai/*`, `FAL_KEY` for `fal/*`). - If omitted, `image_generate` can still infer an auth-backed provider default. It tries the current default provider first, then the remaining registered image-generation providers in provider-id order. - `musicGenerationModel`: accepts either a string (`"provider/model"`) or an object (`{ primary, fallbacks }`). diff --git a/docs/help/testing.md b/docs/help/testing.md index ba99877b279..383a682a9c8 100644 --- a/docs/help/testing.md +++ b/docs/help/testing.md @@ -779,7 +779,7 @@ If you want to rely on env keys (e.g. exported in your `~/.profile`), run local - `google` - Optional narrowing: - `OPENCLAW_LIVE_IMAGE_GENERATION_PROVIDERS="openai,google"` - - `OPENCLAW_LIVE_IMAGE_GENERATION_MODELS="openai/gpt-image-1,google/gemini-3.1-flash-image-preview"` + - `OPENCLAW_LIVE_IMAGE_GENERATION_MODELS="openai/gpt-image-2,google/gemini-3.1-flash-image-preview"` - `OPENCLAW_LIVE_IMAGE_GENERATION_CASES="google:flash-generate,google:pro-edit"` - Optional auth behavior: - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` to force profile-store auth and ignore env-only overrides diff --git a/docs/providers/openai.md b/docs/providers/openai.md index 8faa40fb023..fc4690c6844 100644 --- a/docs/providers/openai.md +++ b/docs/providers/openai.md @@ -158,17 +158,17 @@ The bundled `openai` plugin registers image generation through the `image_genera | Capability | Value | | ------------------------- | ---------------------------------- | -| Default model | `openai/gpt-image-1` | +| Default model | `openai/gpt-image-2` | | Max images per request | 4 | | Edit mode | Enabled (up to 5 reference images) | -| Size overrides | Supported | +| Size overrides | Supported, including 2K/4K sizes | | Aspect ratio / resolution | Not forwarded to OpenAI Images API | ```json5 { agents: { defaults: { - imageGenerationModel: { primary: "openai/gpt-image-1" }, + imageGenerationModel: { primary: "openai/gpt-image-2" }, }, }, } @@ -178,6 +178,22 @@ The bundled `openai` plugin registers image generation through the `image_genera See [Image Generation](/tools/image-generation) for shared tool parameters, provider selection, and failover behavior. +`gpt-image-2` is the default for both OpenAI text-to-image generation and image +editing. `gpt-image-1` remains usable as an explicit model override, but new +OpenAI image workflows should use `openai/gpt-image-2`. + +Generate: + +``` +/tool image_generate model=openai/gpt-image-2 prompt="A polished launch poster for OpenClaw on macOS" size=3840x2160 count=1 +``` + +Edit: + +``` +/tool image_generate model=openai/gpt-image-2 prompt="Preserve the object shape, change the material to translucent glass" image=/path/to/reference.png size=1024x1536 +``` + ## Video generation The bundled `openai` plugin registers video generation through the `video_generate` tool. diff --git a/docs/tools/image-generation.md b/docs/tools/image-generation.md index c187ea368d5..7fcc6325494 100644 --- a/docs/tools/image-generation.md +++ b/docs/tools/image-generation.md @@ -25,7 +25,7 @@ The tool only appears when at least one image generation provider is available. agents: { defaults: { imageGenerationModel: { - primary: "openai/gpt-image-1", + primary: "openai/gpt-image-2", }, }, }, @@ -40,7 +40,7 @@ The agent calls `image_generate` automatically. No tool allow-listing needed — | Provider | Default model | Edit support | API key | | -------- | -------------------------------- | ---------------------------------- | ----------------------------------------------------- | -| OpenAI | `gpt-image-1` | Yes (up to 5 images) | `OPENAI_API_KEY` | +| OpenAI | `gpt-image-2` | Yes (up to 5 images) | `OPENAI_API_KEY` | | Google | `gemini-3.1-flash-image-preview` | Yes | `GEMINI_API_KEY` or `GOOGLE_API_KEY` | | fal | `fal-ai/flux/dev` | Yes | `FAL_KEY` | | MiniMax | `image-01` | Yes (subject reference) | `MINIMAX_API_KEY` or MiniMax OAuth (`minimax-portal`) | @@ -59,10 +59,10 @@ Use `action: "list"` to inspect available providers and models at runtime: | ------------- | -------- | ------------------------------------------------------------------------------------- | | `prompt` | string | Image generation prompt (required for `action: "generate"`) | | `action` | string | `"generate"` (default) or `"list"` to inspect providers | -| `model` | string | Provider/model override, e.g. `openai/gpt-image-1` | +| `model` | string | Provider/model override, e.g. `openai/gpt-image-2` | | `image` | string | Single reference image path or URL for edit mode | | `images` | string[] | Multiple reference images for edit mode (up to 5) | -| `size` | string | Size hint: `1024x1024`, `1536x1024`, `1024x1536`, `1024x1792`, `1792x1024` | +| `size` | string | Size hint: `1024x1024`, `1536x1024`, `1024x1536`, `2048x2048`, `3840x2160` | | `aspectRatio` | string | Aspect ratio: `1:1`, `2:3`, `3:2`, `3:4`, `4:3`, `4:5`, `5:4`, `9:16`, `16:9`, `21:9` | | `resolution` | string | Resolution hint: `1K`, `2K`, or `4K` | | `count` | number | Number of images to generate (1–4) | @@ -81,7 +81,7 @@ Tool results report the applied settings. When OpenClaw remaps geometry during p agents: { defaults: { imageGenerationModel: { - primary: "openai/gpt-image-1", + primary: "openai/gpt-image-2", fallbacks: ["google/gemini-3.1-flash-image-preview", "fal/fal-ai/flux/dev"], }, }, @@ -123,6 +123,42 @@ OpenAI, Google, fal, MiniMax, and ComfyUI support editing reference images. Pass OpenAI and Google support up to 5 reference images via the `images` parameter. fal, MiniMax, and ComfyUI support 1. +### OpenAI `gpt-image-2` + +OpenAI image generation defaults to `openai/gpt-image-2`. The older +`openai/gpt-image-1` model can still be selected explicitly, but new OpenAI +image-generation and image-editing requests should use `gpt-image-2`. + +`gpt-image-2` supports both text-to-image generation and reference-image +editing through the same `image_generate` tool. OpenClaw forwards `prompt`, +`count`, `size`, and reference images to OpenAI. OpenAI does not receive +`aspectRatio` or `resolution` directly; when possible OpenClaw maps those into a +supported `size`, otherwise the tool reports them as ignored overrides. + +Generate one 4K landscape image: + +``` +/tool image_generate action=generate model=openai/gpt-image-2 prompt="A clean editorial poster for OpenClaw image generation" size=3840x2160 count=1 +``` + +Generate two square images: + +``` +/tool image_generate action=generate model=openai/gpt-image-2 prompt="Two visual directions for a calm productivity app icon" size=1024x1024 count=2 +``` + +Edit one local reference image: + +``` +/tool image_generate action=generate model=openai/gpt-image-2 prompt="Keep the subject, replace the background with a bright studio setup" image=/path/to/reference.png size=1024x1536 +``` + +Edit with multiple references: + +``` +/tool image_generate action=generate model=openai/gpt-image-2 prompt="Combine the character identity from the first image with the color palette from the second" images='["/path/to/character.png","/path/to/palette.jpg"]' size=1536x1024 +``` + MiniMax image generation is available through both bundled MiniMax auth paths: - `minimax/image-01` for API-key setups @@ -134,7 +170,7 @@ MiniMax image generation is available through both bundled MiniMax auth paths: | --------------------- | -------------------- | -------------------- | ------------------- | -------------------------- | ---------------------------------- | ------- | | Generate | Yes (up to 4) | Yes (up to 4) | Yes (up to 4) | Yes (up to 9) | Yes (workflow-defined outputs) | Yes (1) | | Edit/reference | Yes (up to 5 images) | Yes (up to 5 images) | Yes (1 image) | Yes (1 image, subject ref) | Yes (1 image, workflow-configured) | No | -| Size control | Yes | Yes | Yes | No | No | No | +| Size control | Yes (up to 4K) | Yes | Yes | No | No | No | | Aspect ratio | No | Yes | Yes (generate only) | Yes | No | No | | Resolution (1K/2K/4K) | No | Yes | Yes | No | No | No | diff --git a/extensions/openai/default-models.ts b/extensions/openai/default-models.ts index d5e88e83e59..eef4757b9d1 100644 --- a/extensions/openai/default-models.ts +++ b/extensions/openai/default-models.ts @@ -6,7 +6,7 @@ import { export const OPENAI_DEFAULT_MODEL = "openai/gpt-5.4"; export const OPENAI_CODEX_DEFAULT_MODEL = "openai-codex/gpt-5.4"; -export const OPENAI_DEFAULT_IMAGE_MODEL = "gpt-image-1"; +export const OPENAI_DEFAULT_IMAGE_MODEL = "gpt-image-2"; export const OPENAI_DEFAULT_TTS_MODEL = "gpt-4o-mini-tts"; export const OPENAI_DEFAULT_TTS_VOICE = "alloy"; export const OPENAI_DEFAULT_AUDIO_TRANSCRIPTION_MODEL = "gpt-4o-transcribe"; diff --git a/extensions/openai/image-generation-provider.test.ts b/extensions/openai/image-generation-provider.test.ts index 10760656763..ea53103ca93 100644 --- a/extensions/openai/image-generation-provider.test.ts +++ b/extensions/openai/image-generation-provider.test.ts @@ -48,13 +48,23 @@ describe("openai image generation provider", () => { vi.unstubAllEnvs(); }); + it("advertises the current OpenAI image model and 2K/4K size hints", () => { + const provider = buildOpenAIImageGenerationProvider(); + + expect(provider.defaultModel).toBe("gpt-image-2"); + expect(provider.models).toEqual(["gpt-image-2"]); + expect(provider.capabilities.geometry?.sizes).toEqual( + expect.arrayContaining(["2048x2048", "3840x2160", "2160x3840"]), + ); + }); + it("does not auto-allow local baseUrl overrides for image requests", async () => { mockGeneratedPngResponse(); const provider = buildOpenAIImageGenerationProvider(); const result = await provider.generateImage({ provider: "openai", - model: "gpt-image-1", + model: "gpt-image-2", prompt: "Draw a QA lighthouse", cfg: { models: { @@ -82,13 +92,40 @@ describe("openai image generation provider", () => { expect(result.images).toHaveLength(1); }); + it("forwards generation count and custom size overrides", async () => { + mockGeneratedPngResponse(); + + const provider = buildOpenAIImageGenerationProvider(); + const result = await provider.generateImage({ + provider: "openai", + model: "gpt-image-2", + prompt: "Create two landscape campaign variants", + cfg: {}, + count: 2, + size: "3840x2160", + }); + + expect(postJsonRequestMock).toHaveBeenCalledWith( + expect.objectContaining({ + url: "https://api.openai.com/v1/images/generations", + body: { + model: "gpt-image-2", + prompt: "Create two landscape campaign variants", + n: 2, + size: "3840x2160", + }, + }), + ); + expect(result.images).toHaveLength(1); + }); + it("allows loopback image requests for the synthetic mock-openai provider", async () => { mockGeneratedPngResponse(); const provider = buildOpenAIImageGenerationProvider(); const result = await provider.generateImage({ provider: "mock-openai", - model: "gpt-image-1", + model: "gpt-image-2", prompt: "Draw a QA lighthouse", cfg: { models: { @@ -123,7 +160,7 @@ describe("openai image generation provider", () => { const provider = buildOpenAIImageGenerationProvider(); const result = await provider.generateImage({ provider: "openai", - model: "gpt-image-1", + model: "gpt-image-2", prompt: "Draw a QA lighthouse", cfg: { models: { @@ -150,21 +187,28 @@ describe("openai image generation provider", () => { expect(result.images).toHaveLength(1); }); - it("uses JSON image_url edits for input-image requests", async () => { + it("forwards edit count, custom size, and multiple input images", async () => { mockGeneratedPngResponse(); const provider = buildOpenAIImageGenerationProvider(); const result = await provider.generateImage({ provider: "openai", - model: "gpt-image-1", + model: "gpt-image-2", prompt: "Change only the background to pale blue", cfg: {}, + count: 2, + size: "1024x1536", inputImages: [ { buffer: Buffer.from("png-bytes"), mimeType: "image/png", fileName: "reference.png", }, + { + buffer: Buffer.from("jpeg-bytes"), + mimeType: "image/jpeg", + fileName: "style.jpg", + }, ], }); @@ -172,12 +216,17 @@ describe("openai image generation provider", () => { expect.objectContaining({ url: "https://api.openai.com/v1/images/edits", body: expect.objectContaining({ - model: "gpt-image-1", + model: "gpt-image-2", prompt: "Change only the background to pale blue", + n: 2, + size: "1024x1536", images: [ { image_url: "data:image/png;base64,cG5nLWJ5dGVz", }, + { + image_url: "data:image/jpeg;base64,anBlZy1ieXRlcw==", + }, ], }), }), diff --git a/extensions/openai/image-generation-provider.ts b/extensions/openai/image-generation-provider.ts index 945b51d82f4..9d3bd24e4e5 100644 --- a/extensions/openai/image-generation-provider.ts +++ b/extensions/openai/image-generation-provider.ts @@ -13,7 +13,15 @@ import { resolveConfiguredOpenAIBaseUrl, toOpenAIDataUrl } from "./shared.js"; const DEFAULT_OPENAI_IMAGE_BASE_URL = "https://api.openai.com/v1"; const DEFAULT_OUTPUT_MIME = "image/png"; const DEFAULT_SIZE = "1024x1024"; -const OPENAI_SUPPORTED_SIZES = ["1024x1024", "1024x1536", "1536x1024"] as const; +const OPENAI_SUPPORTED_SIZES = [ + "1024x1024", + "1536x1024", + "1024x1536", + "2048x2048", + "2048x1152", + "3840x2160", + "2160x3840", +] as const; const OPENAI_MAX_INPUT_IMAGES = 5; const MOCK_OPENAI_PROVIDER_ID = "mock-openai"; diff --git a/extensions/openai/index.test.ts b/extensions/openai/index.test.ts index e3aeb7c99fe..a42d1f9dd55 100644 --- a/extensions/openai/index.test.ts +++ b/extensions/openai/index.test.ts @@ -141,10 +141,12 @@ describe("openai plugin", () => { const authStore = { version: 1, profiles: {} }; const result = await provider.generateImage({ provider: "openai", - model: "gpt-image-1", + model: "gpt-image-2", prompt: "draw a cat", cfg: {}, authStore, + count: 2, + size: "2048x2048", }); expect(resolveApiKeySpy).toHaveBeenCalledWith( @@ -157,10 +159,10 @@ describe("openai plugin", () => { expect.objectContaining({ url: "https://api.openai.com/v1/images/generations", body: { - model: "gpt-image-1", + model: "gpt-image-2", prompt: "draw a cat", - n: 1, - size: "1024x1024", + n: 2, + size: "2048x2048", }, }), ); @@ -178,7 +180,7 @@ describe("openai plugin", () => { revisedPrompt: "revised", }, ], - model: "gpt-image-1", + model: "gpt-image-2", }); }); @@ -193,10 +195,12 @@ describe("openai plugin", () => { const result = await provider.generateImage({ provider: "openai", - model: "gpt-image-1", + model: "gpt-image-2", prompt: "Edit this image", cfg: {}, authStore, + count: 2, + size: "1536x1024", inputImages: [ { buffer: Buffer.from("x"), mimeType: "image/png" }, { buffer: Buffer.from("y"), mimeType: "image/jpeg", fileName: "ref.jpg" }, @@ -213,10 +217,10 @@ describe("openai plugin", () => { expect.objectContaining({ url: "https://api.openai.com/v1/images/edits", body: { - model: "gpt-image-1", + model: "gpt-image-2", prompt: "Edit this image", - n: 1, - size: "1024x1024", + n: 2, + size: "1536x1024", images: [ { image_url: "data:image/png;base64,eA==", @@ -236,7 +240,7 @@ describe("openai plugin", () => { fileName: "image-1.png", }, ], - model: "gpt-image-1", + model: "gpt-image-2", }); }); @@ -253,7 +257,7 @@ describe("openai plugin", () => { await expect( provider.generateImage({ provider: "openai", - model: "gpt-image-1", + model: "gpt-image-2", prompt: "draw a cat", cfg: { models: { diff --git a/extensions/openai/openai.live.test.ts b/extensions/openai/openai.live.test.ts index ae5ffe10eb7..a6f0941bd2b 100644 --- a/extensions/openai/openai.live.test.ts +++ b/extensions/openai/openai.live.test.ts @@ -17,7 +17,7 @@ import plugin from "./index.js"; const OPENAI_API_KEY = process.env.OPENAI_API_KEY ?? ""; const LIVE_MODEL_ID = process.env.OPENCLAW_LIVE_OPENAI_PLUGIN_MODEL?.trim() || "gpt-5.4-nano"; -const LIVE_IMAGE_MODEL = process.env.OPENCLAW_LIVE_OPENAI_IMAGE_MODEL?.trim() || "gpt-image-1"; +const LIVE_IMAGE_MODEL = process.env.OPENCLAW_LIVE_OPENAI_IMAGE_MODEL?.trim() || "gpt-image-2"; const LIVE_VISION_MODEL = process.env.OPENCLAW_LIVE_OPENAI_VISION_MODEL?.trim() || "gpt-4.1-mini"; const liveEnabled = OPENAI_API_KEY.trim().length > 0 && process.env.OPENCLAW_LIVE_TEST === "1"; const describeLive = liveEnabled ? describe : describe.skip; @@ -262,8 +262,9 @@ describeLive("openai plugin live", () => { cfg, agentDir, authStore: EMPTY_AUTH_STORE, - timeoutMs: 45_000, - size: "1024x1024", + timeoutMs: 180_000, + count: 1, + size: "1536x1024", }); expect(generated.model).toBe(LIVE_IMAGE_MODEL); @@ -273,7 +274,7 @@ describeLive("openai plugin live", () => { } finally { await fs.rm(agentDir, { recursive: true, force: true }); } - }, 60_000); + }, 240_000); it("edits a reference image through the registered image provider", async () => { const { imageProviders } = await registerOpenAIPlugin(); @@ -291,8 +292,9 @@ describeLive("openai plugin live", () => { cfg, agentDir, authStore: EMPTY_AUTH_STORE, - timeoutMs: 45_000, - size: "1024x1024", + timeoutMs: 180_000, + count: 1, + size: "1024x1536", inputImages: [ { buffer: createReferencePng(), @@ -309,7 +311,7 @@ describeLive("openai plugin live", () => { } finally { await fs.rm(agentDir, { recursive: true, force: true }); } - }, 60_000); + }, 240_000); it("describes a deterministic image through the registered media provider", async () => { const { mediaProviders } = await registerOpenAIPlugin(); diff --git a/src/agents/tools/image-generate-tool.ts b/src/agents/tools/image-generate-tool.ts index d94b9323706..3457c0a1cb7 100644 --- a/src/agents/tools/image-generate-tool.ts +++ b/src/agents/tools/image-generate-tool.ts @@ -75,7 +75,7 @@ const ImageGenerateToolSchema = Type.Object({ }), ), model: Type.Optional( - Type.String({ description: "Optional provider/model override, e.g. openai/gpt-image-1." }), + Type.String({ description: "Optional provider/model override, e.g. openai/gpt-image-2." }), ), filename: Type.Optional( Type.String({ @@ -86,7 +86,7 @@ const ImageGenerateToolSchema = Type.Object({ size: Type.Optional( Type.String({ description: - "Optional size hint like 1024x1024, 1536x1024, 1024x1536, 1024x1792, or 1792x1024.", + "Optional size hint like 1024x1024, 1536x1024, 1024x1536, 2048x2048, or 3840x2160.", }), ), aspectRatio: Type.Optional( diff --git a/src/image-generation/live-test-helpers.test.ts b/src/image-generation/live-test-helpers.test.ts index 3a7058569cf..0b526c3d8bb 100644 --- a/src/image-generation/live-test-helpers.test.ts +++ b/src/image-generation/live-test-helpers.test.ts @@ -26,10 +26,10 @@ describe("image-generation live-test helpers", () => { it("parses provider model overrides by provider id", () => { expect( - parseProviderModelMap("openai/gpt-image-1, google/gemini-3.1-flash-image-preview, invalid"), + parseProviderModelMap("openai/gpt-image-2, google/gemini-3.1-flash-image-preview, invalid"), ).toEqual( new Map([ - ["openai", "openai/gpt-image-1"], + ["openai", "openai/gpt-image-2"], ["google", "google/gemini-3.1-flash-image-preview"], ]), ); @@ -40,7 +40,7 @@ describe("image-generation live-test helpers", () => { agents: { defaults: { imageGenerationModel: { - primary: "openai/gpt-image-1", + primary: "openai/gpt-image-2", fallbacks: ["google/gemini-3.1-flash-image-preview", "invalid"], }, }, @@ -49,7 +49,7 @@ describe("image-generation live-test helpers", () => { expect(resolveConfiguredLiveImageModels(cfg)).toEqual( new Map([ - ["openai", "openai/gpt-image-1"], + ["openai", "openai/gpt-image-2"], ["google", "google/gemini-3.1-flash-image-preview"], ]), ); diff --git a/src/image-generation/live-test-helpers.ts b/src/image-generation/live-test-helpers.ts index dd2681a9547..a74142cdfc2 100644 --- a/src/image-generation/live-test-helpers.ts +++ b/src/image-generation/live-test-helpers.ts @@ -14,7 +14,7 @@ export const DEFAULT_LIVE_IMAGE_MODELS: Record = { fal: "fal/fal-ai/flux/dev", google: "google/gemini-3.1-flash-image-preview", minimax: "minimax/image-01", - openai: "openai/gpt-image-1", + openai: "openai/gpt-image-2", vydra: "vydra/grok-imagine", }; diff --git a/src/plugins/provider-model-defaults.ts b/src/plugins/provider-model-defaults.ts index 973218657b8..388cc51064f 100644 --- a/src/plugins/provider-model-defaults.ts +++ b/src/plugins/provider-model-defaults.ts @@ -8,7 +8,7 @@ import { applyAgentDefaultPrimaryModel } from "./provider-model-primary.js"; export const OPENAI_DEFAULT_MODEL = "openai/gpt-5.4"; export const OPENAI_CODEX_DEFAULT_MODEL = "openai-codex/gpt-5.4"; -export const OPENAI_DEFAULT_IMAGE_MODEL = "gpt-image-1"; +export const OPENAI_DEFAULT_IMAGE_MODEL = "gpt-image-2"; export const OPENAI_DEFAULT_TTS_MODEL = "gpt-4o-mini-tts"; export const OPENAI_DEFAULT_TTS_VOICE = "alloy"; export const OPENAI_DEFAULT_AUDIO_TRANSCRIPTION_MODEL = "gpt-4o-transcribe";