@stackbilt/llm-providers 1.1.0 → 1.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.
Files changed (87) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +112 -85
  3. package/dist/errors.d.ts +18 -1
  4. package/dist/errors.d.ts.map +1 -1
  5. package/dist/errors.js +12 -4
  6. package/dist/errors.js.map +1 -1
  7. package/dist/factory.d.ts +62 -4
  8. package/dist/factory.d.ts.map +1 -1
  9. package/dist/factory.js +630 -92
  10. package/dist/factory.js.map +1 -1
  11. package/dist/image/index.d.ts +0 -0
  12. package/dist/image/index.d.ts.map +0 -0
  13. package/dist/image/index.js +0 -0
  14. package/dist/image/index.js.map +0 -0
  15. package/dist/image/provider.d.ts +0 -0
  16. package/dist/image/provider.d.ts.map +0 -0
  17. package/dist/image/provider.js +0 -0
  18. package/dist/image/provider.js.map +0 -0
  19. package/dist/image/types.d.ts +0 -0
  20. package/dist/image/types.d.ts.map +0 -0
  21. package/dist/image/types.js +0 -0
  22. package/dist/image/types.js.map +0 -0
  23. package/dist/index.d.ts +43 -12
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +70 -14
  26. package/dist/index.js.map +1 -1
  27. package/dist/providers/anthropic.d.ts +5 -2
  28. package/dist/providers/anthropic.d.ts.map +1 -1
  29. package/dist/providers/anthropic.js +118 -43
  30. package/dist/providers/anthropic.js.map +1 -1
  31. package/dist/providers/base.d.ts +18 -2
  32. package/dist/providers/base.d.ts.map +1 -1
  33. package/dist/providers/base.js +107 -5
  34. package/dist/providers/base.js.map +1 -1
  35. package/dist/providers/cerebras.d.ts +0 -0
  36. package/dist/providers/cerebras.d.ts.map +1 -1
  37. package/dist/providers/cerebras.js +21 -13
  38. package/dist/providers/cerebras.js.map +1 -1
  39. package/dist/providers/cloudflare.d.ts +0 -0
  40. package/dist/providers/cloudflare.d.ts.map +1 -1
  41. package/dist/providers/cloudflare.js +12 -8
  42. package/dist/providers/cloudflare.js.map +1 -1
  43. package/dist/providers/groq.d.ts +2 -1
  44. package/dist/providers/groq.d.ts.map +1 -1
  45. package/dist/providers/groq.js +95 -15
  46. package/dist/providers/groq.js.map +1 -1
  47. package/dist/providers/openai.d.ts +2 -0
  48. package/dist/providers/openai.d.ts.map +1 -1
  49. package/dist/providers/openai.js +56 -24
  50. package/dist/providers/openai.js.map +1 -1
  51. package/dist/types.d.ts +114 -4
  52. package/dist/types.d.ts.map +1 -1
  53. package/dist/types.js +0 -0
  54. package/dist/types.js.map +0 -0
  55. package/dist/utils/circuit-breaker.d.ts +5 -2
  56. package/dist/utils/circuit-breaker.d.ts.map +1 -1
  57. package/dist/utils/circuit-breaker.js +18 -13
  58. package/dist/utils/circuit-breaker.js.map +1 -1
  59. package/dist/utils/cost-tracker.d.ts +9 -2
  60. package/dist/utils/cost-tracker.d.ts.map +1 -1
  61. package/dist/utils/cost-tracker.js +20 -9
  62. package/dist/utils/cost-tracker.js.map +1 -1
  63. package/dist/utils/credit-ledger.d.ts +3 -0
  64. package/dist/utils/credit-ledger.d.ts.map +1 -1
  65. package/dist/utils/credit-ledger.js +5 -2
  66. package/dist/utils/credit-ledger.js.map +1 -1
  67. package/dist/utils/exhaustion.d.ts +38 -0
  68. package/dist/utils/exhaustion.d.ts.map +1 -0
  69. package/dist/utils/exhaustion.js +74 -0
  70. package/dist/utils/exhaustion.js.map +1 -0
  71. package/dist/utils/hooks.d.ts +113 -0
  72. package/dist/utils/hooks.d.ts.map +1 -0
  73. package/dist/utils/hooks.js +44 -0
  74. package/dist/utils/hooks.js.map +1 -0
  75. package/dist/utils/latency-histogram.d.ts +38 -0
  76. package/dist/utils/latency-histogram.d.ts.map +1 -0
  77. package/dist/utils/latency-histogram.js +81 -0
  78. package/dist/utils/latency-histogram.js.map +1 -0
  79. package/dist/utils/logger.d.ts +18 -0
  80. package/dist/utils/logger.d.ts.map +1 -0
  81. package/dist/utils/logger.js +22 -0
  82. package/dist/utils/logger.js.map +1 -0
  83. package/dist/utils/retry.d.ts +4 -2
  84. package/dist/utils/retry.d.ts.map +1 -1
  85. package/dist/utils/retry.js +12 -8
  86. package/dist/utils/retry.js.map +1 -1
  87. package/package.json +1 -1
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Exhaustion Registry
3
+ *
4
+ * Tracks which providers are currently quota-exhausted and auto-resets
5
+ * after a configurable cooldown period. Eliminates the need for callers
6
+ * to maintain their own exhaustion maps.
7
+ */
8
+ /** Default cooldown: 5 minutes */
9
+ const DEFAULT_RESET_MS = 300_000;
10
+ export class ExhaustionRegistry {
11
+ entries = new Map();
12
+ defaultResetMs;
13
+ constructor(defaultResetMs = DEFAULT_RESET_MS) {
14
+ this.defaultResetMs = defaultResetMs;
15
+ }
16
+ /**
17
+ * Mark a provider as quota-exhausted.
18
+ * Automatically clears after `resetAfterMs` (default: 5 min).
19
+ */
20
+ markExhausted(provider, resetAfterMs) {
21
+ const resetMs = resetAfterMs ?? this.defaultResetMs;
22
+ const now = Date.now();
23
+ this.entries.set(provider, {
24
+ provider,
25
+ exhaustedAt: now,
26
+ resetAt: now + resetMs,
27
+ });
28
+ }
29
+ /**
30
+ * Check if a provider is currently exhausted.
31
+ * Automatically clears expired entries.
32
+ */
33
+ isExhausted(provider) {
34
+ const entry = this.entries.get(provider);
35
+ if (!entry)
36
+ return false;
37
+ if (Date.now() >= entry.resetAt) {
38
+ this.entries.delete(provider);
39
+ return false;
40
+ }
41
+ return true;
42
+ }
43
+ /** Manually clear exhaustion for a provider. */
44
+ clearExhaustion(provider) {
45
+ this.entries.delete(provider);
46
+ }
47
+ /** Get list of currently exhausted providers. */
48
+ getExhaustedProviders() {
49
+ const now = Date.now();
50
+ const exhausted = [];
51
+ for (const [provider, entry] of this.entries) {
52
+ if (now >= entry.resetAt) {
53
+ this.entries.delete(provider);
54
+ }
55
+ else {
56
+ exhausted.push(provider);
57
+ }
58
+ }
59
+ return exhausted;
60
+ }
61
+ /** Get the entry for a specific provider (if exhausted). */
62
+ getEntry(provider) {
63
+ if (!this.isExhausted(provider))
64
+ return undefined;
65
+ return this.entries.get(provider);
66
+ }
67
+ /** Clear all exhaustion state. */
68
+ reset() {
69
+ this.entries.clear();
70
+ }
71
+ }
72
+ /** Shared singleton — same pattern as defaultCircuitBreakerManager. */
73
+ export const defaultExhaustionRegistry = new ExhaustionRegistry();
74
+ //# sourceMappingURL=exhaustion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exhaustion.js","sourceRoot":"","sources":["../../src/utils/exhaustion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,kCAAkC;AAClC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAEjC,MAAM,OAAO,kBAAkB;IACrB,OAAO,GAAiC,IAAI,GAAG,EAAE,CAAC;IACjD,cAAc,CAAS;IAEhC,YAAY,iBAAyB,gBAAgB;QACnD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,QAAgB,EAAE,YAAqB;QACnD,MAAM,OAAO,GAAG,YAAY,IAAI,IAAI,CAAC,cAAc,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;YACzB,QAAQ;YACR,WAAW,EAAE,GAAG;YAChB,OAAO,EAAE,GAAG,GAAG,OAAO;SACvB,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,QAAgB;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEzB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gDAAgD;IAChD,eAAe,CAAC,QAAgB;QAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,iDAAiD;IACjD,qBAAqB;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7C,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,4DAA4D;IAC5D,QAAQ,CAAC,QAAgB;QACvB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,kCAAkC;IAClC,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Observability Hooks
3
+ *
4
+ * Structured lifecycle events for LLM provider operations.
5
+ * Callers inject an ObservabilityHooks implementation to receive
6
+ * typed events at every interesting moment in the request lifecycle.
7
+ *
8
+ * This replaces string-based logger calls for telemetry. The Logger
9
+ * interface stays for debug output; hooks are for structured observability.
10
+ */
11
+ import type { CircuitBreakerState, ProviderBalance, QuotaCheckInput, QuotaCheckResult, TokenUsage } from '../types';
12
+ export interface RequestStartEvent {
13
+ provider: string;
14
+ model: string;
15
+ requestId?: string;
16
+ tenantId?: string;
17
+ timestamp: number;
18
+ }
19
+ export interface RequestEndEvent {
20
+ provider: string;
21
+ model: string;
22
+ requestId?: string;
23
+ tenantId?: string;
24
+ durationMs: number;
25
+ usage: TokenUsage;
26
+ finishReason?: string;
27
+ timestamp: number;
28
+ }
29
+ export interface RequestErrorEvent {
30
+ provider: string;
31
+ model: string;
32
+ requestId?: string;
33
+ tenantId?: string;
34
+ error: Error;
35
+ errorCode?: string;
36
+ attempt: number;
37
+ willRetry: boolean;
38
+ timestamp: number;
39
+ }
40
+ export interface RetryEvent {
41
+ provider: string;
42
+ requestId?: string;
43
+ attempt: number;
44
+ maxAttempts: number;
45
+ delayMs: number;
46
+ error: Error;
47
+ timestamp: number;
48
+ }
49
+ export interface FallbackEvent {
50
+ fromProvider: string;
51
+ toProvider: string;
52
+ requestId?: string;
53
+ reason: string;
54
+ errorCode?: string;
55
+ timestamp: number;
56
+ }
57
+ export interface CircuitStateChangeEvent {
58
+ provider: string;
59
+ fromState: CircuitBreakerState['state'];
60
+ toState: CircuitBreakerState['state'];
61
+ consecutiveFailures: number;
62
+ trafficPct: number;
63
+ timestamp: number;
64
+ }
65
+ export interface QuotaExhaustedEvent {
66
+ provider: string;
67
+ resetAfterMs: number;
68
+ timestamp: number;
69
+ }
70
+ export interface BudgetThresholdEvent {
71
+ provider: string;
72
+ tier: 'warning' | 'critical' | 'emergency';
73
+ utilizationPct: number;
74
+ spend: number;
75
+ budget: number;
76
+ timestamp: number;
77
+ }
78
+ export interface QuotaCheckEvent {
79
+ input: QuotaCheckInput;
80
+ result: QuotaCheckResult;
81
+ timestamp: number;
82
+ }
83
+ export interface QuotaDeniedEvent {
84
+ input: QuotaCheckInput;
85
+ reason?: string;
86
+ timestamp: number;
87
+ }
88
+ export interface ProviderBalanceEvent {
89
+ provider: string;
90
+ balance: ProviderBalance;
91
+ timestamp: number;
92
+ }
93
+ export interface ObservabilityHooks {
94
+ onRequestStart?(event: RequestStartEvent): void;
95
+ onRequestEnd?(event: RequestEndEvent): void;
96
+ onRequestError?(event: RequestErrorEvent): void;
97
+ onRetry?(event: RetryEvent): void;
98
+ onFallback?(event: FallbackEvent): void;
99
+ onCircuitStateChange?(event: CircuitStateChangeEvent): void;
100
+ onQuotaExhausted?(event: QuotaExhaustedEvent): void;
101
+ onBudgetThreshold?(event: BudgetThresholdEvent): void;
102
+ onQuotaCheck?(event: QuotaCheckEvent): void;
103
+ onQuotaDenied?(event: QuotaDeniedEvent): void;
104
+ onProviderBalance?(event: ProviderBalanceEvent): void;
105
+ }
106
+ /** Silent hooks — default. */
107
+ export declare const noopHooks: ObservabilityHooks;
108
+ /**
109
+ * Merge multiple hook implementations. Each matching handler is called
110
+ * in order. Errors in one handler don't block others.
111
+ */
112
+ export declare function composeHooks(...implementations: ObservabilityHooks[]): ObservabilityHooks;
113
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/utils/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Observability Hooks
3
+ *
4
+ * Structured lifecycle events for LLM provider operations.
5
+ * Callers inject an ObservabilityHooks implementation to receive
6
+ * typed events at every interesting moment in the request lifecycle.
7
+ *
8
+ * This replaces string-based logger calls for telemetry. The Logger
9
+ * interface stays for debug output; hooks are for structured observability.
10
+ */
11
+ /** Silent hooks — default. */
12
+ export const noopHooks = {};
13
+ /**
14
+ * Merge multiple hook implementations. Each matching handler is called
15
+ * in order. Errors in one handler don't block others.
16
+ */
17
+ export function composeHooks(...implementations) {
18
+ const methods = [
19
+ 'onRequestStart', 'onRequestEnd', 'onRequestError',
20
+ 'onRetry', 'onFallback', 'onCircuitStateChange',
21
+ 'onQuotaExhausted', 'onBudgetThreshold', 'onQuotaCheck',
22
+ 'onQuotaDenied', 'onProviderBalance',
23
+ ];
24
+ const composed = {};
25
+ for (const method of methods) {
26
+ const handlers = implementations
27
+ .map(impl => impl[method])
28
+ .filter((fn) => fn != null);
29
+ if (handlers.length > 0) {
30
+ composed[method] = (event) => {
31
+ for (const handler of handlers) {
32
+ try {
33
+ handler(event);
34
+ }
35
+ catch {
36
+ // Observability must not break the request path.
37
+ }
38
+ }
39
+ };
40
+ }
41
+ }
42
+ return composed;
43
+ }
44
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/utils/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAyHH,8BAA8B;AAC9B,MAAM,CAAC,MAAM,SAAS,GAAuB,EAAE,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAG,eAAqC;IACnE,MAAM,OAAO,GAAG;QACd,gBAAgB,EAAE,cAAc,EAAE,gBAAgB;QAClD,SAAS,EAAE,YAAY,EAAE,sBAAsB;QAC/C,kBAAkB,EAAE,mBAAmB,EAAE,cAAc;QACvD,eAAe,EAAE,mBAAmB;KAC5B,CAAC;IAEX,MAAM,QAAQ,GAAuB,EAAE,CAAC;IAExC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,eAAe;aAC7B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACzB,MAAM,CAAC,CAAC,EAAE,EAAgC,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;QAE5D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,QAAqC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAc,EAAE,EAAE;gBAClE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,IAAI,CAAC;wBACH,OAAO,CAAC,KAAc,CAAC,CAAC;oBAC1B,CAAC;oBAAC,MAAM,CAAC;wBACP,iDAAiD;oBACnD,CAAC;gBACH,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Latency Histogram
3
+ *
4
+ * Per-provider latency tracking with percentile computation.
5
+ * Uses a sorted insertion ring buffer to keep memory bounded
6
+ * while supporting efficient percentile queries.
7
+ */
8
+ export interface LatencySummary {
9
+ p50: number;
10
+ p95: number;
11
+ p99: number;
12
+ min: number;
13
+ max: number;
14
+ mean: number;
15
+ count: number;
16
+ }
17
+ export declare class LatencyHistogram {
18
+ private buffers;
19
+ private maxSamples;
20
+ constructor(maxSamples?: number);
21
+ /** Record a latency measurement for a provider (in milliseconds). */
22
+ record(provider: string, latencyMs: number): void;
23
+ /**
24
+ * Compute a specific percentile for a provider.
25
+ * @param p Percentile as a number between 0 and 100 (e.g. 95 for p95).
26
+ * Returns 0 if no data.
27
+ */
28
+ percentile(provider: string, p: number): number;
29
+ /** Get a full summary for a provider. */
30
+ summary(provider: string): LatencySummary;
31
+ /** Get summaries for all tracked providers. */
32
+ allSummaries(): Record<string, LatencySummary>;
33
+ /** Reset one or all providers. */
34
+ reset(provider?: string): void;
35
+ }
36
+ /** Shared singleton. */
37
+ export declare const defaultLatencyHistogram: LatencyHistogram;
38
+ //# sourceMappingURL=latency-histogram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-histogram.d.ts","sourceRoot":"","sources":["../../src/utils/latency-histogram.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,GAAE,MAA4B;IAIpD,qEAAqE;IACrE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAejD;;;;OAIG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAS/C,yCAAyC;IACzC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;IAqBzC,+CAA+C;IAC/C,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC;IAQ9C,kCAAkC;IAClC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;CAO/B;AAED,wBAAwB;AACxB,eAAO,MAAM,uBAAuB,kBAAyB,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Latency Histogram
3
+ *
4
+ * Per-provider latency tracking with percentile computation.
5
+ * Uses a sorted insertion ring buffer to keep memory bounded
6
+ * while supporting efficient percentile queries.
7
+ */
8
+ /** Maximum samples per provider before oldest are evicted. */
9
+ const DEFAULT_MAX_SAMPLES = 1000;
10
+ export class LatencyHistogram {
11
+ buffers = new Map();
12
+ maxSamples;
13
+ constructor(maxSamples = DEFAULT_MAX_SAMPLES) {
14
+ this.maxSamples = maxSamples;
15
+ }
16
+ /** Record a latency measurement for a provider (in milliseconds). */
17
+ record(provider, latencyMs) {
18
+ let buffer = this.buffers.get(provider);
19
+ if (!buffer) {
20
+ buffer = [];
21
+ this.buffers.set(provider, buffer);
22
+ }
23
+ buffer.push(latencyMs);
24
+ // Evict oldest when buffer is full.
25
+ if (buffer.length > this.maxSamples) {
26
+ buffer.shift();
27
+ }
28
+ }
29
+ /**
30
+ * Compute a specific percentile for a provider.
31
+ * @param p Percentile as a number between 0 and 100 (e.g. 95 for p95).
32
+ * Returns 0 if no data.
33
+ */
34
+ percentile(provider, p) {
35
+ const buffer = this.buffers.get(provider);
36
+ if (!buffer || buffer.length === 0)
37
+ return 0;
38
+ const sorted = [...buffer].sort((a, b) => a - b);
39
+ const index = Math.ceil((p / 100) * sorted.length) - 1;
40
+ return sorted[Math.max(0, index)];
41
+ }
42
+ /** Get a full summary for a provider. */
43
+ summary(provider) {
44
+ const buffer = this.buffers.get(provider);
45
+ if (!buffer || buffer.length === 0) {
46
+ return { p50: 0, p95: 0, p99: 0, min: 0, max: 0, mean: 0, count: 0 };
47
+ }
48
+ const sorted = [...buffer].sort((a, b) => a - b);
49
+ const count = sorted.length;
50
+ const sum = sorted.reduce((a, b) => a + b, 0);
51
+ return {
52
+ p50: sorted[Math.max(0, Math.ceil(0.50 * count) - 1)],
53
+ p95: sorted[Math.max(0, Math.ceil(0.95 * count) - 1)],
54
+ p99: sorted[Math.max(0, Math.ceil(0.99 * count) - 1)],
55
+ min: sorted[0],
56
+ max: sorted[count - 1],
57
+ mean: sum / count,
58
+ count,
59
+ };
60
+ }
61
+ /** Get summaries for all tracked providers. */
62
+ allSummaries() {
63
+ const result = {};
64
+ for (const provider of this.buffers.keys()) {
65
+ result[provider] = this.summary(provider);
66
+ }
67
+ return result;
68
+ }
69
+ /** Reset one or all providers. */
70
+ reset(provider) {
71
+ if (provider) {
72
+ this.buffers.delete(provider);
73
+ }
74
+ else {
75
+ this.buffers.clear();
76
+ }
77
+ }
78
+ }
79
+ /** Shared singleton. */
80
+ export const defaultLatencyHistogram = new LatencyHistogram();
81
+ //# sourceMappingURL=latency-histogram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-histogram.js","sourceRoot":"","sources":["../../src/utils/latency-histogram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Logger interface for structured, controllable logging.
3
+ *
4
+ * Libraries should not spray console.* into consuming applications.
5
+ * Default is noopLogger (silent). Users opt in by passing consoleLogger
6
+ * or their own implementation via config.
7
+ */
8
+ export interface Logger {
9
+ debug(msg: string, ...args: unknown[]): void;
10
+ info(msg: string, ...args: unknown[]): void;
11
+ warn(msg: string, ...args: unknown[]): void;
12
+ error(msg: string, ...args: unknown[]): void;
13
+ }
14
+ /** Silent logger — default for all components. */
15
+ export declare const noopLogger: Logger;
16
+ /** Forwards to console.* — opt-in for development/debugging. */
17
+ export declare const consoleLogger: Logger;
18
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC7C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAC9C;AAED,kDAAkD;AAClD,eAAO,MAAM,UAAU,EAAE,MAKxB,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,aAAa,EAAE,MAK3B,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Logger interface for structured, controllable logging.
3
+ *
4
+ * Libraries should not spray console.* into consuming applications.
5
+ * Default is noopLogger (silent). Users opt in by passing consoleLogger
6
+ * or their own implementation via config.
7
+ */
8
+ /** Silent logger — default for all components. */
9
+ export const noopLogger = {
10
+ debug() { },
11
+ info() { },
12
+ warn() { },
13
+ error() { },
14
+ };
15
+ /** Forwards to console.* — opt-in for development/debugging. */
16
+ export const consoleLogger = {
17
+ debug: (...args) => console.debug(...args),
18
+ info: (...args) => console.log(...args),
19
+ warn: (...args) => console.warn(...args),
20
+ error: (...args) => console.error(...args),
21
+ };
22
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,kDAAkD;AAClD,MAAM,CAAC,MAAM,UAAU,GAAW;IAChC,KAAK,KAAI,CAAC;IACV,IAAI,KAAI,CAAC;IACT,IAAI,KAAI,CAAC;IACT,KAAK,KAAI,CAAC;CACX,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,aAAa,GAAW;IACnC,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACrD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAClD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACnD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;CACtD,CAAC"}
@@ -3,9 +3,11 @@
3
3
  * Exponential backoff retry logic for LLM provider requests
