diff --git a/packages/ai/src/providers/openai-completions.ts b/packages/ai/src/providers/openai-completions.ts index ffe4e28e..f2d36e7c 100644 --- a/packages/ai/src/providers/openai-completions.ts +++ b/packages/ai/src/providers/openai-completions.ts @@ -575,6 +575,10 @@ function buildParams( prompt_cache_retention: cacheRetention === "long" && compat.supportsLongCacheRetention ? "24h" : undefined, }; + if (isOpenRouterImageGenerationModel(model)) { + Reflect.set(params, "modalities", ["image"]); + } + if (compat.supportsUsageInStreaming !== false) { (params as any).stream_options = { include_usage: true }; } diff --git a/packages/ai/test/openai-completions-image-output.test.ts b/packages/ai/test/openai-completions-image-output.test.ts index 2cf1b7fb..745305c4 100644 --- a/packages/ai/test/openai-completions-image-output.test.ts +++ b/packages/ai/test/openai-completions-image-output.test.ts @@ -92,8 +92,9 @@ describe("openai-completions image output", () => { data: "ZmFrZS1wbmc=", }); - const params = mockState.lastParams as { stream?: boolean; stream_options?: unknown }; + const params = mockState.lastParams as { stream?: boolean; stream_options?: unknown; modalities?: string[] }; expect(params.stream).toBe(false); expect("stream_options" in (params as object)).toBe(false); + expect(params.modalities).toEqual(["image"]); }); });