@effect/ai-openai 4.0.0-beta.7 → 4.0.0-beta.71

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.
Files changed (58) hide show
  1. package/dist/Generated.d.ts +66734 -37723
  2. package/dist/Generated.d.ts.map +1 -1
  3. package/dist/Generated.js +1 -1
  4. package/dist/Generated.js.map +1 -1
  5. package/dist/OpenAiClient.d.ts +167 -27
  6. package/dist/OpenAiClient.d.ts.map +1 -1
  7. package/dist/OpenAiClient.js +337 -44
  8. package/dist/OpenAiClient.js.map +1 -1
  9. package/dist/OpenAiClientGenerated.d.ts +91 -0
  10. package/dist/OpenAiClientGenerated.d.ts.map +1 -0
  11. package/dist/OpenAiClientGenerated.js +84 -0
  12. package/dist/OpenAiClientGenerated.js.map +1 -0
  13. package/dist/OpenAiConfig.d.ts +114 -10
  14. package/dist/OpenAiConfig.d.ts.map +1 -1
  15. package/dist/OpenAiConfig.js +68 -7
  16. package/dist/OpenAiConfig.js.map +1 -1
  17. package/dist/OpenAiEmbeddingModel.d.ts +213 -0
  18. package/dist/OpenAiEmbeddingModel.d.ts.map +1 -0
  19. package/dist/OpenAiEmbeddingModel.js +219 -0
  20. package/dist/OpenAiEmbeddingModel.js.map +1 -0
  21. package/dist/OpenAiError.d.ts +168 -35
  22. package/dist/OpenAiError.d.ts.map +1 -1
  23. package/dist/OpenAiError.js +1 -1
  24. package/dist/OpenAiLanguageModel.d.ts +384 -62
  25. package/dist/OpenAiLanguageModel.d.ts.map +1 -1
  26. package/dist/OpenAiLanguageModel.js +416 -166
  27. package/dist/OpenAiLanguageModel.js.map +1 -1
  28. package/dist/OpenAiSchema.d.ts +2298 -0
  29. package/dist/OpenAiSchema.d.ts.map +1 -0
  30. package/dist/OpenAiSchema.js +814 -0
  31. package/dist/OpenAiSchema.js.map +1 -0
  32. package/dist/OpenAiTelemetry.d.ts +59 -18
  33. package/dist/OpenAiTelemetry.d.ts.map +1 -1
  34. package/dist/OpenAiTelemetry.js +35 -8
  35. package/dist/OpenAiTelemetry.js.map +1 -1
  36. package/dist/OpenAiTool.d.ts +157 -62
  37. package/dist/OpenAiTool.d.ts.map +1 -1
  38. package/dist/OpenAiTool.js +134 -39
  39. package/dist/OpenAiTool.js.map +1 -1
  40. package/dist/index.d.ts +19 -33
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +19 -33
  43. package/dist/index.js.map +1 -1
  44. package/dist/internal/errors.js +4 -4
  45. package/dist/internal/errors.js.map +1 -1
  46. package/package.json +3 -3
  47. package/src/Generated.ts +9858 -5044
  48. package/src/OpenAiClient.ts +513 -95
  49. package/src/OpenAiClientGenerated.ts +202 -0
  50. package/src/OpenAiConfig.ts +115 -11
  51. package/src/OpenAiEmbeddingModel.ts +357 -0
  52. package/src/OpenAiError.ts +170 -35
  53. package/src/OpenAiLanguageModel.ts +802 -167
  54. package/src/OpenAiSchema.ts +1289 -0
  55. package/src/OpenAiTelemetry.ts +81 -23
  56. package/src/OpenAiTool.ts +135 -40
  57. package/src/index.ts +22 -33
  58. package/src/internal/errors.ts +6 -4
