@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.
- package/CHANGELOG.md +79 -8
- package/README.md +245 -129
- 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 +54 -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 +23 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +24 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/layer.d.ts +33 -0
- package/dist/layer.d.ts.map +1 -0
- package/dist/layer.js +83 -0
- package/dist/layer.js.map +1 -0
- package/dist/prewarm.d.ts +12 -0
- package/dist/prewarm.d.ts.map +1 -0
- package/dist/prewarm.js +22 -0
- package/dist/prewarm.js.map +1 -0
- package/dist/providers/anthropic.d.ts +10 -0
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +134 -57
- 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 +16 -34
- package/dist/providers/bedrock.js.map +1 -1
- package/dist/providers/openai.d.ts +10 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +143 -61
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/vertex.d.ts +1 -1
- package/dist/providers/vertex.d.ts.map +1 -1
- package/dist/providers/vertex.js +18 -27
- package/dist/providers/vertex.js.map +1 -1
- package/dist/proxy-client.d.ts +30 -7
- package/dist/proxy-client.d.ts.map +1 -1
- package/dist/proxy-client.js +123 -19
- package/dist/proxy-client.js.map +1 -1
- package/dist/runtime.d.ts +23 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +60 -0
- package/dist/runtime.js.map +1 -0
- package/dist/sdk-layer.d.ts +33 -0
- package/dist/sdk-layer.d.ts.map +1 -0
- package/dist/sdk-layer.js +107 -0
- package/dist/sdk-layer.js.map +1 -0
- package/dist/transport.d.ts +3 -1
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +6 -2
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +82 -15
- 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-overhead.d.ts +32 -0
- package/dist/wrap-overhead.d.ts.map +1 -0
- package/dist/wrap-overhead.js +60 -0
- package/dist/wrap-overhead.js.map +1 -0
- package/dist/wrap.d.ts +13 -17
- package/dist/wrap.d.ts.map +1 -1
- package/dist/wrap.js +59 -74
- package/dist/wrap.js.map +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"
|
|
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;
|
package/dist/applied.d.ts.map
CHANGED
|
@@ -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,
|
|
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;
|
package/dist/applied.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applied.js","sourceRoot":"","sources":["../src/applied.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,iDAAiD;AACjD,MAAM,UAAU,GAAG,0CAA0C,CAAC;AAE9D;;;GAGG;AAEH,gEAAgE;AAChE,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO,UAAU,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,oDAAoD;AACpD,SAAS,aAAa,CAAC,MAAc;IACnC,OAAO,aAAa,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,MAA+B;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,MAA+B;IACjD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,aAAa,CAAC,MAA+B;IACpD,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACtC,OAAO,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,SAAS,CAAC,MAAc;IAC/B,OAAO,WAAW,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAe,EACf,QAAgB,EAChB,QAAgC;
|
|
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
|
-
|
|
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. */
|
package/dist/circuit.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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.
|
|
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
|
package/dist/circuit.js.map
CHANGED
|
@@ -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;
|
|
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
|
|
16
|
-
* TensorCostConfigError is thrown.
|
|
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";
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA
|
|
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
|
|
16
|
-
* TensorCostConfigError is thrown.
|
|
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
|
|
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 (
|
|
72
|
-
throw new TensorCostConfigError(
|
|
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
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|
package/dist/decision.js
ADDED
|
@@ -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
|