From e3b7262555ac3ced9973547cc54b42aaf15fc04b Mon Sep 17 00:00:00 2001 From: Grace Yun Date: Tue, 1 Apr 2025 13:01:42 -0400 Subject: [PATCH 01/11] feat: google vertex imagegen options --- .../src/google-vertex-image-model.test.ts | 64 ++++++++++--------- .../src/google-vertex-image-model.ts | 31 ++++++++- packages/google-vertex/src/index.ts | 1 + 3 files changed, 66 insertions(+), 30 deletions(-) diff --git a/packages/google-vertex/src/google-vertex-image-model.test.ts b/packages/google-vertex/src/google-vertex-image-model.test.ts index 1a33215883cc..b053696a75a8 100644 --- a/packages/google-vertex/src/google-vertex-image-model.test.ts +++ b/packages/google-vertex/src/google-vertex-image-model.test.ts @@ -31,27 +31,6 @@ describe('GoogleVertexImageModel', () => { }; } - it('should pass the correct parameters', async () => { - prepareJsonResponse(); - - await model.doGenerate({ - prompt, - n: 2, - size: undefined, - aspectRatio: undefined, - seed: undefined, - providerOptions: { vertex: { aspectRatio: '1:1' } }, - }); - - expect(await server.getRequestBodyJson()).toStrictEqual({ - instances: [{ prompt }], - parameters: { - sampleCount: 2, - aspectRatio: '1:1', - }, - }); - }); - it('should pass headers', async () => { prepareJsonResponse(); @@ -138,13 +117,9 @@ describe('GoogleVertexImageModel', () => { prompt: 'test prompt', n: 1, size: undefined, - aspectRatio: undefined, + aspectRatio: '16:9', seed: undefined, - providerOptions: { - vertex: { - aspectRatio: '16:9', - }, - }, + providerOptions: {}, }); expect(await server.getRequestBodyJson()).toStrictEqual({ @@ -209,7 +184,7 @@ describe('GoogleVertexImageModel', () => { seed: 42, providerOptions: { vertex: { - temperature: 0.8, + enhancePrompt: true, }, }, }); @@ -220,7 +195,7 @@ describe('GoogleVertexImageModel', () => { sampleCount: 1, aspectRatio: '1:1', seed: 42, - temperature: 0.8, + enhancePrompt: true, }, }); }); @@ -313,5 +288,36 @@ describe('GoogleVertexImageModel', () => { ); expect(result.response.modelId).toBe('imagen-3.0-generate-001'); }); + + it('should only pass valid provider options', async () => { + prepareJsonResponse(); + + await model.doGenerate({ + prompt, + n: 1, + size: undefined, + aspectRatio: '16:9', + seed: undefined, + providerOptions: { + vertex: { + enhancePrompt: true, + negativePrompt: 'negative prompt', + personGeneration: 'allow_all', + foo: 'bar', + }, + }, + }); + + expect(await server.getRequestBodyJson()).toStrictEqual({ + instances: [{ prompt }], + parameters: { + sampleCount: 1, + enhancePrompt: true, + negativePrompt: 'negative prompt', + personGeneration: 'allow_all', + aspectRatio: '16:9', + }, + }); + }); }); }); diff --git a/packages/google-vertex/src/google-vertex-image-model.ts b/packages/google-vertex/src/google-vertex-image-model.ts index c94d5ddc32d5..889c6e344177 100644 --- a/packages/google-vertex/src/google-vertex-image-model.ts +++ b/packages/google-vertex/src/google-vertex-image-model.ts @@ -3,6 +3,7 @@ import { Resolvable, combineHeaders, createJsonResponseHandler, + parseProviderOptions, postJsonToApi, resolve, } from '@ai-sdk/provider-utils'; @@ -65,13 +66,19 @@ export class GoogleVertexImageModel implements ImageModelV1 { }); } + const googleVertexImageOptions = parseProviderOptions({ + provider: 'vertex', + providerOptions: providerOptions, + schema: googleVertexImageProviderOptionsSchema, + }); + const body = { instances: [{ prompt }], parameters: { sampleCount: n, ...(aspectRatio != null ? { aspectRatio } : {}), ...(seed != null ? { seed } : {}), - ...(providerOptions.vertex ?? {}), + ...(googleVertexImageOptions ?? {}), }, }; @@ -108,3 +115,25 @@ export class GoogleVertexImageModel implements ImageModelV1 { const vertexImageResponseSchema = z.object({ predictions: z.array(z.object({ bytesBase64Encoded: z.string() })).nullish(), }); + +const googleVertexImageProviderOptionsSchema = z.object({ + temperature: z.number().nullish(), + enhancePrompt: z.boolean().nullish(), + negativePrompt: z.string().nullish(), + personGeneration: z + .enum(['dont_allow', 'allow_adult', 'allow_all']) + .nullish(), + safetySetting: z + .enum([ + 'block_low_and_above', + 'block_medium_and_above', + 'block_only_high', + 'block_none', + ]) + .nullish(), + addWatermark: z.boolean().nullish(), + storageUri: z.string().nullish(), +}); +export type GoogleVertexImageProviderOptions = z.infer< + typeof googleVertexImageProviderOptionsSchema +>; \ No newline at end of file diff --git a/packages/google-vertex/src/index.ts b/packages/google-vertex/src/index.ts index bf1e0fad1033..e84f8e06d72f 100644 --- a/packages/google-vertex/src/index.ts +++ b/packages/google-vertex/src/index.ts @@ -1,3 +1,4 @@ +export type { GoogleVertexImageProviderOptions } from './google-vertex-image-model'; export { createVertex, vertex } from './google-vertex-provider-node'; export type { GoogleVertexProvider, From 1393e479ce190a0bc0a7e3ccffa98bbc5358cc52 Mon Sep 17 00:00:00 2001 From: Grace Yun Date: Tue, 1 Apr 2025 13:10:05 -0400 Subject: [PATCH 02/11] feat: google language model options --- ...oogle-generative-ai-language-model.test.ts | 65 ++++++++++++++++++- .../google-generative-ai-language-model.ts | 11 +++- packages/google/src/index.ts | 3 +- 3 files changed, 74 insertions(+), 5 deletions(-) diff --git a/packages/google/src/google-generative-ai-language-model.test.ts b/packages/google/src/google-generative-ai-language-model.test.ts index 8aeead5f9e32..cef2ac9b0a8a 100644 --- a/packages/google/src/google-generative-ai-language-model.test.ts +++ b/packages/google/src/google-generative-ai-language-model.test.ts @@ -4,12 +4,12 @@ import { convertReadableStreamToArray, withTestServer, } from '@ai-sdk/provider-utils/test'; -import { createGoogleGenerativeAI } from './google-provider'; import { GoogleGenerativeAILanguageModel, groundingMetadataSchema, } from './google-generative-ai-language-model'; import { GoogleGenerativeAIGroundingMetadata } from './google-generative-ai-prompt'; +import { createGoogleGenerativeAI } from './google-provider'; const TEST_PROMPT: LanguageModelV1Prompt = [ { role: 'user', content: [{ type: 'text', text: 'Hello' }] }, @@ -1274,6 +1274,40 @@ describe('doGenerate', () => { }, ), ); + + it( + 'should only pass valid provider options', + withTestServer(prepareJsonResponse({}), async ({ call }) => { + await model.doGenerate({ + inputFormat: 'prompt', + mode: { type: 'regular' }, + prompt: [ + { role: 'system', content: 'test system instruction' }, + { role: 'user', content: [{ type: 'text', text: 'Hello' }] }, + ], + seed: 123, + temperature: 0.5, + providerMetadata: { + google: { foo: 'bar', responseModalities: ['TEXT', 'IMAGE'] }, + }, + }); + + expect(await call(0).getRequestBodyJson()).toStrictEqual({ + contents: [ + { + role: 'user', + parts: [{ text: 'Hello' }], + }, + ], + systemInstruction: { parts: [{ text: 'test system instruction' }] }, + generationConfig: { + seed: 123, + temperature: 0.5, + responseModalities: ['TEXT', 'IMAGE'], + }, + }); + }), + ); }); describe('doStream', () => { @@ -1922,4 +1956,33 @@ describe('doStream', () => { }, ), ); + + it( + 'should only pass valid provider options', + withTestServer( + prepareStreamResponse({ content: [''] }), + async ({ call }) => { + await model.doStream({ + inputFormat: 'prompt', + mode: { type: 'regular' }, + prompt: TEST_PROMPT, + providerMetadata: { + google: { foo: 'bar', responseModalities: ['TEXT', 'IMAGE'] }, + }, + }); + + expect(await call(0).getRequestBodyJson()).toStrictEqual({ + contents: [ + { + role: 'user', + parts: [{ text: 'Hello' }], + }, + ], + generationConfig: { + responseModalities: ['TEXT', 'IMAGE'], + }, + }); + }, + ), + ); }); diff --git a/packages/google/src/google-generative-ai-language-model.ts b/packages/google/src/google-generative-ai-language-model.ts index 8f2a9bf1c356..6482e97d64c9 100644 --- a/packages/google/src/google-generative-ai-language-model.ts +++ b/packages/google/src/google-generative-ai-language-model.ts @@ -88,9 +88,7 @@ export class GoogleGenerativeAILanguageModel implements LanguageModelV1 { const googleOptions = parseProviderOptions({ provider: 'google', providerOptions: providerMetadata, - schema: z.object({ - responseModalities: z.array(z.enum(['TEXT', 'IMAGE'])).nullish(), - }), + schema: googleGenerativeAIProviderOptionsSchema, }); const generationConfig = { @@ -623,3 +621,10 @@ const chunkSchema = z.object({ }) .nullish(), }); + +const googleGenerativeAIProviderOptionsSchema = z.object({ + responseModalities: z.array(z.enum(['TEXT', 'IMAGE'])).nullish(), +}); +export type GoogleGenerativeAIProviderOptions = z.infer< + typeof googleGenerativeAIProviderOptionsSchema +>; diff --git a/packages/google/src/index.ts b/packages/google/src/index.ts index bf9c08c46346..8220c6c80ba0 100644 --- a/packages/google/src/index.ts +++ b/packages/google/src/index.ts @@ -1,6 +1,7 @@ -export { createGoogleGenerativeAI, google } from './google-provider'; export type { GoogleErrorData } from './google-error'; +export type { GoogleGenerativeAIProviderOptions } from './google-generative-ai-language-model'; export type { GoogleGenerativeAIProviderMetadata } from './google-generative-ai-prompt'; +export { createGoogleGenerativeAI, google } from './google-provider'; export type { GoogleGenerativeAIProvider, GoogleGenerativeAIProviderSettings, From 0b7d3a53a1a8f4b3af02f13d67558622ff4a8c44 Mon Sep 17 00:00:00 2001 From: Grace Yun Date: Tue, 1 Apr 2025 13:29:27 -0400 Subject: [PATCH 03/11] chore: docs --- packages/google-vertex/src/google-vertex-image-model.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/google-vertex/src/google-vertex-image-model.ts b/packages/google-vertex/src/google-vertex-image-model.ts index 889c6e344177..c522710c1b66 100644 --- a/packages/google-vertex/src/google-vertex-image-model.ts +++ b/packages/google-vertex/src/google-vertex-image-model.ts @@ -117,7 +117,6 @@ const vertexImageResponseSchema = z.object({ }); const googleVertexImageProviderOptionsSchema = z.object({ - temperature: z.number().nullish(), enhancePrompt: z.boolean().nullish(), negativePrompt: z.string().nullish(), personGeneration: z @@ -136,4 +135,4 @@ const googleVertexImageProviderOptionsSchema = z.object({ }); export type GoogleVertexImageProviderOptions = z.infer< typeof googleVertexImageProviderOptionsSchema ->; \ No newline at end of file +>; From 460800856b9b0979573a913fbc3ef8aada5930ca Mon Sep 17 00:00:00 2001 From: Grace Yun Date: Tue, 1 Apr 2025 13:29:39 -0400 Subject: [PATCH 04/11] chore: docs --- .../15-google-generative-ai.mdx | 16 ++++++++++++++++ .../01-ai-sdk-providers/16-google-vertex.mdx | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx b/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx index 980fb3ccdc4d..a0243cdcf70e 100644 --- a/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx +++ b/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx @@ -132,6 +132,22 @@ The following optional settings are available for Google Generative AI models: - `BLOCK_ONLY_HIGH` - `BLOCK_NONE` +Further configuration can be done using Google Generative AI provider options. You can validate the provider options using the `GoogleGenerativeAIProviderOptions` type. + +```ts +import { google } from '@ai-sdk/google'; +import { GoogleGenerativeAIProviderOptions } from '@ai-sdk/google'; +import { generateText } from 'ai'; + +const { text } = await generateText({ + model: google('gemini-1.5-pro-latest'), + providerOptions: { + google: { responseModalities: ['TEXT', 'IMAGE'] } satisfies GoogleGenerativeAIProviderOptions, + }, + // ... +}); +``` + You can use Google Generative AI language models to generate text with the `generateText` function: ```ts diff --git a/content/providers/01-ai-sdk-providers/16-google-vertex.mdx b/content/providers/01-ai-sdk-providers/16-google-vertex.mdx index b326449fd6fe..1b463fdf6890 100644 --- a/content/providers/01-ai-sdk-providers/16-google-vertex.mdx +++ b/content/providers/01-ai-sdk-providers/16-google-vertex.mdx @@ -599,6 +599,22 @@ const { image } = await generateImage({ }); ``` +Further configuration can be done using Google Vertex provider options. You can validate the provider options using the `GoogleVertexImageProviderOptions` type. + +```ts +import { vertex } from '@ai-sdk/google-vertex'; +import { GoogleVertexImageProviderOptions } from '@ai-sdk/google-vertex'; +import { generateImage } from 'ai'; + +const { image } = await generateImage({ + model: vertex.image('imagen-3.0-generate-001'), + providerOptions: { + vertex: { enhancePrompt: true } satisfies GoogleVertexImageProviderOptions, + }, + // ... +}); +``` + Imagen models do not support the `size` parameter. Use the `aspectRatio` parameter instead. From 9cc3e3812c121e62d0311fca6f337e436c68b16d Mon Sep 17 00:00:00 2001 From: Grace Yun Date: Tue, 1 Apr 2025 13:32:30 -0400 Subject: [PATCH 05/11] chore: examples --- examples/ai-core/src/generate-image/google-vertex.ts | 11 +++++++---- examples/ai-core/src/generate-text/google-image.ts | 7 ++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/examples/ai-core/src/generate-image/google-vertex.ts b/examples/ai-core/src/generate-image/google-vertex.ts index 4635fcda81dd..3a6be761ed9b 100644 --- a/examples/ai-core/src/generate-image/google-vertex.ts +++ b/examples/ai-core/src/generate-image/google-vertex.ts @@ -1,7 +1,10 @@ -import { vertex } from '@ai-sdk/google-vertex'; +import { + GoogleVertexImageProviderOptions, + vertex, +} from '@ai-sdk/google-vertex'; import { experimental_generateImage as generateImage } from 'ai'; -import { presentImages } from '../lib/present-image'; import 'dotenv/config'; +import { presentImages } from '../lib/present-image'; async function main() { const { image } = await generateImage({ @@ -10,9 +13,9 @@ async function main() { aspectRatio: '1:1', providerOptions: { vertex: { - // https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/imagen-api#parameter_list addWatermark: false, - }, + enhancePrompt: true, + } satisfies GoogleVertexImageProviderOptions, }, }); diff --git a/examples/ai-core/src/generate-text/google-image.ts b/examples/ai-core/src/generate-text/google-image.ts index d7c66219ecdf..f5f32d72134a 100644 --- a/examples/ai-core/src/generate-text/google-image.ts +++ b/examples/ai-core/src/generate-text/google-image.ts @@ -1,4 +1,4 @@ -import { google } from '@ai-sdk/google'; +import { google, GoogleGenerativeAIProviderOptions } from '@ai-sdk/google'; import { generateText } from 'ai'; import 'dotenv/config'; import fs from 'node:fs'; @@ -15,6 +15,11 @@ async function main() { ], }, ], + providerOptions: { + google: { + responseModalities: ['TEXT', 'IMAGE'], + } satisfies GoogleGenerativeAIProviderOptions, + }, }); console.log(result.text); From fd6a04f3982cddf6afa23995b2cccd609bc745d2 Mon Sep 17 00:00:00 2001 From: Grace Yun Date: Tue, 1 Apr 2025 13:33:20 -0400 Subject: [PATCH 06/11] changeset --- .changeset/pink-deers-switch.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/pink-deers-switch.md diff --git a/.changeset/pink-deers-switch.md b/.changeset/pink-deers-switch.md new file mode 100644 index 000000000000..84d524aeb623 --- /dev/null +++ b/.changeset/pink-deers-switch.md @@ -0,0 +1,6 @@ +--- +'@ai-sdk/google-vertex': patch +'@ai-sdk/google': patch +--- + +feat: add provider option schemas for vertex imagegen and google genai From c2504aea1191c208e37276df14d91192d9bd5d0b Mon Sep 17 00:00:00 2001 From: Grace Yun Date: Tue, 1 Apr 2025 13:38:13 -0400 Subject: [PATCH 07/11] prettier --- .../providers/01-ai-sdk-providers/15-google-generative-ai.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx b/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx index a0243cdcf70e..7cde3af6f035 100644 --- a/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx +++ b/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx @@ -142,7 +142,9 @@ import { generateText } from 'ai'; const { text } = await generateText({ model: google('gemini-1.5-pro-latest'), providerOptions: { - google: { responseModalities: ['TEXT', 'IMAGE'] } satisfies GoogleGenerativeAIProviderOptions, + google: { + responseModalities: ['TEXT', 'IMAGE'], + } satisfies GoogleGenerativeAIProviderOptions, }, // ... }); From e75cdbbbcbbd3422cb11e2ea9721a946c4e60b2e Mon Sep 17 00:00:00 2001 From: Grace Yun Date: Tue, 1 Apr 2025 18:14:42 -0400 Subject: [PATCH 08/11] fix naming --- .../google-vertex/src/google-vertex-image-model.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/google-vertex/src/google-vertex-image-model.ts b/packages/google-vertex/src/google-vertex-image-model.ts index c522710c1b66..456592d79ec4 100644 --- a/packages/google-vertex/src/google-vertex-image-model.ts +++ b/packages/google-vertex/src/google-vertex-image-model.ts @@ -66,10 +66,10 @@ export class GoogleVertexImageModel implements ImageModelV1 { }); } - const googleVertexImageOptions = parseProviderOptions({ + const vertexImageOptions = parseProviderOptions({ provider: 'vertex', - providerOptions: providerOptions, - schema: googleVertexImageProviderOptionsSchema, + providerOptions, + schema: vertexImageProviderOptionsSchema, }); const body = { @@ -78,7 +78,7 @@ export class GoogleVertexImageModel implements ImageModelV1 { sampleCount: n, ...(aspectRatio != null ? { aspectRatio } : {}), ...(seed != null ? { seed } : {}), - ...(googleVertexImageOptions ?? {}), + ...(vertexImageOptions ?? {}), }, }; @@ -116,7 +116,7 @@ const vertexImageResponseSchema = z.object({ predictions: z.array(z.object({ bytesBase64Encoded: z.string() })).nullish(), }); -const googleVertexImageProviderOptionsSchema = z.object({ +const vertexImageProviderOptionsSchema = z.object({ enhancePrompt: z.boolean().nullish(), negativePrompt: z.string().nullish(), personGeneration: z @@ -134,5 +134,5 @@ const googleVertexImageProviderOptionsSchema = z.object({ storageUri: z.string().nullish(), }); export type GoogleVertexImageProviderOptions = z.infer< - typeof googleVertexImageProviderOptionsSchema + typeof vertexImageProviderOptionsSchema >; From 39ae9960a06c11b36b679d3d679db45d8bb12148 Mon Sep 17 00:00:00 2001 From: Grace Yun Date: Wed, 2 Apr 2025 15:54:17 -0400 Subject: [PATCH 09/11] fix: test merge conflicts --- .../src/google-vertex-image-model.test.ts | 8 +-- ...oogle-generative-ai-language-model.test.ts | 58 +++++++++++++++++++ 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/packages/google-vertex/src/google-vertex-image-model.test.ts b/packages/google-vertex/src/google-vertex-image-model.test.ts index f3c650478849..9f0005d29297 100644 --- a/packages/google-vertex/src/google-vertex-image-model.test.ts +++ b/packages/google-vertex/src/google-vertex-image-model.test.ts @@ -277,7 +277,7 @@ describe('GoogleVertexImageModel', () => { const result = await model.doGenerate({ prompt, - n: 1, + n: 2, size: undefined, aspectRatio: undefined, seed: undefined, @@ -300,7 +300,7 @@ describe('GoogleVertexImageModel', () => { await model.doGenerate({ prompt, - n: 1, + n: 2, size: undefined, aspectRatio: '16:9', seed: undefined, @@ -314,10 +314,10 @@ describe('GoogleVertexImageModel', () => { }, }); - expect(await server.getRequestBodyJson()).toStrictEqual({ + expect(await server.calls[0].requestBody).toStrictEqual({ instances: [{ prompt }], parameters: { - sampleCount: 1, + sampleCount: 2, enhancePrompt: true, negativePrompt: 'negative prompt', personGeneration: 'allow_all', diff --git a/packages/google/src/google-generative-ai-language-model.test.ts b/packages/google/src/google-generative-ai-language-model.test.ts index 4a10794a8c2a..a860afb73ad9 100644 --- a/packages/google/src/google-generative-ai-language-model.test.ts +++ b/packages/google/src/google-generative-ai-language-model.test.ts @@ -414,6 +414,39 @@ describe('doGenerate', () => { }); }); + it('should only pass valid provider options', async () => { + prepareJsonResponse({}); + + await model.doGenerate({ + inputFormat: 'prompt', + mode: { type: 'regular' }, + prompt: [ + { role: 'system', content: 'test system instruction' }, + { role: 'user', content: [{ type: 'text', text: 'Hello' }] }, + ], + seed: 123, + temperature: 0.5, + providerMetadata: { + google: { foo: 'bar', responseModalities: ['TEXT', 'IMAGE'] }, + }, + }); + + expect(await server.calls[0].requestBody).toStrictEqual({ + contents: [ + { + role: 'user', + parts: [{ text: 'Hello' }], + }, + ], + systemInstruction: { parts: [{ text: 'test system instruction' }] }, + generationConfig: { + seed: 123, + temperature: 0.5, + responseModalities: ['TEXT', 'IMAGE'], + }, + }); + }); + it('should pass tools and toolChoice', async () => { prepareJsonResponse({}); @@ -1869,4 +1902,29 @@ describe('doStream', () => { 'tool-calls', ); }); + + it('should only pass valid provider options', async () => { + prepareStreamResponse({ content: [''] }); + + await model.doStream({ + inputFormat: 'prompt', + mode: { type: 'regular' }, + prompt: TEST_PROMPT, + providerMetadata: { + google: { foo: 'bar', responseModalities: ['TEXT', 'IMAGE'] }, + }, + }); + + expect(await server.calls[0].requestBody).toMatchObject({ + contents: [ + { + role: 'user', + parts: [{ text: 'Hello' }], + }, + ], + generationConfig: { + responseModalities: ['TEXT', 'IMAGE'], + }, + }); + }); }); From ea45e7ae2e9a2c75cf8f01197e3088e5478ac4fd Mon Sep 17 00:00:00 2001 From: Grace Yun Date: Wed, 2 Apr 2025 16:16:18 -0400 Subject: [PATCH 10/11] fix: docs --- .../15-google-generative-ai.mdx | 6 +++++- .../01-ai-sdk-providers/16-google-vertex.mdx | 19 ++++++++++++++++++- .../src/generate-image/google-vertex.ts | 1 - .../src/google-vertex-image-model.test.ts | 8 ++++---- .../src/google-vertex-image-model.ts | 1 - 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx b/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx index 7cde3af6f035..a9c08c5cc51b 100644 --- a/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx +++ b/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx @@ -80,7 +80,7 @@ const model = google('gemini-1.5-pro-latest'); e.g. `tunedModels/my-model`. -Google Generative AI models support also some model specific settings that are not part of the [standard call settings](/docs/ai-sdk-core/settings). +Google Generative AI also supports some model specific settings that are not part of the [standard call settings](/docs/ai-sdk-core/settings). You can pass them as an options argument: ```ts @@ -149,6 +149,10 @@ const { text } = await generateText({ // ... }); ``` +The following provider options are available: + +- **responseModalities** _string[]_ + The modalities to use for the response. The following modalities are supported: `TEXT`, `IMAGE`. When not defined or empty, the model defaults to returning only text. You can use Google Generative AI language models to generate text with the `generateText` function: diff --git a/content/providers/01-ai-sdk-providers/16-google-vertex.mdx b/content/providers/01-ai-sdk-providers/16-google-vertex.mdx index 1b463fdf6890..669dbc883104 100644 --- a/content/providers/01-ai-sdk-providers/16-google-vertex.mdx +++ b/content/providers/01-ai-sdk-providers/16-google-vertex.mdx @@ -609,12 +609,29 @@ import { generateImage } from 'ai'; const { image } = await generateImage({ model: vertex.image('imagen-3.0-generate-001'), providerOptions: { - vertex: { enhancePrompt: true } satisfies GoogleVertexImageProviderOptions, + vertex: { negativePrompt: 'pixelated, blurry, low-quality' } satisfies GoogleVertexImageProviderOptions, }, // ... }); ``` +The following provider options are available: + +- **negativePrompt** _string_ + A description of what to discourage in the generated images. + +- **personGeneration** `allow_adult` | `allow_all` | `dont_allow` + Whether to allow person generation. Defaults to `allow_adult`. + +- **safetySetting** `block_low_and_above` | `block_medium_and_above` | `block_only_high` | `block_none` + Whether to block unsafe content. Defaults to `block_medium_and_above`. + +- **addWatermark** _boolean_ + Whether to add an invisible watermark to the generated images. Defaults to `true`. + +- **storageUri** _string_ + Cloud Storage URI to store the generated images. + Imagen models do not support the `size` parameter. Use the `aspectRatio` parameter instead. diff --git a/examples/ai-core/src/generate-image/google-vertex.ts b/examples/ai-core/src/generate-image/google-vertex.ts index 3a6be761ed9b..d21043e1005b 100644 --- a/examples/ai-core/src/generate-image/google-vertex.ts +++ b/examples/ai-core/src/generate-image/google-vertex.ts @@ -14,7 +14,6 @@ async function main() { providerOptions: { vertex: { addWatermark: false, - enhancePrompt: true, } satisfies GoogleVertexImageProviderOptions, }, }); diff --git a/packages/google-vertex/src/google-vertex-image-model.test.ts b/packages/google-vertex/src/google-vertex-image-model.test.ts index 9f0005d29297..c9be8cb4839a 100644 --- a/packages/google-vertex/src/google-vertex-image-model.test.ts +++ b/packages/google-vertex/src/google-vertex-image-model.test.ts @@ -189,7 +189,7 @@ describe('GoogleVertexImageModel', () => { seed: 42, providerOptions: { vertex: { - enhancePrompt: true, + addWatermark: false, }, }, }); @@ -200,7 +200,7 @@ describe('GoogleVertexImageModel', () => { sampleCount: 1, aspectRatio: '1:1', seed: 42, - enhancePrompt: true, + addWatermark: false, }, }); }); @@ -306,7 +306,7 @@ describe('GoogleVertexImageModel', () => { seed: undefined, providerOptions: { vertex: { - enhancePrompt: true, + addWatermark: false, negativePrompt: 'negative prompt', personGeneration: 'allow_all', foo: 'bar', @@ -318,7 +318,7 @@ describe('GoogleVertexImageModel', () => { instances: [{ prompt }], parameters: { sampleCount: 2, - enhancePrompt: true, + addWatermark: false, negativePrompt: 'negative prompt', personGeneration: 'allow_all', aspectRatio: '16:9', diff --git a/packages/google-vertex/src/google-vertex-image-model.ts b/packages/google-vertex/src/google-vertex-image-model.ts index 456592d79ec4..635b50df5445 100644 --- a/packages/google-vertex/src/google-vertex-image-model.ts +++ b/packages/google-vertex/src/google-vertex-image-model.ts @@ -117,7 +117,6 @@ const vertexImageResponseSchema = z.object({ }); const vertexImageProviderOptionsSchema = z.object({ - enhancePrompt: z.boolean().nullish(), negativePrompt: z.string().nullish(), personGeneration: z .enum(['dont_allow', 'allow_adult', 'allow_all']) From 089eb5054ec0d3ca2caf39778ad1b3d089e6f119 Mon Sep 17 00:00:00 2001 From: Grace Yun Date: Wed, 2 Apr 2025 18:52:14 -0400 Subject: [PATCH 11/11] prettier --- .../providers/01-ai-sdk-providers/15-google-generative-ai.mdx | 1 + content/providers/01-ai-sdk-providers/16-google-vertex.mdx | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx b/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx index a9c08c5cc51b..2fba02438350 100644 --- a/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx +++ b/content/providers/01-ai-sdk-providers/15-google-generative-ai.mdx @@ -149,6 +149,7 @@ const { text } = await generateText({ // ... }); ``` + The following provider options are available: - **responseModalities** _string[]_ diff --git a/content/providers/01-ai-sdk-providers/16-google-vertex.mdx b/content/providers/01-ai-sdk-providers/16-google-vertex.mdx index 669dbc883104..b65b0f6b0819 100644 --- a/content/providers/01-ai-sdk-providers/16-google-vertex.mdx +++ b/content/providers/01-ai-sdk-providers/16-google-vertex.mdx @@ -609,7 +609,9 @@ import { generateImage } from 'ai'; const { image } = await generateImage({ model: vertex.image('imagen-3.0-generate-001'), providerOptions: { - vertex: { negativePrompt: 'pixelated, blurry, low-quality' } satisfies GoogleVertexImageProviderOptions, + vertex: { + negativePrompt: 'pixelated, blurry, low-quality', + } satisfies GoogleVertexImageProviderOptions, }, // ... });