@stackbilt/llm-providers 1.10.0 → 1.11.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.
- package/README.md +86 -4
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +36 -13
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/model-catalog.d.ts +6 -0
- package/dist/model-catalog.d.ts.map +1 -1
- package/dist/model-catalog.js +53 -0
- package/dist/model-catalog.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +79 -7
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/base.d.ts +3 -1
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +30 -0
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/cerebras.d.ts +1 -0
- package/dist/providers/cerebras.d.ts.map +1 -1
- package/dist/providers/cerebras.js +18 -2
- package/dist/providers/cerebras.js.map +1 -1
- package/dist/providers/cloudflare.d.ts.map +1 -1
- package/dist/providers/cloudflare.js +24 -3
- package/dist/providers/cloudflare.js.map +1 -1
- package/dist/providers/groq.d.ts +1 -0
- package/dist/providers/groq.d.ts.map +1 -1
- package/dist/providers/groq.js +18 -2
- package/dist/providers/groq.js.map +1 -1
- package/dist/providers/nvidia.d.ts +1 -0
- package/dist/providers/nvidia.d.ts.map +1 -1
- package/dist/providers/nvidia.js +18 -2
- package/dist/providers/nvidia.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +17 -2
- package/dist/providers/openai.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/circuit-breaker.d.ts +45 -1
- package/dist/utils/circuit-breaker.d.ts.map +1 -1
- package/dist/utils/circuit-breaker.js +105 -0
- package/dist/utils/circuit-breaker.js.map +1 -1
- package/dist/utils/exhaustion.d.ts +13 -1
- package/dist/utils/exhaustion.d.ts.map +1 -1
- package/dist/utils/exhaustion.js +36 -0
- package/dist/utils/exhaustion.js.map +1 -1
- package/dist/utils/stream-usage.d.ts +13 -0
- package/dist/utils/stream-usage.d.ts.map +1 -0
- package/dist/utils/stream-usage.js +27 -0
- package/dist/utils/stream-usage.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +8 -7
package/dist/utils/exhaustion.js
CHANGED
|
@@ -64,6 +64,42 @@ export class ExhaustionRegistry {
|
|
|
64
64
|
return undefined;
|
|
65
65
|
return this.entries.get(provider);
|
|
66
66
|
}
|
|
67
|
+
/** Snapshot non-expired exhaustion state for external persistence. */
|
|
68
|
+
snapshot() {
|
|
69
|
+
this.getExhaustedProviders();
|
|
70
|
+
return {
|
|
71
|
+
version: 1,
|
|
72
|
+
defaultResetMs: this.defaultResetMs,
|
|
73
|
+
entries: Array.from(this.entries.values()).map(entry => ({ ...entry })),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** Serialize exhaustion state for Workers KV, D1, Redis, etc. */
|
|
77
|
+
serialize() {
|
|
78
|
+
return JSON.stringify(this.snapshot());
|
|
79
|
+
}
|
|
80
|
+
/** Restore exhaustion state onto this registry. */
|
|
81
|
+
restore(snapshot) {
|
|
82
|
+
const parsed = typeof snapshot === 'string'
|
|
83
|
+
? JSON.parse(snapshot)
|
|
84
|
+
: snapshot;
|
|
85
|
+
if (parsed.version !== 1) {
|
|
86
|
+
throw new Error(`Unsupported ExhaustionRegistry snapshot version: ${String(parsed.version)}`);
|
|
87
|
+
}
|
|
88
|
+
this.defaultResetMs = parsed.defaultResetMs;
|
|
89
|
+
this.entries.clear();
|
|
90
|
+
for (const entry of parsed.entries) {
|
|
91
|
+
this.entries.set(entry.provider, { ...entry });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
static deserialize(json) {
|
|
95
|
+
const snapshot = JSON.parse(json);
|
|
96
|
+
if (snapshot.version !== 1) {
|
|
97
|
+
throw new Error(`Unsupported ExhaustionRegistry snapshot version: ${String(snapshot.version)}`);
|
|
98
|
+
}
|
|
99
|
+
const registry = new ExhaustionRegistry(snapshot.defaultResetMs);
|
|
100
|
+
registry.restore(snapshot);
|
|
101
|
+
return registry;
|
|
102
|
+
}
|
|
67
103
|
/** Clear all exhaustion state. */
|
|
68
104
|
reset() {
|
|
69
105
|
this.entries.clear();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exhaustion.js","sourceRoot":"","sources":["../../src/utils/exhaustion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"exhaustion.js","sourceRoot":"","sources":["../../src/utils/exhaustion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TokenUsage } from '../types.js';
|
|
2
|
+
declare const STREAM_USAGE: unique symbol;
|
|
3
|
+
export type UsageTrackedStream = ReadableStream<string> & {
|
|
4
|
+
[STREAM_USAGE]?: Promise<TokenUsage | undefined>;
|
|
5
|
+
};
|
|
6
|
+
export declare function createStreamUsageTracker(): {
|
|
7
|
+
promise: Promise<TokenUsage | undefined>;
|
|
8
|
+
resolve: (usage: TokenUsage | undefined) => void;
|
|
9
|
+
};
|
|
10
|
+
export declare function attachStreamUsage(stream: ReadableStream<string>, usage: Promise<TokenUsage | undefined>): UsageTrackedStream;
|
|
11
|
+
export declare function getStreamUsage(stream: ReadableStream<string>): Promise<TokenUsage | undefined> | undefined;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=stream-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-usage.d.ts","sourceRoot":"","sources":["../../src/utils/stream-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,QAAA,MAAM,YAAY,eAAqD,CAAC;AAExE,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG;IACxD,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;CAClD,CAAC;AAEF,wBAAgB,wBAAwB,IAAI;IAC1C,OAAO,EAAE,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IACzC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,KAAK,IAAI,CAAC;CAClD,CAeA;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAC9B,KAAK,EAAE,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,GACrC,kBAAkB,CAMpB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,SAAS,CAE1G"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const STREAM_USAGE = Symbol.for('@stackbilt/llm-providers.streamUsage');
|
|
2
|
+
export function createStreamUsageTracker() {
|
|
3
|
+
let settled = false;
|
|
4
|
+
let resolvePromise = () => { };
|
|
5
|
+
const promise = new Promise((resolve) => {
|
|
6
|
+
resolvePromise = resolve;
|
|
7
|
+
});
|
|
8
|
+
return {
|
|
9
|
+
promise,
|
|
10
|
+
resolve: (usage) => {
|
|
11
|
+
if (settled)
|
|
12
|
+
return;
|
|
13
|
+
settled = true;
|
|
14
|
+
resolvePromise(usage);
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function attachStreamUsage(stream, usage) {
|
|
19
|
+
Object.defineProperty(stream, STREAM_USAGE, {
|
|
20
|
+
value: usage,
|
|
21
|
+
});
|
|
22
|
+
return stream;
|
|
23
|
+
}
|
|
24
|
+
export function getStreamUsage(stream) {
|
|
25
|
+
return stream[STREAM_USAGE];
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=stream-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-usage.js","sourceRoot":"","sources":["../../src/utils/stream-usage.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;AAMxE,MAAM,UAAU,wBAAwB;IAItC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,cAAc,GAA4C,GAAG,EAAE,GAAE,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAyB,CAAC,OAAO,EAAE,EAAE;QAC9D,cAAc,GAAG,OAAO,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO;QACP,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAA8B,EAC9B,KAAsC;IAEtC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE;QAC1C,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,OAAO,MAA4B,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAA8B;IAC3D,OAAQ,MAA6B,CAAC,YAAY,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,WAAW,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stackbilt/llm-providers",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.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",
|
|
@@ -35,13 +35,14 @@
|
|
|
35
35
|
"LICENSE"
|
|
36
36
|
],
|
|
37
37
|
"scripts": {
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
38
|
+
"sync:version": "node scripts/sync-version.mjs",
|
|
39
|
+
"build": "npm run sync:version && tsc",
|
|
40
|
+
"typecheck": "npm run sync:version && tsc --noEmit",
|
|
41
|
+
"test": "npm run sync:version && vitest run",
|
|
41
42
|
"test:package": "bash ./scripts/package-smoke.sh",
|
|
42
|
-
"test:watch": "vitest watch",
|
|
43
|
-
"test:coverage": "vitest run --coverage",
|
|
44
|
-
"prepare": "
|
|
43
|
+
"test:watch": "npm run sync:version && vitest watch",
|
|
44
|
+
"test:coverage": "npm run sync:version && vitest run --coverage",
|
|
45
|
+
"prepare": "npm run build",
|
|
45
46
|
"prepublishOnly": "npm run build"
|
|
46
47
|
},
|
|
47
48
|
"devDependencies": {
|