@tensorcost/sdk 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +74 -0
- package/README.md +89 -1
- package/dist/circuit.d.ts +56 -0
- package/dist/circuit.d.ts.map +1 -0
- package/dist/circuit.js +93 -0
- package/dist/circuit.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +67 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +84 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic.d.ts +17 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +179 -20
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/openai.d.ts +19 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +217 -20
- package/dist/providers/openai.js.map +1 -1
- package/dist/proxy-client.d.ts +64 -0
- package/dist/proxy-client.d.ts.map +1 -0
- package/dist/proxy-client.js +259 -0
- package/dist/proxy-client.js.map +1 -0
- package/dist/retry.d.ts +50 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +80 -0
- package/dist/retry.js.map +1 -0
- package/dist/telemetry.d.ts +70 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +41 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/wrap.d.ts +4 -0
- package/dist/wrap.d.ts.map +1 -1
- package/dist/wrap.js +26 -2
- package/dist/wrap.js.map +1 -1
- package/package.json +1 -1
package/dist/types.d.ts
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* the customer's client type, so most provider shapes are duck-typed
|
|
6
6
|
* at runtime rather than expressed in TypeScript.
|
|
7
7
|
*/
|
|
8
|
+
import type { LifecycleEventCallback } from "./telemetry.js";
|
|
9
|
+
import type { RetryConfig } from "./retry.js";
|
|
8
10
|
export type Provider = "openai" | "anthropic";
|
|
9
11
|
export type Operation = "chat.completions" | "completions" | "messages";
|
|
10
12
|
export type ObservationStatus = "success" | "error";
|
|
@@ -112,6 +114,59 @@ export interface WrapOptions {
|
|
|
112
114
|
* Example: `https://proxy.tensorcost.com`
|
|
113
115
|
*/
|
|
114
116
|
proxyUrl?: string;
|
|
117
|
+
/**
|
|
118
|
+
* Retry configuration. Applies to applied-mode proxy requests only.
|
|
119
|
+
* Observe-only telemetry posts do not retry (they are fire-and-forget).
|
|
120
|
+
*
|
|
121
|
+
* Defaults: maxAttempts=5, baseDelayMs=500, maxDelayMs=30 000.
|
|
122
|
+
* Set `maxAttempts: 1` to disable retries entirely.
|
|
123
|
+
*/
|
|
124
|
+
retry?: Partial<RetryConfig>;
|
|
125
|
+
/**
|
|
126
|
+
* Timeout for non-streaming proxy requests, in milliseconds.
|
|
127
|
+
* Default: 60 000 (60s). Surfaces as `TensorCostTimeoutError` (kind: "total").
|
|
128
|
+
*/
|
|
129
|
+
timeoutMs?: number;
|
|
130
|
+
/**
|
|
131
|
+
* Idle timeout for streaming proxy requests (no bytes received for N ms).
|
|
132
|
+
* Default: 30 000 (30s). Surfaces as `TensorCostTimeoutError` (kind: "idle").
|
|
133
|
+
*/
|
|
134
|
+
idleTimeoutMs?: number;
|
|
135
|
+
/**
|
|
136
|
+
* Optional lifecycle event callback. Fires on `before_request`,
|
|
137
|
+
* `after_response`, `on_retry`, `on_error`, and `on_fallback`.
|
|
138
|
+
* The payload contains only request metadata — never prompt / completion
|
|
139
|
+
* content or credentials. Errors in the callback are swallowed.
|
|
140
|
+
*/
|
|
141
|
+
onLifecycleEvent?: LifecycleEventCallback;
|
|
142
|
+
/**
|
|
143
|
+
* Fail-open circuit breaker for the proxy. When the proxy returns 5xx
|
|
144
|
+
* for `openThreshold` consecutive calls (default 3), the SDK routes
|
|
145
|
+
* subsequent calls directly to the upstream provider, bypassing the
|
|
146
|
+
* proxy. The circuit closes again after `closeThreshold` consecutive
|
|
147
|
+
* successful probe calls (default 5).
|
|
148
|
+
*
|
|
149
|
+
* Default: true (enabled). Set to false when running in-VPC with a
|
|
150
|
+
* sidecar proxy where direct-provider access is not available.
|
|
151
|
+
*
|
|
152
|
+
* When false, proxy 5xx errors surface as `TensorCostProxyError` with
|
|
153
|
+
* no automatic fallback.
|
|
154
|
+
*
|
|
155
|
+
* The fallback requires that the customer's provider SDK client has its
|
|
156
|
+
* original credentials intact (pre-wrap). If the client credentials are
|
|
157
|
+
* not available, the SDK throws `TensorCostProxyError` instead.
|
|
158
|
+
*/
|
|
159
|
+
failOpenEnabled?: boolean;
|
|
160
|
+
/**
|
|
161
|
+
* Provider API key used for the fail-open direct-provider fallback.
|
|
162
|
+
* Only relevant when `failOpenEnabled=true` and `appliedMode=true`.
|
|
163
|
+
*
|
|
164
|
+
* In most cases the SDK reads the provider key directly from the wrapped
|
|
165
|
+
* client (client.apiKey), so this is not needed. Supply it explicitly if
|
|
166
|
+
* the client exposes the key under a non-standard property name, or if
|
|
167
|
+
* you are using the SDK in a context where the client's key is unavailable.
|
|
168
|
+
*/
|
|
169
|
+
providerApiKey?: string;
|
|
115
170
|
}
|
|
116
171
|
export interface ResolvedConfig {
|
|
117
172
|
apiKey: string;
|
|
@@ -139,5 +194,11 @@ export interface ResolvedConfig {
|
|
|
139
194
|
* a config with `appliedMode=true` and `proxyUrl=null`.
|
|
140
195
|
*/
|
|
141
196
|
proxyUrl: string | null;
|
|
197
|
+
retry: RetryConfig;
|
|
198
|
+
timeoutMs: number;
|
|
199
|
+
idleTimeoutMs: number;
|
|
200
|
+
onLifecycleEvent: LifecycleEventCallback | undefined;
|
|
201
|
+
failOpenEnabled: boolean;
|
|
202
|
+
providerApiKey: string | null;
|
|
142
203
|
}
|
|
143
204
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG,kBAAkB,GAAG,aAAa,GAAG,UAAU,CAAC;AAExE,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;;;;;;;;;;OAiBG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;;;;;;;OAcG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/wrap.d.ts
CHANGED
|
@@ -10,6 +10,10 @@
|
|
|
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.
|
|
13
17
|
*/
|
|
14
18
|
import type { WrapOptions } from "./types.js";
|
|
15
19
|
export declare function wrap<T>(client: T, options?: WrapOptions): T;
|
package/dist/wrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../src/wrap.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../src/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAE,WAAgB,GAAG,CAAC,CA+D/D"}
|
package/dist/wrap.js
CHANGED
|
@@ -10,6 +10,10 @@
|
|
|
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.
|
|
13
17
|
*/
|
|
14
18
|
import { resolveConfig } from "./config.js";
|
|
15
19
|
import { ObservationTransport } from "./transport.js";
|
|
@@ -17,6 +21,7 @@ import { detectProvider } from "./providers/detect.js";
|
|
|
17
21
|
import { installAppliedMode } from "./applied.js";
|
|
18
22
|
import * as openaiProvider from "./providers/openai.js";
|
|
19
23
|
import * as anthropicProvider from "./providers/anthropic.js";
|
|
24
|
+
import { CircuitBreaker } from "./circuit.js";
|
|
20
25
|
export function wrap(client, options = {}) {
|
|
21
26
|
// resolveConfig throws MissingConfigError when apiKey is absent, and
|
|
22
27
|
// TensorCostConfigError when appliedMode=true with no proxyUrl.
|
|
@@ -37,11 +42,30 @@ export function wrap(client, options = {}) {
|
|
|
37
42
|
if (config.appliedMode && config.proxyUrl !== null) {
|
|
38
43
|
installAppliedMode(client, config.proxyUrl, provider);
|
|
39
44
|
}
|
|
45
|
+
// One circuit breaker per wrap() call — shared across all requests
|
|
46
|
+
// dispatched through this client instance.
|
|
47
|
+
const circuit = new CircuitBreaker();
|
|
40
48
|
if (provider === "openai") {
|
|
41
|
-
openaiProvider.install(client, transport, config.tenantId, config.environment, config.connectionId
|
|
49
|
+
openaiProvider.install(client, transport, config.tenantId, config.environment, config.connectionId, {
|
|
50
|
+
appliedMode: config.appliedMode,
|
|
51
|
+
proxyUrl: config.proxyUrl,
|
|
52
|
+
retry: config.retry,
|
|
53
|
+
timeoutMs: config.timeoutMs,
|
|
54
|
+
onLifecycleEvent: config.onLifecycleEvent,
|
|
55
|
+
failOpenEnabled: config.failOpenEnabled,
|
|
56
|
+
circuit,
|
|
57
|
+
});
|
|
42
58
|
}
|
|
43
59
|
else {
|
|
44
|
-
anthropicProvider.install(client, transport, config.tenantId, config.environment, config.connectionId
|
|
60
|
+
anthropicProvider.install(client, transport, config.tenantId, config.environment, config.connectionId, {
|
|
61
|
+
appliedMode: config.appliedMode,
|
|
62
|
+
proxyUrl: config.proxyUrl,
|
|
63
|
+
retry: config.retry,
|
|
64
|
+
timeoutMs: config.timeoutMs,
|
|
65
|
+
onLifecycleEvent: config.onLifecycleEvent,
|
|
66
|
+
failOpenEnabled: config.failOpenEnabled,
|
|
67
|
+
circuit,
|
|
68
|
+
});
|
|
45
69
|
}
|
|
46
70
|
return client;
|
|
47
71
|
}
|
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":"AAAA;;;;;;;;;;;;;;;;GAgBG;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;AAC9D,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,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,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,CAAC;QACN,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;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED