@tensorcost/sdk 0.6.0 → 1.1.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 (105) hide show
  1. package/CHANGELOG.md +79 -8
  2. package/README.md +245 -129
  3. package/dist/adapters/crewai.d.ts +4 -0
  4. package/dist/adapters/crewai.d.ts.map +1 -0
  5. package/dist/adapters/crewai.js +6 -0
  6. package/dist/adapters/crewai.js.map +1 -0
  7. package/dist/adapters/langchain.d.ts +4 -0
  8. package/dist/adapters/langchain.d.ts.map +1 -0
  9. package/dist/adapters/langchain.js +6 -0
  10. package/dist/adapters/langchain.js.map +1 -0
  11. package/dist/adapters/llamaindex.d.ts +4 -0
  12. package/dist/adapters/llamaindex.d.ts.map +1 -0
  13. package/dist/adapters/llamaindex.js +6 -0
  14. package/dist/adapters/llamaindex.js.map +1 -0
  15. package/dist/adapters/vercel-ai.d.ts +4 -0
  16. package/dist/adapters/vercel-ai.d.ts.map +1 -0
  17. package/dist/adapters/vercel-ai.js +6 -0
  18. package/dist/adapters/vercel-ai.js.map +1 -0
  19. package/dist/admit-client.d.ts +39 -0
  20. package/dist/admit-client.d.ts.map +1 -0
  21. package/dist/admit-client.js +93 -0
  22. package/dist/admit-client.js.map +1 -0
  23. package/dist/applied.d.ts +6 -1
  24. package/dist/applied.d.ts.map +1 -1
  25. package/dist/applied.js +13 -1
  26. package/dist/applied.js.map +1 -1
  27. package/dist/circuit-observations.d.ts +12 -0
  28. package/dist/circuit-observations.d.ts.map +1 -0
  29. package/dist/circuit-observations.js +37 -0
  30. package/dist/circuit-observations.js.map +1 -0
  31. package/dist/circuit.d.ts +4 -1
  32. package/dist/circuit.d.ts.map +1 -1
  33. package/dist/circuit.js +13 -7
  34. package/dist/circuit.js.map +1 -1
  35. package/dist/config.d.ts +2 -3
  36. package/dist/config.d.ts.map +1 -1
  37. package/dist/config.js +54 -6
  38. package/dist/config.js.map +1 -1
  39. package/dist/decision.d.ts +11 -0
  40. package/dist/decision.d.ts.map +1 -0
  41. package/dist/decision.js +40 -0
  42. package/dist/decision.js.map +1 -0
  43. package/dist/errors.d.ts +23 -3
  44. package/dist/errors.d.ts.map +1 -1
  45. package/dist/errors.js +24 -0
  46. package/dist/errors.js.map +1 -1
  47. package/dist/index.d.ts +9 -3
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +8 -2
  50. package/dist/index.js.map +1 -1
  51. package/dist/layer.d.ts +33 -0
  52. package/dist/layer.d.ts.map +1 -0
  53. package/dist/layer.js +83 -0
  54. package/dist/layer.js.map +1 -0
  55. package/dist/prewarm.d.ts +12 -0
  56. package/dist/prewarm.d.ts.map +1 -0
  57. package/dist/prewarm.js +22 -0
  58. package/dist/prewarm.js.map +1 -0
  59. package/dist/providers/anthropic.d.ts +10 -0
  60. package/dist/providers/anthropic.d.ts.map +1 -1
  61. package/dist/providers/anthropic.js +134 -57
  62. package/dist/providers/anthropic.js.map +1 -1
  63. package/dist/providers/bedrock.d.ts +1 -1
  64. package/dist/providers/bedrock.d.ts.map +1 -1
  65. package/dist/providers/bedrock.js +16 -34
  66. package/dist/providers/bedrock.js.map +1 -1
  67. package/dist/providers/openai.d.ts +10 -0
  68. package/dist/providers/openai.d.ts.map +1 -1
  69. package/dist/providers/openai.js +143 -61
  70. package/dist/providers/openai.js.map +1 -1
  71. package/dist/providers/vertex.d.ts +1 -1
  72. package/dist/providers/vertex.d.ts.map +1 -1
  73. package/dist/providers/vertex.js +18 -27
  74. package/dist/providers/vertex.js.map +1 -1
  75. package/dist/proxy-client.d.ts +30 -7
  76. package/dist/proxy-client.d.ts.map +1 -1
  77. package/dist/proxy-client.js +123 -19
  78. package/dist/proxy-client.js.map +1 -1
  79. package/dist/runtime.d.ts +23 -0
  80. package/dist/runtime.d.ts.map +1 -0
  81. package/dist/runtime.js +60 -0
  82. package/dist/runtime.js.map +1 -0
  83. package/dist/sdk-layer.d.ts +33 -0
  84. package/dist/sdk-layer.d.ts.map +1 -0
  85. package/dist/sdk-layer.js +107 -0
  86. package/dist/sdk-layer.js.map +1 -0
  87. package/dist/transport.d.ts +3 -1
  88. package/dist/transport.d.ts.map +1 -1
  89. package/dist/transport.js +6 -2
  90. package/dist/transport.js.map +1 -1
  91. package/dist/types.d.ts +82 -15
  92. package/dist/types.d.ts.map +1 -1
  93. package/dist/version.d.ts +9 -0
  94. package/dist/version.d.ts.map +1 -0
  95. package/dist/version.js +10 -0
  96. package/dist/version.js.map +1 -0
  97. package/dist/wrap-overhead.d.ts +32 -0
  98. package/dist/wrap-overhead.d.ts.map +1 -0
  99. package/dist/wrap-overhead.js +60 -0
  100. package/dist/wrap-overhead.js.map +1 -0
  101. package/dist/wrap.d.ts +13 -17
  102. package/dist/wrap.d.ts.map +1 -1
  103. package/dist/wrap.js +59 -74
  104. package/dist/wrap.js.map +1 -1
  105. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langchain.js","sourceRoot":"","sources":["../../src/adapters/langchain.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAI,MAAS,EAAE,OAAqB;IAC/D,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { WrapOptions } from "../types.js";
