@providerkit/core 0.8.0 → 0.8.1
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/fallback.d.ts +15 -2
- package/dist/fallback.d.ts.map +1 -1
- package/dist/fallback.js +9 -1
- package/dist/fallback.js.map +1 -1
- package/package.json +1 -1
- package/src/fallback.ts +29 -3
package/dist/fallback.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { ProviderError, type ErrorKind } from "./errors.ts";
|
|
2
2
|
import type { RateLimitWindow } from "./rate-limit.ts";
|
|
3
|
+
import type { ProviderPresetId } from "./presets.ts";
|
|
3
4
|
import type { Provider } from "./types.ts";
|
|
5
|
+
import { type PresetProviderConfig } from "./providers/factory.ts";
|
|
4
6
|
/** Retry intervals when the server supplies no deadline, not estimates of when
|
|
5
7
|
* it will recover. A server deadline always wins over these defaults. */
|
|
6
8
|
export declare const DEFAULT_FALLBACK_COOLDOWNS: Readonly<Partial<Record<ErrorKind, number>>>;
|
|
@@ -18,10 +20,21 @@ export interface FallbackOptions<T> {
|
|
|
18
20
|
/** Inject a clock for deterministic tests. */
|
|
19
21
|
now?: () => number;
|
|
20
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* A fallback named by PRESET id rather than hand-built: the endpoint, auth
|
|
25
|
+
* style, effort dialect and every measured quirk come from the presets table,
|
|
26
|
+
* so a consumer writes neither a baseUrl nor a model-spelling rule. A
|
|
27
|
+
* hand-built `Provider` is still accepted wherever a spec is.
|
|
28
|
+
*/
|
|
29
|
+
export interface FallbackSpec extends PresetProviderConfig {
|
|
30
|
+
preset: ProviderPresetId;
|
|
31
|
+
}
|
|
32
|
+
export type FallbackCandidate = Provider | FallbackSpec;
|
|
21
33
|
/** Standard options that any provider config can accept to configure fallbacks inline. */
|
|
22
34
|
export interface ProviderFallbackConfig {
|
|
23
|
-
/** Secondary and tertiary providers to try if this provider fails/exhausts
|
|
24
|
-
|
|
35
|
+
/** Secondary and tertiary providers to try if this provider fails/exhausts:
|
|
36
|
+
* hand-built `Provider`s, preset-id `FallbackSpec`s, or both. */
|
|
37
|
+
fallbacks?: readonly FallbackCandidate[];
|
|
25
38
|
/** Custom cooldown or telemetry options for the fallback pool. */
|
|
26
39
|
fallbackOptions?: FallbackOptions<Provider>;
|
|
27
40
|
}
|
package/dist/fallback.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAwB,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEzF;0EAC0E;AAC1E,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CASlF,CAAC;AAEH,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC;oEACgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACvD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAClB,SAAS,EAAE,CAAC,CAAC;QACb,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,SAAS,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,eAAe,CAAC;KAC1B,KAAK,IAAI,CAAC;IACX,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAa,SAAQ,oBAAoB;IACxD,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,YAAY,CAAC;AAUxD,0FAA0F;AAC1F,MAAM,WAAW,sBAAsB;IACrC;sEACkE;IAClE,SAAS,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACzC,kEAAkE;IAClE,eAAe,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;CAC7C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,QAAQ,EACjB,MAAM,CAAC,EAAE,sBAAsB,GAC9B,QAAQ,CAMV;AASD;kFACkF;AAClF,qBAAa,wBAAyB,SAAQ,aAAa;IACzD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;CAQ3C;AAED;;;oEAGoE;AACpE,qBAAa,YAAY,CAAC,CAAC;IAKa,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,UAAU,EAAE,SAAS,CAAC,EAAE,EAAmB,OAAO,GAAE,eAAe,CAAC,CAAC,CAAM;IAcvF;8EAC0E;IAC1E,KAAK,CAAC,GAAG,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI;IAKnC,MAAM,IAAI,KAAK,CAAC;QAAE,SAAS,EAAE,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAC;QAAC,MAAM,CAAC,EAAE,eAAe,CAAA;KAAE,CAAC;IASlH,gFAAgF;IAC1E,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAO3G;qFACiF;IAC1E,MAAM,CAAC,CAAC,EACb,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,KAAK,aAAa,CAAC,CAAC,CAAC,EAChE,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,CAAC,CAAC;CAuErB;AAED,MAAM,WAAW,gBAAiB,SAAQ,QAAQ;IAChD,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;CAC5C;AAED;;;sEAGsE;AACtE,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,OAAO,GAAE,eAAe,CAAC,QAAQ,CAAM,GACtC,gBAAgB,CAiBlB"}
|
package/dist/fallback.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { classify, parseRetryAfterMs, ProviderError } from "./errors.js";
|
|
2
|
+
import { createPresetProvider } from "./providers/factory.js";
|
|
2
3
|
/** Retry intervals when the server supplies no deadline, not estimates of when
|
|
3
4
|
* it will recover. A server deadline always wins over these defaults. */
|
|
4
5
|
export const DEFAULT_FALLBACK_COOLDOWNS = Object.freeze({
|
|
@@ -11,6 +12,13 @@ export const DEFAULT_FALLBACK_COOLDOWNS = Object.freeze({
|
|
|
11
12
|
entitlement: 3_600_000,
|
|
12
13
|
model: 3_600_000,
|
|
13
14
|
});
|
|
15
|
+
function resolveFallback(candidate) {
|
|
16
|
+
if (typeof candidate === "object" && candidate !== null && "createStream" in candidate) {
|
|
17
|
+
return candidate;
|
|
18
|
+
}
|
|
19
|
+
const { preset, ...config } = candidate;
|
|
20
|
+
return createPresetProvider(preset, config);
|
|
21
|
+
}
|
|
14
22
|
/**
|
|
15
23
|
* Wrap a primary provider with its fallbacks if any are specified.
|
|
16
24
|
* Returns the primary provider untouched when fallbacks is empty or omitted.
|
|
@@ -18,7 +26,7 @@ export const DEFAULT_FALLBACK_COOLDOWNS = Object.freeze({
|
|
|
18
26
|
export function withConfiguredFallbacks(primary, config) {
|
|
19
27
|
if (!config?.fallbacks || config.fallbacks.length === 0)
|
|
20
28
|
return primary;
|
|
21
|
-
return withFallbackProviders([primary, ...config.fallbacks], config.fallbackOptions);
|
|
29
|
+
return withFallbackProviders([primary, ...config.fallbacks.map(resolveFallback)], config.fallbackOptions);
|
|
22
30
|
}
|
|
23
31
|
/** The whole chain is unavailable. Fail promptly instead of holding a request
|
|
24
32
|
* open for hours. `retryAtMs` names its next opportunity, not a sleep to cap. */
|
package/dist/fallback.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fallback.js","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAkB,MAAM,aAAa,CAAC;AAIzF;0EAC0E;AAC1E,MAAM,CAAC,MAAM,0BAA0B,GAAiD,MAAM,CAAC,MAAM,CAAC;IACpG,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,SAAS;IACtB,KAAK,EAAE,SAAS;CACjB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"fallback.js","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/fallback.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { classify, parseRetryAfterMs, ProviderError, type ErrorKind } from "./errors.ts";
|
|
2
2
|
import type { RateLimitWindow } from "./rate-limit.ts";
|
|
3
|
+
import type { ProviderPresetId } from "./presets.ts";
|
|
3
4
|
import type { Provider, ProviderChunk } from "./types.ts";
|
|
5
|
+
import { createPresetProvider, type PresetProviderConfig } from "./providers/factory.ts";
|
|
4
6
|
|
|
5
7
|
/** Retry intervals when the server supplies no deadline, not estimates of when
|
|
6
8
|
* it will recover. A server deadline always wins over these defaults. */
|
|
@@ -30,10 +32,31 @@ export interface FallbackOptions<T> {
|
|
|
30
32
|
now?: () => number;
|
|
31
33
|
}
|
|
32
34
|
|
|
35
|
+
/**
|
|
36
|
+
* A fallback named by PRESET id rather than hand-built: the endpoint, auth
|
|
37
|
+
* style, effort dialect and every measured quirk come from the presets table,
|
|
38
|
+
* so a consumer writes neither a baseUrl nor a model-spelling rule. A
|
|
39
|
+
* hand-built `Provider` is still accepted wherever a spec is.
|
|
40
|
+
*/
|
|
41
|
+
export interface FallbackSpec extends PresetProviderConfig {
|
|
42
|
+
preset: ProviderPresetId;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type FallbackCandidate = Provider | FallbackSpec;
|
|
46
|
+
|
|
47
|
+
function resolveFallback(candidate: FallbackCandidate): Provider {
|
|
48
|
+
if (typeof candidate === "object" && candidate !== null && "createStream" in candidate) {
|
|
49
|
+
return candidate;
|
|
50
|
+
}
|
|
51
|
+
const { preset, ...config } = candidate;
|
|
52
|
+
return createPresetProvider(preset, config);
|
|
53
|
+
}
|
|
54
|
+
|
|
33
55
|
/** Standard options that any provider config can accept to configure fallbacks inline. */
|
|
34
56
|
export interface ProviderFallbackConfig {
|
|
35
|
-
/** Secondary and tertiary providers to try if this provider fails/exhausts
|
|
36
|
-
|
|
57
|
+
/** Secondary and tertiary providers to try if this provider fails/exhausts:
|
|
58
|
+
* hand-built `Provider`s, preset-id `FallbackSpec`s, or both. */
|
|
59
|
+
fallbacks?: readonly FallbackCandidate[];
|
|
37
60
|
/** Custom cooldown or telemetry options for the fallback pool. */
|
|
38
61
|
fallbackOptions?: FallbackOptions<Provider>;
|
|
39
62
|
}
|
|
@@ -47,7 +70,10 @@ export function withConfiguredFallbacks(
|
|
|
47
70
|
config?: ProviderFallbackConfig,
|
|
48
71
|
): Provider {
|
|
49
72
|
if (!config?.fallbacks || config.fallbacks.length === 0) return primary;
|
|
50
|
-
return withFallbackProviders(
|
|
73
|
+
return withFallbackProviders(
|
|
74
|
+
[primary, ...config.fallbacks.map(resolveFallback)],
|
|
75
|
+
config.fallbackOptions,
|
|
76
|
+
);
|
|
51
77
|
}
|
|
52
78
|
|
|
53
79
|
interface Cooldown {
|