@deepthonk/providers 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,282 @@
1
+ import { z } from "zod";
2
+ import type { ProviderConfig } from "./types.js";
3
+ export declare const providerReplaySchema: z.ZodObject<{
4
+ provider: z.ZodString;
5
+ baseUrl: z.ZodOptional<z.ZodString>;
6
+ apiKeyEnv: z.ZodOptional<z.ZodString>;
7
+ supportsJsonMode: z.ZodDefault<z.ZodBoolean>;
8
+ models: z.ZodObject<{
9
+ generator: z.ZodString;
10
+ mutator: z.ZodString;
11
+ judge: z.ZodString;
12
+ finalizer: z.ZodOptional<z.ZodString>;
13
+ }, "strict", z.ZodTypeAny, {
14
+ generator: string;
15
+ mutator: string;
16
+ judge: string;
17
+ finalizer?: string | undefined;
18
+ }, {
19
+ generator: string;
20
+ mutator: string;
21
+ judge: string;
22
+ finalizer?: string | undefined;
23
+ }>;
24
+ roleProviders: z.ZodOptional<z.ZodObject<{
25
+ generator: z.ZodOptional<z.ZodObject<{
26
+ provider: z.ZodString;
27
+ baseUrl: z.ZodOptional<z.ZodString>;
28
+ apiKeyEnv: z.ZodOptional<z.ZodString>;
29
+ model: z.ZodString;
30
+ supportsJsonMode: z.ZodOptional<z.ZodBoolean>;
31
+ }, "strict", z.ZodTypeAny, {
32
+ provider: string;
33
+ model: string;
34
+ baseUrl?: string | undefined;
35
+ apiKeyEnv?: string | undefined;
36
+ supportsJsonMode?: boolean | undefined;
37
+ }, {
38
+ provider: string;
39
+ model: string;
40
+ baseUrl?: string | undefined;
41
+ apiKeyEnv?: string | undefined;
42
+ supportsJsonMode?: boolean | undefined;
43
+ }>>;
44
+ mutator: z.ZodOptional<z.ZodObject<{
45
+ provider: z.ZodString;
46
+ baseUrl: z.ZodOptional<z.ZodString>;
47
+ apiKeyEnv: z.ZodOptional<z.ZodString>;
48
+ model: z.ZodString;
49
+ supportsJsonMode: z.ZodOptional<z.ZodBoolean>;
50
+ }, "strict", z.ZodTypeAny, {
51
+ provider: string;
52
+ model: string;
53
+ baseUrl?: string | undefined;
54
+ apiKeyEnv?: string | undefined;
55
+ supportsJsonMode?: boolean | undefined;
56
+ }, {
57
+ provider: string;
58
+ model: string;
59
+ baseUrl?: string | undefined;
60
+ apiKeyEnv?: string | undefined;
61
+ supportsJsonMode?: boolean | undefined;
62
+ }>>;
63
+ judge: z.ZodOptional<z.ZodObject<{
64
+ provider: z.ZodString;
65
+ baseUrl: z.ZodOptional<z.ZodString>;
66
+ apiKeyEnv: z.ZodOptional<z.ZodString>;
67
+ model: z.ZodString;
68
+ supportsJsonMode: z.ZodOptional<z.ZodBoolean>;
69
+ }, "strict", z.ZodTypeAny, {
70
+ provider: string;
71
+ model: string;
72
+ baseUrl?: string | undefined;
73
+ apiKeyEnv?: string | undefined;
74
+ supportsJsonMode?: boolean | undefined;
75
+ }, {
76
+ provider: string;
77
+ model: string;
78
+ baseUrl?: string | undefined;
79
+ apiKeyEnv?: string | undefined;
80
+ supportsJsonMode?: boolean | undefined;
81
+ }>>;
82
+ finalizer: z.ZodOptional<z.ZodObject<{
83
+ provider: z.ZodString;
84
+ baseUrl: z.ZodOptional<z.ZodString>;
85
+ apiKeyEnv: z.ZodOptional<z.ZodString>;
86
+ model: z.ZodString;
87
+ supportsJsonMode: z.ZodOptional<z.ZodBoolean>;
88
+ }, "strict", z.ZodTypeAny, {
89
+ provider: string;
90
+ model: string;
91
+ baseUrl?: string | undefined;
92
+ apiKeyEnv?: string | undefined;
93
+ supportsJsonMode?: boolean | undefined;
94
+ }, {
95
+ provider: string;
96
+ model: string;
97
+ baseUrl?: string | undefined;
98
+ apiKeyEnv?: string | undefined;
99
+ supportsJsonMode?: boolean | undefined;
100
+ }>>;
101
+ }, "strict", z.ZodTypeAny, {
102
+ generator?: {
103
+ provider: string;
104
+ model: string;
105
+ baseUrl?: string | undefined;
106
+ apiKeyEnv?: string | undefined;
107
+ supportsJsonMode?: boolean | undefined;
108
+ } | undefined;
109
+ mutator?: {
110
+ provider: string;
111
+ model: string;
112
+ baseUrl?: string | undefined;
113
+ apiKeyEnv?: string | undefined;
114
+ supportsJsonMode?: boolean | undefined;
115
+ } | undefined;
116
+ judge?: {
117
+ provider: string;
118
+ model: string;
119
+ baseUrl?: string | undefined;
120
+ apiKeyEnv?: string | undefined;
121
+ supportsJsonMode?: boolean | undefined;
122
+ } | undefined;
123
+ finalizer?: {
124
+ provider: string;
125
+ model: string;
126
+ baseUrl?: string | undefined;
127
+ apiKeyEnv?: string | undefined;
128
+ supportsJsonMode?: boolean | undefined;
129
+ } | undefined;
130
+ }, {
131
+ generator?: {
132
+ provider: string;
133
+ model: string;
134
+ baseUrl?: string | undefined;
135
+ apiKeyEnv?: string | undefined;
136
+ supportsJsonMode?: boolean | undefined;
137
+ } | undefined;
138
+ mutator?: {
139
+ provider: string;
140
+ model: string;
141
+ baseUrl?: string | undefined;
142
+ apiKeyEnv?: string | undefined;
143
+ supportsJsonMode?: boolean | undefined;
144
+ } | undefined;
145
+ judge?: {
146
+ provider: string;
147
+ model: string;
148
+ baseUrl?: string | undefined;
149
+ apiKeyEnv?: string | undefined;
150
+ supportsJsonMode?: boolean | undefined;
151
+ } | undefined;
152
+ finalizer?: {
153
+ provider: string;
154
+ model: string;
155
+ baseUrl?: string | undefined;
156
+ apiKeyEnv?: string | undefined;
157
+ supportsJsonMode?: boolean | undefined;
158
+ } | undefined;
159
+ }>>;
160
+ samplingPreferences: z.ZodOptional<z.ZodObject<{
161
+ modelHints: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
162
+ costPriority: z.ZodOptional<z.ZodNumber>;
163
+ speedPriority: z.ZodOptional<z.ZodNumber>;
164
+ intelligencePriority: z.ZodOptional<z.ZodNumber>;
165
+ }, "strict", z.ZodTypeAny, {
166
+ modelHints?: string[] | undefined;
167
+ costPriority?: number | undefined;
168
+ speedPriority?: number | undefined;
169
+ intelligencePriority?: number | undefined;
170
+ }, {
171
+ modelHints?: string[] | undefined;
172
+ costPriority?: number | undefined;
173
+ speedPriority?: number | undefined;
174
+ intelligencePriority?: number | undefined;
175
+ }>>;
176
+ routeFingerprint: z.ZodOptional<z.ZodString>;
177
+ }, "strict", z.ZodTypeAny, {
178
+ provider: string;
179
+ models: {
180
+ generator: string;
181
+ mutator: string;
182
+ judge: string;
183
+ finalizer?: string | undefined;
184
+ };
185
+ supportsJsonMode: boolean;
186
+ routeFingerprint?: string | undefined;
187
+ baseUrl?: string | undefined;
188
+ apiKeyEnv?: string | undefined;
189
+ roleProviders?: {
190
+ generator?: {
191
+ provider: string;
192
+ model: string;
193
+ baseUrl?: string | undefined;
194
+ apiKeyEnv?: string | undefined;
195
+ supportsJsonMode?: boolean | undefined;
196
+ } | undefined;
197
+ mutator?: {
198
+ provider: string;
199
+ model: string;
200
+ baseUrl?: string | undefined;
201
+ apiKeyEnv?: string | undefined;
202
+ supportsJsonMode?: boolean | undefined;
203
+ } | undefined;
204
+ judge?: {
205
+ provider: string;
206
+ model: string;
207
+ baseUrl?: string | undefined;
208
+ apiKeyEnv?: string | undefined;
209
+ supportsJsonMode?: boolean | undefined;
210
+ } | undefined;
211
+ finalizer?: {
212
+ provider: string;
213
+ model: string;
214
+ baseUrl?: string | undefined;
215
+ apiKeyEnv?: string | undefined;
216
+ supportsJsonMode?: boolean | undefined;
217
+ } | undefined;
218
+ } | undefined;
219
+ samplingPreferences?: {
220
+ modelHints?: string[] | undefined;
221
+ costPriority?: number | undefined;
222
+ speedPriority?: number | undefined;
223
+ intelligencePriority?: number | undefined;
224
+ } | undefined;
225
+ }, {
226
+ provider: string;
227
+ models: {
228
+ generator: string;
229
+ mutator: string;
230
+ judge: string;
231
+ finalizer?: string | undefined;
232
+ };
233
+ routeFingerprint?: string | undefined;
234
+ baseUrl?: string | undefined;
235
+ apiKeyEnv?: string | undefined;
236
+ supportsJsonMode?: boolean | undefined;
237
+ roleProviders?: {
238
+ generator?: {
239
+ provider: string;
240
+ model: string;
241
+ baseUrl?: string | undefined;
242
+ apiKeyEnv?: string | undefined;
243
+ supportsJsonMode?: boolean | undefined;
244
+ } | undefined;
245
+ mutator?: {
246
+ provider: string;
247
+ model: string;
248
+ baseUrl?: string | undefined;
249
+ apiKeyEnv?: string | undefined;
250
+ supportsJsonMode?: boolean | undefined;
251
+ } | undefined;
252
+ judge?: {
253
+ provider: string;
254
+ model: string;
255
+ baseUrl?: string | undefined;
256
+ apiKeyEnv?: string | undefined;
257
+ supportsJsonMode?: boolean | undefined;
258
+ } | undefined;
259
+ finalizer?: {
260
+ provider: string;
261
+ model: string;
262
+ baseUrl?: string | undefined;
263
+ apiKeyEnv?: string | undefined;
264
+ supportsJsonMode?: boolean | undefined;
265
+ } | undefined;
266
+ } | undefined;
267
+ samplingPreferences?: {
268
+ modelHints?: string[] | undefined;
269
+ costPriority?: number | undefined;
270
+ speedPriority?: number | undefined;
271
+ intelligencePriority?: number | undefined;
272
+ } | undefined;
273
+ }>;
274
+ export type ProviderReplay = z.infer<typeof providerReplaySchema>;
275
+ export declare function providerReplayFromConfig(config: ProviderConfig): ProviderReplay;
276
+ export declare function parseProviderReplay(value: unknown): ProviderReplay | undefined;
277
+ export declare function providerConfigFromReplay(replay: ProviderReplay, retry?: ProviderConfig["retry"], options?: {
278
+ providerMaxConcurrency?: number;
279
+ samplingTransport?: ProviderConfig["samplingTransport"];
280
+ }): ProviderConfig;
281
+ export declare function providerRouteFingerprint(replay: Omit<ProviderReplay, "routeFingerprint"> | ProviderReplay): string;
282
+ export declare function assertProviderReplayFingerprint(replay: ProviderReplay): void;
@@ -0,0 +1,186 @@
1
+ import { createHash } from "node:crypto";
2
+ import { ConfigError } from "@deepthonk/core";
3
+ import { z } from "zod";
4
+ import { resolveProviderConfig } from "./defaults.js";
5
+ const providerRoles = ["generator", "mutator", "judge", "finalizer"];
6
+ const providerReplayRoleSchema = z.object({
7
+ provider: z.string().min(1),
8
+ baseUrl: z.string().optional(),
9
+ apiKeyEnv: z.string().optional(),
10
+ model: z.string().min(1),
11
+ supportsJsonMode: z.boolean().optional()
12
+ }).strict();
13
+ export const providerReplaySchema = z.object({
14
+ provider: z.string().min(1),
15
+ baseUrl: z.string().optional(),
16
+ apiKeyEnv: z.string().optional(),
17
+ supportsJsonMode: z.boolean().default(true),
18
+ models: z.object({
19
+ generator: z.string().min(1),
20
+ mutator: z.string().min(1),
21
+ judge: z.string().min(1),
22
+ finalizer: z.string().min(1).optional()
23
+ }).strict(),
24
+ roleProviders: z
25
+ .object({
26
+ generator: providerReplayRoleSchema.optional(),
27
+ mutator: providerReplayRoleSchema.optional(),
28
+ judge: providerReplayRoleSchema.optional(),
29
+ finalizer: providerReplayRoleSchema.optional()
30
+ })
31
+ .strict()
32
+ .optional(),
33
+ samplingPreferences: z
34
+ .object({
35
+ modelHints: z.array(z.string().min(1)).optional(),
36
+ costPriority: z.number().min(0).max(1).optional(),
37
+ speedPriority: z.number().min(0).max(1).optional(),
38
+ intelligencePriority: z.number().min(0).max(1).optional()
39
+ })
40
+ .strict()
41
+ .optional(),
42
+ routeFingerprint: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional()
43
+ }).strict();
44
+ export function providerReplayFromConfig(config) {
45
+ const replay = {
46
+ provider: config.provider,
47
+ baseUrl: config.baseUrl,
48
+ apiKeyEnv: config.apiKeyEnv,
49
+ supportsJsonMode: config.supportsJsonMode ?? true,
50
+ models: compactObject({
51
+ generator: config.models.generator,
52
+ mutator: config.models.mutator,
53
+ judge: config.models.judge,
54
+ finalizer: config.models.finalizer
55
+ })
56
+ };
57
+ const roleProviders = replayRoleProviders(config);
58
+ if (roleProviders)
59
+ replay.roleProviders = roleProviders;
60
+ const samplingPreferences = compactObject({
61
+ modelHints: config.modelHints,
62
+ costPriority: config.costPriority,
63
+ speedPriority: config.speedPriority,
64
+ intelligencePriority: config.intelligencePriority
65
+ });
66
+ if (Object.keys(samplingPreferences).length > 0) {
67
+ replay.samplingPreferences = samplingPreferences;
68
+ }
69
+ replay.routeFingerprint = providerRouteFingerprint(replay);
70
+ return replay;
71
+ }
72
+ export function parseProviderReplay(value) {
73
+ if (value === undefined)
74
+ return undefined;
75
+ const parsed = providerReplaySchema.safeParse(value);
76
+ if (!parsed.success) {
77
+ throw invalidReplay(`Stored provider replay is invalid: ${parsed.error.issues.map((issue) => `${issue.path.join(".") || "root"}: ${issue.message}`).join("; ")}`);
78
+ }
79
+ assertProviderReplayFingerprint(parsed.data);
80
+ return parsed.data;
81
+ }
82
+ export function providerConfigFromReplay(replay, retry, options = {}) {
83
+ assertProviderReplayFingerprint(replay);
84
+ return resolveProviderConfig({
85
+ provider: replay.provider,
86
+ routeFingerprint: replay.routeFingerprint,
87
+ providerMaxConcurrency: options.providerMaxConcurrency,
88
+ baseUrl: replay.baseUrl,
89
+ apiKeyEnv: replay.apiKeyEnv,
90
+ supportsJsonMode: replay.supportsJsonMode,
91
+ models: replay.models,
92
+ roleProviders: replay.roleProviders,
93
+ retry,
94
+ samplingTransport: options.samplingTransport,
95
+ modelHints: replay.samplingPreferences?.modelHints,
96
+ costPriority: replay.samplingPreferences?.costPriority,
97
+ speedPriority: replay.samplingPreferences?.speedPriority,
98
+ intelligencePriority: replay.samplingPreferences?.intelligencePriority
99
+ });
100
+ }
101
+ export function providerRouteFingerprint(replay) {
102
+ const roles = Object.fromEntries(providerRoles.flatMap((role) => {
103
+ const route = replay.roleProviders?.[role];
104
+ return route
105
+ ? [[role, routeFingerprintValue(route.provider, route.baseUrl, route.apiKeyEnv, route.model, route.supportsJsonMode)]]
106
+ : [];
107
+ }));
108
+ const fingerprintValue = {
109
+ base: routeFingerprintValue(replay.provider, replay.baseUrl, replay.apiKeyEnv, replay.models, replay.supportsJsonMode),
110
+ roles,
111
+ samplingPreferences: replay.samplingPreferences ?? null
112
+ };
113
+ return `sha256:${createHash("sha256").update(stableJson(fingerprintValue)).digest("hex")}`;
114
+ }
115
+ export function assertProviderReplayFingerprint(replay) {
116
+ if (replay.routeFingerprint && replay.routeFingerprint !== providerRouteFingerprint(replay)) {
117
+ throw invalidReplay("Stored provider replay route fingerprint does not match its provider route fields.");
118
+ }
119
+ }
120
+ function replayRoleProviders(config) {
121
+ if (!config.roleProviders)
122
+ return undefined;
123
+ const entries = providerRoles.flatMap((role) => {
124
+ const roleConfig = config.roleProviders?.[role];
125
+ if (!roleConfig)
126
+ return [];
127
+ return [
128
+ [
129
+ role,
130
+ compactObject({
131
+ provider: roleConfig.provider,
132
+ baseUrl: roleConfig.baseUrl,
133
+ apiKeyEnv: roleConfig.apiKeyEnv,
134
+ model: roleConfig.model,
135
+ supportsJsonMode: roleConfig.supportsJsonMode
136
+ })
137
+ ]
138
+ ];
139
+ });
140
+ return entries.length ? Object.fromEntries(entries) : undefined;
141
+ }
142
+ function compactObject(value) {
143
+ return Object.fromEntries(Object.entries(value).filter(([, entryValue]) => entryValue !== undefined));
144
+ }
145
+ function routeFingerprintValue(provider, baseUrl, apiKeyEnv, model, supportsJsonMode) {
146
+ return compactObject({
147
+ provider,
148
+ baseUrl: normalizeFingerprintUrl(baseUrl),
149
+ apiKeyEnv,
150
+ model,
151
+ supportsJsonMode
152
+ });
153
+ }
154
+ function normalizeFingerprintUrl(baseUrl) {
155
+ if (!baseUrl)
156
+ return undefined;
157
+ try {
158
+ const parsed = new URL(baseUrl);
159
+ parsed.hash = "";
160
+ parsed.hostname = parsed.hostname.toLowerCase();
161
+ parsed.pathname = parsed.pathname.replace(/\/+$/, "");
162
+ return parsed.toString().replace(/\/$/, "");
163
+ }
164
+ catch {
165
+ return baseUrl.replace(/\/+$/, "");
166
+ }
167
+ }
168
+ function stableJson(value) {
169
+ if (Array.isArray(value))
170
+ return `[${value.map(stableJson).join(",")}]`;
171
+ if (value && typeof value === "object") {
172
+ const entries = Object.entries(value)
173
+ .sort(([left], [right]) => left.localeCompare(right))
174
+ .map(([key, inner]) => `${JSON.stringify(key)}:${stableJson(inner)}`);
175
+ return `{${entries.join(",")}}`;
176
+ }
177
+ return JSON.stringify(value) ?? "null";
178
+ }
179
+ function invalidReplay(message) {
180
+ return new ConfigError(message, {
181
+ code: "provider.replay_route_mismatch",
182
+ retryable: false,
183
+ fix: "Resume with the original provider route, or explicitly select a complete replacement route instead of editing config.json."
184
+ });
185
+ }
186
+ //# sourceMappingURL=providerReplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerReplay.js","sourceRoot":"","sources":["../src/providerReplay.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,4 @@
1
1
  import type { ModelDriver, ProviderConfig } from "./types.js";
