@effect/ai-openrouter 4.0.0-beta.9 → 4.0.0-beta.90

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/ai-openrouter",
3
- "version": "4.0.0-beta.9",
3
+ "version": "4.0.0-beta.90",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "An OpenRouter provider integration for Effect AI SDK",
@@ -43,10 +43,10 @@
43
43
  "provenance": true
44
44
  },
45
45
  "devDependencies": {
46
- "effect": "^4.0.0-beta.9"
46
+ "effect": "^4.0.0-beta.90"
47
47
  },
48
48
  "peerDependencies": {
49
- "effect": "^4.0.0-beta.9"
49
+ "effect": "^4.0.0-beta.90"
50
50
  },
51
51
  "scripts": {
52
52
  "codegen": "effect-utils codegen",
package/src/Generated.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * @since 4.0.0
3
3
  */
4
4
 
5
5
  import * as Data from "effect/Data"
@@ -8923,7 +8923,7 @@ export const make = (
8923
8923
  Type,
8924
8924
  DecodingServices
8925
8925
  >(
8926
- schema: Schema.Decoder<Type, DecodingServices>
8926
+ schema: Schema.ConstraintDecoder<Type, DecodingServices>
8927
8927
  ) =>
8928
8928
  (
8929
8929
  request: HttpClientRequest.HttpClientRequest
@@ -8939,10 +8939,10 @@ export const make = (
8939
8939
  Stream.pipeThroughChannel(Sse.decodeDataSchema(schema))
8940
8940
  )
8941
8941
  const decodeSuccess =
8942
- <Schema extends Schema.Top>(schema: Schema) => (response: HttpClientResponse.HttpClientResponse) =>
8942
+ <Schema extends Schema.Constraint>(schema: Schema) => (response: HttpClientResponse.HttpClientResponse) =>
8943
8943
  HttpClientResponse.schemaBodyJson(schema)(response)
8944
8944
  const decodeError =
8945
- <const Tag extends string, Schema extends Schema.Top>(tag: Tag, schema: Schema) =>
8945
+ <const Tag extends string, Schema extends Schema.Constraint>(tag: Tag, schema: Schema) =>
8946
8946
  (response: HttpClientResponse.HttpClientResponse) =>
8947
8947
  Effect.flatMap(
8948
8948
  HttpClientResponse.schemaBodyJson(schema)(response),
@@ -1,14 +1,19 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * The `OpenRouterClient` module provides an Effect service for calling
3
+ * OpenRouter's chat completions API. It wraps the generated OpenRouter HTTP
4
+ * client with Effect-native constructors, layers, authentication and optional
5
+ * site ranking headers, typed errors, and streaming support.
6
+ *
7
+ * @since 4.0.0
3
8
  */
4
9
  import type * as Config from "effect/Config"
10
+ import * as Context from "effect/Context"
5
11
  import * as Effect from "effect/Effect"
6
12
  import { identity } from "effect/Function"
7
13
  import * as Layer from "effect/Layer"
8
14
  import * as Predicate from "effect/Predicate"
9
15
  import type * as Redacted from "effect/Redacted"
10
16
  import * as Schema from "effect/Schema"
11
- import * as ServiceMap from "effect/ServiceMap"
12
17
  import * as Stream from "effect/Stream"
13
18
  import type * as AiError from "effect/unstable/ai/AiError"
14
19
  import * as Sse from "effect/unstable/encoding/Sse"
@@ -27,11 +32,13 @@ import { OpenRouterConfig } from "./OpenRouterConfig.ts"
27
32
  /**
28
33
  * The OpenRouter client service interface.
29
34
  *
35
+ * **Details**
36
+ *
30
37
  * Provides methods for interacting with OpenRouter's Chat Completions API,
31
38
  * including both synchronous and streaming message creation.
32
39
  *
33
- * @since 1.0.0
34
40
  * @category models
41
+ * @since 4.0.0
35
42
  */
36
43
  export interface Service {
37
44
  readonly client: Generated.OpenRouterClient
@@ -55,8 +62,15 @@ export interface Service {
55
62
  }
56
63
 
57
64
  /**
58
- * @since 1.0.0
59
- * @category Models
65
+ * Decoded `data` payload from an OpenRouter chat completion streaming chunk.
66
+ *
67
+ * **Details**
68
+ *
69
+ * The payload contains streamed choices, model metadata, optional usage, and may
70
+ * include an OpenRouter error object for a streamed response.
71
+ *
72
+ * @category models
73
+ * @since 4.0.0
60
74
  */
61
75
  export type ChatStreamingResponseChunkData = typeof Generated.ChatStreamingResponseChunk.fields.data.Type
62
76
 
@@ -65,12 +79,21 @@ export type ChatStreamingResponseChunkData = typeof Generated.ChatStreamingRespo
65
79
  // =============================================================================
66
80
 
67
81
  /**
68
- * Service identifier for the OpenRouter client.
82
+ * Service tag for the OpenRouter client.
83
+ *
84
+ * **When to use**
69
85
  *
70
- * @since 1.0.0
71
- * @category service
86
+ * Use when accessing or providing the OpenRouter client service through
87
+ * Effect's context.
88
+ *
89
+ * @see {@link make} for constructing an OpenRouter client effectfully
90
+ * @see {@link layer} for providing a client from explicit options
91
+ * @see {@link layerConfig} for providing a client from `Config`
92
+ *
93
+ * @category services
94
+ * @since 4.0.0
72
95
  */
73
- export class OpenRouterClient extends ServiceMap.Service<
96
+ export class OpenRouterClient extends Context.Service<
74
97
  OpenRouterClient,
75
98
  Service
76
99
  >()("@effect/ai-openrouter/OpenRouterClient") {}
@@ -80,10 +103,10 @@ export class OpenRouterClient extends ServiceMap.Service<
80
103
  // =============================================================================
81
104
 
82
105
  /**
83
- * Configuration options for creating an OpenRouter client.
106
+ * Configuration for creating an OpenRouter client.
84
107
  *
85
- * @since 1.0.0
86
- * @category models
108
+ * @category options
109
+ * @since 4.0.0
87
110
  */
88
111
  export type Options = {
89
112
  readonly apiKey?: Redacted.Redacted<string> | undefined
@@ -103,7 +126,9 @@ export type Options = {
103
126
  /**
104
127
  * Optional transformer for the underlying HTTP client.
105
128
  *
106
- * Use this to add middleware, logging, or custom request/response handling.
129
+ * **When to use**
130
+ *
131
+ * Use to add middleware, logging, or custom request/response handling.
107
132
  */
108
133
  readonly transformClient?: ((client: HttpClient.HttpClient) => HttpClient.HttpClient) | undefined
109
134
  }
@@ -113,10 +138,30 @@ export type Options = {
113
138
  // =============================================================================
114
139
 
115
140
  /**
116
- * Creates an OpenRouter client service with the given options.
141
+ * Creates an OpenRouter client service from explicit options.
142
+ *
143
+ * **When to use**
144
+ *
145
+ * Use when you need the OpenRouter client service value inside an effect.
146
+ *
147
+ * **Details**
148
+ *
149
+ * The returned service uses the current `HttpClient`, prepends `apiUrl` or
150
+ * `https://openrouter.ai/api/v1`, adds the bearer token and optional
151
+ * `HTTP-Referer` and `X-Title` headers, accepts JSON responses, and applies
152
+ * `transformClient` when provided.
153
+ *
154
+ * **Gotchas**
155
+ *
156
+ * Scoped `OpenRouterConfig.withClientTransform` applies to generated client
157
+ * request methods. Streaming chat completion requests are sent directly by this
158
+ * module and do not read that scoped transform.
159
+ *
160
+ * @see {@link layer} for providing this client from explicit options
161
+ * @see {@link layerConfig} for loading client settings from `Config`
117
162
  *
118
- * @since 1.0.0
119
163
  * @category constructors
164
+ * @since 4.0.0
120
165
  */
121
166
  export const make = Effect.fnUntraced(
122
167
  function*(options: Options): Effect.fn.Return<Service, never, HttpClient.HttpClient> {
@@ -127,7 +172,7 @@ export const make = Effect.fnUntraced(
127
172
  request.pipe(
128
173
  HttpClientRequest.prependUrl(options.apiUrl ?? "https://openrouter.ai/api/v1"),
129
174
  options.apiKey ? HttpClientRequest.bearerToken(options.apiKey) : identity,
130
- options.siteReferrer ? HttpClientRequest.setHeader("HTTP-Referrer", options.siteReferrer) : identity,
175
+ options.siteReferrer ? HttpClientRequest.setHeader("HTTP-Referer", options.siteReferrer) : identity,
131
176
  options.siteTitle ? HttpClientRequest.setHeader("X-Title", options.siteTitle) : identity,
132
177
  HttpClientRequest.acceptJson
133
178
  )
@@ -212,24 +257,45 @@ export const make = Effect.fnUntraced(
212
257
  /**
213
258
  * Creates a layer for the OpenRouter client with the given options.
214
259
  *
215
- * @since 1.0.0
260
+ * **When to use**
261
+ *
262
+ * Use when you already have the OpenRouter client options in code and want to
263
+ * provide `OpenRouterClient` as a layer.
264
+ *
265
+ * @see {@link make} for constructing the client service effectfully
266
+ * @see {@link layerConfig} for loading client settings from `Config`
267
+ *
216
268
  * @category layers
269
+ * @since 4.0.0
217
270
  */
218
271
  export const layer = (options: Options): Layer.Layer<OpenRouterClient, never, HttpClient.HttpClient> =>
219
272
  Layer.effect(OpenRouterClient, make(options))
220
273
 
221
274
  /**
222
- * Creates a layer for the OpenRouter client, loading the requisite
223
- * configuration via Effect's `Config` module.
275
+ * Creates a layer for the OpenRouter client from provided `Config` values.
276
+ *
277
+ * **When to use**
278
+ *
279
+ * Use when you need client settings for OpenRouter to be read from Effect
280
+ * `Config` values while providing `OpenRouterClient` as a layer.
281
+ *
282
+ * **Details**
283
+ *
284
+ * Only config values supplied in `options` are loaded. Omitted fields are
285
+ * passed to `make` as `undefined`, and `transformClient` is forwarded as a
286
+ * plain option.
287
+ *
288
+ * @see {@link make} for constructing the client service effectfully
289
+ * @see {@link layer} for providing the client from already-resolved options
224
290
  *
225
- * @since 1.0.0
226
291
  * @category layers
292
+ * @since 4.0.0
227
293
  */
228
294
  export const layerConfig = (options?: {
229
295
  /**
230
296
  * The config value to load for the API key.
231
297
  */
232
- readonly apiKey?: Config.Config<Redacted.Redacted<string>> | undefined
298
+ readonly apiKey?: Config.Config<Redacted.Redacted<string> | undefined> | undefined
233
299
 
234
300
  /**
235
301
  * The config value to load for the API URL.
@@ -1,35 +1,57 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * The `OpenRouterConfig` module lets a workflow temporarily customize the HTTP
3
+ * client used by generated OpenRouter request methods. `OpenRouterClient` reads
4
+ * this scoped transform when generated client operations execute, so callers can
5
+ * add middleware or instrumentation without rebuilding the client layer.
6
+ *
7
+ * @since 4.0.0
3
8
  */
9
+ import * as Context from "effect/Context"
4
10
  import * as Effect from "effect/Effect"
5
11
  import { dual } from "effect/Function"
6
- import * as ServiceMap from "effect/ServiceMap"
7
12
  import type { HttpClient } from "effect/unstable/http/HttpClient"
8
13
 
9
14
  /**
10
- * @since 1.0.0
15
+ * Context service for scoped OpenRouter provider configuration used by client
16
+ * operations.
17
+ *
18
+ * **When to use**
19
+ *
20
+ * Use as the context service tag when manually providing or reading scoped
21
+ * OpenRouter provider configuration in an Effect context.
22
+ *
23
+ * @see {@link withClientTransform} for scoping an HTTP client transformation
24
+ *
11
25
  * @category services
26
+ * @since 4.0.0
12
27
  */
13
- export class OpenRouterConfig extends ServiceMap.Service<
28
+ export class OpenRouterConfig extends Context.Service<
14
29
  OpenRouterConfig,
15
30
  OpenRouterConfig.Service
16
31
  >()("@effect/ai-openrouter/OpenRouterConfig") {
17
32
  /**
18
- * @since 1.0.0
33
+ * Gets the configured OpenRouter service from the current context when present.
34
+ *
35
+ * @since 4.0.0
19
36
  */
20
37
  static readonly getOrUndefined: Effect.Effect<typeof OpenRouterConfig.Service | undefined> = Effect.map(
21
- Effect.services<never>(),
38
+ Effect.context<never>(),
22
39
  (services) => services.mapUnsafe.get(OpenRouterConfig.key)
23
40
  )
24
41
  }
25
42
 
26
43
  /**
27
- * @since 1.0.0
44
+ * Types associated with the `OpenRouterConfig` context service.
45
+ *
46
+ * @since 4.0.0
28
47
  */
29
48
  export declare namespace OpenRouterConfig {
30
49
  /**
31
- * @since 1.0.0
50
+ * Configuration values read by OpenRouter provider operations when resolving
51
+ * the generated HTTP client.
52
+ *
32
53
  * @category models
54
+ * @since 4.0.0
33
55
  */
34
56
  export interface Service {
35
57
  readonly transformClient?: ((client: HttpClient) => HttpClient) | undefined
@@ -37,18 +59,81 @@ export declare namespace OpenRouterConfig {
37
59
  }
38
60
 
39
61
  /**
40
- * @since 1.0.0
62
+ * Provides a scoped transform for the OpenRouter HTTP client used by provider
63
+ * operations.
64
+ *
65
+ * **When to use**
66
+ *
67
+ * Use when you need temporary OpenRouter HTTP client customization for a
68
+ * single effect or workflow without rebuilding the client layer.
69
+ *
70
+ * **Details**
71
+ *
72
+ * Supports both data-first and data-last forms. The transform is stored in the
73
+ * scoped `OpenRouterConfig` service and read by generated OpenRouter request
74
+ * operations while running the supplied effect.
75
+ *
76
+ * **Gotchas**
77
+ *
78
+ * If a transform is already present in the scoped config, this helper replaces
79
+ * it. Compose transforms manually when both should apply. Streaming chat
80
+ * completion requests are sent directly by `OpenRouterClient.make` and do not
81
+ * read this scoped transform.
82
+ *
41
83
  * @category configuration
84
+ * @since 4.0.0
42
85
  */
43
86
  export const withClientTransform: {
44
87
  /**
45
- * @since 1.0.0
88
+ * Provides a scoped transform for the OpenRouter HTTP client used by provider
89
+ * operations.
90
+ *
91
+ * **When to use**
92
+ *
93
+ * Use when you need temporary OpenRouter HTTP client customization for a
94
+ * single effect or workflow without rebuilding the client layer.
95
+ *
96
+ * **Details**
97
+ *
98
+ * Supports both data-first and data-last forms. The transform is stored in the
99
+ * scoped `OpenRouterConfig` service and read by generated OpenRouter request
100
+ * operations while running the supplied effect.
101
+ *
102
+ * **Gotchas**
103
+ *
104
+ * If a transform is already present in the scoped config, this helper replaces
105
+ * it. Compose transforms manually when both should apply. Streaming chat
106
+ * completion requests are sent directly by `OpenRouterClient.make` and do not
107
+ * read this scoped transform.
108
+ *
46
109
  * @category configuration
110
+ * @since 4.0.0
47
111
  */
48
112
  (transform: (client: HttpClient) => HttpClient): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
49
113
  /**
50
- * @since 1.0.0
114
+ * Provides a scoped transform for the OpenRouter HTTP client used by provider
115
+ * operations.
116
+ *
117
+ * **When to use**
118
+ *
119
+ * Use when you need temporary OpenRouter HTTP client customization for a
120
+ * single effect or workflow without rebuilding the client layer.
121
+ *
122
+ * **Details**
123
+ *
124
+ * Supports both data-first and data-last forms. The transform is stored in the
125
+ * scoped `OpenRouterConfig` service and read by generated OpenRouter request
126
+ * operations while running the supplied effect.
127
+ *
128
+ * **Gotchas**
129
+ *
130
+ * If a transform is already present in the scoped config, this helper replaces
131
+ * it. Compose transforms manually when both should apply. Streaming chat
132
+ * completion requests are sent directly by `OpenRouterClient.make` and do not
133
+ * read this scoped transform.
134
+ *
51
135
  * @category configuration
136
+ * @since 4.0.0
52
137
  */
53
138
  <A, E, R>(
54
139
  self: Effect.Effect<A, E, R>,
@@ -56,13 +141,55 @@ export const withClientTransform: {
56
141
  ): Effect.Effect<A, E, R>
57
142
  } = dual<
58
143
  /**
59
- * @since 1.0.0
144
+ * Provides a scoped transform for the OpenRouter HTTP client used by provider
145
+ * operations.
146
+ *
147
+ * **When to use**
148
+ *
149
+ * Use when you need temporary OpenRouter HTTP client customization for a
150
+ * single effect or workflow without rebuilding the client layer.
151
+ *
152
+ * **Details**
153
+ *
154
+ * Supports both data-first and data-last forms. The transform is stored in the
155
+ * scoped `OpenRouterConfig` service and read by generated OpenRouter request
156
+ * operations while running the supplied effect.
157
+ *
158
+ * **Gotchas**
159
+ *
160
+ * If a transform is already present in the scoped config, this helper replaces
161
+ * it. Compose transforms manually when both should apply. Streaming chat
162
+ * completion requests are sent directly by `OpenRouterClient.make` and do not
163
+ * read this scoped transform.
164
+ *
60
165
  * @category configuration
166
+ * @since 4.0.0
61
167
  */
62
168
  (transform: (client: HttpClient) => HttpClient) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>,
63
169
  /**
64
- * @since 1.0.0
170
+ * Provides a scoped transform for the OpenRouter HTTP client used by provider
171
+ * operations.
172
+ *
173
+ * **When to use**
174
+ *
175
+ * Use when you need temporary OpenRouter HTTP client customization for a
176
+ * single effect or workflow without rebuilding the client layer.
177
+ *
178
+ * **Details**
179
+ *
180
+ * Supports both data-first and data-last forms. The transform is stored in the
181
+ * scoped `OpenRouterConfig` service and read by generated OpenRouter request
182
+ * operations while running the supplied effect.
183
+ *
184
+ * **Gotchas**
185
+ *
186
+ * If a transform is already present in the scoped config, this helper replaces
187
+ * it. Compose transforms manually when both should apply. Streaming chat
188
+ * completion requests are sent directly by `OpenRouterClient.make` and do not
189
+ * read this scoped transform.
190
+ *
65
191
  * @category configuration
192
+ * @since 4.0.0
66
193
  */
67
194
  <A, E, R>(
68
195
  self: Effect.Effect<A, E, R>,
@@ -4,14 +4,14 @@
4
4
  * Provides OpenRouter-specific metadata fields for AI error types through
5
5
  * module augmentation, enabling typed access to OpenRouter error details.
6
6
  *
7
- * @since 1.0.0
7
+ * @since 4.0.0
8
8
  */
9
9
 
10
10
  /**
11
11
  * OpenRouter-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 OpenRouterErrorMetadata = {
17
17
  /**
@@ -31,8 +31,8 @@ export type OpenRouterErrorMetadata = {
31
31
  /**
32
32
  * OpenRouter-specific rate limit metadata fields.
33
33
  *
34
- * @since 1.0.0
35
34
  * @category models
35
+ * @since 4.0.0
36
36
  */
37
37
  export type OpenRouterRateLimitMetadata = OpenRouterErrorMetadata & {
38
38
  readonly limit: string | null
@@ -42,51 +42,184 @@ export type OpenRouterRateLimitMetadata = OpenRouterErrorMetadata & {
42
42
  }
43
43
 
44
44
  declare module "effect/unstable/ai/AiError" {
45
- export interface RateLimitError {
46
- readonly metadata: {
47
- readonly openrouter?: OpenRouterRateLimitMetadata | null
48
- }
45
+ /**
46
+ * OpenRouter metadata attached to `RateLimitError` values.
47
+ *
48
+ * **Details**
49
+ *
50
+ * Captures OpenRouter error details together with rate limit header
51
+ * information from responses where the provider rejected the request because
52
+ * a limit was reached.
53
+ *
54
+ * @category configuration
55
+ * @since 4.0.0
56
+ */
57
+ export interface RateLimitErrorMetadata {
58
+ /**
59
+ * OpenRouter-specific details for the rate limit response.
60
+ */
61
+ readonly openrouter?: OpenRouterRateLimitMetadata | null
62
+ }
63
+
64
+ /**
65
+ * OpenRouter metadata attached to `QuotaExhaustedError` values.
66
+ *
67
+ * **Details**
68
+ *
69
+ * Preserves provider error details for failures caused by exhausted account,
70
+ * billing, or usage quota.
71
+ *
72
+ * @category configuration
73
+ * @since 4.0.0
74
+ */
75
+ export interface QuotaExhaustedErrorMetadata {
76
+ /**
77
+ * OpenRouter-specific details for the quota exhaustion response.
78
+ */
79
+ readonly openrouter?: OpenRouterErrorMetadata | null
49
80
  }
50
81
 
51
- export interface QuotaExhaustedError {
52
- readonly metadata: {
53
- readonly openrouter?: OpenRouterErrorMetadata | null
54
- }
82
+ /**
83
+ * OpenRouter metadata attached to `AuthenticationError` values.
84
+ *
85
+ * **Details**
86
+ *
87
+ * Preserves provider error details for failed API key, authorization, or
88
+ * permission checks.
89
+ *
90
+ * @category configuration
91
+ * @since 4.0.0
92
+ */
93
+ export interface AuthenticationErrorMetadata {
94
+ /**
95
+ * OpenRouter-specific details for the authentication failure.
96
+ */
97
+ readonly openrouter?: OpenRouterErrorMetadata | null
98
+ }
99
+
100
+ /**
101
+ * OpenRouter metadata attached to `ContentPolicyError` values.
102
+ *
103
+ * **Details**
104
+ *
105
+ * Preserves provider error details when OpenRouter rejects input or output
106
+ * because it violates a content policy.
107
+ *
108
+ * @category configuration
109
+ * @since 4.0.0
110
+ */
111
+ export interface ContentPolicyErrorMetadata {
112
+ /**
113
+ * OpenRouter-specific details for the content policy response.
114
+ */
115
+ readonly openrouter?: OpenRouterErrorMetadata | null
55
116
  }
56
117
 
57
- export interface AuthenticationError {
58
- readonly metadata: {
59
- readonly openrouter?: OpenRouterErrorMetadata | null
60
- }
118
+ /**
119
+ * OpenRouter metadata attached to `InvalidRequestError` values.
120
+ *
121
+ * **Details**
122
+ *
123
+ * Preserves provider error details for malformed requests, unsupported
124
+ * parameters, or other request validation failures reported by OpenRouter.
125
+ *
126
+ * @category configuration
127
+ * @since 4.0.0
128
+ */
129
+ export interface InvalidRequestErrorMetadata {
130
+ /**
131
+ * OpenRouter-specific details for the invalid request response.
132
+ */
133
+ readonly openrouter?: OpenRouterErrorMetadata | null
61
134
  }
62
135
 
63
- export interface ContentPolicyError {
64
- readonly metadata: {
65
- readonly openrouter?: OpenRouterErrorMetadata | null
66
- }
136
+ /**
137
+ * OpenRouter metadata attached to `InternalProviderError` values.
138
+ *
139
+ * **Details**
140
+ *
141
+ * Preserves provider error details for OpenRouter-side failures such as
142
+ * transient server errors or overload responses.
143
+ *
144
+ * @category configuration
145
+ * @since 4.0.0
146
+ */
147
+ export interface InternalProviderErrorMetadata {
148
+ /**
149
+ * OpenRouter-specific details for the internal provider response.
150
+ */
151
+ readonly openrouter?: OpenRouterErrorMetadata | null
67
152
  }
68
153
 
69
- export interface InvalidRequestError {
70
- readonly metadata: {
71
- readonly openrouter?: OpenRouterErrorMetadata | null
72
- }
154
+ /**
155
+ * OpenRouter metadata attached to `InvalidOutputError` values.
156
+ *
157
+ * **Details**
158
+ *
159
+ * Preserves provider error details when an OpenRouter response cannot be
160
+ * parsed or validated as the expected output.
161
+ *
162
+ * @category configuration
163
+ * @since 4.0.0
164
+ */
165
+ export interface InvalidOutputErrorMetadata {
166
+ /**
167
+ * OpenRouter-specific details for the invalid output response.
168
+ */
169
+ readonly openrouter?: OpenRouterErrorMetadata | null
73
170
  }
74
171
 
75
- export interface InternalProviderError {
76
- readonly metadata: {
77
- readonly openrouter?: OpenRouterErrorMetadata | null
78
- }
172
+ /**
173
+ * OpenRouter metadata attached to `StructuredOutputError` values.
174
+ *
175
+ * **Details**
176
+ *
177
+ * Preserves provider error details when OpenRouter returns content that does
178
+ * not satisfy the requested structured output schema.
179
+ *
180
+ * @category configuration
181
+ * @since 4.0.0
182
+ */
183
+ export interface StructuredOutputErrorMetadata {
184
+ /**
185
+ * OpenRouter-specific details for the structured output failure.
186
+ */
187
+ readonly openrouter?: OpenRouterErrorMetadata | null
79
188
  }
80
189
 
81
- export interface InvalidOutputError {
82
- readonly metadata: {
83
- readonly openrouter?: OpenRouterErrorMetadata | null
84
- }
190
+ /**
191
+ * OpenRouter metadata attached to `UnsupportedSchemaError` values.
192
+ *
193
+ * **Details**
194
+ *
195
+ * Preserves provider error details when an unsupported schema failure is
196
+ * associated with an OpenRouter response.
197
+ *
198
+ * @category configuration
199
+ * @since 4.0.0
200
+ */
201
+ export interface UnsupportedSchemaErrorMetadata {
202
+ /**
203
+ * OpenRouter-specific details for the unsupported schema failure.
204
+ */
205
+ readonly openrouter?: OpenRouterErrorMetadata | null
85
206
  }
86
207
 
87
- export interface UnknownError {
88
- readonly metadata: {
89
- readonly openrouter?: OpenRouterErrorMetadata | null
90
- }
208
+ /**
209
+ * OpenRouter metadata attached to `UnknownError` values.
210
+ *
211
+ * **Details**
212
+ *
213
+ * Preserves provider error details for OpenRouter failures that do not map
214
+ * cleanly to a more specific AI error category.
215
+ *
216
+ * @category configuration
217
+ * @since 4.0.0
218
+ */
219
+ export interface UnknownErrorMetadata {
220
+ /**
221
+ * OpenRouter-specific details for the unclassified provider failure.
222
+ */
223
+ readonly openrouter?: OpenRouterErrorMetadata | null
91
224
  }
92
225
  }