@zhivex-ai/openai 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,6 +8,22 @@ OpenAI adapter for Zhivex AI SDK.
8
8
  bun add @zhivex-ai/openai @zhivex-ai/core zod
9
9
  ```
10
10
 
11
+ ## Audio response limits
12
+
13
+ Transcription and speech responses are bounded before JSON parsing or binary buffering. Defaults are 16 MiB for speech, 4 MiB for transcription JSON, and 64 KiB for error bodies. Override them at provider creation time when your application requires a stricter policy:
14
+
15
+ ```ts
16
+ const openai = createOpenAI({
17
+ responseLimits: {
18
+ speechBytes: 16 * 1024 * 1024,
19
+ transcriptionBytes: 1024 * 1024,
20
+ errorBodyBytes: 64 * 1024
21
+ }
22
+ });
23
+ ```
24
+
25
+ Oversized successful bodies throw `ProviderResponseTooLargeError`. Provider HTTP errors keep their original status and expose only a bounded, possibly truncated `responseBody`.
26
+
11
27
  ## GPT-5.6
12
28
 
13
29
  The adapter recognizes the three GPT-5.6 model IDs and their shared SDK surface:
@@ -51,6 +67,69 @@ Multi-turn Responses normally continue through `previous_response_id`. With `pro
51
67
 
52
68
  Use `providerOptions.safety_identifier` for a stable, non-PII identifier for the end user. It is sent as an OpenAI request field; do not put email addresses, names, or other direct personal data in it.
53
69
 