2
2
  export declare function createDriver(config: ProviderConfig): ModelDriver;
3
+ /** Route-only driver for validation and dry-run planning; every model method refuses execution. */
4
+ export declare function createDriverIdentity(config: ProviderConfig): ModelDriver;
package/dist/registry.js CHANGED
@@ -4,9 +4,47 @@ import { ConfigError, ProviderError } from "@deepthonk/core";
4
4
  import { SamplingDriver } from "./sampling.js";
5
5
  export function createDriver(config) {
6
6
  const baseDriver = createSingleDriver({ ...config, roleProviders: undefined });
7
- if (config.roleProviders)
8
- return new RoleRoutingDriver(baseDriver, config.roleProviders);
9
- return baseDriver;
7
+ const driver = config.roleProviders ? new RoleRoutingDriver(baseDriver, config.roleProviders) : baseDriver;
8
+ if (config.routeFingerprint) {
9
+ Object.defineProperty(driver, "routeFingerprint", { value: config.routeFingerprint, enumerable: false });
10
+ }
11
+ return driver;
12
+ }
13
+ /** Route-only driver for validation and dry-run planning; every model method refuses execution. */
14
+ export function createDriverIdentity(config) {
15
+ const unavailable = async () => {
16
+ throw new ConfigError("A route-identity driver cannot make model calls.", {
17
+ code: "provider.identity_driver_call",
18
+ retryable: false,
19
+ fix: "Construct a real provider driver before executing the run."
20
+ });
21
+ };
22
+ const identity = {
23
+ provider: config.provider,
24
+ baseUrl: config.baseUrl,
25
+ routeFingerprint: config.routeFingerprint,
26
+ generate: unavailable,
27
+ compare: unavailable,
28
+ mutate: unavailable,
29
+ finalize: unavailable
30
+ };
31
+ if (config.roleProviders) {
32
+ identity.routes = Object.fromEntries(Object.entries(config.roleProviders).map(([role, route]) => [
33
+ role,
34
+ {
35
+ driver: {
36
+ provider: route.provider,
37
+ baseUrl: route.baseUrl,
38
+ generate: unavailable,
39
+ compare: unavailable,
40
+ mutate: unavailable,
41
+ finalize: unavailable
42
+ },
43
+ model: route.model
44
+ }
45
+ ]));
46
+ }
47
+ return identity;
10
48
  }
