@effect/ai-openrouter 4.0.0-beta.9 → 4.0.0-beta.91
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/dist/Generated.d.ts +1 -1
- package/dist/Generated.js +1 -1
- package/dist/Generated.js.map +1 -1
- package/dist/OpenRouterClient.d.ts +86 -20
- package/dist/OpenRouterClient.d.ts.map +1 -1
- package/dist/OpenRouterClient.js +62 -12
- package/dist/OpenRouterClient.js.map +1 -1
- package/dist/OpenRouterConfig.d.ts +95 -10
- package/dist/OpenRouterConfig.d.ts.map +1 -1
- package/dist/OpenRouterConfig.js +45 -7
- package/dist/OpenRouterConfig.js.map +1 -1
- package/dist/OpenRouterError.d.ts +166 -35
- package/dist/OpenRouterError.d.ts.map +1 -1
- package/dist/OpenRouterError.js +1 -1
- package/dist/OpenRouterLanguageModel.d.ts +364 -23
- package/dist/OpenRouterLanguageModel.d.ts.map +1 -1
- package/dist/OpenRouterLanguageModel.js +148 -14
- package/dist/OpenRouterLanguageModel.js.map +1 -1
- package/dist/index.d.ts +6 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -11
- package/dist/index.js.map +1 -1
- package/dist/internal/errors.js +4 -4
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/utilities.js +0 -1
- package/dist/internal/utilities.js.map +1 -1
- package/package.json +3 -3
- package/src/Generated.ts +4 -4
- package/src/OpenRouterClient.ts +87 -21
- package/src/OpenRouterConfig.ts +140 -13
- package/src/OpenRouterError.ts +168 -35
- package/src/OpenRouterLanguageModel.ts +463 -24
- package/src/index.ts +6 -11
- package/src/internal/errors.ts +6 -4
- package/src/internal/utilities.ts +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/ai-openrouter",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.91",
|
|
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.
|
|
46
|
+
"effect": "^4.0.0-beta.91"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
|
-
"effect": "^4.0.0-beta.
|
|
49
|
+
"effect": "^4.0.0-beta.91"
|
|
50
50
|
},
|
|
51
51
|
"scripts": {
|
|
52
52
|
"codegen": "effect-utils codegen",
|
package/src/Generated.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @since
|
|
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.
|
|
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.
|
|
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.
|
|
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),
|
package/src/OpenRouterClient.ts
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
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
|
-
*
|
|
59
|
-
*
|
|
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
|
|
82
|
+
* Service tag for the OpenRouter client.
|
|
83
|
+
*
|
|
84
|
+
* **When to use**
|
|
69
85
|
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
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
|
|
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
|
|
106
|
+
* Configuration for creating an OpenRouter client.
|
|
84
107
|
*
|
|
85
|
-
* @
|
|
86
|
-
* @
|
|
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
|
-
*
|
|
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
|
|
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-
|
|
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
|
-
*
|
|
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
|
|
223
|
-
*
|
|
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
|
|
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.
|
package/src/OpenRouterConfig.ts
CHANGED
|
@@ -1,35 +1,57 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
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
|
-
*
|
|
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
|
|
28
|
+
export class OpenRouterConfig extends Context.Service<
|
|
14
29
|
OpenRouterConfig,
|
|
15
30
|
OpenRouterConfig.Service
|
|
16
31
|
>()("@effect/ai-openrouter/OpenRouterConfig") {
|
|
17
32
|
/**
|
|
18
|
-
*
|
|
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.
|
|
38
|
+
Effect.context<never>(),
|
|
22
39
|
(services) => services.mapUnsafe.get(OpenRouterConfig.key)
|
|
23
40
|
)
|
|
24
41
|
}
|
|
25
42
|
|
|
26
43
|
/**
|
|
27
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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>,
|
package/src/OpenRouterError.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
}
|