From ec6f1fe4966c20f413db416d0edcb6d0fdd7afe1 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Thu, 20 Nov 2025 18:09:42 +0000 Subject: [PATCH 1/2] feat: add Google Gemini 3 Pro Image Preview to image generation models --- src/core/tools/GenerateImageTool.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/core/tools/GenerateImageTool.ts b/src/core/tools/GenerateImageTool.ts index 60914a86a74..42171c71f96 100644 --- a/src/core/tools/GenerateImageTool.ts +++ b/src/core/tools/GenerateImageTool.ts @@ -12,7 +12,12 @@ import { OpenRouterHandler } from "../../api/providers/openrouter" import { BaseTool, ToolCallbacks } from "./BaseTool" import type { ToolUse } from "../../shared/tools" -const IMAGE_GENERATION_MODELS = ["google/gemini-2.5-flash-image", "openai/gpt-5-image", "openai/gpt-5-image-mini"] +const IMAGE_GENERATION_MODELS = [ + "google/gemini-2.5-flash-image", + "google/gemini-3-pro-image-preview", + "openai/gpt-5-image", + "openai/gpt-5-image-mini", +] export class GenerateImageTool extends BaseTool<"generate_image"> { readonly name = "generate_image" as const From 06af3bca8c97da0cee0402365c69b18307a5260d Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Thu, 20 Nov 2025 14:05:04 -0500 Subject: [PATCH 2/2] DRY up image generation --- packages/types/src/image-generation.ts | 20 +++++++++++++++++++ packages/types/src/index.ts | 1 + src/core/tools/GenerateImageTool.ts | 11 ++-------- .../settings/ImageGenerationSettings.tsx | 9 +-------- 4 files changed, 24 insertions(+), 17 deletions(-) create mode 100644 packages/types/src/image-generation.ts diff --git a/packages/types/src/image-generation.ts b/packages/types/src/image-generation.ts new file mode 100644 index 00000000000..2acd281031d --- /dev/null +++ b/packages/types/src/image-generation.ts @@ -0,0 +1,20 @@ +/** + * Image generation model constants + */ + +export interface ImageGenerationModel { + value: string + label: string +} + +export const IMAGE_GENERATION_MODELS: ImageGenerationModel[] = [ + { value: "google/gemini-2.5-flash-image", label: "Gemini 2.5 Flash Image" }, + { value: "google/gemini-3-pro-image-preview", label: "Gemini 3 Pro Image Preview" }, + { value: "openai/gpt-5-image", label: "GPT-5 Image" }, + { value: "openai/gpt-5-image-mini", label: "GPT-5 Image Mini" }, +] + +/** + * Get array of model values only (for backend validation) + */ +export const IMAGE_GENERATION_MODEL_IDS = IMAGE_GENERATION_MODELS.map((m) => m.value) diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index ebebb72313c..32505ede7bc 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -7,6 +7,7 @@ export * from "./experiment.js" export * from "./followup.js" export * from "./global-settings.js" export * from "./history.js" +export * from "./image-generation.js" export * from "./ipc.js" export * from "./marketplace.js" export * from "./mcp.js" diff --git a/src/core/tools/GenerateImageTool.ts b/src/core/tools/GenerateImageTool.ts index 42171c71f96..18e88827548 100644 --- a/src/core/tools/GenerateImageTool.ts +++ b/src/core/tools/GenerateImageTool.ts @@ -1,7 +1,7 @@ import path from "path" import fs from "fs/promises" import * as vscode from "vscode" -import type { GenerateImageParams } from "@roo-code/types" +import { GenerateImageParams, IMAGE_GENERATION_MODEL_IDS } from "@roo-code/types" import { Task } from "../task/Task" import { formatResponse } from "../prompts/responses" import { fileExistsAtPath } from "../../utils/fs" @@ -12,13 +12,6 @@ import { OpenRouterHandler } from "../../api/providers/openrouter" import { BaseTool, ToolCallbacks } from "./BaseTool" import type { ToolUse } from "../../shared/tools" -const IMAGE_GENERATION_MODELS = [ - "google/gemini-2.5-flash-image", - "google/gemini-3-pro-image-preview", - "openai/gpt-5-image", - "openai/gpt-5-image-mini", -] - export class GenerateImageTool extends BaseTool<"generate_image"> { readonly name = "generate_image" as const @@ -142,7 +135,7 @@ export class GenerateImageTool extends BaseTool<"generate_image"> { return } - const selectedModel = state?.openRouterImageGenerationSelectedModel || IMAGE_GENERATION_MODELS[0] + const selectedModel = state?.openRouterImageGenerationSelectedModel || IMAGE_GENERATION_MODEL_IDS[0] const fullPath = path.resolve(task.cwd, removeClosingTag("path", relPath)) const isOutsideWorkspace = isPathOutsideWorkspace(fullPath) diff --git a/webview-ui/src/components/settings/ImageGenerationSettings.tsx b/webview-ui/src/components/settings/ImageGenerationSettings.tsx index 2f0f21f74d5..3baa2a9e8be 100644 --- a/webview-ui/src/components/settings/ImageGenerationSettings.tsx +++ b/webview-ui/src/components/settings/ImageGenerationSettings.tsx @@ -1,5 +1,6 @@ import React, { useState, useEffect } from "react" import { VSCodeCheckbox, VSCodeTextField, VSCodeDropdown, VSCodeOption } from "@vscode/webview-ui-toolkit/react" +import { IMAGE_GENERATION_MODELS } from "@roo-code/types" import { useAppTranslation } from "@/i18n/TranslationContext" interface ImageGenerationSettingsProps { @@ -11,14 +12,6 @@ interface ImageGenerationSettingsProps { setImageGenerationSelectedModel: (model: string) => void } -// Hardcoded list of image generation models -const IMAGE_GENERATION_MODELS = [ - { value: "google/gemini-2.5-flash-image", label: "Gemini 2.5 Flash Image" }, - { value: "openai/gpt-5-image", label: "GPT-5 Image" }, - { value: "openai/gpt-5-image-mini", label: "GPT-5 Image Mini" }, - // Add more models as they become available -] - export const ImageGenerationSettings = ({ enabled, onChange,