11
49
  function createSingleDriver(config) {
12
50
  if (config.provider === "fake")
@@ -78,6 +116,7 @@ function roleProviderToConfig(config) {
78
116
  judge: config.model,
79
117
  finalizer: config.model
80
118
  },
119
+ providerMaxConcurrency: config.providerMaxConcurrency,
81
120
  retry: config.retry,
82
121
  supportsJsonMode: config.supportsJsonMode
83
122
  };
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC3G,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,gBAAgB,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACzD,MAAM,WAAW,GAAG,KAAK,IAAoB,EAAE;QAC7C,MAAM,IAAI,WAAW,CAAC,kDAAkD,EAAE;YACxE,IAAI,EAAE,+BAA+B;YACrC,SAAS,EAAE,KAAK;YAChB,GAAG,EAAE,4DAA4D;SAClE,CAAC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG;QACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,WAAW;QACpB,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,WAAW;KAMtB,CAAC;IACF,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAClC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;YAC1D,IAAI;YACJ;gBACE,MAAM,EAAE;oBACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,QAAQ,EAAE,WAAW;oBACrB,OAAO,EAAE,WAAW;oBACpB,MAAM,EAAE,WAAW;oBACnB,QAAQ,EAAE,WAAW;iBACP;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAsB;IAChD,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,UAAU,EAAE,CAAC;IACxD,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC9B,MAAM,IAAI,WAAW,CAAC,6IAA6I,EAAE;gBACnK,IAAI,EAAE,gCAAgC;gBACtC,SAAS,EAAE,KAAK;gBAChB,GAAG,EAAE,uGAAuG;aAC7G,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,iBAAiB,EAAE;YAClD,GAAG,MAAM;YACT,gBAAgB,EAAE,MAAM,CAAC,KAAK,EAAE,gBAAgB,IAAK,MAAwC,CAAC,gBAAgB;SAC/G,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU;QAAE,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,QAAQ,KAAK,mBAAmB;QAAE,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACvF,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,IAAI,aAAa,CAAC,qBAAqB,MAAM,CAAC,QAAQ,kGAAkG,EAAE;QAC9J,IAAI,EAAE,2BAA2B;QACjC,SAAS,EAAE,KAAK;QAChB,GAAG,EAAE,sIAAsI;KAC5I,CAAC,CAAC;AACL,CAAC;AAED,MAAM,iBAAiB;IAIF;IAHF,MAAM,CAAwE;IAE/F,YACmB,UAAuB,EACxC,aAA2D;QAD1C,eAAU,GAAV,UAAU,CAAa;QAGxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAC9B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,kBAAkB,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CACpF,CAAC;IAC7E,CAAC;IAED,QAAQ,CAAC,KAAoB;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,CAAC,KAAmB;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,CAAC,KAAkB;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IACpF,CAAC;IAED,QAAQ,CAAC,KAAoB;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3H,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IACxE,CAAC;IAEO,KAAK,CAAC,IAAkB;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1D,CAAC;IAEO,cAAc,CAA8B,KAAQ,EAAE,IAAkB;QAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;QACvC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,CAAC;CACF;AAED,SAAS,oBAAoB,CAAC,MAA0B;IACtD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE;YACN,SAAS,EAAE,MAAM,CAAC,KAAK;YACvB,OAAO,EAAE,MAAM,CAAC,KAAK;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,KAAK;SACxB;QACD,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;QACrD,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;KAC1C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { ProviderConfig } from "./types.js";
2
+ export interface RouteLimiterSnapshot {
3
+ key: string;
4
+ active: number;
5
+ queued: number;
6
+ ceiling: number;
7
+ configuredMax: number;
8
+ explicitMaxConfigured: boolean;
9
+ successesTowardIncrease: number;
10
+ }
11
+ /** FIFO adaptive concurrency limiter shared by every matching provider route in this process. */
12
+ export declare class AdaptiveRouteLimiter {
13
+ readonly key: string;
14
+ private active;
15
+ private readonly queue;
16
+ private ceilingValue;
17
+ private configuredMaxValue;
18
+ private explicitMaxConfiguredValue;
19
+ private successesTowardIncrease;
20
+ constructor(key: string, initialCeiling: number, configuredMax: number, explicitMaxConfigured?: boolean);
21
+ acquire(signal?: AbortSignal): Promise<() => void>;
22
+ recordRateLimit(): void;
23
+ recordSuccess(): void;
24
+ /**
25
+ * Unspecified defaults establish a starting point, not a permanent cap. Once a route
26
+ * receives explicit maxima, conflicting explicit values resolve to their conservative minimum.
27
+ */
28
+ constrainConfiguredMax(configuredMax: number, explicitlyConfigured?: boolean): void;
29
+ snapshot(): RouteLimiterSnapshot;
30
+ private releaseOnce;
31
+ private drain;
32
+ }
33
+ export declare function getSharedRouteLimiter(config: ProviderConfig): AdaptiveRouteLimiter;
34
+ export declare function providerRouteLimiterKey(config: Pick<ProviderConfig, "provider" | "baseUrl" | "apiKeyEnv" | "apiKey">): string;
35
+ /** Test-only process registry reset. */
36
+ export declare function resetSharedRouteLimiters(): void;