Skip to content

Commit e4847ed

Browse files
authored
Add support for images api (#9587)
1 parent 311940b commit e4847ed

File tree

6 files changed

+631
-15
lines changed

6 files changed

+631
-15
lines changed

packages/types/src/image-generation.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,16 @@
22
* Image generation model constants
33
*/
44

5+
/**
6+
* API method used for image generation
7+
*/
8+
export type ImageGenerationApiMethod = "chat_completions" | "images_api"
9+
510
export interface ImageGenerationModel {
611
value: string
712
label: string
813
provider: ImageGenerationProvider
14+
apiMethod?: ImageGenerationApiMethod
915
}
1016

1117
export const IMAGE_GENERATION_MODELS: ImageGenerationModel[] = [
@@ -17,6 +23,7 @@ export const IMAGE_GENERATION_MODELS: ImageGenerationModel[] = [
1723
// Roo Code Cloud models
1824
{ value: "google/gemini-2.5-flash-image", label: "Gemini 2.5 Flash Image", provider: "roo" },
1925
{ value: "google/gemini-3-pro-image", label: "Gemini 3 Pro Image", provider: "roo" },
26+
{ value: "bfl/flux-2-pro", label: "BFL Flux 2 Pro", provider: "roo", apiMethod: "images_api" },
2027
]
2128

2229
/**

src/api/providers/openrouter.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,8 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH
435435
}
436436

437437
/**
438-
* Generate an image using OpenRouter's image generation API
438+
* Generate an image using OpenRouter's image generation API (chat completions with modalities)
439+
* Note: OpenRouter only supports the chat completions approach, not the /images/generations endpoint
439440
* @param prompt The text prompt for image generation
440441
* @param model The model to use for generation
441442
* @param apiKey The OpenRouter API key (must be explicitly provided)
@@ -456,6 +457,8 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH
456457
}
457458

458459
const baseURL = this.options.openRouterBaseUrl || "https://openrouter.ai/api/v1"
460+
461+
// OpenRouter only supports chat completions approach for image generation
459462
return generateImageWithProvider({
460463
baseURL,
461464
authToken: apiKey,

src/api/providers/roo.ts

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Anthropic } from "@anthropic-ai/sdk"
22
import OpenAI from "openai"
33

4-
import { rooDefaultModelId, getApiProtocol } from "@roo-code/types"
4+
import { rooDefaultModelId, getApiProtocol, type ImageGenerationApiMethod } from "@roo-code/types"
55
import { CloudService } from "@roo-code/cloud"
66

77
import type { ApiHandlerOptions, ModelRecord } from "../../shared/api"
@@ -15,7 +15,7 @@ import type { ApiHandlerCreateMessageMetadata } from "../index"
1515
import { BaseOpenAiCompatibleProvider } from "./base-openai-compatible-provider"
1616
import { getModels, getModelsFromCache } from "../providers/fetchers/modelCache"
1717
import { handleOpenAIError } from "./utils/openai-error-handler"
18-
import { generateImageWithProvider, ImageGenerationResult } from "./utils/image-generation"
18+
import { generateImageWithProvider, generateImageWithImagesApi, ImageGenerationResult } from "./utils/image-generation"
1919
import { t } from "../../i18n"
2020

2121
// Extend OpenAI's CompletionUsage to include Roo specific fields
@@ -273,9 +273,15 @@ export class RooHandler extends BaseOpenAiCompatibleProvider<string> {
273273
* @param prompt The text prompt for image generation
274274
* @param model The model to use for generation
275275
* @param inputImage Optional base64 encoded input image data URL
276+
* @param apiMethod The API method to use (chat_completions or images_api)
276277
* @returns The generated image data and format, or an error
277278
*/
278-
async generateImage(prompt: string, model: string, inputImage?: string): Promise<ImageGenerationResult> {
279+
async generateImage(
280+
prompt: string,
281+
model: string,
282+
inputImage?: string,
283+
apiMethod?: ImageGenerationApiMethod,
284+
): Promise<ImageGenerationResult> {
279285
const sessionToken = getSessionToken()
280286

281287
if (!sessionToken || sessionToken === "unauthenticated") {
@@ -285,8 +291,23 @@ export class RooHandler extends BaseOpenAiCompatibleProvider<string> {
285291
}
286292
}
287293

294+
const baseURL = `${this.fetcherBaseURL}/v1`
295+
296+
// Use the specified API method, defaulting to chat_completions for backward compatibility
297+
if (apiMethod === "images_api") {
298+
return generateImageWithImagesApi({
299+
baseURL,
300+
authToken: sessionToken,
301+
model,
302+
prompt,
303+
inputImage,
304+
outputFormat: "png",
305+
})
306+
}
307+
308+
// Default to chat completions approach
288309
return generateImageWithProvider({
289-
baseURL: `${this.fetcherBaseURL}/v1`,
310+
baseURL,
290311
authToken: sessionToken,
291312
model,
292313
prompt,

0 commit comments

Comments
 (0)