From 63376886bb18b4bd40eb51fb1bee4130c7fca5b4 Mon Sep 17 00:00:00 2001 From: Lars Grammel Date: Tue, 7 Jan 2025 14:23:43 +0100 Subject: [PATCH] feat: change image generation errors to warnings (#4298) --- .changeset/sour-months-give.md | 10 +++ .../03-ai-sdk-core/35-image-generation.mdx | 11 +++ .../01-ai-sdk-core/10-generate-image.mdx | 6 ++ .../generate-image/generate-image-result.ts | 7 ++ .../generate-image/generate-image.test.ts | 35 ++++++++-- .../ai/core/generate-image/generate-image.ts | 34 ++++++---- packages/ai/core/types/image-model.ts | 12 ++++ packages/ai/core/types/index.ts | 4 ++ .../src/fireworks-image-model.test.ts | 55 ++++++--------- .../fireworks/src/fireworks-image-model.ts | 20 +++--- .../src/google-vertex-image-model.test.ts | 47 ++++++------- .../src/google-vertex-image-model.ts | 19 +++--- .../openai/src/openai-image-model.test.ts | 26 +++++++ packages/openai/src/openai-image-model.ts | 22 +++--- .../src/test/binary-test-server.ts | 2 + .../v1/image-model-v1-call-options.ts | 60 +++++++++++++++++ .../v1/image-model-v1-call-warning.ts | 16 +++++ .../src/image-model/v1/image-model-v1.ts | 67 +++---------------- packages/provider/src/image-model/v1/index.ts | 4 +- .../language-model/v1/language-model-v1.ts | 5 +- 20 files changed, 287 insertions(+), 175 deletions(-) create mode 100644 .changeset/sour-months-give.md create mode 100644 packages/ai/core/types/image-model.ts create mode 100644 packages/provider/src/image-model/v1/image-model-v1-call-options.ts create mode 100644 packages/provider/src/image-model/v1/image-model-v1-call-warning.ts diff --git a/.changeset/sour-months-give.md b/.changeset/sour-months-give.md new file mode 100644 index 000000000000..af491bfc11f1 --- /dev/null +++ b/.changeset/sour-months-give.md @@ -0,0 +1,10 @@ +--- +'@ai-sdk/provider-utils': patch +'@ai-sdk/google-vertex': patch +'@ai-sdk/fireworks': patch +'@ai-sdk/provider': patch +'@ai-sdk/openai': patch +'ai': patch +--- + +feat: change image generation errors to warnings diff --git a/content/docs/03-ai-sdk-core/35-image-generation.mdx b/content/docs/03-ai-sdk-core/35-image-generation.mdx index f6a157f3f97e..a13b934a4662 100644 --- a/content/docs/03-ai-sdk-core/35-image-generation.mdx +++ b/content/docs/03-ai-sdk-core/35-image-generation.mdx @@ -148,6 +148,17 @@ const { image } = await generateImage({ }); ``` +### Warnings + +If the model returns warnings, e.g. for unsupported parameters, they will be available in the `warnings` property of the response. + +```tsx +const { image, warnings } = await generateImage({ + model: openai.image('dall-e-3'), + prompt: 'Santa Claus driving a Cadillac', +}); +``` + ## Image Models | Provider | Model | Sizes | Aspect Ratios | diff --git a/content/docs/07-reference/01-ai-sdk-core/10-generate-image.mdx b/content/docs/07-reference/01-ai-sdk-core/10-generate-image.mdx index 7f2d25ae7926..5ca7c3ebe894 100644 --- a/content/docs/07-reference/01-ai-sdk-core/10-generate-image.mdx +++ b/content/docs/07-reference/01-ai-sdk-core/10-generate-image.mdx @@ -149,5 +149,11 @@ console.log(images); }, ], }, + { + name: 'warnings', + type: 'ImageGenerationWarning[]', + description: + 'Warnings from the model provider (e.g. unsupported settings).', + }, ]} /> diff --git a/packages/ai/core/generate-image/generate-image-result.ts b/packages/ai/core/generate-image/generate-image-result.ts index 3d31c07efcd0..4b1e361d5360 100644 --- a/packages/ai/core/generate-image/generate-image-result.ts +++ b/packages/ai/core/generate-image/generate-image-result.ts @@ -1,3 +1,5 @@ +import { ImageGenerationWarning } from '../types/image-model'; + /** The result of a `generateImage` call. It contains the images and additional information. @@ -12,6 +14,11 @@ The first image that was generated. The images that were generated. */ readonly images: Array; + + /** +Warnings for the call, e.g. unsupported settings. + */ + readonly warnings: Array; } export interface GeneratedImage { diff --git a/packages/ai/core/generate-image/generate-image.test.ts b/packages/ai/core/generate-image/generate-image.test.ts index 10690dd5650c..1c2d65343891 100644 --- a/packages/ai/core/generate-image/generate-image.test.ts +++ b/packages/ai/core/generate-image/generate-image.test.ts @@ -19,7 +19,7 @@ describe('generateImage', () => { model: new MockImageModelV1({ doGenerate: async args => { capturedArgs = args; - return { images: [] }; + return { images: [], warnings: [] }; }, }), prompt, @@ -43,6 +43,30 @@ describe('generateImage', () => { }); }); + it('should return warnings', async () => { + const result = await generateImage({ + model: new MockImageModelV1({ + doGenerate: async () => ({ + images: [], + warnings: [ + { + type: 'other', + message: 'Setting is not supported', + }, + ], + }), + }), + prompt, + }); + + expect(result.warnings).toStrictEqual([ + { + type: 'other', + message: 'Setting is not supported', + }, + ]); + }); + describe('base64 image data', () => { it('should return generated images', async () => { const base64Images = [ @@ -52,7 +76,7 @@ describe('generateImage', () => { const result = await generateImage({ model: new MockImageModelV1({ - doGenerate: async () => ({ images: base64Images }), + doGenerate: async () => ({ images: base64Images, warnings: [] }), }), prompt, }); @@ -79,7 +103,10 @@ describe('generateImage', () => { const result = await generateImage({ model: new MockImageModelV1({ - doGenerate: async () => ({ images: [base64Image, 'base64-image-2'] }), + doGenerate: async () => ({ + images: [base64Image, 'base64-image-2'], + warnings: [], + }), }), prompt, }); @@ -103,7 +130,7 @@ describe('generateImage', () => { const result = await generateImage({ model: new MockImageModelV1({ - doGenerate: async () => ({ images: uint8ArrayImages }), + doGenerate: async () => ({ images: uint8ArrayImages, warnings: [] }), }), prompt, }); diff --git a/packages/ai/core/generate-image/generate-image.ts b/packages/ai/core/generate-image/generate-image.ts index dc2c9c1101a7..6cef19cc55f3 100644 --- a/packages/ai/core/generate-image/generate-image.ts +++ b/packages/ai/core/generate-image/generate-image.ts @@ -4,6 +4,7 @@ import { convertUint8ArrayToBase64, } from '@ai-sdk/provider-utils'; import { prepareRetries } from '../prompt/prepare-retries'; +import { ImageGenerationWarning } from '../types/image-model'; import { GeneratedImage, GenerateImageResult } from './generate-image-result'; /** @@ -101,29 +102,34 @@ Only applicable for HTTP-based providers. }): Promise { const { retry } = prepareRetries({ maxRetries: maxRetriesArg }); - const { images } = await retry(() => - model.doGenerate({ - prompt, - n: n ?? 1, - abortSignal, - headers, - size, - aspectRatio, - seed, - providerOptions: providerOptions ?? {}, - }), + return new DefaultGenerateImageResult( + await retry(() => + model.doGenerate({ + prompt, + n: n ?? 1, + abortSignal, + headers, + size, + aspectRatio, + seed, + providerOptions: providerOptions ?? {}, + }), + ), ); - - return new DefaultGenerateImageResult({ images }); } class DefaultGenerateImageResult implements GenerateImageResult { readonly images: Array; + readonly warnings: Array; - constructor(options: { images: Array | Array }) { + constructor(options: { + images: Array | Array; + warnings: Array; + }) { this.images = options.images.map( image => new DefaultGeneratedImage({ imageData: image }), ); + this.warnings = options.warnings; } get image() { diff --git a/packages/ai/core/types/image-model.ts b/packages/ai/core/types/image-model.ts new file mode 100644 index 000000000000..bcf85992bfc8 --- /dev/null +++ b/packages/ai/core/types/image-model.ts @@ -0,0 +1,12 @@ +import { ImageModelV1, ImageModelV1CallWarning } from '@ai-sdk/provider'; + +/** +Image model that is used by the AI SDK Core functions. + */ +export type ImageModel = ImageModelV1; + +/** +Warning from the model provider for this call. The call will proceed, but e.g. +some settings might not be supported, which can lead to suboptimal results. + */ +export type ImageGenerationWarning = ImageModelV1CallWarning; diff --git a/packages/ai/core/types/index.ts b/packages/ai/core/types/index.ts index c57eee4a46fa..8bdb0ffb44c8 100644 --- a/packages/ai/core/types/index.ts +++ b/packages/ai/core/types/index.ts @@ -1,4 +1,8 @@ export type { Embedding, EmbeddingModel } from './embedding-model'; +export type { + ImageModel, + ImageGenerationWarning as ImageModelCallWarning, +} from './image-model'; export type { CallWarning, CoreToolChoice, diff --git a/packages/fireworks/src/fireworks-image-model.test.ts b/packages/fireworks/src/fireworks-image-model.test.ts index 119bff09b6c2..3556a516e69d 100644 --- a/packages/fireworks/src/fireworks-image-model.test.ts +++ b/packages/fireworks/src/fireworks-image-model.test.ts @@ -1,8 +1,7 @@ import { APICallError } from '@ai-sdk/provider'; import { BinaryTestServer } from '@ai-sdk/provider-utils/test'; +import { describe, expect, it } from 'vitest'; import { FireworksImageModel } from './fireworks-image-model'; -import { describe, it, expect } from 'vitest'; -import { UnsupportedFunctionalityError } from '@ai-sdk/provider'; const prompt = 'A cute baby sea otter'; @@ -169,41 +168,27 @@ describe('FireworksImageModel', () => { }); }); - it('should throw error when requesting more than one image', async () => { - await expect( - model.doGenerate({ - prompt, - n: 2, - size: undefined, - aspectRatio: undefined, - seed: undefined, - providerOptions: {}, - }), - ).rejects.toThrowError( - new UnsupportedFunctionalityError({ - functionality: 'generate multiple images', - message: `This model does not support generating more than 1 images at a time.`, - }), - ); - }); + it('should return warnings for unsupported settings', async () => { + const mockImageBuffer = Buffer.from('mock-image-data'); + server.responseBody = mockImageBuffer; - it('should throw error when specifying image size', async () => { - await expect( - model.doGenerate({ - prompt, - n: 1, - size: '512x512', - aspectRatio: undefined, - seed: undefined, - providerOptions: {}, - }), - ).rejects.toThrowError( - new UnsupportedFunctionalityError({ - functionality: 'image size', - message: + const result = await model.doGenerate({ + prompt, + n: 1, + size: '1024x1024', + aspectRatio: '1:1', + seed: 123, + providerOptions: {}, + }); + + expect(result.warnings).toStrictEqual([ + { + type: 'unsupported-setting', + setting: 'size', + details: 'This model does not support the `size` option. Use `aspectRatio` instead.', - }), - ); + }, + ]); }); }); }); diff --git a/packages/fireworks/src/fireworks-image-model.ts b/packages/fireworks/src/fireworks-image-model.ts index 8a880cb3dd39..28602b0a76fe 100644 --- a/packages/fireworks/src/fireworks-image-model.ts +++ b/packages/fireworks/src/fireworks-image-model.ts @@ -1,7 +1,7 @@ import { APICallError, ImageModelV1, - UnsupportedFunctionalityError, + ImageModelV1CallWarning, } from '@ai-sdk/provider'; import { combineHeaders, @@ -106,21 +106,17 @@ export class FireworksImageModel implements ImageModelV1 { }: Parameters[0]): Promise< Awaited> > { + const warnings: Array = []; + if (size != null) { - throw new UnsupportedFunctionalityError({ - functionality: 'image size', - message: + warnings.push({ + type: 'unsupported-setting', + setting: 'size', + details: 'This model does not support the `size` option. Use `aspectRatio` instead.', }); } - if (n > this.maxImagesPerCall) { - throw new UnsupportedFunctionalityError({ - functionality: `generate more than ${this.maxImagesPerCall} images`, - message: `This model does not support generating more than ${this.maxImagesPerCall} images at a time.`, - }); - } - const url = `${this.config.baseURL}/workflows/${this.modelId}/text_to_image`; const body = { prompt, @@ -139,6 +135,6 @@ export class FireworksImageModel implements ImageModelV1 { fetch: this.config.fetch, }); - return { images: [new Uint8Array(response)] }; + return { images: [new Uint8Array(response)], warnings }; } } 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 f28295cfd7ac..a16d6ffbe585 100644 --- a/packages/google-vertex/src/google-vertex-image-model.test.ts +++ b/packages/google-vertex/src/google-vertex-image-model.test.ts @@ -1,7 +1,6 @@ import { JsonTestServer } from '@ai-sdk/provider-utils/test'; import { describe, expect, it } from 'vitest'; import { GoogleVertexImageModel } from './google-vertex-image-model'; -import { UnsupportedFunctionalityError } from '@ai-sdk/provider'; const prompt = 'A cute baby sea otter'; @@ -99,30 +98,6 @@ describe('GoogleVertexImageModel', () => { expect(result.images).toStrictEqual(['base64-image-1', 'base64-image-2']); }); - it('throws when size is specified', async () => { - const model = new GoogleVertexImageModel('imagen-3.0-generate-001', { - provider: 'vertex', - baseURL: 'https://example.com', - }); - - await expect( - model.doGenerate({ - prompt: 'test prompt', - n: 1, - size: '1024x1024', - aspectRatio: undefined, - seed: undefined, - providerOptions: {}, - }), - ).rejects.toThrow( - new UnsupportedFunctionalityError({ - functionality: 'image size', - message: - 'This model does not support the `size` option. Use `aspectRatio` instead.', - }), - ); - }); - it('sends aspect ratio in the request', async () => { prepareJsonResponse(); @@ -216,5 +191,27 @@ describe('GoogleVertexImageModel', () => { }, }); }); + + it('should return warnings for unsupported settings', async () => { + prepareJsonResponse(); + + const result = await model.doGenerate({ + prompt, + n: 1, + size: '1024x1024', + aspectRatio: '1:1', + seed: 123, + providerOptions: {}, + }); + + expect(result.warnings).toStrictEqual([ + { + type: 'unsupported-setting', + setting: 'size', + details: + 'This model does not support the `size` option. Use `aspectRatio` instead.', + }, + ]); + }); }); }); diff --git a/packages/google-vertex/src/google-vertex-image-model.ts b/packages/google-vertex/src/google-vertex-image-model.ts index 507d799b82f4..6dfe56298a9d 100644 --- a/packages/google-vertex/src/google-vertex-image-model.ts +++ b/packages/google-vertex/src/google-vertex-image-model.ts @@ -1,4 +1,4 @@ -import { ImageModelV1, UnsupportedFunctionalityError } from '@ai-sdk/provider'; +import { ImageModelV1, ImageModelV1CallWarning } from '@ai-sdk/provider'; import { Resolvable, combineHeaders, @@ -49,21 +49,17 @@ export class GoogleVertexImageModel implements ImageModelV1 { }: Parameters[0]): Promise< Awaited> > { + const warnings: Array = []; + if (size != null) { - throw new UnsupportedFunctionalityError({ - functionality: 'image size', - message: + warnings.push({ + type: 'unsupported-setting', + setting: 'size', + details: 'This model does not support the `size` option. Use `aspectRatio` instead.', }); } - if (n > this.maxImagesPerCall) { - throw new UnsupportedFunctionalityError({ - functionality: `generate more than ${this.maxImagesPerCall} images`, - message: `This model does not support generating more than ${this.maxImagesPerCall} images at a time.`, - }); - } - const body = { instances: [{ prompt }], parameters: { @@ -90,6 +86,7 @@ export class GoogleVertexImageModel implements ImageModelV1 { images: response.predictions.map( (p: { bytesBase64Encoded: string }) => p.bytesBase64Encoded, ), + warnings, }; } } diff --git a/packages/openai/src/openai-image-model.test.ts b/packages/openai/src/openai-image-model.test.ts index 3e70e4f67a72..f19780a3fbff 100644 --- a/packages/openai/src/openai-image-model.test.ts +++ b/packages/openai/src/openai-image-model.test.ts @@ -101,4 +101,30 @@ describe('doGenerate', () => { expect(result.images).toStrictEqual(['base64-image-1', 'base64-image-2']); }); + + it('should return warnings for unsupported settings', async () => { + prepareJsonResponse(); + + const result = await model.doGenerate({ + prompt, + n: 1, + size: '1024x1024', + aspectRatio: '1:1', + seed: 123, + providerOptions: {}, + }); + + expect(result.warnings).toStrictEqual([ + { + type: 'unsupported-setting', + setting: 'aspectRatio', + details: + 'This model does not support aspect ratio. Use `size` instead.', + }, + { + type: 'unsupported-setting', + setting: 'seed', + }, + ]); + }); }); diff --git a/packages/openai/src/openai-image-model.ts b/packages/openai/src/openai-image-model.ts index 409ce120d8ca..7413958219d7 100644 --- a/packages/openai/src/openai-image-model.ts +++ b/packages/openai/src/openai-image-model.ts @@ -1,4 +1,4 @@ -import { ImageModelV1, UnsupportedFunctionalityError } from '@ai-sdk/provider'; +import { ImageModelV1, ImageModelV1CallWarning } from '@ai-sdk/provider'; import { combineHeaders, createJsonResponseHandler, @@ -47,24 +47,19 @@ export class OpenAIImageModel implements ImageModelV1 { }: Parameters[0]): Promise< Awaited> > { + const warnings: Array = []; + if (aspectRatio != null) { - throw new UnsupportedFunctionalityError({ - functionality: 'image aspect ratio', - message: + warnings.push({ + type: 'unsupported-setting', + setting: 'aspectRatio', + details: 'This model does not support aspect ratio. Use `size` instead.', }); } if (seed != null) { - throw new UnsupportedFunctionalityError({ - functionality: 'image seed', - }); - } - - if (n > this.maxImagesPerCall) { - throw new UnsupportedFunctionalityError({ - functionality: `generate more than ${this.maxImagesPerCall} images`, - }); + warnings.push({ type: 'unsupported-setting', setting: 'seed' }); } const { value: response } = await postJsonToApi({ @@ -91,6 +86,7 @@ export class OpenAIImageModel implements ImageModelV1 { return { images: response.data.map(item => item.b64_json), + warnings, }; } } diff --git a/packages/provider-utils/src/test/binary-test-server.ts b/packages/provider-utils/src/test/binary-test-server.ts index ead68dd94609..2dfad8c5d363 100644 --- a/packages/provider-utils/src/test/binary-test-server.ts +++ b/packages/provider-utils/src/test/binary-test-server.ts @@ -60,6 +60,8 @@ export class BinaryTestServer { beforeEach(() => { this.responseBody = null; this.request = undefined; + this.responseHeaders = {}; + this.responseStatus = 200; }); afterEach(() => this.server.resetHandlers()); afterAll(() => this.server.close()); diff --git a/packages/provider/src/image-model/v1/image-model-v1-call-options.ts b/packages/provider/src/image-model/v1/image-model-v1-call-options.ts new file mode 100644 index 000000000000..9d0cad74c3bd --- /dev/null +++ b/packages/provider/src/image-model/v1/image-model-v1-call-options.ts @@ -0,0 +1,60 @@ +import { JSONValue } from '../../json-value/json-value'; + +export type ImageModelV1CallOptions = { + /** +Prompt for the image generation. + */ + prompt: string; + + /** +Number of images to generate. + */ + n: number; + + /** +Size of the images to generate. +Must have the format `{width}x{height}`. +`undefined` will use the provider's default size. + */ + size: `${number}x${number}` | undefined; + + /** +Aspect ratio of the images to generate. +Must have the format `{width}:{height}`. +`undefined` will use the provider's default aspect ratio. + */ + aspectRatio: `${number}:${number}` | undefined; + + /** +Seed for the image generation. +`undefined` will use the provider's default seed. + */ + seed: number | undefined; + + /** +Additional provider-specific options that are passed through to the provider +as body parameters. + +The outer record is keyed by the provider name, and the inner +record is keyed by the provider-specific metadata key. +```ts +{ +"openai": { +"style": "vivid" +} +} +``` + */ + providerOptions: Record>; + + /** +Abort signal for cancelling the operation. + */ + abortSignal?: AbortSignal; + + /** +Additional HTTP headers to be sent with the request. +Only applicable for HTTP-based providers. + */ + headers?: Record; +}; diff --git a/packages/provider/src/image-model/v1/image-model-v1-call-warning.ts b/packages/provider/src/image-model/v1/image-model-v1-call-warning.ts new file mode 100644 index 000000000000..4e245fb7fe50 --- /dev/null +++ b/packages/provider/src/image-model/v1/image-model-v1-call-warning.ts @@ -0,0 +1,16 @@ +import { ImageModelV1CallOptions } from './image-model-v1-call-options'; + +/** +Warning from the model provider for this call. The call will proceed, but e.g. +some settings might not be supported, which can lead to suboptimal results. + */ +export type ImageModelV1CallWarning = + | { + type: 'unsupported-setting'; + setting: keyof ImageModelV1CallOptions; + details?: string; + } + | { + type: 'other'; + message: string; + }; diff --git a/packages/provider/src/image-model/v1/image-model-v1.ts b/packages/provider/src/image-model/v1/image-model-v1.ts index 138f916f2efd..f0274c4f0133 100644 --- a/packages/provider/src/image-model/v1/image-model-v1.ts +++ b/packages/provider/src/image-model/v1/image-model-v1.ts @@ -1,4 +1,5 @@ -import { JSONValue } from '../../json-value/json-value'; +import { ImageModelV1CallOptions } from './image-model-v1-call-options'; +import { ImageModelV1CallWarning } from './image-model-v1-call-warning'; /** Image generation model specification version 1. @@ -32,64 +33,7 @@ If undefined, we will max generate one image per call. /** Generates an array of images. */ - doGenerate(options: { - /** -Prompt for the image generation. - */ - prompt: string; - - /** -Number of images to generate. - */ - n: number; - - /** -Size of the images to generate. -Must have the format `{width}x{height}`. -`undefined` will use the provider's default size. - */ - size: `${number}x${number}` | undefined; - - /** -Aspect ratio of the images to generate. -Must have the format `{width}:{height}`. -`undefined` will use the provider's default aspect ratio. - */ - aspectRatio: `${number}:${number}` | undefined; - - /** -Seed for the image generation. -`undefined` will use the provider's default seed. - */ - seed: number | undefined; - - /** -Additional provider-specific options that are passed through to the provider -as body parameters. - -The outer record is keyed by the provider name, and the inner -record is keyed by the provider-specific metadata key. -```ts -{ - "openai": { - "style": "vivid" - } -} -``` - */ - providerOptions: Record>; - - /** -Abort signal for cancelling the operation. - */ - abortSignal?: AbortSignal; - - /** - Additional HTTP headers to be sent with the request. - Only applicable for HTTP-based providers. - */ - headers?: Record; - }): PromiseLike<{ + doGenerate(options: ImageModelV1CallOptions): PromiseLike<{ /** Generated images as base64 encoded strings or binary data. The images should be returned without any unnecessary conversion. @@ -98,5 +42,10 @@ as base64 encoded strings. If the API returns binary data, the images should be returned as binary data. */ images: Array | Array; + + /** +Warnings for the call, e.g. unsupported settings. + */ + warnings: Array; }>; }; diff --git a/packages/provider/src/image-model/v1/index.ts b/packages/provider/src/image-model/v1/index.ts index baf079e6a0e2..cf3284f8ca50 100644 --- a/packages/provider/src/image-model/v1/index.ts +++ b/packages/provider/src/image-model/v1/index.ts @@ -1 +1,3 @@ -export * from './image-model-v1'; +export type { ImageModelV1 } from './image-model-v1'; +export type { ImageModelV1CallOptions } from './image-model-v1-call-options'; +export type { ImageModelV1CallWarning } from './image-model-v1-call-warning'; diff --git a/packages/provider/src/language-model/v1/language-model-v1.ts b/packages/provider/src/language-model/v1/language-model-v1.ts index 00c34fc2a9a8..b7e54f86553e 100644 --- a/packages/provider/src/language-model/v1/language-model-v1.ts +++ b/packages/provider/src/language-model/v1/language-model-v1.ts @@ -236,7 +236,10 @@ Non-HTTP(s) providers should not set this. body?: string; }; - warnings?: LanguageModelV1CallWarning[]; + /** +Warnings for the call, e.g. unsupported settings. + */ + warnings?: Array; }>; };