2
+ /** Thin passthrough — wraps the underlying LLM client instance. */
3
+ export declare function wrapLlamaIndex<T>(client: T, options?: WrapOptions): T;
4
+ //# sourceMappingURL=llamaindex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llamaindex.d.ts","sourceRoot":"","sources":["../../src/adapters/llamaindex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,CAErE"}
@@ -0,0 +1,6 @@
1
+ import { wrap } from "../wrap.js";
2
+ /** Thin passthrough — wraps the underlying LLM client instance. */
3
+ export function wrapLlamaIndex(client, options) {
4
+ return wrap(client, options);
5
+ }
6
+ //# sourceMappingURL=llamaindex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llamaindex.js","sourceRoot":"","sources":["../../src/adapters/llamaindex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,mEAAmE;AACnE,MAAM,UAAU,cAAc,CAAI,MAAS,EAAE,OAAqB;IAChE,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { WrapOptions } from "../types.js";
2
+ /** Thin passthrough — wraps the provider client passed to Vercel AI SDK. */
3
+ export declare function wrapVercelAi<T>(client: T, options?: WrapOptions): T;
4
+ //# sourceMappingURL=vercel-ai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-ai.d.ts","sourceRoot":"","sources":["../../src/adapters/vercel-ai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,CAEnE"}
@@ -0,0 +1,6 @@
1
+ import { wrap } from "../wrap.js";
2
+ /** Thin passthrough — wraps the provider client passed to Vercel AI SDK. */
3
+ export function wrapVercelAi(client, options) {
4
+ return wrap(client, options);
5
+ }
6
+ //# sourceMappingURL=vercel-ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-ai.js","sourceRoot":"","sources":["../../src/adapters/vercel-ai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAI,MAAS,EAAE,OAAqB;IAC9D,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Govern-layer admit — metadata-only POST /api/inference-proxy/v1/admit.
3
+ *
4
+ * Fail-open on transport failure: the customer's call proceeds to the
5
+ * provider and an error observation is emitted when transport is available.
6
+ */
7
+ import type { ControlLayer } from "./layer.js";
8
+ import type { Operation, Provider } from "./types.js";
9
+ import type { ObservationTransport } from "./transport.js";
10
+ export interface AdmitMetadata {
11
+ provider: Provider;
12
+ model: string;
13
+ operation: Operation;
14
+ correlation_id: string;
15
+ environment?: string | null;
16
+ connection_id?: string | null;
17
+ agent_id?: string;
18
+ workflow_id?: string;
19
+ customer?: string;
20
+ feature?: string;
21
+ application?: string | null;
22
+ tags?: string[];
23
+ }
24
+ export interface AdmitRequestOptions {
25
+ baseUrl: string;
26
+ bearerToken: string;
27
+ maxLayer: ControlLayer;
28
+ metadata: AdmitMetadata;
29
+ transport?: ObservationTransport;
30
+ failOpen?: boolean;
31
+ timeoutMs?: number;
32
+ fetchImpl?: typeof fetch;
33
+ }
34
+ export interface AdmitResult {
35
+ allowed: boolean;
36
+ decisionHeader: string | null;
37
+ }
38
+ export declare function admitRequest(opts: AdmitRequestOptions): Promise<AdmitResult>;
39
+ //# sourceMappingURL=admit-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admit-client.d.ts","sourceRoot":"","sources":["../src/admit-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAI3D,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,WAAW,CAAC,CA8DtB"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Govern-layer admit — metadata-only POST /api/inference-proxy/v1/admit.
3
+ *
4
+ * Fail-open on transport failure: the customer's call proceeds to the
5
+ * provider and an error observation is emitted when transport is available.
6
+ */
7
+ import { ADMIT_PATH, ADMIT_TIMEOUT_MS } from "./layer.js";
8
+ import { SDK_VERSION, sdkCapabilityHeader } from "./version.js";
9
+ export async function admitRequest(opts) {
10
+ const fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);
11
+ const url = `${opts.baseUrl.replace(/\/+$/, "")}${ADMIT_PATH}`;
12
+ const headers = {
13
+ Authorization: `Bearer ${opts.bearerToken}`,
14
+ "Content-Type": "application/json",
15
+ "x-tc-sdk-version": SDK_VERSION,
16
+ "x-tc-sdk-capabilities": sdkCapabilityHeader(),
17
+ "x-tc-max-layer": opts.maxLayer,
18
+ };
19
+ const body = {
20
+ provider: opts.metadata.provider,
21
+ model: opts.metadata.model,
22
+ operation: opts.metadata.operation,
23
+ correlation_id: opts.metadata.correlation_id,
24
+ ...(opts.metadata.environment ? { environment: opts.metadata.environment } : {}),
25
+ ...(opts.metadata.connection_id ? { connection_id: opts.metadata.connection_id } : {}),
26
+ ...(opts.metadata.agent_id ? { agent_id: opts.metadata.agent_id } : {}),
27
+ ...(opts.metadata.workflow_id ? { workflow_id: opts.metadata.workflow_id } : {}),
28
+ ...(opts.metadata.customer ? { customer: opts.metadata.customer } : {}),
29
+ ...(opts.metadata.feature ? { feature: opts.metadata.feature } : {}),
30
+ ...(opts.metadata.application ? { application: opts.metadata.application } : {}),
31
+ ...(opts.metadata.tags && opts.metadata.tags.length > 0
32
+ ? { tags: opts.metadata.tags.join(",") }
33
+ : {}),
34
+ };
35
+ const controller = new AbortController();
36
+ const timer = setTimeout(() => controller.abort(), opts.timeoutMs ?? ADMIT_TIMEOUT_MS);
37
+ try {
38
+ const resp = await fetchImpl(url, {
39
+ method: "POST",
40
+ headers,
41
+ body: JSON.stringify(body),
42
+ signal: controller.signal,
43
+ });
44
+ const decisionHeader = resp.headers.get("x-tc-decision");
45
+ if (resp.status === 403) {
46
+ return { allowed: false, decisionHeader };
47
+ }
48
+ if (!resp.ok) {
49
+ throw new Error(`admit POST failed status=${resp.status}`);
50
+ }
51
+ return { allowed: true, decisionHeader };
52
+ }
53
+ catch (err) {
54
+ if (opts.failOpen !== false) {
55
+ postAdmitFailureObservation(opts, err);
56
+ return { allowed: true, decisionHeader: null };
57
+ }
58
+ throw err;
59
+ }
60
+ finally {
61
+ clearTimeout(timer);
62
+ }
63
+ }
64
+ function postAdmitFailureObservation(opts, err) {
65
+ if (!opts.transport)
66
+ return;
67
+ try {
68
+ opts.transport.post({
69
+ sdk_version: SDK_VERSION,
70
+ provider: opts.metadata.provider,
71
+ model: opts.metadata.model,
72
+ operation: opts.metadata.operation,
73
+ request_at: new Date().toISOString(),
74
+ response_at: new Date().toISOString(),
75
+ input_tokens: null,
76
+ output_tokens: null,
77
+ cost_usd_cents: null,
78
+ status: "success",
79
+ error_message: null,
80
+ correlation_id: opts.metadata.correlation_id,
81
+ ...(opts.metadata.environment ? { environment: opts.metadata.environment } : {}),
82
+ ...(opts.metadata.connection_id ? { connection_id: opts.metadata.connection_id } : {}),
83
+ metadata: {
84
+ decision_action: "allow",
85
+ decision_reason: "admit_unavailable",
86
+ },
87
+ });
88
+ }
89
+ catch {
90
+ /* belt-and-suspenders */
91
+ }
92
+ }
93
+ //# sourceMappingURL=admit-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admit-client.js","sourceRoot":"","sources":["../src/admit-client.ts"],"names":[],"mappings":"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"}
package/dist/applied.d.ts CHANGED
@@ -84,7 +84,12 @@ declare function azureAuth(apiKey: string): string;
84
84
  * - If the client doesn't expose `apiKey` (can't build `x-tc-provider-auth`).