@@ -0,0 +1,357 @@
1
+ /**
2
+ * The `OpenAiEmbeddingModel` module provides the OpenAI implementation of
3
+ * Effect AI's `EmbeddingModel` service. It adapts the OpenAI embeddings
4
+ * endpoint into Effect AI's batch embedding interface, preserving input order
5
+ * and returning numeric vectors for each requested input.
6
+ *
7
+ * **Mental model**
8
+ *
9
+ * `OpenAiClient` owns transport, authentication, and provider request
10
+ * execution. This module owns embedding-specific configuration, response
11
+ * validation, and the `EmbeddingModel.EmbeddingModel` layer. Use {@link model}
12
+ * when you want an `AiModel` descriptor that also provides the configured
13
+ * embedding dimensions, or {@link layer} / {@link make} when the dimensions are
14
+ * managed separately.
15
+ *
16
+ * **Common tasks**
17
+ *
18
+ * - Provide an OpenAI-backed `EmbeddingModel.EmbeddingModel` from an existing
19
+ * `OpenAiClient`
20
+ * - Configure the OpenAI embedding model id, dimensions, encoding format, and
21
+ * other create-embedding request fields
22
+ * - Scope per-request defaults with {@link Config} and
23
+ * {@link withConfigOverride}
24
+ *
25
+ * **Gotchas**
26
+ *
27
+ * - The service expects OpenAI to return floating-point embedding arrays.
28
+ * Requesting base64 embeddings causes an `InvalidOutputError`.
29
+ * - Provider results are checked for missing, duplicate, or out-of-range
30
+ * indexes before they are exposed as Effect AI embedding results.
31
+ *
32
+ * @since 4.0.0
33
+ */
34
+ import * as Context from "effect/Context"
35
+ import * as Effect from "effect/Effect"
36
+ import { dual } from "effect/Function"
37
+ import * as Layer from "effect/Layer"
38
+ import type { Simplify } from "effect/Types"
39
+ import * as AiError from "effect/unstable/ai/AiError"
40
+ import * as EmbeddingModel from "effect/unstable/ai/EmbeddingModel"
41
+ import * as AiModel from "effect/unstable/ai/Model"
42
+ import { OpenAiClient } from "./OpenAiClient.ts"
43
+ import type * as OpenAiSchema from "./OpenAiSchema.ts"
44
+
45
+ /**
46
+ * Model identifiers supported by OpenAI's embeddings API.
47
+ *
48
+ * @category models
49
+ * @since 4.0.0
50
+ */
51
+ export type Model = "text-embedding-ada-002" | "text-embedding-3-small" | "text-embedding-3-large"
52
+
53
+ /**
54
+ * Service definition for OpenAI embedding model configuration.
55
+ *
56
+ * **When to use**
57
+ *
58
+ * Use when embedding requests need scoped OpenAI request defaults or overrides
59
+ * from Effect context.
60
+ *
61
+ * **Details**
62
+ *
63
+ * The service stores the OpenAI create-embedding request payload without
64
+ * `input`, carrying options such as `model`, `dimensions`, `encoding_format`,
65
+ * and `user`.
66
+ *
67
+ * @see {@link withConfigOverride} for scoping embedding request overrides
68
+ *
69
+ * @category services
70
+ * @since 4.0.0
71
+ */
72
+ export class Config extends Context.Service<
73
+ Config,
74
+ Simplify<
75
+ & Partial<
76
+ Omit<
77
+ typeof OpenAiSchema.CreateEmbeddingRequest.Encoded,
78
+ "input"
79
+ >
80
+ >
81
+ & {
82
+ readonly [x: string]: unknown
83
+ }
84
+ >
85
+ >()("@effect/ai-openai/OpenAiEmbeddingModel/Config") {}
86
+
87
+ /**
88
+ * Creates an `AiModel` for an OpenAI embedding model with its configured vector dimensions.
89
+ *
90
+ * **When to use**
91
+ *
92
+ * Use to provide an OpenAI `EmbeddingModel` and its `Dimensions` service to an
93
+ * Effect program.
94
+ *
95
+ * @see {@link layer} for providing only the embedding model service
96
+ * @see {@link withConfigOverride} for scoped request configuration overrides
97
+ *
98
+ * @category constructors
99
+ * @since 4.0.0
100
+ */
101
+ export const model = (
102
+ model: (string & {}) | Model,
103
+ options: {
104
+ readonly dimensions: number
105
+ readonly config?: Omit<typeof Config.Service, "model" | "dimensions">
106
+ }
107
+ ): AiModel.Model<"openai", EmbeddingModel.EmbeddingModel | EmbeddingModel.Dimensions, OpenAiClient> =>
108
+ AiModel.make(
109
+ "openai",
110
+ model,
111
+ Layer.merge(
112
+ layer({
113
+ model,
114
+ config: {
115
+ ...options.config,
116
+ dimensions: options.dimensions
117
+ }
118
+ }),
119
+ Layer.succeed(EmbeddingModel.Dimensions, options.dimensions)
120
+ )
121
+ )
122
+
123
+ /**
124
+ * Creates an OpenAI embedding model service.
125
+ *
126
+ * **When to use**
127
+ *
128
+ * Use to construct the `EmbeddingModel.Service` effectfully when
129
+ * `OpenAiClient` is already available in the environment or when the service
130
+ * value is needed directly.
131
+ *
132
+ * **Details**
133
+ *
134
+ * The `model` option is sent with each embedding request. Constructor `config`
135
+ * supplies create-embedding request fields other than `model` and `input`, and
136
+ * scoped overrides from `withConfigOverride` are merged last for each request.
137
+ *
138
+ * **Gotchas**
139
+ *
140
+ * The service expects numeric embedding vectors. It fails with
141
+ * `InvalidOutputError` when the provider returns base64 embeddings,
142
+ * out-of-range indexes, duplicate indexes, or an unexpected number of
143
+ * embeddings.
144
+ *
145
+ * @see {@link layer} for providing the embedding model service as a layer
146
+ * @see {@link model} for creating an `AiModel` that also provides dimensions
147
+ * @see {@link withConfigOverride} for scoped request configuration overrides
148
+ *
149
+ * @category constructors
150
+ * @since 4.0.0
151
+ */
152
+ export const make = Effect.fnUntraced(function*({ model, config: providerConfig }: {
153
+ readonly model: (string & {}) | Model
154
+ readonly config?: Omit<typeof Config.Service, "model"> | undefined
155
+ }): Effect.fn.Return<EmbeddingModel.Service, never, OpenAiClient> {
156
+ const client = yield* OpenAiClient
157
+
158
+ const makeConfig = Effect.gen(function*() {
159
+ const services = yield* Effect.context<never>()
160
+ return { model, ...providerConfig, ...services.mapUnsafe.get(Config.key) }
161
+ })
162
+
163
+ return yield* EmbeddingModel.make({
164
+ embedMany: Effect.fnUntraced(function*({ inputs }) {
165
+ const config = yield* makeConfig
166
+ const response = yield* client.createEmbedding({ ...config, input: inputs })
167
+ return yield* mapProviderResponse(inputs.length, response)
168
+ })
169
+ })
170
+ })
171
+
172
+ /**
173
+ * Creates a layer for the OpenAI embedding model.
174
+ *
175
+ * **When to use**
176
+ *
177
+ * Use when composing application layers and you want OpenAI to satisfy
178
+ * `EmbeddingModel.EmbeddingModel` while supplying `OpenAiClient` from another
179
+ * layer.
180
+ *
181
+ * **Gotchas**
182
+ *
183
+ * Use the default floating-point embedding format. The service expects numeric
184
+ * vectors and fails with `InvalidOutputError` if OpenAI returns base64
185
+ * embeddings.
186
+ *
187
+ * @see {@link make} for constructing the embedding model service effectfully
188
+ * @see {@link model} for creating an `AiModel` that also provides embedding dimensions
189
+ *
190
+ * @category layers
191
+ * @since 4.0.0
192
+ */
193
+ export const layer = (options: {
194
+ readonly model: (string & {}) | Model
195
+ readonly config?: Omit<typeof Config.Service, "model"> | undefined
196
+ }): Layer.Layer<EmbeddingModel.EmbeddingModel, never, OpenAiClient> =>
197
+ Layer.effect(EmbeddingModel.EmbeddingModel, make(options))
198
+
199
+ /**
200
+ * Provides config overrides for OpenAI embedding model operations.
201
+ *
202
+ * **When to use**
203
+ *
204
+ * Use when a single effect or workflow needs scoped OpenAI embedding request
205
+ * defaults without rebuilding the embedding model service.
206
+ *
207
+ * **Details**
208
+ *
209
+ * Supports both data-first and data-last forms. Existing scoped config is read
210
+ * first, then the provided overrides are applied so override fields take
211
+ * precedence.
212
+ *
213
+ * @see {@link Config} for the scoped embedding request configuration service
214
+ *
215
+ * @category configuration
216
+ * @since 4.0.0
217
+ */
218
+ export const withConfigOverride: {
219
+ /**
220
+ * Provides config overrides for OpenAI embedding model operations.
221
+ *
222
+ * **When to use**
223
+ *
224
+ * Use when a single effect or workflow needs scoped OpenAI embedding request
225
+ * defaults without rebuilding the embedding model service.
226
+ *
227
+ * **Details**
228
+ *
229
+ * Supports both data-first and data-last forms. Existing scoped config is read
230
+ * first, then the provided overrides are applied so override fields take
231
+ * precedence.
232
+ *
233
+ * @see {@link Config} for the scoped embedding request configuration service
234
+ *
235
+ * @category configuration
236
+ * @since 4.0.0
237
+ */
238
+ (overrides: typeof Config.Service): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, Config>>
239
+ /**
240
+ * Provides config overrides for OpenAI embedding model operations.
241
+ *
242
+ * **When to use**
243
+ *
244
+ * Use when a single effect or workflow needs scoped OpenAI embedding request
245
+ * defaults without rebuilding the embedding model service.
246
+ *
247
+ * **Details**
248
+ *
249
+ * Supports both data-first and data-last forms. Existing scoped config is read
250
+ * first, then the provided overrides are applied so override fields take
251
+ * precedence.
252
+ *
253
+ * @see {@link Config} for the scoped embedding request configuration service
254
+ *
255
+ * @category configuration
256
+ * @since 4.0.0
257
+ */
258
+ <A, E, R>(self: Effect.Effect<A, E, R>, overrides: typeof Config.Service): Effect.Effect<A, E, Exclude<R, Config>>
259
+ } = dual<
260
+ /**
261
+ * Provides config overrides for OpenAI embedding model operations.
262
+ *
263
+ * **When to use**
264
+ *
265
+ * Use when a single effect or workflow needs scoped OpenAI embedding request
266
+ * defaults without rebuilding the embedding model service.
267
+ *
268
+ * **Details**
269
+ *
270
+ * Supports both data-first and data-last forms. Existing scoped config is read
271
+ * first, then the provided overrides are applied so override fields take
272
+ * precedence.
273
+ *
274
+ * @see {@link Config} for the scoped embedding request configuration service
275
+ *
276
+ * @category configuration
277
+ * @since 4.0.0
278
+ */
279
+ (overrides: typeof Config.Service) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, Config>>,
280
+ /**
281
+ * Provides config overrides for OpenAI embedding model operations.
282
+ *
283
+ * **When to use**
284
+ *
285
+ * Use when a single effect or workflow needs scoped OpenAI embedding request
286
+ * defaults without rebuilding the embedding model service.
287
+ *
288
+ * **Details**
289
+ *
290
+ * Supports both data-first and data-last forms. Existing scoped config is read
291
+ * first, then the provided overrides are applied so override fields take
292
+ * precedence.
293
+ *
294
+ * @see {@link Config} for the scoped embedding request configuration service
295
+ *
296
+ * @category configuration
297
+ * @since 4.0.0
298
+ */
299
+ <A, E, R>(self: Effect.Effect<A, E, R>, overrides: typeof Config.Service) => Effect.Effect<A, E, Exclude<R, Config>>
300
+ >(2, (self, overrides) =>
301
+ Effect.flatMap(
302
+ Effect.serviceOption(Config),
303
+ (config) =>
304
+ Effect.provideService(self, Config, {
305
+ ...(config._tag === "Some" ? config.value : {}),
306
+ ...overrides
307
+ })
308
+ ))
309
+
310
+ const mapProviderResponse = (
311
+ inputLength: number,
312
+ response: typeof OpenAiSchema.CreateEmbeddingResponse.Type
313
+ ): Effect.Effect<EmbeddingModel.ProviderResponse, AiError.AiError> => {
314
+ if (response.data.length !== inputLength) {
315
+ return Effect.fail(
316
+ invalidOutput("Provider returned " + response.data.length + " embeddings but expected " + inputLength)
317
+ )
318
+ }
319
+
320
+ const results = new Array<Array<number>>(inputLength)
321
+ const seen = new Set<number>()
322
+
323
+ for (const entry of response.data) {
324
+ if (!Number.isInteger(entry.index) || entry.index < 0 || entry.index >= inputLength) {
325
+ return Effect.fail(invalidOutput("Provider returned invalid embedding index: " + entry.index))
326
+ }
327
+ if (seen.has(entry.index)) {
328
+ return Effect.fail(invalidOutput("Provider returned duplicate embedding index: " + entry.index))
329
+ }
330
+ if (!Array.isArray(entry.embedding)) {
331
+ return Effect.fail(invalidOutput("Provider returned non-vector embedding at index " + entry.index))
332
+ }
333
+
334
+ seen.add(entry.index)
335
+ results[entry.index] = [...entry.embedding]
336
+ }
337
+
338
+ if (seen.size !== inputLength) {
339
+ return Effect.fail(
340
+ invalidOutput("Provider returned embeddings for " + seen.size + " inputs but expected " + inputLength)
341
+ )
342
+ }
343
+
344
+ return Effect.succeed({
345
+ results,
346
+ usage: {
347
+ inputTokens: response.usage?.prompt_tokens
348
+ }
349
+ })
350
+ }
351
+
352
+ const invalidOutput = (description: string): AiError.AiError =>
353
+ AiError.make({
354
+ module: "OpenAiEmbeddingModel",
355
+ method: "embedMany",
356
+ reason: new AiError.InvalidOutputError({ description })
357
+ })
@@ -4,14 +4,14 @@
4
4
  * Provides OpenAI-specific metadata fields for AI error types through module
