(
options: ImageGenerationOptions<OpenAIImageProviderOptions>,
)
| 74 | } |
| 75 | |
| 76 | async generateImages( |
| 77 | options: ImageGenerationOptions<OpenAIImageProviderOptions>, |
| 78 | ): Promise<ImageGenerationResult> { |
| 79 | const { model, numberOfImages, size, modelOptions } = options |
| 80 | |
| 81 | const resolved = resolveMediaPrompt(options.prompt) |
| 82 | const prompt = resolved.text |
| 83 | |
| 84 | validatePrompt({ prompt, model }) |
| 85 | validateImageSize(model, size) |
| 86 | validateNumberOfImages(model, numberOfImages) |
| 87 | |
| 88 | if (resolved.videos.length > 0) { |
| 89 | throw new Error( |
| 90 | `${this.name}.generateImages does not support video prompt parts (model: ${model}).`, |
| 91 | ) |
| 92 | } |
| 93 | if (resolved.audios.length > 0) { |
| 94 | throw new Error( |
| 95 | `${this.name}.generateImages does not support audio prompt parts (model: ${model}).`, |
| 96 | ) |
| 97 | } |
| 98 | |
| 99 | if (resolved.images.length > 0) { |
| 100 | return this.editImages({ |
| 101 | model: model as OpenAIImageModel, |
| 102 | prompt, |
| 103 | numberOfImages, |
| 104 | size, |
| 105 | modelOptions, |
| 106 | imageInputs: resolved.images, |
| 107 | logger: options.logger, |
| 108 | }) |
| 109 | } |
| 110 | |
| 111 | // With exactOptionalPropertyTypes, vendor SDK request shapes reject |
| 112 | // `T | undefined` in optional fields. Build the request incrementally and |
| 113 | // only set `size` when it's actually defined. |
| 114 | const request: OpenAI_SDK.Images.ImageGenerateParams = { |
| 115 | model, |
| 116 | prompt, |
| 117 | n: numberOfImages ?? 1, |
| 118 | ...(modelOptions ?? {}), |
| 119 | } |
| 120 | if (size !== undefined) { |
| 121 | request.size = size |
| 122 | } |
| 123 | |
| 124 | try { |
| 125 | options.logger.request( |
| 126 | `activity=image provider=${this.name} model=${model} n=${request.n ?? 1} size=${request.size ?? 'default'}`, |
| 127 | { provider: this.name, model }, |
| 128 | ) |
| 129 | const response = await this.client.images.generate({ |
| 130 | ...request, |
| 131 | stream: false, |
| 132 | }) |
| 133 |
no test coverage detected