@tensorcost/sdk 0.5.0 → 1.0.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 +117 -0
- package/README.md +63 -95
- package/dist/adapters/crewai.d.ts +4 -0
- package/dist/adapters/crewai.d.ts.map +1 -0
- package/dist/adapters/crewai.js +6 -0
- package/dist/adapters/crewai.js.map +1 -0
- package/dist/adapters/langchain.d.ts +4 -0
- package/dist/adapters/langchain.d.ts.map +1 -0
- package/dist/adapters/langchain.js +6 -0
- package/dist/adapters/langchain.js.map +1 -0
- package/dist/adapters/llamaindex.d.ts +4 -0
- package/dist/adapters/llamaindex.d.ts.map +1 -0
- package/dist/adapters/llamaindex.js +6 -0
- package/dist/adapters/llamaindex.js.map +1 -0
- package/dist/adapters/vercel-ai.d.ts +4 -0
- package/dist/adapters/vercel-ai.d.ts.map +1 -0
- package/dist/adapters/vercel-ai.js +6 -0
- package/dist/adapters/vercel-ai.js.map +1 -0
- package/dist/admit-client.d.ts +39 -0
- package/dist/admit-client.d.ts.map +1 -0
- package/dist/admit-client.js +93 -0
- package/dist/admit-client.js.map +1 -0
- package/dist/applied.d.ts +6 -1
- package/dist/applied.d.ts.map +1 -1
- package/dist/applied.js +13 -1
- package/dist/applied.js.map +1 -1
- package/dist/circuit-observations.d.ts +12 -0
- package/dist/circuit-observations.d.ts.map +1 -0
- package/dist/circuit-observations.js +37 -0
- package/dist/circuit-observations.js.map +1 -0
- package/dist/circuit.d.ts +4 -1
- package/dist/circuit.d.ts.map +1 -1
- package/dist/circuit.js +13 -7
- package/dist/circuit.js.map +1 -1
- package/dist/config.d.ts +2 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +74 -6
- package/dist/config.js.map +1 -1
- package/dist/decision.d.ts +11 -0
- package/dist/decision.d.ts.map +1 -0
- package/dist/decision.js +40 -0
- package/dist/decision.js.map +1 -0
- package/dist/errors.d.ts +40 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +46 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +8 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/layer.d.ts +27 -0
- package/dist/layer.d.ts.map +1 -0
- package/dist/layer.js +77 -0
- package/dist/layer.js.map +1 -0
- package/dist/providers/anthropic.d.ts +11 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +196 -18
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/bedrock.d.ts +1 -1
- package/dist/providers/bedrock.d.ts.map +1 -1
- package/dist/providers/bedrock.js +21 -3
- package/dist/providers/bedrock.js.map +1 -1
- package/dist/providers/detect.d.ts.map +1 -1
- package/dist/providers/detect.js +17 -2
- 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 +11 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +255 -20
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/vertex.d.ts +14 -0
- package/dist/providers/vertex.d.ts.map +1 -0
- package/dist/providers/vertex.js +174 -0
- package/dist/providers/vertex.js.map +1 -0
- package/dist/proxy-client.d.ts +37 -1
- package/dist/proxy-client.d.ts.map +1 -1
- package/dist/proxy-client.js +124 -4
- package/dist/proxy-client.js.map +1 -1
- package/dist/sdk-layer.d.ts +26 -0
- package/dist/sdk-layer.d.ts.map +1 -0
- package/dist/sdk-layer.js +73 -0
- package/dist/sdk-layer.js.map +1 -0
- package/dist/transport.d.ts +6 -1
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +14 -3
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +178 -17
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +9 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/dist/wrap.d.ts +13 -14
- package/dist/wrap.d.ts.map +1 -1
- package/dist/wrap.js +66 -59
- package/dist/wrap.js.map +1 -1
- package/package.json +7 -2
package/dist/wrap.js
CHANGED
|
@@ -5,20 +5,11 @@
|
|
|
5
5
|
* ergonomics non-negotiable: customer changes one line, no other code
|
|
6
6
|
* paths shift.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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.
|
|
8
|
+
* Control layers:
|
|
9
|
+
* off — client returned unchanged (no transport, no hooks)
|
|
10
|
+
* observe — telemetry only
|
|
11
|
+
* govern — admit (metadata) then direct provider call
|
|
12
|
+
* steer/route — proxy in request path (OpenAI / Anthropic only)
|
|
22
13
|
*/
|
|
23
14
|
import { resolveConfig } from "./config.js";
|
|
24
15
|
import { TensorCostConfigError } from "./config.js";
|
|
@@ -28,66 +19,82 @@ import { installAppliedMode } from "./applied.js";
|
|
|
28
19
|
import * as openaiProvider from "./providers/openai.js";
|
|
29
20
|
import * as anthropicProvider from "./providers/anthropic.js";
|
|
30
21
|
import * as bedrockProvider from "./providers/bedrock.js";
|
|
22
|
+
import * as vertexProvider from "./providers/vertex.js";
|
|
31
23
|
import { CircuitBreaker } from "./circuit.js";
|
|
24
|
+
import { bindCircuitObservations } from "./circuit-observations.js";
|
|
25
|
+
import { layerRank, needsProxyUrl } from "./layer.js";
|
|
26
|
+
import { SdkLayerClient } from "./sdk-layer.js";
|
|
27
|
+
function steerRouteUnsupportedError(provider, maxLayer) {
|
|
28
|
+
return new TensorCostConfigError(`TensorCost maxLayer '${maxLayer}' is not supported for ${provider} clients. ` +
|
|
29
|
+
"Bedrock and Vertex use provider-native signing that cannot be intercepted at " +
|
|
30
|
+
"the proxy layer. Use maxLayer 'govern' or lower for telemetry, or wrap an " +
|
|
31
|
+
"OpenAI / Anthropic client for steer/route.");
|
|
32
|
+
}
|
|
32
33
|
export function wrap(client, options = {}) {
|
|
33
|
-
// resolveConfig throws MissingConfigError when apiKey is absent, and
|
|
34
|
-
// TensorCostConfigError when appliedMode=true with no proxyUrl.
|
|
35
|
-
// Both are intentional non-fail-open cases — see config.ts header.
|
|
36
34
|
const config = resolveConfig(options);
|
|
35
|
+
// L0 off — no transport, no provider hooks.
|
|
36
|
+
if (config.maxLayer === "off") {
|
|
37
|
+
return client;
|
|
38
|
+
}
|
|
39
|
+
const provider = detectProvider(client);
|
|
40
|
+
if (needsProxyUrl(config.maxLayer) &&
|
|
41
|
+
(provider === "bedrock" || provider === "vertex")) {
|
|
42
|
+
throw steerRouteUnsupportedError(provider, config.maxLayer);
|
|
43
|
+
}
|
|
37
44
|
const transport = new ObservationTransport({
|
|
38
45
|
baseUrl: config.baseUrl,
|
|
39
46
|
apiKey: config.apiKey,
|
|
47
|
+
tenantId: config.tenantId,
|
|
40
48
|
failOpen: config.failOpen,
|
|
41
49
|
});
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
// baseURL and defaultHeaders, and the provider wrappers capture the
|
|
56
|
-
// (now-modified) bound methods, so post-call observations correctly
|
|
57
|
-
// attribute the response to the original provider model even though
|
|
58
|
-
// the network call went through the proxy.
|
|
59
|
-
if (config.appliedMode && config.proxyUrl !== null) {
|
|
60
|
-
installAppliedMode(client, config.proxyUrl, provider);
|
|
50
|
+
const sdkLayer = new SdkLayerClient({
|
|
51
|
+
baseUrl: config.baseUrl,
|
|
52
|
+
getToken: () => transport.getToken(),
|
|
53
|
+
});
|
|
54
|
+
if (needsProxyUrl(config.maxLayer) &&
|
|
55
|
+
config.proxyUrl !== null &&
|
|
56
|
+
(provider === "openai" || provider === "anthropic")) {
|
|
57
|
+
installAppliedMode(client, config.proxyUrl, provider, {
|
|
58
|
+
application: config.application,
|
|
59
|
+
tags: config.tags,
|
|
60
|
+
customer: config.customer,
|
|
61
|
+
feature: config.feature,
|
|
62
|
+
});
|
|
61
63
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
const circuit = new CircuitBreaker(undefined, bindCircuitObservations(transport, {
|
|
65
|
+
provider,
|
|
66
|
+
tenantId: config.tenantId,
|
|
67
|
+
environment: config.environment,
|
|
68
|
+
}));
|
|
69
|
+
const hardening = {
|
|
70
|
+
maxLayer: config.maxLayer,
|
|
71
|
+
appliedMode: config.appliedMode,
|
|
72
|
+
proxyUrl: config.proxyUrl,
|
|
73
|
+
baseUrl: config.baseUrl,
|
|
74
|
+
sdkLayer,
|
|
75
|
+
retry: config.retry,
|
|
76
|
+
timeoutMs: config.timeoutMs,
|
|
77
|
+
onLifecycleEvent: config.onLifecycleEvent,
|
|
78
|
+
failOpenEnabled: config.failOpenEnabled,
|
|
79
|
+
circuit,
|
|
80
|
+
application: config.application,
|
|
81
|
+
tags: config.tags,
|
|
82
|
+
customer: config.customer,
|
|
83
|
+
feature: config.feature,
|
|
84
|
+
};
|
|
65
85
|
if (provider === "openai") {
|
|
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
|
-
});
|
|
86
|
+
openaiProvider.install(client, transport, config.tenantId, config.environment, config.connectionId, hardening, config.deployment, config.promptTemplateId, config.agentId, config.workflowId);
|
|
75
87
|
}
|
|
76
88
|
else if (provider === "anthropic") {
|
|
77
|
-
anthropicProvider.install(client, transport, config.tenantId, config.environment, config.connectionId,
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
timeoutMs: config.timeoutMs,
|
|
82
|
-
onLifecycleEvent: config.onLifecycleEvent,
|
|
83
|
-
failOpenEnabled: config.failOpenEnabled,
|
|
84
|
-
circuit,
|
|
85
|
-
});
|
|
89
|
+
anthropicProvider.install(client, transport, config.tenantId, config.environment, config.connectionId, hardening, config.deployment, config.promptTemplateId, config.agentId, config.workflowId);
|
|
90
|
+
}
|
|
91
|
+
else if (provider === "bedrock") {
|
|
92
|
+
bedrockProvider.install(client, transport, config.tenantId, config.environment, config.connectionId, config.deployment, config.promptTemplateId, config.agentId, config.workflowId, config.customer, config.feature);
|
|
86
93
|
}
|
|
87
94
|
else {
|
|
88
|
-
|
|
89
|
-
bedrockProvider.install(client, transport, config.tenantId, config.environment, config.connectionId);
|
|
95
|
+
vertexProvider.install(client, transport, config.tenantId, config.environment, config.connectionId, config.deployment, config.promptTemplateId, config.agentId, config.workflowId, config.customer, config.feature);
|
|
90
96
|
}
|
|
91
97
|
return client;
|
|
92
98
|
}
|
|
99
|
+
export const __test__ = { layerRank, steerRouteUnsupportedError };
|
|
93
100
|
//# sourceMappingURL=wrap.js.map
|
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, Anthropic,
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "One-line wrapper SDK for TensorCost — fire-and-forget LLM observability for OpenAI, Anthropic, AWS Bedrock, and Google Vertex AI clients.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.js",
|
|
@@ -19,6 +19,9 @@
|
|
|
19
19
|
"CHANGELOG.md",
|
|
20
20
|
"LICENSE"
|
|
21
21
|
],
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
22
25
|
"engines": {
|
|
23
26
|
"node": ">=18.0.0"
|
|
24
27
|
},
|
|
@@ -27,6 +30,8 @@
|
|
|
27
30
|
"openai",
|
|
28
31
|
"anthropic",
|
|
29
32
|
"bedrock",
|
|
33
|
+
"vertex",
|
|
34
|
+
"google",
|
|
30
35
|
"aws",
|
|
31
36
|
"observability",
|
|
32
37
|
"cost",
|