85
85
  * - If the provider is "bedrock" (not yet supported in v1).
86
86
  */
87
- export declare function installAppliedMode(client: unknown, proxyUrl: string, provider: "openai" | "anthropic"): void;
87
+ export declare function installAppliedMode(client: unknown, proxyUrl: string, provider: "openai" | "anthropic", scope?: {
88
+ application?: string | null;
89
+ tags?: string[];
90
+ customer?: string | null;
91
+ feature?: string | null;
92
+ }): void;
88
93
  export declare const PROXY_PATH_SUFFIX = "/api/inference-proxy/v1/chat/completions";
89
94
  export declare const __test__: {
90
95
  readBaseUrl: typeof readBaseUrl;
@@ -1 +1 @@
1
- {"version":3,"file":"applied.d.ts","sourceRoot":"","sources":["../src/applied.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAOH;;;GAGG;AAEH,gEAAgE;AAChE,iBAAS,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,oDAAoD;AACpD,iBAAS,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;;;;GAKG;AACH,iBAAS,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAMnE;AAED;;;GAGG;AACH,iBAAS,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAGlE;AAED;;;;;;;;GAQG;AACH,iBAAS,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAI/D;AAED;;;;;;;;GAQG;AACH,iBAAS,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAC/B,IAAI,CAiEN;AAED,eAAO,MAAM,iBAAiB,6CAAa,CAAC;AAE5C,eAAO,MAAM,QAAQ;;;;;;;CAOpB,CAAC"}
1
+ {"version":3,"file":"applied.d.ts","sourceRoot":"","sources":["../src/applied.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAOH;;;GAGG;AAEH,gEAAgE;AAChE,iBAAS,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,oDAAoD;AACpD,iBAAS,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;;;;GAKG;AACH,iBAAS,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAMnE;AAED;;;GAGG;AACH,iBAAS,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAGlE;AAED;;;;;;;;GAQG;AACH,iBAAS,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAI/D;AAED;;;;;;;;GAQG;AACH,iBAAS,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GAAG,WAAW,EAChC,KAAK,CAAC,EAAE;IACN,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,GACA,IAAI,CA6EN;AAED,eAAO,MAAM,iBAAiB,6CAAa,CAAC;AAE5C,eAAO,MAAM,QAAQ;;;;;;;CAOpB,CAAC"}
package/dist/applied.js CHANGED
@@ -107,7 +107,7 @@ function azureAuth(apiKey) {
107
107
  * - If the client doesn't expose `apiKey` (can't build `x-tc-provider-auth`).
108
108
  * - If the provider is "bedrock" (not yet supported in v1).
109
109
  */
110
- export function installAppliedMode(client, proxyUrl, provider) {
110
+ export function installAppliedMode(client, proxyUrl, provider, scope) {
111
111
  if (provider === "bedrock") {
112
112
  // Bedrock uses SigV4 signing on regional HTTPS endpoints. The AWS
113
113
  // SDK does not expose baseURL / defaultHeaders in the same shape,
@@ -160,6 +160,18 @@ export function installAppliedMode(client, proxyUrl, provider) {
160
160
  : {};
161
161
  headers["x-tc-provider-url"] = originalBaseUrl;
162
162
  headers["x-tc-provider-auth"] = providerAuth;
163
+ if (scope?.application) {
164
+ headers["x-tc-application"] = scope.application;
165
+ }
166
+ if (scope?.tags && scope.tags.length > 0) {
167
+ headers["x-tc-tags"] = scope.tags.join(",");
168
+ }
169
+ if (scope?.customer) {
170
+ headers["x-tc-customer"] = scope.customer;
171
+ }
172
+ if (scope?.feature) {
173
+ headers["x-tc-feature"] = scope.feature;
174
+ }
163
175
  c["defaultHeaders"] = headers;
164
176
  }
165
177
  export const PROXY_PATH_SUFFIX = PROXY_PATH;
@@ -1 +1 @@
1
- {"version":3,"file":"applied.js","sourceRoot":"","sources":["../src/applied.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"applied.js","sourceRoot":"","sources":["../src/applied.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Emit circuit-breaker state transitions as observations (Phase 4).
3
+ */
4
+ import type { CircuitState } from "./circuit.js";
5
+ import type { ObservationTransport } from "./transport.js";
6
+ import type { Provider } from "./types.js";
7
+ export declare function bindCircuitObservations(transport: ObservationTransport, ctx: {
8
+ provider: Provider;
9
+ tenantId: string | null;
10
+ environment: string | null;
11
+ }): (from: CircuitState, to: CircuitState) => void;
12
+ //# sourceMappingURL=circuit-observations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-observations.d.ts","sourceRoot":"","sources":["../src/circuit-observations.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAe,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGxD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,oBAAoB,EAC/B,GAAG,EAAE;IACH,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GACA,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,CA6BhD"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Emit circuit-breaker state transitions as observations (Phase 4).
3
+ */
4
+ import { randomUUID } from "node:crypto";
5
+ import { SDK_VERSION } from "./version.js";
6
+ export function bindCircuitObservations(transport, ctx) {
7
+ return (from, to) => {
8
+ const obs = {
9
+ sdk_version: SDK_VERSION,
10
+ provider: ctx.provider,
11
+ model: "circuit-breaker",
12
+ operation: "chat.completions",
13
+ modality: "text",
14
+ request_at: new Date().toISOString(),
15
+ response_at: new Date().toISOString(),
16
+ input_tokens: null,
17
+ output_tokens: null,
18
+ cost_usd_cents: null,
19
+ status: "success",
20
+ error_message: null,
21
+ correlation_id: randomUUID(),
22
+ tenant_id: ctx.tenantId,
23
+ environment: ctx.environment ?? undefined,
24
+ metadata: {
25
+ circuit_state: to,
26
+ circuit_previous_state: from,
27
+ },
28
+ };
29
+ try {
30
+ transport.post(obs);
31
+ }
32
+ catch {
33
+ /* fail-open */
34
+ }
35
+ };
36
+ }
37
+ //# sourceMappingURL=circuit-observations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-observations.js","sourceRoot":"","sources":["../src/circuit-observations.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,UAAU,uBAAuB,CACrC,SAA+B,EAC/B,GAIC;IAED,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;QAClB,MAAM,GAAG,GAAgB;YACvB,WAAW,EAAE,WAAW;YACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,KAAK,EAAE,iBAAiB;YACxB,SAAS,EAAE,kBAAkB;YAC7B,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,IAAI;YACpB,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,UAAU,EAAE;YAC5B,SAAS,EAAE,GAAG,CAAC,QAAQ;YACvB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;YACzC,QAAQ,EAAE;gBACR,aAAa,EAAE,EAAE;gBACjB,sBAAsB,EAAE,IAAI;aAC7B;SACF,CAAC;QACF,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
package/dist/circuit.d.ts CHANGED
@@ -26,12 +26,15 @@ export interface CircuitBreakerConfig {
26
26
  closeThreshold: number;
27
27
  }
28
28
  export declare const DEFAULT_CIRCUIT_CONFIG: CircuitBreakerConfig;
29
+ export type CircuitTransitionListener = (from: CircuitState, to: CircuitState) => void;
29
30
  export declare class CircuitBreaker {
30
31
  private state;
31
32
  private consecutiveFailures;
32
33
  private probeSuccesses;
33
34
  readonly config: CircuitBreakerConfig;
34
- constructor(config?: CircuitBreakerConfig);
35
+ private readonly onTransition?;
36
+ constructor(config?: CircuitBreakerConfig, onTransition?: CircuitTransitionListener);
37
+ private transition;
35
38
  /** Current circuit state. */
36
39
  get currentState(): CircuitState;
37
40
  /** How many consecutive failures have been recorded. */
@@ -1 +1 @@
1
- {"version":3,"file":"circuit.d.ts","sourceRoot":"","sources":["../src/circuit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC;IACtB,qFAAqF;IACrF,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,sBAAsB,EAAE,oBAGpC,CAAC;AAEF,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,cAAc,CAAK;IAC3B,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;gBAE1B,MAAM,GAAE,oBAA6C;IAIjE,6BAA6B;IAC7B,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED,wDAAwD;IACxD,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;;;OAIG;IACH,YAAY,IAAI,OAAO;IAIvB;;;OAGG;IACH,WAAW,IAAI,OAAO;IAStB,2CAA2C;IAC3C,aAAa,IAAI,IAAI;IAWrB,+DAA+D;IAC/D,aAAa,IAAI,IAAI;IAcrB,OAAO,CAAC,KAAK;CAKd"}
1
+ {"version":3,"file":"circuit.d.ts","sourceRoot":"","sources":["../src/circuit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC;IACtB,qFAAqF;IACrF,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,sBAAsB,EAAE,oBAGpC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,CACtC,IAAI,EAAE,YAAY,EAClB,EAAE,EAAE,YAAY,KACb,IAAI,CAAC;AAEV,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,cAAc,CAAK;IAC3B,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAA4B;gBAGxD,MAAM,GAAE,oBAA6C,EACrD,YAAY,CAAC,EAAE,yBAAyB;IAM1C,OAAO,CAAC,UAAU;IAOlB,6BAA6B;IAC7B,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED,wDAAwD;IACxD,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;;;OAIG;IACH,YAAY,IAAI,OAAO;IAIvB;;;OAGG;IACH,WAAW,IAAI,OAAO;IAQtB,2CAA2C;IAC3C,aAAa,IAAI,IAAI;IAWrB,+DAA+D;IAC/D,aAAa,IAAI,IAAI;IAarB,OAAO,CAAC,KAAK;CAKd"}
package/dist/circuit.js CHANGED
@@ -23,11 +23,19 @@ export const DEFAULT_CIRCUIT_CONFIG = {
23
23
  closeThreshold: 5,
24
24
  };
25
25
  export class CircuitBreaker {
26
- constructor(config = DEFAULT_CIRCUIT_CONFIG) {
26
+ constructor(config = DEFAULT_CIRCUIT_CONFIG, onTransition) {
27
27
  this.state = "CLOSED";
28
28
  this.consecutiveFailures = 0;
29
29
  this.probeSuccesses = 0;
30
30
  this.config = config;
31
+ this.onTransition = onTransition;
32
+ }
33
+ transition(to) {
34
+ if (to === this.state)
35
+ return;
36
+ const from = this.state;
37
+ this.state = to;
38
+ this.onTransition?.(from, to);
31
39
  }
32
40
  /** Current circuit state. */
33
41
  get currentState() {
@@ -51,8 +59,7 @@ export class CircuitBreaker {
51
59
  */
52
60
  shouldProbe() {
53
61
  if (this.state === "OPEN") {
54
- // Transition to HALF_OPEN for the probe attempt.
55
- this.state = "HALF_OPEN";
62
+ this.transition("HALF_OPEN");
56
63
  return true;
57
64
  }
58
65
  return false;
@@ -72,22 +79,21 @@ export class CircuitBreaker {
72
79
  /** Call after a proxy request fails (5xx or network error). */
73
80
  recordFailure() {
74
81
  if (this.state === "HALF_OPEN") {
75
- // Probe failed — go back to fully open.
76
- this.state = "OPEN";
77
82
  this.probeSuccesses = 0;
83
+ this.transition("OPEN");
78
84
  }
79
85
  else if (this.state === "CLOSED") {
80
86
  this.consecutiveFailures += 1;
81
87
  if (this.consecutiveFailures >= this.config.openThreshold) {
82
- this.state = "OPEN";
88
+ this.transition("OPEN");
83
89
  }
84
90
  }
85
91
  // OPEN + another failure: stay open, no state change needed.
86
92
  }
87
93
  reset() {
88
- this.state = "CLOSED";
89
94
  this.consecutiveFailures = 0;
90
95
  this.probeSuccesses = 0;
96
+ this.transition("CLOSED");
91
97
  }
92
98
  }
93
99
  //# sourceMappingURL=circuit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"circuit.js","sourceRoot":"","sources":["../src/circuit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAWH,MAAM,CAAC,MAAM,sBAAsB,GAAyB;IAC1D,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,OAAO,cAAc;IAMzB,YAAY,SAA+B,sBAAsB;QALzD,UAAK,GAAiB,QAAQ,CAAC;QAC/B,wBAAmB,GAAG,CAAC,CAAC;QACxB,mBAAc,GAAG,CAAC,CAAC;QAIzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,6BAA6B;IAC7B,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,wDAAwD;IACxD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1B,iDAAiD;YACjD,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2CAA2C;IAC3C,aAAa;QACX,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;YACzB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBACtD,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,aAAa;QACX,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC/B,wCAAwC;YACxC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACpB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC1D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACtB,CAAC;QACH,CAAC;QACD,6DAA6D;IAC/D,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"circuit.js","sourceRoot":"","sources":["../src/circuit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAWH,MAAM,CAAC,MAAM,sBAAsB,GAAyB;IAC1D,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,CAAC;CAClB,CAAC;AAOF,MAAM,OAAO,cAAc;IAOzB,YACE,SAA+B,sBAAsB,EACrD,YAAwC;QARlC,UAAK,GAAiB,QAAQ,CAAC;QAC/B,wBAAmB,GAAG,CAAC,CAAC;QACxB,mBAAc,GAAG,CAAC,CAAC;QAQzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAEO,UAAU,CAAC,EAAgB;QACjC,IAAI,EAAE,KAAK,IAAI,CAAC,KAAK;YAAE,OAAO;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,6BAA6B;IAC7B,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,wDAAwD;IACxD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2CAA2C;IAC3C,aAAa;QACX,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;YACzB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBACtD,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,aAAa;QACX,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC1D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,6DAA6D;IAC/D,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;CACF"}
package/dist/config.d.ts CHANGED
@@ -12,9 +12,8 @@
12
12
  * the SDK was never configured at all, and silently dropping every
13
13
  * observation would be worse than a loud import-time failure.
14
14
  *
15
- * If appliedMode=true and proxyUrl is missing from both options and env,
16
- * TensorCostConfigError is thrown. Applied mode needs an explicit proxy
17
- * URL; there is no safe default.
15
+ * If maxLayer is steer or route and proxyUrl is missing from both options
16
+ * and env, TensorCostConfigError is thrown.
18
17
  */
19
18
  import type { ResolvedConfig, WrapOptions } from "./types.js";
20
19
  export declare const DEFAULT_BASE_URL = "https://api.tensorcost.com";
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9D,eAAO,MAAM,gBAAgB,+BAA+B,CAAC;AAE7D,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,yEAAyE;AACzE,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,WAAgB,GAAG,cAAc,CAuHvE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAU9D,eAAO,MAAM,gBAAgB,+BAA+B,CAAC;AAE7D,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,yEAAyE;AACzE,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,WAAgB,GAAG,cAAc,CAmKvE"}
package/dist/config.js CHANGED
@@ -12,11 +12,11 @@
12
12
  * the SDK was never configured at all, and silently dropping every
13
13
  * observation would be worse than a loud import-time failure.
14
14
  *
15
- * If appliedMode=true and proxyUrl is missing from both options and env,
16
- * TensorCostConfigError is thrown. Applied mode needs an explicit proxy
17
- * URL; there is no safe default.
15
+ * If maxLayer is steer or route and proxyUrl is missing from both options
16
+ * and env, TensorCostConfigError is thrown.
18
17
  */
19
18
  import { DEFAULT_RETRY_CONFIG } from "./retry.js";
19
+ import { DATA_GRANTS, needsProxyUrl, PROXY_HEADERS_TIMEOUT_MS, resolveMaxLayer, } from "./layer.js";
20
20
  export const DEFAULT_BASE_URL = "https://api.tensorcost.com";
21
21
  export class MissingConfigError extends Error {
22
22
  constructor(message) {
@@ -61,15 +61,19 @@ export function resolveConfig(options = {}) {
61
61
  connectionId = trimmed.length === 0 ? null : trimmed;
62
62
  }
63
63
  const failOpen = options.failOpen ?? true;
64
- const appliedMode = options.appliedMode ?? false;
64
+ const maxLayer = resolveMaxLayer({
65
+ maxLayer: options.maxLayer,
66
+ appliedMode: options.appliedMode,
67
+ });
68
+ const appliedMode = needsProxyUrl(maxLayer);
65
69
  const proxyUrlRaw = options.proxyUrl ?? process.env.TENSORCOST_PROXY_URL ?? null;
66
70
  const proxyUrl = proxyUrlRaw !== null ? proxyUrlRaw.replace(/\/+$/, "") : null;
67
71
  if (!apiKey) {
68
72
  throw new MissingConfigError("TensorCost apiKey not found. Pass { apiKey } to wrap() or set the " +
69
73
  "TENSORCOST_API_KEY environment variable.");
70
74
  }
71
- if (appliedMode && !proxyUrl) {
72
- throw new TensorCostConfigError("TensorCost applied mode is enabled but no proxy URL was provided. " +
75
+ if (needsProxyUrl(maxLayer) && !proxyUrl) {
76
+ throw new TensorCostConfigError(`TensorCost maxLayer '${maxLayer}' requires a proxy URL. ` +
73
77
  "Pass { proxyUrl } to wrap() or set the TENSORCOST_PROXY_URL " +
74
78
  "environment variable.");
75
79
  }
@@ -79,6 +83,7 @@ export function resolveConfig(options = {}) {
79
83
  ...options.retry,
80
84
  };
81
85
  const timeoutMs = options.timeoutMs ?? 60_000;
86
+ const headersTimeoutMs = options.headersTimeoutMs ?? PROXY_HEADERS_TIMEOUT_MS;
82
87
  const idleTimeoutMs = options.idleTimeoutMs ?? 30_000;
83
88
  const onLifecycleEvent = options.onLifecycleEvent;
84
89
  const failOpenEnabled = options.failOpenEnabled ?? true;
@@ -101,6 +106,25 @@ export function resolveConfig(options = {}) {
101
106
  const agentId = agentIdRaw !== null ? String(agentIdRaw).trim() || null : null;
102
107
  const workflowIdRaw = options.workflowId ?? process.env.TENSORCOST_WORKFLOW_ID ?? null;
103
108
  const workflowId = workflowIdRaw !== null ? String(workflowIdRaw).trim() || null : null;
109
+ const applicationRaw = options.application ??
110
+ process.env.TC_APPLICATION ??
111
+ process.env.TENSORCOST_APPLICATION ??
112
+ null;
113
+ const application = applicationRaw !== null ? String(applicationRaw).trim() || null : null;
114
+ const tagsRaw = options.tags ?? process.env.TC_TAGS ?? process.env.TENSORCOST_TAGS ?? null;
115
+ let tags = [];
116
+ if (Array.isArray(tagsRaw)) {
117
+ tags = tagsRaw.map((x) => String(x).trim()).filter((x) => x.length > 0);
118
+ }
119
+ else if (tagsRaw !== null) {
120
+ tags = String(tagsRaw)
121
+ .split(",")
122
+ .map((x) => x.trim())
123
+ .filter((x) => x.length > 0);
124
+ }
125
+ const customer = resolveAttributionField(options.customer ?? process.env.TENSORCOST_CUSTOMER ?? null, "customer");
126
+ const feature = resolveAttributionField(options.feature ?? process.env.TENSORCOST_FEATURE ?? null, "feature");
127
+ const maxGrants = normalizeMaxGrants(options.maxGrants);
104
128
  return {
105
129
  apiKey,
106
130
  baseUrl: baseUrlRaw.replace(/\/+$/, ""),
@@ -108,10 +132,12 @@ export function resolveConfig(options = {}) {
108
132
  environment,
109
133
  connectionId,
110
134
  failOpen,
135
+ maxLayer,
111
136
  appliedMode,
112
137
  proxyUrl,
113
138
  retry,
114
139
  timeoutMs,
140
+ headersTimeoutMs,
115
141
  idleTimeoutMs,
116
142
  onLifecycleEvent,
117
143
  failOpenEnabled,
@@ -120,6 +146,28 @@ export function resolveConfig(options = {}) {
120
146
  promptTemplateId,
121
147
  agentId,
122
148
  workflowId,
149
+ application,
150
+ tags,
151
+ customer,
152
+ feature,
153
+ maxGrants,
123
154
  };
124
155
  }
156
+ function normalizeMaxGrants(raw) {
157
+ if (!raw || raw.length === 0)
158
+ return [];
159
+ const allowed = new Set(DATA_GRANTS);
160
+ return raw.filter((g) => allowed.has(g));
161
+ }
162
+ function resolveAttributionField(raw, fieldName) {
163
+ if (raw === null)
164
+ return null;
165
+ const trimmed = String(raw).trim();
166
+ if (trimmed.length === 0)
167
+ return null;
168
+ if (trimmed.length > 128) {
169
+ throw new MissingConfigError(`TensorCost ${fieldName} must be 128 characters or fewer.`);
170
+ }
171
+ return trimmed;
172
+ }
125
173
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Parse x-tc-decision response header for observation metadata.
3
+ */
4
+ export interface ParsedDecision {
5
+ layer: string;
6
+ action: string;
7
+ reason?: string;
8
+ }
9
+ export declare function parseDecisionHeader(header: string | null | undefined): ParsedDecision | null;
10
+ export declare function decisionMetadata(header: string | null | undefined): Record<string, string> | undefined;
11
+ //# sourceMappingURL=decision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision.d.ts","sourceRoot":"","sources":["../src/decision.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,cAAc,GAAG,IAAI,CAiBvB;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAUpC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Parse x-tc-decision response header for observation metadata.
3
+ */
4
+ export function parseDecisionHeader(header) {
5
+ if (!header || header.trim() === "")
6
+ return null;
7
+ let layer;
8
+ let action;
9
+ let reason;
10
+ for (const segment of header.split(";")) {
11
+ const trimmed = segment.trim();
12
+ const eq = trimmed.indexOf("=");
13
+ if (eq <= 0)
14
+ continue;
15
+ const key = trimmed.slice(0, eq).trim();
16
+ const value = trimmed.slice(eq + 1).trim();
17
+ if (key === "layer")
18
+ layer = value;
19
+ else if (key === "action")
20
+ action = value;
21
+ else if (key === "reason")
22
+ reason = value;
23
+ }
24
+ if (!layer || !action)
25
+ return null;
26
+ return { layer, action, reason };
27
+ }
28
+ export function decisionMetadata(header) {
29
+ const parsed = parseDecisionHeader(header);
30
+ if (!parsed)
31
+ return undefined;
32
+ const meta = {
33
+ decision_action: parsed.action,
34
+ };
35
+ if (parsed.reason) {
36
+ meta.decision_reason = parsed.reason;
37
+ }
38
+ return meta;
39
+ }
40
+ //# sourceMappingURL=decision.js.map