70
+ ## GPT Image 2 and hosted image generation
71
+
72
+ Use the shared image contract for direct Image API generations. `gpt-image-2` supports the current square, portrait, landscape, and wide output sizes exposed by OpenAI. See the official [GPT Image 2 model page](https://developers.openai.com/api/docs/models/gpt-image-2) and [image generation guide](https://developers.openai.com/api/docs/guides/image-generation).
73
+
74
+ ```ts
75
+ import { generateImage } from "@zhivex-ai/core";
76
+ import { createOpenAI } from "@zhivex-ai/openai";
77
+
78
+ const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY });
79
+
80
+ const result = await generateImage({
81
+ model: openai.imageGenerationModel!("gpt-image-2"),
82
+ prompt: "A clean editorial illustration of a distributed system",
83
+ aspectRatio: "16:9",
84
+ outputMimeType: "image/webp",
85
+ providerOptions: {
86
+ quality: "high"
87
+ }
88
+ });
89
+
90
+ console.log(result.images[0]?.mediaType);
91
+ ```
92
+
93
+ For conversational generation, edits, reference images, or progressive previews, use the provider-hosted Responses tool. Buffered and collected text calls expose final media on `result.steps.at(-1)?.response.images`; streaming calls emit typed `image-generation` events:
94
+
95
+ ```ts
96
+ import { streamText } from "@zhivex-ai/core";
97
+ import {
98
+ openAIImageGenerationTool,
99
+ openAIImageGenerationToolChoice
100
+ } from "@zhivex-ai/openai";
101
+
102
+ const stream = await streamText({
103
+ model: openai("gpt-5.6"),
104
+ prompt: "Generate a wide product concept, then refine its lighting.",
105
+ tools: {
106
+ image: openAIImageGenerationTool({
107
+ action: "auto",
108
+ output_format: "webp",
109
+ partial_images: 2,
110
+ size: "1536x864"
111
+ })
112
+ },
113
+ providerOptions: {
114
+ tool_choice: openAIImageGenerationToolChoice()
115
+ }
116
+ });
117
+
118
+ for await (const event of stream) {
119
+ if (event.type === "image-generation") {
120
+ console.log(event.partial, event.image.mediaType, event.image.data?.byteLength);
121
+ }
122
+ }
123
+ ```
124
+
125
+ Partial images are transient live stream events: they are not copied into collected messages or replayed to consumers that subscribe after generation. The shared `ImageGenerationModel` path is buffered; use the Responses tool when you need partial-image streaming or image edits.
126
+
127
+ ## Realtime 2.1 and remote MCP
128
+
129
+ `gpt-realtime-2.1` and `gpt-realtime-2.1-mini` use the GA Realtime tool shape and support image input. A stable `providerOptions.safety_identifier` is sent as the `OpenAI-Safety-Identifier` header for both server WebSocket sessions and browser client-secret creation.
130
+
131
+ Remote MCP lifecycle, calls, failures, and approval requests arrive as `realtime-provider-data` events so provider-executed MCP is not confused with an app-executed function tool. Return an approval with `openAIRealtimeMcpApprovalResult()` through `session.sendToolResult()`. See OpenAI's [Realtime MCP guide](https://developers.openai.com/api/docs/guides/realtime-mcp).
132
+
54
133
  ## Prompt caching
55
134
 
56
135
  OpenAI prompt cache controls pass through `providerOptions`. Explicit breakpoints can be attached directly to a cacheable text, image, or file part through `providerMetadata`, or inserted immediately after a cacheable part with `openAIPromptCacheBreakpoint()`.
@@ -0,0 +1,109 @@
1
+ import { type GeneratedMedia, type ImageGenerationModel, type ImageGenerationModelInput, type ImageGenerationResult, type JsonValue, type ModelCapabilities } from "@zhivex-ai/core";
2
+ export type OpenAIImageOutputFormat = "png" | "jpeg" | "webp";
3
+ export type OpenAIImageSize = "auto" | `${number}x${number}`;
4
+ export type OpenAIImageQuality = "auto" | "low" | "medium" | "high" | "standard" | "hd";
5
+ export type OpenAIImageGenerationOptions = Record<string, unknown> & {
6
+ background?: "auto" | "opaque" | "transparent";
7
+ moderation?: "auto" | "low";
8
+ output_compression?: number;
9
+ output_format?: OpenAIImageOutputFormat;
10
+ quality?: OpenAIImageQuality;
11
+ response_format?: "url" | "b64_json";
12
+ style?: "vivid" | "natural";
13
+ user?: string;
14
+ /** Extra HTTP headers. Authorization and content-type remain SDK-controlled. */
15
+ headers?: Record<string, string>;
16
+ /** Maximum JSON response size, including base64 image data. Defaults to 128 MiB. */
17
+ responseMaxBytes?: number;
18
+ /** Maximum error response body retained for diagnostics. Defaults to 64 KiB. */
19
+ errorBodyMaxBytes?: number;
20
+ /** Streaming belongs to the Responses/Image streaming APIs, not ImageGenerationModel. */
21
+ stream?: false;
22
+ partial_images?: never;
23
+ };
24
+ export interface OpenAIImageGenerationToolConfig {
25
+ action?: "auto" | "generate" | "edit";
26
+ background?: "auto" | "opaque" | "transparent";
27
+ input_fidelity?: "low" | "high";
28
+ output_compression?: number;
29
+ output_format?: OpenAIImageOutputFormat;
30
+ partial_images?: 0 | 1 | 2 | 3;
31
+ quality?: "auto" | "low" | "medium" | "high";
32
+ size?: OpenAIImageSize;
33
+ }
34
+ export interface OpenAIImageGenerationToolChoice {
35
+ type: "image_generation";
36
+ }
37
+ export interface OpenAIImageGenerationModelConfig {
38
+ modelId: string;
39
+ apiKey: string;
40
+ baseURL?: string;
41
+ fetch?: typeof globalThis.fetch;
42
+ responseMaxBytes?: number;
43
+ errorBodyMaxBytes?: number;
44
+ }
45
+ export interface OpenAIImageGenerationCall {
46
+ type: "image_generation_call";
47
+ id?: string;
48
+ status?: string;
49
+ revised_prompt?: string | null;
50
+ result?: string | null;
51
+ output_format?: OpenAIImageOutputFormat;
52
+ [key: string]: unknown;
53
+ }
54
+ export interface NormalizedOpenAIImageGenerationCall {
55
+ id?: string;
56
+ status?: string;
57
+ revisedPrompt?: string;
58
+ image?: GeneratedMedia;
59
+ providerMetadata: Record<string, unknown>;
60
+ }
61
+ export type OpenAIImageGenerationPartialImageEvent = {
62
+ type: "response.image_generation_call.partial_image";
63
+ partial_image_b64: string;
64
+ partial_image_index: number;
65
+ item_id?: string;
66
+ output_index?: number;
67
+ sequence_number?: number;
68
+ output_format?: OpenAIImageOutputFormat;
69
+ [key: string]: unknown;
70
+ } | {
71
+ type: "image_generation.partial_image";
72
+ b64_json: string;
73
+ partial_image_index: number;
74
+ output_format?: OpenAIImageOutputFormat;
75
+ [key: string]: unknown;
76
+ };
77
+ export interface NormalizedOpenAIImageGenerationPartialImage {
78
+ source: "responses" | "images";
79
+ callId?: string;
80
+ partialImageIndex: number;
81
+ outputIndex?: number;
82
+ sequenceNumber?: number;
83
+ image: GeneratedMedia;
84
+ providerMetadata: Record<string, unknown>;
85
+ }
86
+ /** Creates the hosted Responses API image_generation tool definition. */
87
+ export declare const openAIImageGenerationTool: (config?: OpenAIImageGenerationToolConfig) => import("@zhivex-ai/core").HostedToolDefinition<JsonValue>;
88
+ /** Forces the hosted Responses image_generation tool for the current turn. */
89
+ export declare const openAIImageGenerationToolChoice: () => OpenAIImageGenerationToolChoice;
90
+ export declare const isOpenAIImageGenerationCall: (value: unknown) => value is OpenAIImageGenerationCall;
91
+ /** Decodes a Responses image_generation_call without retaining a second base64 copy in metadata. */
92
+ export declare const normalizeOpenAIImageGenerationCall: (value: unknown, fallbackOutputFormat?: OpenAIImageOutputFormat, maxImageBytes?: number) => NormalizedOpenAIImageGenerationCall | undefined;
93
+ export declare const isOpenAIImageGenerationPartialImageEvent: (value: unknown) => value is OpenAIImageGenerationPartialImageEvent;
94
+ /** Normalizes partial images from both Responses and the streaming Image API. */
95
+ export declare const normalizeOpenAIImageGenerationPartialImage: (value: unknown, fallbackOutputFormat?: OpenAIImageOutputFormat, maxImageBytes?: number) => NormalizedOpenAIImageGenerationPartialImage | undefined;
96
+ export declare class OpenAIImageGenerationModel implements ImageGenerationModel<OpenAIImageGenerationOptions> {
97
+ readonly provider = "openai";
98
+ readonly capabilities: ModelCapabilities;
99
+ readonly modelId: string;
100
+ private readonly apiKey;
101
+ private readonly baseURL;
102
+ private readonly fetcher;
103
+ private readonly responseMaxBytes;
104
+ private readonly errorBodyMaxBytes;
105
+ constructor(config: OpenAIImageGenerationModelConfig);
106
+ generateImage(input: ImageGenerationModelInput<OpenAIImageGenerationOptions>): Promise<ImageGenerationResult>;
107
+ }
108
+ export declare const createOpenAIImageGenerationModel: (config: OpenAIImageGenerationModelConfig) => OpenAIImageGenerationModel;
109
+ //# sourceMappingURL=image-generation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-generation.d.ts","sourceRoot":"","sources":["../src/image-generation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,343 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { ParseError, ProviderHTTPError, UnsupportedFeatureError, ValidationError, decodeBase64WithLimit, hostedTool, readErrorBodyWithLimit, readJsonWithLimit, withRetry, withTimeoutSignal } from "@zhivex-ai/core";
3
+ const MIB = 1024 * 1024;
4
+ const DEFAULT_RESPONSE_MAX_BYTES = 128 * MIB;
5
+ const DEFAULT_ERROR_BODY_MAX_BYTES = 64 * 1024;
6
+ const imageGenerationCapabilities = {
7
+ streaming: false,
8
+ tools: false,
9
+ structuredOutput: false,
10
+ jsonMode: false,
11
+ toolChoice: false,
12
+ parallelToolCalls: false,
13
+ vision: false,
14
+ files: false,
15
+ audioInput: false,
16
+ audioOutput: false,
17
+ embeddings: false,
18
+ imageGeneration: true,
19
+ reasoning: false,
20
+ webSearch: false
21
+ };
22
+ const normalizePositiveLimit = (value, name) => {
23
+ if (!Number.isSafeInteger(value) || value <= 0) {
24
+ throw new ValidationError(`The OpenAI image generation "${name}" option must be a positive safe integer.`);
25
+ }
26
+ return value;
27
+ };
28
+ const validateIntegerRange = (value, name, minimum, maximum) => {
29
+ if (value === undefined) {
30
+ return;
31
+ }
32
+ if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {
33
+ throw new ValidationError(`The OpenAI image generation "${name}" option must be an integer from ${minimum} to ${maximum}.`);
34
+ }
35
+ };
36
+ const outputFormatFromMimeType = (mediaType) => {
37
+ if (mediaType === undefined)
38
+ return undefined;
39
+ const normalized = mediaType.trim().toLowerCase();
40
+ if (normalized === "image/png")
41
+ return "png";
42
+ if (normalized === "image/jpeg" || normalized === "image/jpg")
43
+ return "jpeg";
44
+ if (normalized === "image/webp")
45
+ return "webp";
46
+ throw new UnsupportedFeatureError(`Provider "openai" does not support image output MIME type "${mediaType}".`);
47
+ };
48
+ const mediaTypeFromOutputFormat = (format) => format === "jpeg" ? "image/jpeg" : format === "webp" ? "image/webp" : "image/png";
49
+ const normalizedModelId = (modelId) => modelId.trim().toLowerCase();
50
+ const isGPTImageModel = (modelId) => /^gpt-image(?:-|$)/.test(normalizedModelId(modelId));
51
+ const isGPTImage2Model = (modelId) => /^gpt-image-2(?:-|$)/.test(normalizedModelId(modelId));
52
+ const isDallE2Model = (modelId) => /^dall-e-2(?:-|$)/.test(normalizedModelId(modelId));
53
+ const isDallE3Model = (modelId) => /^dall-e-3(?:-|$)/.test(normalizedModelId(modelId));
54
+ const promptLimitForModel = (modelId) => {
55
+ if (isDallE2Model(modelId))
56
+ return 1_000;
57
+ if (isDallE3Model(modelId))
58
+ return 4_000;
59
+ if (isGPTImageModel(modelId))
60
+ return 32_000;
61
+ return undefined;
62
+ };
63
+ const sizeFromAspectRatio = (aspectRatio, modelId) => {
64
+ if (!aspectRatio)
65
+ return undefined;
66
+ const normalized = aspectRatio.replaceAll(" ", "");
67
+ if (isDallE2Model(modelId)) {
68
+ if (normalized === "1:1")
69
+ return "1024x1024";
70
+ throw new UnsupportedFeatureError(`Provider "openai" model "dall-e-2" cannot map aspect ratio "${aspectRatio}" because it only supports square output.`);
71
+ }
72
+ if (isDallE3Model(modelId)) {
73
+ if (normalized === "1:1")
74
+ return "1024x1024";
75
+ if (normalized === "16:9")
76
+ return "1792x1024";
77
+ if (normalized === "9:16")
78
+ return "1024x1792";
79
+ throw new UnsupportedFeatureError(`Provider "openai" cannot map aspect ratio "${aspectRatio}" to a supported size for model "dall-e-3". Pass an explicit "size" instead.`);
80
+ }
81
+ const standard = {
82
+ "1:1": "1024x1024",
83
+ "3:2": "1536x1024",
84
+ "2:3": "1024x1536"
85
+ };
86
+ if (standard[normalized])
87
+ return standard[normalized];
88
+ if (isGPTImage2Model(modelId)) {
89
+ if (normalized === "16:9")
90
+ return "1536x864";
91
+ if (normalized === "9:16")
92
+ return "864x1536";
93
+ }
94
+ throw new UnsupportedFeatureError(`Provider "openai" cannot map aspect ratio "${aspectRatio}" to a supported size for model "${modelId}". Pass an explicit "size" instead.`);
95
+ };
96
+ const sanitizeMetadata = (value, base64Keys) => {
97
+ const sanitized = { ...value };
98
+ for (const key of base64Keys)
99
+ delete sanitized[key];
100
+ return sanitized;
101
+ };
102
+ const validateToolConfig = (config) => {
103
+ validateIntegerRange(config.partial_images, "partial_images", 0, 3);
104
+ validateIntegerRange(config.output_compression, "output_compression", 0, 100);
105
+ if (config.background === "transparent" && config.output_format === "jpeg") {
106
+ throw new ValidationError('OpenAI image generation requires "png" or "webp" output for a transparent background.');
107
+ }
108
+ };
109
+ /** Creates the hosted Responses API image_generation tool definition. */
110
+ export const openAIImageGenerationTool = (config = {}) => {
111
+ validateToolConfig(config);
112
+ return hostedTool({
113
+ name: "image_generation",
114
+ provider: "openai",
115
+ type: "image_generation",
116
+ toolClass: "custom",
117
+ config: config
118
+ });
119
+ };
120
+ /** Forces the hosted Responses image_generation tool for the current turn. */
121
+ export const openAIImageGenerationToolChoice = () => ({
122
+ type: "image_generation"
123
+ });
124
+ export const isOpenAIImageGenerationCall = (value) => Boolean(value && typeof value === "object" && value.type === "image_generation_call");
125
+ /** Decodes a Responses image_generation_call without retaining a second base64 copy in metadata. */
126
+ export const normalizeOpenAIImageGenerationCall = (value, fallbackOutputFormat = "png", maxImageBytes) => {
127
+ if (!isOpenAIImageGenerationCall(value))
128
+ return undefined;
129
+ const revisedPrompt = typeof value.revised_prompt === "string" ? value.revised_prompt : undefined;
130
+ const outputFormat = value.output_format ?? fallbackOutputFormat;
131
+ const providerMetadata = sanitizeMetadata(value, ["result"]);
132
+ const result = typeof value.result === "string" && value.result ? value.result : undefined;
133
+ return {
134
+ id: typeof value.id === "string" ? value.id : undefined,
135
+ status: typeof value.status === "string" ? value.status : undefined,
136
+ revisedPrompt,
137
+ image: result
138
+ ? {
139
+ data: maxImageBytes === undefined
140
+ ? Uint8Array.from(Buffer.from(result, "base64"))
141
+ : decodeBase64WithLimit(result, {
142
+ maxBytes: maxImageBytes,
143
+ provider: "openai",
144
+ endpoint: "hosted image generation event"
145
+ }),
146
+ mediaType: mediaTypeFromOutputFormat(outputFormat),
147
+ text: revisedPrompt,
148
+ providerMetadata
149
+ }
150
+ : undefined,
151
+ providerMetadata
152
+ };
153
+ };
154
+ export const isOpenAIImageGenerationPartialImageEvent = (value) => {
155
+ if (!value || typeof value !== "object")
156
+ return false;
157
+ const event = value;
158
+ return ((event.type === "response.image_generation_call.partial_image" && typeof event.partial_image_b64 === "string") ||
159
+ (event.type === "image_generation.partial_image" && typeof event.b64_json === "string")) && Number.isSafeInteger(event.partial_image_index);
160
+ };
161
+ /** Normalizes partial images from both Responses and the streaming Image API. */
162
+ export const normalizeOpenAIImageGenerationPartialImage = (value, fallbackOutputFormat = "png", maxImageBytes) => {
163
+ if (!isOpenAIImageGenerationPartialImageEvent(value))
164
+ return undefined;
165
+ const isResponses = value.type === "response.image_generation_call.partial_image";
166
+ const base64 = isResponses ? value.partial_image_b64 : value.b64_json;
167
+ const providerMetadata = sanitizeMetadata(value, ["partial_image_b64", "b64_json"]);
168
+ return {
169
+ source: isResponses ? "responses" : "images",
170
+ callId: isResponses && typeof value.item_id === "string" ? value.item_id : undefined,
171
+ partialImageIndex: value.partial_image_index,
172
+ outputIndex: isResponses && typeof value.output_index === "number" ? value.output_index : undefined,
173
+ sequenceNumber: isResponses && typeof value.sequence_number === "number" ? value.sequence_number : undefined,
174
+ image: {
175
+ data: maxImageBytes === undefined
176
+ ? Uint8Array.from(Buffer.from(base64, "base64"))
177
+ : decodeBase64WithLimit(base64, {
178
+ maxBytes: maxImageBytes,
179
+ provider: "openai",
180
+ endpoint: "hosted image generation event"
181
+ }),
182
+ mediaType: mediaTypeFromOutputFormat(value.output_format ?? fallbackOutputFormat),
183
+ providerMetadata
184
+ },
185
+ providerMetadata
186
+ };
187
+ };
188
+ export class OpenAIImageGenerationModel {
189
+ provider = "openai";
190
+ capabilities = imageGenerationCapabilities;
191
+ modelId;
192
+ apiKey;
193
+ baseURL;
194
+ fetcher;
195
+ responseMaxBytes;
196
+ errorBodyMaxBytes;
197
+ constructor(config) {
198
+ this.modelId = config.modelId;
199
+ this.apiKey = config.apiKey;
200
+ this.baseURL = (config.baseURL ?? "https://api.openai.com/v1").replace(/\/$/, "");
201
+ this.fetcher = config.fetch ?? globalThis.fetch;
202
+ this.responseMaxBytes = normalizePositiveLimit(config.responseMaxBytes ?? DEFAULT_RESPONSE_MAX_BYTES, "responseMaxBytes");
203
+ this.errorBodyMaxBytes = normalizePositiveLimit(config.errorBodyMaxBytes ?? DEFAULT_ERROR_BODY_MAX_BYTES, "errorBodyMaxBytes");
204
+ }
205
+ async generateImage(input) {
206
+ if (!input.prompt.trim()) {
207
+ throw new ValidationError('The OpenAI image generation "prompt" field is required.');
208
+ }
209
+ const promptLimit = promptLimitForModel(this.modelId);
210
+ if (promptLimit !== undefined && input.prompt.length > promptLimit) {
211
+ throw new ValidationError(`The OpenAI image generation prompt exceeds the ${promptLimit}-character limit for model "${this.modelId}".`);
212
+ }
213
+ if (input.images?.length) {
214
+ throw new UnsupportedFeatureError('Provider "openai" image generations do not accept input images. Use the Responses image_generation tool for conversational edits.');
215
+ }
216
+ if (input.negativePrompt) {
217
+ throw new UnsupportedFeatureError('Provider "openai" image generations do not support a separate negative prompt.');
218
+ }
219
+ validateIntegerRange(input.count, "count", 1, 10);
220
+ if (isDallE3Model(this.modelId) && input.count !== undefined && input.count !== 1) {
221
+ throw new UnsupportedFeatureError('Provider "openai" model "dall-e-3" only supports one image per request.');
222
+ }
223
+ const providerOptions = { ...(input.providerOptions ?? {}) };
224
+ if (providerOptions.stream !== undefined && providerOptions.stream !== false) {
225
+ throw new UnsupportedFeatureError('OpenAI Image API streaming is not supported through ImageGenerationModel. Use the Responses streaming API for partial images.');
226
+ }
227
+ if (providerOptions.partial_images !== undefined) {
228
+ throw new UnsupportedFeatureError('The OpenAI "partial_images" option requires streaming and is not supported through ImageGenerationModel.');
229
+ }
230
+ const customHeaders = providerOptions.headers;
231
+ if (customHeaders !== undefined && (!customHeaders || typeof customHeaders !== "object" || Array.isArray(customHeaders))) {
232
+ throw new ValidationError('The OpenAI image generation "headers" option must be an object.');
233
+ }
234
+ const safeCustomHeaders = Object.fromEntries(Object.entries((customHeaders ?? {})).filter(([key]) => !["authorization", "content-type"].includes(key.toLowerCase())));
235
+ delete providerOptions.headers;
236
+ delete providerOptions.stream;
237
+ delete providerOptions.partial_images;
238
+ const responseMaxBytes = normalizePositiveLimit(typeof providerOptions.responseMaxBytes === "number" ? providerOptions.responseMaxBytes : this.responseMaxBytes, "responseMaxBytes");
239
+ const errorBodyMaxBytes = normalizePositiveLimit(typeof providerOptions.errorBodyMaxBytes === "number" ? providerOptions.errorBodyMaxBytes : this.errorBodyMaxBytes, "errorBodyMaxBytes");
240
+ delete providerOptions.responseMaxBytes;
241
+ delete providerOptions.errorBodyMaxBytes;
242
+ validateIntegerRange(typeof providerOptions.output_compression === "number" ? providerOptions.output_compression : undefined, "output_compression", 0, 100);
243
+ const mimeOutputFormat = outputFormatFromMimeType(input.outputMimeType);
244
+ let outputFormat = mimeOutputFormat ??
245
+ providerOptions.output_format;
246
+ if (outputFormat !== undefined && !["png", "jpeg", "webp"].includes(outputFormat)) {
247
+ throw new ValidationError(`The OpenAI image generation "output_format" option "${String(outputFormat)}" is invalid.`);
248
+ }
249
+ if (isDallE2Model(this.modelId) || isDallE3Model(this.modelId)) {
250
+ if (mimeOutputFormat !== undefined && mimeOutputFormat !== "png") {
251
+ throw new UnsupportedFeatureError(`Provider "openai" model "${this.modelId}" only supports PNG image output.`);
252
+ }
253
+ if (providerOptions.output_format !== undefined) {
254
+ throw new UnsupportedFeatureError(`Provider "openai" model "${this.modelId}" does not support the "output_format" option.`);
255
+ }
256
+ outputFormat = undefined;
257
+ }
258
+ if (isGPTImageModel(this.modelId) && providerOptions.response_format !== undefined) {
259
+ throw new UnsupportedFeatureError(`Provider "openai" model "${this.modelId}" always returns base64 images and does not support "response_format".`);
260
+ }
261
+ const background = providerOptions.background;
262
+ if (background === "transparent" && outputFormat === "jpeg") {
263
+ throw new ValidationError('OpenAI image generation requires "png" or "webp" output for a transparent background.');
264
+ }
265
+ if (isGPTImage2Model(this.modelId) && background === "transparent") {
266
+ throw new UnsupportedFeatureError('Provider "openai" model "gpt-image-2" does not support transparent backgrounds.');
267
+ }
268
+ if (providerOptions.output_compression !== undefined && outputFormat !== "jpeg" && outputFormat !== "webp") {
269
+ throw new ValidationError('OpenAI image generation only supports "output_compression" with "jpeg" or "webp" output.');
270
+ }
271
+ const size = input.size ?? sizeFromAspectRatio(input.aspectRatio, this.modelId);
272
+ const { signal, cleanup, abort } = withTimeoutSignal(input);
273
+ try {
274
+ const json = await withRetry(async () => {
275
+ const response = await this.fetcher(`${this.baseURL}/images/generations`, {
276
+ method: "POST",
277
+ headers: {
278
+ ...safeCustomHeaders,
279
+ "content-type": "application/json",
280
+ authorization: `Bearer ${this.apiKey}`
281
+ },
282
+ signal,
283
+ body: JSON.stringify({
284
+ ...providerOptions,
285
+ model: this.modelId,
286
+ prompt: input.prompt,
287
+ n: input.count,
288
+ size,
289
+ output_format: outputFormat
290
+ })
291
+ });
292
+ if (!response.ok) {
293
+ const responseBody = await readErrorBodyWithLimit(response, errorBodyMaxBytes);
294
+ throw new ProviderHTTPError(`OpenAI image generation failed with status ${response.status}.`, response.status, {
295
+ responseBody
296
+ });
297
+ }
298
+ return readJsonWithLimit(response, {
299
+ maxBytes: responseMaxBytes,
300
+ provider: "openai",
301
+ endpoint: "images/generations",
302
+ abort
303
+ });
304
+ }, input);
305
+ if (!Array.isArray(json.data)) {
306
+ throw new ParseError("OpenAI image generation response did not contain an image data array.");
307
+ }
308
+ const mediaType = mediaTypeFromOutputFormat(outputFormat);
309
+ const images = json.data.map((item, index) => {
310
+ if (!item || typeof item !== "object") {
311
+ throw new ParseError(`OpenAI image generation response item ${index} was invalid.`);
312
+ }
313
+ const providerMetadata = sanitizeMetadata(item, ["b64_json"]);
314
+ const hasData = typeof item.b64_json === "string" && item.b64_json.length > 0;
315
+ const hasUri = typeof item.url === "string" && item.url.length > 0;
316
+ if (!hasData && !hasUri) {
317
+ throw new ParseError(`OpenAI image generation response item ${index} contained neither image data nor a URL.`);
318
+ }
319
+ return {
320
+ data: hasData ? Uint8Array.from(Buffer.from(item.b64_json, "base64")) : undefined,
321
+ uri: hasUri ? item.url : undefined,
322
+ mediaType,
323
+ text: typeof item.revised_prompt === "string" ? item.revised_prompt : undefined,
324
+ providerMetadata
325
+ };
326
+ });
327
+ const revisedPrompts = images.flatMap((image) => image.text ? [image.text] : []);
328
+ return {
329
+ images,
330
+ text: revisedPrompts.length ? revisedPrompts.join("\n") : undefined,
331
+ rawResponse: {
332
+ ...json,
333
+ data: json.data.map((item) => sanitizeMetadata(item, ["b64_json"]))
334
+ }
335
+ };
336
+ }
337
+ finally {
338
+ cleanup();
339
+ }
340
+ }
341
+ }
342
+ export const createOpenAIImageGenerationModel = (config) => new OpenAIImageGenerationModel(config);
343
+ //# sourceMappingURL=image-generation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-generation.js","sourceRoot":"","sources":["../src/image-generation.ts"],"names":[],"mappings":"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"}