@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.
Files changed (56) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/README.md +150 -5
  3. package/dist/circuit.d.ts +56 -0
  4. package/dist/circuit.d.ts.map +1 -0
  5. package/dist/circuit.js +93 -0
  6. package/dist/circuit.js.map +1 -0
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +17 -0
  9. package/dist/config.js.map +1 -1
  10. package/dist/errors.d.ts +67 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +84 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/index.d.ts +4 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/providers/anthropic.d.ts +17 -1
  19. package/dist/providers/anthropic.d.ts.map +1 -1
  20. package/dist/providers/anthropic.js +179 -20
  21. package/dist/providers/anthropic.js.map +1 -1
  22. package/dist/providers/bedrock.d.ts +48 -0
  23. package/dist/providers/bedrock.d.ts.map +1 -0
  24. package/dist/providers/bedrock.js +277 -0
  25. package/dist/providers/bedrock.js.map +1 -0
  26. package/dist/providers/detect.d.ts +9 -3
  27. package/dist/providers/detect.d.ts.map +1 -1
  28. package/dist/providers/detect.js +24 -6
  29. package/dist/providers/detect.js.map +1 -1
  30. package/dist/providers/index.d.ts +1 -0
  31. package/dist/providers/index.d.ts.map +1 -1
  32. package/dist/providers/index.js +1 -0
  33. package/dist/providers/index.js.map +1 -1
  34. package/dist/providers/openai.d.ts +19 -1
  35. package/dist/providers/openai.d.ts.map +1 -1
  36. package/dist/providers/openai.js +217 -20
  37. package/dist/providers/openai.js.map +1 -1
  38. package/dist/proxy-client.d.ts +64 -0
  39. package/dist/proxy-client.d.ts.map +1 -0
  40. package/dist/proxy-client.js +259 -0
  41. package/dist/proxy-client.js.map +1 -0
  42. package/dist/retry.d.ts +50 -0
  43. package/dist/retry.d.ts.map +1 -0
  44. package/dist/retry.js +80 -0
  45. package/dist/retry.js.map +1 -0
  46. package/dist/telemetry.d.ts +70 -0
  47. package/dist/telemetry.d.ts.map +1 -0
  48. package/dist/telemetry.js +41 -0
  49. package/dist/telemetry.js.map +1 -0
  50. package/dist/types.d.ts +63 -2
  51. package/dist/types.d.ts.map +1 -1
  52. package/dist/wrap.d.ts +9 -0
  53. package/dist/wrap.d.ts.map +1 -1
  54. package/dist/wrap.js +47 -2
  55. package/dist/wrap.js.map +1 -1
  56. 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
- anthropicProvider.install(client, transport, config.tenantId, config.environment, config.connectionId);
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;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAG9D,MAAM,UAAU,IAAI,CAAI,MAAS,EAAE,UAAuB,EAAE;IAC1D,qEAAqE;IACrE,gEAAgE;IAChE,mEAAmE;IACnE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC;QACzC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAExC,mEAAmE;IACnE,wEAAwE;IACxE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,2CAA2C;IAC3C,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACnD,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,cAAc,CAAC,OAAO,CACpB,MAAM,EACN,SAAS,EACT,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,YAAY,CACpB,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,iBAAiB,CAAC,OAAO,CACvB,MAAM,EACN,SAAS,EACT,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,YAAY,CACpB,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"wrap.js","sourceRoot":"","sources":["../src/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,MAAM,UAAU,IAAI,CAAI,MAAS,EAAE,UAAuB,EAAE;IAC1D,qEAAqE;IACrE,gEAAgE;IAChE,mEAAmE;IACnE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC;QACzC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAExC,sEAAsE;IACtE,uEAAuE;IACvE,uEAAuE;IACvE,sEAAsE;IACtE,yBAAyB;IACzB,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,IAAI,qBAAqB,CAC7B,oEAAoE;YAClE,4EAA4E;YAC5E,2EAA2E,CAC9E,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,wEAAwE;IACxE,oEAAoE;IACpE,oEAAoE;IACpE,oEAAoE;IACpE,2CAA2C;IAC3C,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACnD,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAkC,CAAC,CAAC;IAClF,CAAC;IAED,mEAAmE;IACnE,2CAA2C;IAC3C,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;IAErC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,cAAc,CAAC,OAAO,CACpB,MAAM,EACN,SAAS,EACT,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,YAAY,EACnB;YACE,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,OAAO;SACR,CACF,CAAC;IACJ,CAAC;SAAM,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,iBAAiB,CAAC,OAAO,CACvB,MAAM,EACN,SAAS,EACT,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,YAAY,EACnB;YACE,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,OAAO;SACR,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,yBAAyB;QACzB,eAAe,CAAC,OAAO,CACrB,MAAM,EACN,SAAS,EACT,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,YAAY,CACpB,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tensorcost/sdk",
3
- "version": "0.3.0",
4
- "description": "One-line wrapper SDK for TensorCost — fire-and-forget LLM observability for OpenAI and Anthropic clients.",
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",