4
4
  */
5
5
  import type { RetryConfig } from '../types';
6
+ import type { Logger } from './logger';
6
7
  export declare class RetryManager {
7
8
  private config;
8
- constructor(config?: Partial<RetryConfig>);
9
+ private logger;
10
+ constructor(config?: Partial<RetryConfig>, logger?: Logger);
9
11
  /**
10
12
  * Execute a function with retry logic
11
13
  */
@@ -38,7 +40,7 @@ export declare const defaultRetryManager: RetryManager;
38
40
  /**
39
41
  * Retry decorator for async functions
40
42
  */
41
- export declare function withRetry<T extends any[], R>(retryConfig?: Partial<RetryConfig>): (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: T) => Promise<R>>) => TypedPropertyDescriptor<(...args: T) => Promise<R>>;
43
+ export declare function withRetry<T extends unknown[], R>(retryConfig?: Partial<RetryConfig>): (_target: object, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: T) => Promise<R>>) => TypedPropertyDescriptor<(...args: T) => Promise<R>>;
42
44
  /**
43
45
  * Simple retry function for one-off operations
44
46
  */
@@ -1 +1 @@
1
- {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM;IAgB7C;;OAEG;IACG,OAAO,CAAC,CAAC,EACb,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,MAAoB,GAC5B,OAAO,CAAC,CAAC,CAAC;IA8Bb;;OAEG;IACH,OAAO,CAAC,WAAW;IAoBnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAIhD;;OAEG;IACH,SAAS,IAAI,WAAW;CAGzB;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,cAAqB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EAC1C,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,IAGhC,QAAQ,GAAG,EACX,aAAa,MAAM,EACnB,YAAY,uBAAuB,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,uCAAjB,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAcjE;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CAGZ"}
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIvC,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAiB9D;;OAEG;IACG,OAAO,CAAC,CAAC,EACb,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,MAAoB,GAC5B,OAAO,CAAC,CAAC,CAAC;IA8Bb;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAIhD;;OAEG;IACH,SAAS,IAAI,WAAW;CAGzB;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,cAAqB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,EAC9C,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,IAGhC,SAAS,MAAM,EACf,aAAa,MAAM,EACnB,YAAY,uBAAuB,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,uCAAjB,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAcjE;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CAGZ"}
@@ -2,10 +2,12 @@
2
2
  * Retry Utility
3
3
  * Exponential backoff retry logic for LLM provider requests
4
4
  */
5
- import { LLMErrorFactory } from '../errors';
5
+ import { noopLogger } from './logger';
6
+ import { LLMErrorFactory, LLMProviderError } from '../errors';
6
7
  export class RetryManager {
7
8
  config;
8
- constructor(config = {}) {
9
+ logger;
10
+ constructor(config = {}, logger) {
9
11
  this.config = {
10
12
  maxRetries: config.maxRetries ?? 3,
11
13
  initialDelay: config.initialDelay ?? 1000,
@@ -19,6 +21,7 @@ export class RetryManager {
19
21
  'CIRCUIT_BREAKER_OPEN'
20
22
  ]
21
23
  };
24
+ this.logger = logger ?? noopLogger;
22
25
  }
23
26
  /**
24
27
  * Execute a function with retry logic
@@ -39,7 +42,7 @@ export class RetryManager {
39
42
  }
40
43
  // Calculate delay for next attempt
41
44
  const delay = this.calculateDelay(attempt, error);
42
- console.warn(`[RetryManager] ${context} failed (attempt ${attempt}/${this.config.maxRetries + 1}): ${lastError.message}. Retrying in ${delay}ms...`);
45
+ this.logger.warn(`[RetryManager] ${context} failed (attempt ${attempt}/${this.config.maxRetries + 1}): ${lastError.message}. Retrying in ${delay}ms...`);
43
46
  await this.delay(delay);
44
47
  }
45
48
  }
@@ -58,9 +61,10 @@ export class RetryManager {
58
61
  return false;
59
62
  }
60
63
  // Check if error code is in retryable list
61
- const errorCode = error.code;
62
- if (errorCode && !this.config.retryableErrors.includes(errorCode)) {
63
- return false;
64
+ if (error instanceof LLMProviderError) {
65
+ if (!this.config.retryableErrors.includes(error.code)) {
66
+ return false;
67
+ }
64
68
  }
65
69
  return true;
66
70
  }
@@ -106,11 +110,11 @@ export const defaultRetryManager = new RetryManager();
106
110
  * Retry decorator for async functions
107
111
  */
108
112
  export function withRetry(retryConfig) {
109
- return function (target, propertyKey, descriptor) {
113
+ return function (_target, propertyKey, descriptor) {
110
114
  const originalMethod = descriptor.value;
111
115
  const retryManager = new RetryManager(retryConfig);
112
116
  descriptor.value = async function (...args) {
113
- return retryManager.execute(() => originalMethod.apply(this, args), `${target.constructor.name}.${propertyKey}`);
117
+ return retryManager.execute(() => originalMethod.apply(this, args), `${this.constructor.name}.${propertyKey}`);
114
118
  };
115
119
  return descriptor;
116
120
  };
@@ -1 +1 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackbilt/llm-providers",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Multi-LLM failover with circuit breakers, cost tracking, and intelligent retry. Cloudflare Workers native.",
5
5
  "author": "Stackbilt <admin@stackbilt.dev>",
6
6
  "license": "Apache-2.0",