@effect/ai-openrouter 4.0.0-beta.1 → 4.0.0-beta.100

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.
@@ -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
  }