5
5
  * augmentation, enabling typed access to OpenAI error details.
6
6
  *
7
- * @since 1.0.0
7
+ * @since 4.0.0
8
8
  */
9
9
 
10
10
  /**
11
11
  * OpenAI-specific error metadata fields.
12
12
  *
13
- * @since 1.0.0
14
13
  * @category models
14
+ * @since 4.0.0
15
15
  */
16
16
  export type OpenAiErrorMetadata = {
17
17
  /**
@@ -31,11 +31,13 @@ export type OpenAiErrorMetadata = {
31
31
  /**
32
32
  * OpenAI-specific rate limit metadata fields.
33
33
  *
34
+ * **Details**
35
+ *
34
36
  * Extends base error metadata with rate limit specific information from
35
37
  * OpenAI's rate limit headers.
36
38
  *
37
- * @since 1.0.0
38
39
  * @category models
40
+ * @since 4.0.0
39
41
  */
40
42
  export type OpenAiRateLimitMetadata = OpenAiErrorMetadata & {
41
43
  /**
@@ -57,51 +59,184 @@ export type OpenAiRateLimitMetadata = OpenAiErrorMetadata & {
57
59
  }
58
60
 
59
61
  declare module "effect/unstable/ai/AiError" {
60
- export interface RateLimitError {
61
- readonly metadata: {
62
- readonly openai?: OpenAiRateLimitMetadata | null
63
- }
62
+ /**
63
+ * OpenAI metadata attached to `RateLimitError` values.
64
+ *
65
+ * **Details**
66
+ *
67
+ * Captures OpenAI error details together with rate limit header information
68
+ * from responses where the provider rejected the request because a limit was
69
+ * reached.
70
+ *
71
+ * @category configuration
72
+ * @since 4.0.0
73
+ */
74
+ export interface RateLimitErrorMetadata {
75
+ /**
76
+ * OpenAI-specific details for the rate limit response.
77
+ */
78
+ readonly openai?: OpenAiRateLimitMetadata | null
64
79
  }
65
80
 
66
- export interface QuotaExhaustedError {
67
- readonly metadata: {
68
- readonly openai?: OpenAiErrorMetadata | null
69
- }
81
+ /**
82
+ * OpenAI metadata attached to `QuotaExhaustedError` values.
83
+ *
84
+ * **Details**
85
+ *
86
+ * Preserves provider error details for failures caused by exhausted account,
87
+ * billing, or usage quota.
88
+ *
89
+ * @category configuration
90
+ * @since 4.0.0
91
+ */
92
+ export interface QuotaExhaustedErrorMetadata {
93
+ /**
94
+ * OpenAI-specific details for the quota exhaustion response.
95
+ */
96
+ readonly openai?: OpenAiErrorMetadata | null
70
97
  }
71
98
 
72
- export interface AuthenticationError {
73
- readonly metadata: {
74
- readonly openai?: OpenAiErrorMetadata | null
75
- }
99
+ /**
100
+ * OpenAI metadata attached to `AuthenticationError` values.
101
+ *
102
+ * **Details**
103
+ *
104
+ * Preserves provider error details for failed API key, authorization, or
105
+ * permission checks.
106
+ *
107
+ * @category configuration
108
+ * @since 4.0.0
109
+ */
110
+ export interface AuthenticationErrorMetadata {
111
+ /**
112
+ * OpenAI-specific details for the authentication failure.
113
+ */
114
+ readonly openai?: OpenAiErrorMetadata | null
76
115
  }
77
116
 
78
- export interface ContentPolicyError {
79
- readonly metadata: {
80
- readonly openai?: OpenAiErrorMetadata | null
81
- }
117
+ /**
118
+ * OpenAI metadata attached to `ContentPolicyError` values.
119
+ *
120
+ * **Details**
121
+ *
122
+ * Preserves provider error details when OpenAI rejects input or output because
123
+ * it violates a content policy.
124
+ *
125
+ * @category configuration
126
+ * @since 4.0.0
127
+ */
128
+ export interface ContentPolicyErrorMetadata {
129
+ /**
130
+ * OpenAI-specific details for the content policy response.
131
+ */
132
+ readonly openai?: OpenAiErrorMetadata | null
82
133
  }
83
134
 
84
- export interface InvalidRequestError {
85
- readonly metadata: {
86
- readonly openai?: OpenAiErrorMetadata | null
87
- }
135
+ /**
136
+ * OpenAI metadata attached to `InvalidRequestError` values.
137
+ *
138
+ * **Details**
139
+ *
140
+ * Preserves provider error details for malformed requests, unsupported
141
+ * parameters, or other request validation failures reported by OpenAI.
142
+ *
143
+ * @category configuration
144
+ * @since 4.0.0
145
+ */
146
+ export interface InvalidRequestErrorMetadata {
147
+ /**
148
+ * OpenAI-specific details for the invalid request response.
149
+ */
150
+ readonly openai?: OpenAiErrorMetadata | null
88
151
  }
89
152
 
90
- export interface InternalProviderError {
91
- readonly metadata: {
92
- readonly openai?: OpenAiErrorMetadata | null
93
- }
153
+ /**
154
+ * OpenAI metadata attached to `InternalProviderError` values.
155
+ *
156
+ * **Details**
157
+ *
158
+ * Preserves provider error details for OpenAI-side failures such as transient
159
+ * server errors.
160
+ *
161
+ * @category configuration
162
+ * @since 4.0.0
163
+ */
164
+ export interface InternalProviderErrorMetadata {
165
+ /**
166
+ * OpenAI-specific details for the internal provider response.
167
+ */
168
+ readonly openai?: OpenAiErrorMetadata | null
94
169
  }
95
170
 
96
- export interface InvalidOutputError {
97
- readonly metadata: {
98
- readonly openai?: OpenAiErrorMetadata | null
99
- }
171
+ /**
172
+ * OpenAI metadata attached to `InvalidOutputError` values.
173
+ *
174
+ * **Details**
175
+ *
176
+ * Preserves provider error details when an OpenAI response cannot be parsed or
177
+ * validated as the expected output.
178
+ *
179
+ * @category configuration
180
+ * @since 4.0.0
181
+ */
182
+ export interface InvalidOutputErrorMetadata {
183
+ /**
184
+ * OpenAI-specific details for the invalid output response.
185
+ */
186
+ readonly openai?: OpenAiErrorMetadata | null
187
+ }
188
+
189
+ /**
190
+ * OpenAI metadata attached to `StructuredOutputError` values.
191
+ *
192
+ * **Details**
193
+ *
194
+ * Preserves provider error details when OpenAI returns content that does not
195
+ * satisfy the requested structured output schema.
196
+ *
197
+ * @category configuration
198
+ * @since 4.0.0
199
+ */
200
+ export interface StructuredOutputErrorMetadata {
201
+ /**
202
+ * OpenAI-specific details for the structured output failure.
203
+ */
204
+ readonly openai?: OpenAiErrorMetadata | null
100
205
  }
101
206
 
102
- export interface UnknownError {
103
- readonly metadata: {
104
- readonly openai?: OpenAiErrorMetadata | null
105
- }
207
+ /**
208
+ * OpenAI metadata attached to `UnsupportedSchemaError` values.
209
+ *
210
+ * **Details**
211
+ *
212
+ * Preserves provider error details when an unsupported schema failure is
213
+ * associated with an OpenAI response.
214
+ *
215
+ * @category configuration
216
+ * @since 4.0.0
217
+ */
218
+ export interface UnsupportedSchemaErrorMetadata {
219
+ /**
220
+ * OpenAI-specific details for the unsupported schema failure.
221
+ */
222
+ readonly openai?: OpenAiErrorMetadata | null
223
+ }
224
+
225
+ /**
226
+ * OpenAI metadata attached to `UnknownError` values.
227
+ *
228
+ * **Details**
229
+ *
230
+ * Preserves provider error details for OpenAI failures that do not map cleanly
231
+ * to a more specific AI error category.
232
+ *
233
+ * @category configuration
234
+ * @since 4.0.0
235
+ */
236
+ export interface UnknownErrorMetadata {
237
+ /**
238
+ * OpenAI-specific details for the unclassified provider failure.
239
+ */
240
+ readonly openai?: OpenAiErrorMetadata | null
106
241
  }
107
242
  }