@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.
@@ -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
- fallbacks?: readonly Provider[];
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"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"}
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. */
@@ -1 +1 @@
1
- {"version":3,"file":"fallback.js","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"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"}
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,OAAO,EAAE,oBAAoB,EAA6B,MAAM,wBAAwB,CAAC;AAEzF;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;AA6BH,SAAS,eAAe,CAAC,SAA4B;IACnD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,IAAI,cAAc,IAAI,SAAS,EAAE,CAAC;QACvF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAiB,EACjB,MAA+B;IAE/B,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACxE,OAAO,qBAAqB,CAC1B,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,EACnD,MAAM,CAAC,eAAe,CACvB,CAAC;AACJ,CAAC;AASD;kFACkF;AAClF,MAAM,OAAO,wBAAyB,SAAQ,aAAa;IAChD,SAAS,CAAS;IAE3B,YAAY,SAAiB,EAAE,GAAW;QACxC,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,qEAAqE,EAAE;YAC/F,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;SAC3C,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED;;;oEAGoE;AACpE,MAAM,OAAO,YAAY;IAKgC;IAJtC,UAAU,CAAe;IACzB,SAAS,GAAG,IAAI,GAAG,EAAe,CAAC;IACnC,GAAG,CAAe;IAEnC,YAAY,UAAwB,EAAmB,UAA8B,EAAE;QAAhC,YAAO,GAAP,OAAO,CAAyB;QACrF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACjG,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACpF,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACrC,CAAC;IAED;8EAC0E;IAC1E,KAAK,CAAC,GAAG,SAAmB;QAC1B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;;YAC9C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACzC,SAAS;YACT,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,KAAK;YACd,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;SACjC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,IAAI,CAAI,OAA0D,EAAE,MAAoB;QAC5F,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK;YACtE,MAAM,MAAM,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC,EAAE,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED;qFACiF;IACjF,KAAK,CAAC,CAAC,MAAM,CACX,OAAgE,EAChE,MAAoB;QAEpB,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,SAAkB,CAAC;QACvB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAS;YAChF,wEAAwE;YACxE,iEAAiE;YACjE,IAAI,QAAQ;gBAAE,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;YACtC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;YACxF,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,aAAa,GAAG,KAAK,CAAC;YAC1B,MAAM,mBAAmB,GAAG,QAAQ,KAAK,SAAS,CAAC;YACnD,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;oBACpD,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,GAAG,IAAI,CAAC;oBACf,gFAAgF;oBAChF,wDAAwD;oBACxD,IAAI,mBAAmB,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;wBACtE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBACnC,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,mBAAmB,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACtE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACnC,CAAC;gBACD,OAAO;YACT,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,EAAE,cAAc,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,IAAI,KAAK,SAAS;oBAAE,MAAM,KAAK,CAAC;gBACpC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;gBACnD,MAAM,QAAQ,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC1F,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;oBAAE,MAAM,KAAK,CAAC;gBAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBACvC,MAAM,KAAK,GAAG,KAAK,YAAY,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC3E,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CACzE,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC1E,CAAC;gBACF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,GAAG,EACH,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,EAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,IAAI,CAAC,CAC9C,CAAC;gBACF,MAAM,MAAM,GAAG,KAAK,YAAY,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC3E,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;gBACzE,aAAa,GAAG,IAAI,CAAC;gBACrB,SAAS,GAAG,IAAI,CAAC;gBACjB,SAAS,GAAG,KAAK,CAAC;gBAClB,IAAI,OAAO;oBAAE,MAAM,KAAK,CAAC;YAC3B,CAAC;oBAAS,CAAC;gBACT,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC9C,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;oBACjD,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,SAAS;YAAE,MAAM,SAAS,CAAC;QAC/B,2EAA2E;QAC3E,4EAA4E;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACnG,MAAM,IAAI,wBAAwB,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5D,CAAC;CACF;AAMD;;;sEAGsE;AACtE,MAAM,UAAU,qBAAqB,CACnC,SAA8B,EAC9B,UAAqC,EAAE;IAEvC,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;IAC9B,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS;QACT,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE;YACrC,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM;gBACvD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;gBAC1C,MAAM,KAAK,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACnF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;oBAC7F,MAAM,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC/E,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@providerkit/core",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "The layer under your agent loop: one seam for every LLM provider, plus the failure handling you only learn in production.",
5
5
  "type": "module",
6
6
  "license": "MIT",
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
- fallbacks?: readonly Provider[];
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([primary, ...config.fallbacks], config.fallbackOptions);
73
+ return withFallbackProviders(
74
+ [primary, ...config.fallbacks.map(resolveFallback)],
75
+ config.fallbackOptions,
76
+ );
51
77
  }
52
78
 
53
79
  interface Cooldown {