@tensorcost/sdk 0.3.0 → 0.5.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/CHANGELOG.md +74 -0
- package/README.md +150 -5
- package/dist/circuit.d.ts +56 -0
- package/dist/circuit.d.ts.map +1 -0
- package/dist/circuit.js +93 -0
- package/dist/circuit.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +67 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +84 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic.d.ts +17 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +179 -20
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/bedrock.d.ts +48 -0
- package/dist/providers/bedrock.d.ts.map +1 -0
- package/dist/providers/bedrock.js +277 -0
- package/dist/providers/bedrock.js.map +1 -0
- package/dist/providers/detect.d.ts +9 -3
- package/dist/providers/detect.d.ts.map +1 -1
- package/dist/providers/detect.js +24 -6
- package/dist/providers/detect.js.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +1 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +19 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +217 -20
- package/dist/providers/openai.js.map +1 -1
- package/dist/proxy-client.d.ts +64 -0
- package/dist/proxy-client.d.ts.map +1 -0
- package/dist/proxy-client.js +259 -0
- package/dist/proxy-client.js.map +1 -0
- package/dist/retry.d.ts +50 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +80 -0
- package/dist/retry.js.map +1 -0
- package/dist/telemetry.d.ts +70 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +41 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +63 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/wrap.d.ts +9 -0
- package/dist/wrap.d.ts.map +1 -1
- package/dist/wrap.js +47 -2
- package/dist/wrap.js.map +1 -1
- package/package.json +12 -2
package/dist/wrap.js
CHANGED
|
@@ -10,13 +10,25 @@
|
|
|
10
10
|
* two custom headers (`x-tc-provider-url`, `x-tc-provider-auth`) are
|
|
11
11
|
* injected into `client.defaultHeaders`. The proxy handles per-request
|
|
12
12
|
* routing decisions. Observe-only telemetry still fires post-call.
|
|
13
|
+
*
|
|
14
|
+
* Hardening (v0.4.0): applied-mode requests now go through the proxy-client
|
|
15
|
+
* module which adds retries, timeouts, typed errors, telemetry hooks, and
|
|
16
|
+
* the fail-open circuit breaker.
|
|
17
|
+
*
|
|
18
|
+
* Bedrock (v0.4.0): observe-only. Applied mode is not supported for Bedrock —
|
|
19
|
+
* wrap(bedrockClient, { appliedMode: true }) throws TensorCostConfigError.
|
|
20
|
+
* The Smithy middleware registered on client.middlewareStack intercepts
|
|
21
|
+
* every client.send() call transparently.
|
|
13
22
|
*/
|
|
14
23
|
import { resolveConfig } from "./config.js";
|
|
24
|
+
import { TensorCostConfigError } from "./config.js";
|
|
15
25
|
import { ObservationTransport } from "./transport.js";
|
|
16
26
|
import { detectProvider } from "./providers/detect.js";
|
|
17
27
|
import { installAppliedMode } from "./applied.js";
|
|
18
28
|
import * as openaiProvider from "./providers/openai.js";
|
|
19
29
|
import * as anthropicProvider from "./providers/anthropic.js";
|
|
30
|
+
import * as bedrockProvider from "./providers/bedrock.js";
|
|
31
|
+
import { CircuitBreaker } from "./circuit.js";
|
|
20
32
|
export function wrap(client, options = {}) {
|
|
21
33
|
// resolveConfig throws MissingConfigError when apiKey is absent, and
|
|
22
34
|
// TensorCostConfigError when appliedMode=true with no proxyUrl.
|
|
@@ -28,6 +40,16 @@ export function wrap(client, options = {}) {
|
|
|
28
40
|
failOpen: config.failOpen,
|
|
29
41
|
});
|
|
30
42
|
const provider = detectProvider(client);
|
|
43
|
+
// Bedrock does not support applied mode. SigV4 signing happens inside
|
|
44
|
+
// the AWS SDK before our middleware can intercept the request, and the
|
|
45
|
+
// signed URL/headers are region-specific. Fail loudly here rather than
|
|
46
|
+
// silently ignoring the option — the customer almost certainly made a
|
|
47
|
+
// configuration mistake.
|
|
48
|
+
if (provider === "bedrock" && config.appliedMode) {
|
|
49
|
+
throw new TensorCostConfigError("TensorCost applied mode is not supported for AWS Bedrock clients. " +
|
|
50
|
+
"Bedrock uses SigV4 signing that cannot be intercepted at the proxy layer. " +
|
|
51
|
+
"Remove { appliedMode: true } or use an OpenAI / Anthropic client instead.");
|
|
52
|
+
}
|
|
31
53
|
// Applied mode: redirect the client to the proxy before installing
|
|
32
54
|
// the observe-only wrappers. Order matters — installAppliedMode mutates
|
|
33
55
|
// baseURL and defaultHeaders, and the provider wrappers capture the
|
|
@@ -37,11 +59,34 @@ export function wrap(client, options = {}) {
|
|
|
37
59
|
if (config.appliedMode && config.proxyUrl !== null) {
|
|
38
60
|
installAppliedMode(client, config.proxyUrl, provider);
|
|
39
61
|
}
|
|
62
|
+
// One circuit breaker per wrap() call — shared across all requests
|
|
63
|
+
// dispatched through this client instance.
|
|
64
|
+
const circuit = new CircuitBreaker();
|
|
40
65
|
if (provider === "openai") {
|
|
41
|
-
openaiProvider.install(client, transport, config.tenantId, config.environment, config.connectionId
|
|
66
|
+
openaiProvider.install(client, transport, config.tenantId, config.environment, config.connectionId, {
|
|
67
|
+
appliedMode: config.appliedMode,
|
|
68
|
+
proxyUrl: config.proxyUrl,
|
|
69
|
+
retry: config.retry,
|
|
70
|
+
timeoutMs: config.timeoutMs,
|
|
71
|
+
onLifecycleEvent: config.onLifecycleEvent,
|
|
72
|
+
failOpenEnabled: config.failOpenEnabled,
|
|
73
|
+
circuit,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else if (provider === "anthropic") {
|
|
77
|
+
anthropicProvider.install(client, transport, config.tenantId, config.environment, config.connectionId, {
|
|
78
|
+
appliedMode: config.appliedMode,
|
|
79
|
+
proxyUrl: config.proxyUrl,
|
|
80
|
+
retry: config.retry,
|
|
81
|
+
timeoutMs: config.timeoutMs,
|
|
82
|
+
onLifecycleEvent: config.onLifecycleEvent,
|
|
83
|
+
failOpenEnabled: config.failOpenEnabled,
|
|
84
|
+
circuit,
|
|
85
|
+
});
|
|
42
86
|
}
|
|
43
87
|
else {
|
|
44
|
-
|
|
88
|
+
// provider === "bedrock"
|
|
89
|
+
bedrockProvider.install(client, transport, config.tenantId, config.environment, config.connectionId);
|
|
45
90
|
}
|
|
46
91
|
return client;
|
|
47
92
|
}
|
package/dist/wrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap.js","sourceRoot":"","sources":["../src/wrap.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"wrap.js","sourceRoot":"","sources":["../src/wrap.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tensorcost/sdk",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "One-line wrapper SDK for TensorCost — fire-and-forget LLM observability for OpenAI and
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "One-line wrapper SDK for TensorCost — fire-and-forget LLM observability for OpenAI, Anthropic, and AWS Bedrock clients.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.js",
|
|
@@ -26,6 +26,8 @@
|
|
|
26
26
|
"llm",
|
|
27
27
|
"openai",
|
|
28
28
|
"anthropic",
|
|
29
|
+
"bedrock",
|
|
30
|
+
"aws",
|
|
29
31
|
"observability",
|
|
30
32
|
"cost",
|
|
31
33
|
"tensorcost"
|
|
@@ -39,6 +41,14 @@
|
|
|
39
41
|
"test": "vitest run --coverage",
|
|
40
42
|
"lint": "echo 'no lint configured'"
|
|
41
43
|
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"@aws-sdk/client-bedrock-runtime": "^3.0.0"
|
|
46
|
+
},
|
|
47
|
+
"peerDependenciesMeta": {
|
|
48
|
+
"@aws-sdk/client-bedrock-runtime": {
|
|
49
|
+
"optional": true
|
|
50
|
+
}
|
|
51
|
+
},
|
|
42
52
|
"devDependencies": {
|
|
43
53
|
"@types/node": "^22.0.0",
|
|
44
54
|
"@vitest/coverage-v8": "^2.1",
|