@metrxbot/sdk 0.1.0 → 0.2.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/README.md +81 -12
- package/dist/client.d.ts +26 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +75 -1
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/otel.d.ts +37 -0
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +56 -0
- package/dist/otel.js.map +1 -1
- package/dist/routing-gate.d.ts +49 -0
- package/dist/routing-gate.d.ts.map +1 -0
- package/dist/routing-gate.js +118 -0
- package/dist/routing-gate.js.map +1 -0
- package/dist/routing-policy-cache.d.ts +77 -0
- package/dist/routing-policy-cache.d.ts.map +1 -0
- package/dist/routing-policy-cache.js +96 -0
- package/dist/routing-policy-cache.js.map +1 -0
- package/dist/routing.d.ts +156 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +631 -0
- package/dist/routing.js.map +1 -0
- package/dist/task.d.ts +99 -0
- package/dist/task.d.ts.map +1 -0
- package/dist/task.js +104 -0
- package/dist/task.js.map +1 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,9 +28,7 @@ const client = new MetrxbotClient({
|
|
|
28
28
|
```typescript
|
|
29
29
|
const response = await client.chat({
|
|
30
30
|
model: 'gpt-4',
|
|
31
|
-
messages: [
|
|
32
|
-
{ role: 'user', content: 'What is 2+2?' }
|
|
33
|
-
],
|
|
31
|
+
messages: [{ role: 'user', content: 'What is 2+2?' }],
|
|
34
32
|
customerId: 'user-123', // optional, for tracking
|
|
35
33
|
sessionId: 'session-456', // optional, for tracking
|
|
36
34
|
});
|
|
@@ -45,9 +43,7 @@ console.log(`Latency: ${response._meta.latencyMs}ms`);
|
|
|
45
43
|
```typescript
|
|
46
44
|
const stream = client.chatStream({
|
|
47
45
|
model: 'gpt-4',
|
|
48
|
-
messages: [
|
|
49
|
-
{ role: 'user', content: 'Write a haiku' }
|
|
50
|
-
]
|
|
46
|
+
messages: [{ role: 'user', content: 'Write a haiku' }],
|
|
51
47
|
});
|
|
52
48
|
|
|
53
49
|
for await (const chunk of stream) {
|
|
@@ -63,9 +59,7 @@ for await (const chunk of stream) {
|
|
|
63
59
|
const response = await client.messages({
|
|
64
60
|
model: 'claude-3-sonnet',
|
|
65
61
|
max_tokens: 1024,
|
|
66
|
-
messages: [
|
|
67
|
-
{ role: 'user', content: 'Hello, Claude!' }
|
|
68
|
-
]
|
|
62
|
+
messages: [{ role: 'user', content: 'Hello, Claude!' }],
|
|
69
63
|
});
|
|
70
64
|
|
|
71
65
|
console.log(response.content[0].text);
|
|
@@ -76,7 +70,7 @@ console.log(response.content[0].text);
|
|
|
76
70
|
```typescript
|
|
77
71
|
const response = await client.embeddings({
|
|
78
72
|
model: 'text-embedding-3-small',
|
|
79
|
-
input: 'Hello world'
|
|
73
|
+
input: 'Hello world',
|
|
80
74
|
});
|
|
81
75
|
|
|
82
76
|
console.log(response.data[0].embedding);
|
|
@@ -94,7 +88,7 @@ console.log(health.version);
|
|
|
94
88
|
|
|
95
89
|
```typescript
|
|
96
90
|
const models = await client.models();
|
|
97
|
-
console.log(models.data.map(m => m.id));
|
|
91
|
+
console.log(models.data.map((m) => m.id));
|
|
98
92
|
```
|
|
99
93
|
|
|
100
94
|
## Configuration
|
|
@@ -160,7 +154,7 @@ import {
|
|
|
160
154
|
try {
|
|
161
155
|
const response = await client.chat({
|
|
162
156
|
model: 'gpt-4',
|
|
163
|
-
messages: [{ role: 'user', content: 'Hello' }]
|
|
157
|
+
messages: [{ role: 'user', content: 'Hello' }],
|
|
164
158
|
});
|
|
165
159
|
} catch (error) {
|
|
166
160
|
if (error instanceof AuthenticationError) {
|
|
@@ -202,6 +196,81 @@ interface MetrxbotMeta {
|
|
|
202
196
|
- Deno
|
|
203
197
|
- Modern browsers (with native fetch support)
|
|
204
198
|
|
|
199
|
+
## Cascade routing (v0.2.1, opt-in)
|
|
200
|
+
|
|
201
|
+
Delegate per-request model choice to Metrx **inside your own process** — your
|
|
202
|
+
provider keys never leave your environment, and prompt/output text is never
|
|
203
|
+
sent to Metrx (scores only).
|
|
204
|
+
|
|
205
|
+
```ts
|
|
206
|
+
import { MetrxbotClient, runWithPolicy } from '@metrxbot/sdk';
|
|
207
|
+
|
|
208
|
+
const metrx = new MetrxbotClient({ apiKey: process.env.METRX_API_KEY! });
|
|
209
|
+
|
|
210
|
+
const r = await runWithPolicy(metrx, {
|
|
211
|
+
agentKey: 'ask_fundry',
|
|
212
|
+
input: prompt,
|
|
213
|
+
// Your own provider call — your client, your keys.
|
|
214
|
+
// model === undefined ⇒ call your own default (day-0 pass-through).
|
|
215
|
+
callModel: (model, input) => callAnthropic(model ?? DEFAULT_MODEL, input),
|
|
216
|
+
// Cross-family checker (required before shadow/cascade modes are enabled):
|
|
217
|
+
checkerCaller: (model, task) => callOpenAI(model!, task),
|
|
218
|
+
});
|
|
219
|
+
use(r.output);
|
|
220
|
+
// Attach r.requestId to your telemetry events (request_id field) so cost
|
|
221
|
+
// joins work: it links llm_events ↔ optimization_decisions ↔ quality.
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Behavior is controlled server-side per agent (`routing_policies`): with no
|
|
225
|
+
policy row every call is an exact pass-through. Modes advance
|
|
226
|
+
`pass_through → shadow_sample → cascade`, each gated by evidence. **Every
|
|
227
|
+
seam fails open** — no code path throws an error your own
|
|
228
|
+
`callModel(prodModel)` would not have thrown. Kill switches: server policy
|
|
229
|
+
`enabled=false`, env `METRX_ROUTING_DISABLED=true`, `min_sdk_version`.
|
|
230
|
+
|
|
231
|
+
Not supported in v1: streaming call sites (keep them on their original path).
|
|
232
|
+
|
|
233
|
+
### Tagging telemetry via `ctx` (v0.2.1)
|
|
234
|
+
|
|
235
|
+
Both `callModel` and `checkerCaller` receive an optional third argument, a
|
|
236
|
+
`ModelCallContext`, on every provider call the router makes. It's purely
|
|
237
|
+
informational — the router serves exactly the same thing whether or not you
|
|
238
|
+
read it — but it lets your own instrumentation stamp routing tags on the
|
|
239
|
+
provider call so cascade cost SUMs join across
|
|
240
|
+
`llm_events ↔ optimization_decisions ↔ quality`, and skip the background
|
|
241
|
+
shadow candidate so it never lands on your cost dashboard.
|
|
242
|
+
|
|
243
|
+
```ts
|
|
244
|
+
import { runWithPolicy, type ModelCallContext } from '@metrxbot/sdk';
|
|
245
|
+
|
|
246
|
+
const r = await runWithPolicy(metrx, {
|
|
247
|
+
agentKey: 'ask_fundry',
|
|
248
|
+
input: prompt,
|
|
249
|
+
callModel: (model, input, ctx?: ModelCallContext) => {
|
|
250
|
+
// Don't record the background shadow candidate — it's never served and
|
|
251
|
+
// would double-count on your cost dashboard.
|
|
252
|
+
const record = ctx?.phase !== 'shadow_candidate';
|
|
253
|
+
return callAnthropic(model ?? DEFAULT_MODEL, input, {
|
|
254
|
+
// Stamp the same request_id the decision/quality rows carry, plus the
|
|
255
|
+
// experiment id + arm, so your cost query joins on all three.
|
|
256
|
+
tags: record
|
|
257
|
+
? {
|
|
258
|
+
request_id: ctx?.requestId,
|
|
259
|
+
experiment_id: ctx?.experimentId,
|
|
260
|
+
arm: ctx?.arm, // 'control' | 'treatment'
|
|
261
|
+
phase: ctx?.phase, // 'primary' | 'candidate' | 'escalation' | 'checker' | 'shadow_candidate'
|
|
262
|
+
}
|
|
263
|
+
: undefined,
|
|
264
|
+
});
|
|
265
|
+
},
|
|
266
|
+
checkerCaller: (model, task, ctx) => callOpenAI(model!, task), // ctx.phase === 'checker'
|
|
267
|
+
});
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
`ctx` is optional and additive: existing two-arg `callModel`/`checkerCaller`
|
|
271
|
+
closures keep working unchanged (the extra argument is simply ignored).
|
|
272
|
+
`ctx.requestId` always equals `RunWithPolicyResult.requestId`.
|
|
273
|
+
|
|
205
274
|
## License
|
|
206
275
|
|
|
207
276
|
MIT
|
package/dist/client.d.ts
CHANGED
|
@@ -3,9 +3,17 @@
|
|
|
3
3
|
* Main SDK client for interacting with the Metrx gateway
|
|
4
4
|
*/
|
|
5
5
|
import { MetrxbotConfig, ChatCompletionParams, ChatCompletionResponse, EmbeddingsParams, EmbeddingsResponse, HealthResponse, MessagesParams, MessagesResponse, ModelsResponse, StreamChunk } from './types';
|
|
6
|
+
import { type TaskOutcome } from './task';
|
|
7
|
+
export interface SubmitOutcomeResponse {
|
|
8
|
+
outcome_id: string;
|
|
9
|
+
task_id: string;
|
|
10
|
+
source: 'sdk_asserted';
|
|
11
|
+
confidence_tier: 'human_verified';
|
|
12
|
+
}
|
|
6
13
|
export declare class MetrxbotClient {
|
|
7
14
|
private apiKey;
|
|
8
15
|
private gatewayUrl;
|
|
16
|
+
private apiUrl;
|
|
9
17
|
private defaultAgentId?;
|
|
10
18
|
private defaultProvider?;
|
|
11
19
|
private timeout;
|
|
@@ -46,6 +54,24 @@ export declare class MetrxbotClient {
|
|
|
46
54
|
* Internal: Build request headers
|
|
47
55
|
*/
|
|
48
56
|
private buildHeaders;
|
|
57
|
+
/**
|
|
58
|
+
* Submit an SDK-asserted outcome for a completed task. Calls
|
|
59
|
+
* `POST {apiUrl}/api/v1/tasks/:task_id/outcome` (Session 3 endpoint).
|
|
60
|
+
*
|
|
61
|
+
* Idempotent server-side via UNIQUE(org_id, source, reference_id);
|
|
62
|
+
* re-submitting with the same task_id updates rather than duplicates.
|
|
63
|
+
*
|
|
64
|
+
* Prefer calling this through `task()` which handles it automatically.
|
|
65
|
+
*/
|
|
66
|
+
/**
|
|
67
|
+
* @internal Narrow credential accessor for the routing module (routing.ts).
|
|
68
|
+
* Not part of the public API surface — do not use in application code.
|
|
69
|
+
*/
|
|
70
|
+
getRoutingCredentials(): {
|
|
71
|
+
apiUrl: string;
|
|
72
|
+
apiKey: string;
|
|
73
|
+
};
|
|
74
|
+
submitOutcome(taskId: string, outcome: TaskOutcome): Promise<SubmitOutcomeResponse>;
|
|
49
75
|
/**
|
|
50
76
|
* Internal: Extract metadata from response headers
|
|
51
77
|
*/
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,cAAc,EAEd,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,cAAc,EAEd,WAAW,EACZ,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,cAAc,EAEd,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,cAAc,EAEd,WAAW,EACZ,MAAM,SAAS,CAAC;AASjB,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAMzD,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,gBAAgB,CAAC;CACnC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,cAAc;IAuBlC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC;IAIvC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC;IAIvC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IASzE;;OAEG;IACI,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,aAAa,CAAC,WAAW,CAAC;IAyD3E;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIjE;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIvE;;OAEG;YACW,OAAO;IAsBrB;;OAEG;YACW,QAAQ;IAsCtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAwCpB;;;;;;;;OAQG;IACH;;;OAGG;IACH,qBAAqB,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAIrD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAwCzF;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;YACW,mBAAmB;CAiClC"}
|
package/dist/client.js
CHANGED
|
@@ -3,11 +3,14 @@
|
|
|
3
3
|
* Main SDK client for interacting with the Metrx gateway
|
|
4
4
|
*/
|
|
5
5
|
import { MetrxbotError, AuthenticationError, GatewayError, RateLimitError, TimeoutError, ValidationError, } from './errors';
|
|
6
|
+
import { currentTaskId } from './task';
|
|
6
7
|
const DEFAULT_GATEWAY_URL = 'https://gateway.metrxbot.com';
|
|
8
|
+
const DEFAULT_API_URL = 'https://metrxbot.com';
|
|
7
9
|
const DEFAULT_TIMEOUT = 30000; // 30 seconds
|
|
8
10
|
export class MetrxbotClient {
|
|
9
11
|
apiKey;
|
|
10
12
|
gatewayUrl;
|
|
13
|
+
apiUrl;
|
|
11
14
|
defaultAgentId;
|
|
12
15
|
defaultProvider;
|
|
13
16
|
timeout;
|
|
@@ -17,6 +20,17 @@ export class MetrxbotClient {
|
|
|
17
20
|
}
|
|
18
21
|
this.apiKey = config.apiKey;
|
|
19
22
|
this.gatewayUrl = config.gatewayUrl || DEFAULT_GATEWAY_URL;
|
|
23
|
+
this.apiUrl = config.apiUrl || DEFAULT_API_URL;
|
|
24
|
+
// The apiUrl receives the Bearer API key on submitOutcome(). Reject
|
|
25
|
+
// plaintext http:// so a misconfigured SDK cannot leak credentials
|
|
26
|
+
// to an attacker-controlled origin. localhost/127.0.0.1 is allowed
|
|
27
|
+
// unencrypted to keep local dev ergonomics.
|
|
28
|
+
if (!/^https:\/\//i.test(this.apiUrl)) {
|
|
29
|
+
const isLocal = /^http:\/\/(localhost|127\.0\.0\.1)(:|\/|$)/i.test(this.apiUrl);
|
|
30
|
+
if (!isLocal) {
|
|
31
|
+
throw new ValidationError('apiUrl must use https:// (got: ' + this.apiUrl + ')');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
20
34
|
this.defaultAgentId = config.defaultAgentId;
|
|
21
35
|
this.defaultProvider = config.defaultProvider;
|
|
22
36
|
this.timeout = config.timeout || DEFAULT_TIMEOUT;
|
|
@@ -170,8 +184,67 @@ export class MetrxbotClient {
|
|
|
170
184
|
if (provider) {
|
|
171
185
|
headers['X-Provider'] = provider;
|
|
172
186
|
}
|
|
187
|
+
// Session 4: task() AsyncLocalStorage → X-Task-Id. Explicit
|
|
188
|
+
// options.taskId always wins so advanced callers can override.
|
|
189
|
+
// Gateway reads this header and writes it to llm_events.task_id
|
|
190
|
+
// (migration 056).
|
|
191
|
+
const taskId = options?.taskId ?? currentTaskId();
|
|
192
|
+
if (taskId) {
|
|
193
|
+
headers['X-Task-Id'] = taskId;
|
|
194
|
+
}
|
|
173
195
|
return headers;
|
|
174
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Submit an SDK-asserted outcome for a completed task. Calls
|
|
199
|
+
* `POST {apiUrl}/api/v1/tasks/:task_id/outcome` (Session 3 endpoint).
|
|
200
|
+
*
|
|
201
|
+
* Idempotent server-side via UNIQUE(org_id, source, reference_id);
|
|
202
|
+
* re-submitting with the same task_id updates rather than duplicates.
|
|
203
|
+
*
|
|
204
|
+
* Prefer calling this through `task()` which handles it automatically.
|
|
205
|
+
*/
|
|
206
|
+
/**
|
|
207
|
+
* @internal Narrow credential accessor for the routing module (routing.ts).
|
|
208
|
+
* Not part of the public API surface — do not use in application code.
|
|
209
|
+
*/
|
|
210
|
+
getRoutingCredentials() {
|
|
211
|
+
return { apiUrl: this.apiUrl, apiKey: this.apiKey };
|
|
212
|
+
}
|
|
213
|
+
async submitOutcome(taskId, outcome) {
|
|
214
|
+
if (!taskId || typeof taskId !== 'string') {
|
|
215
|
+
throw new ValidationError('taskId is required');
|
|
216
|
+
}
|
|
217
|
+
const url = `${this.apiUrl}/api/v1/tasks/${encodeURIComponent(taskId)}/outcome`;
|
|
218
|
+
const headers = {
|
|
219
|
+
'Content-Type': 'application/json',
|
|
220
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
221
|
+
};
|
|
222
|
+
const controller = new AbortController();
|
|
223
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
224
|
+
let response;
|
|
225
|
+
try {
|
|
226
|
+
response = await fetch(url, {
|
|
227
|
+
method: 'POST',
|
|
228
|
+
headers,
|
|
229
|
+
body: JSON.stringify(outcome),
|
|
230
|
+
signal: controller.signal,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
235
|
+
throw new TimeoutError(`Outcome submission timeout after ${this.timeout}ms`);
|
|
236
|
+
}
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
clearTimeout(timeoutId);
|
|
241
|
+
}
|
|
242
|
+
if (!response.ok) {
|
|
243
|
+
await this.handleErrorResponse(response);
|
|
244
|
+
}
|
|
245
|
+
const body = (await response.json());
|
|
246
|
+
return body.data;
|
|
247
|
+
}
|
|
175
248
|
/**
|
|
176
249
|
* Internal: Extract metadata from response headers
|
|
177
250
|
*/
|
|
@@ -205,9 +278,10 @@ export class MetrxbotClient {
|
|
|
205
278
|
throw new ValidationError(errorMessage, requestId);
|
|
206
279
|
case 401:
|
|
207
280
|
throw new AuthenticationError(errorMessage, requestId);
|
|
208
|
-
case 429:
|
|
281
|
+
case 429: {
|
|
209
282
|
const retryAfter = response.headers.get('Retry-After');
|
|
210
283
|
throw new RateLimitError(errorMessage, retryAfter || undefined, requestId);
|
|
284
|
+
}
|
|
211
285
|
case 502:
|
|
212
286
|
case 504:
|
|
213
287
|
throw new GatewayError(errorMessage, response.status, requestId);
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,eAAe,GAChB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,15 @@
|
|
|
3
3
|
* TypeScript SDK for integrating with Metrx gateway
|
|
4
4
|
*/
|
|
5
5
|
export { MetrxbotClient } from './client';
|
|
6
|
-
export {
|
|
6
|
+
export type { SubmitOutcomeResponse } from './client';
|
|
7
|
+
export { task, currentTaskId } from './task';
|
|
8
|
+
export type { TaskContext, TaskOutcome, TaskOptions, OutcomeSubmitter, BenchLytixCategory, } from './task';
|
|
9
|
+
export { MetrxbotSpanExporter, MetrxbotSpanProcessor, METRX_TASK_ID_ATTR } from './otel';
|
|
10
|
+
export { runWithPolicy, routerFor, MetrxRouter, semverLt, SDK_VERSION } from './routing';
|
|
11
|
+
export type { ModelCaller, ModelCallContext, ModelCallResult, ClientJudge, RunWithPolicyOptions, RunWithPolicyResult, RouterConfig, } from './routing';
|
|
12
|
+
export type { RoutingPolicy } from './routing-policy-cache';
|
|
13
|
+
export { runValidators, parseScore } from './routing-gate';
|
|
14
|
+
export type { ValidatorConfig, GateOutcome } from './routing-gate';
|
|
7
15
|
export type { MetrxbotConfig, MetrxbotMeta, RequestOptions, ChatCompletionParams, ChatCompletionResponse, ChatMessage, ChatChoice, StreamChunk, StreamChoice, MessagesParams, MessagesResponse, AnthropicMessage, AnthropicContent, MessageContent, EmbeddingsParams, EmbeddingsResponse, Embedding, HealthResponse, ModelsResponse, Model, APIError, OtelExporterConfig, } from './types';
|
|
8
16
|
export { MetrxbotError, AuthenticationError, RateLimitError, GatewayError, ValidationError, TimeoutError, isMetrxbotError, } from './errors';
|
|
9
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAGtD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC7C,YAAY,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,QAAQ,CAAC;AAKhB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAKzF,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACzF,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,GACb,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGnE,YAAY,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,WAAW,EACX,UAAU,EACV,WAAW,EACX,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,cAAc,EACd,KAAK,EACL,QAAQ,EACR,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,eAAe,GAChB,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,8 +3,17 @@
|
|
|
3
3
|
* TypeScript SDK for integrating with Metrx gateway
|
|
4
4
|
*/
|
|
5
5
|
export { MetrxbotClient } from './client';
|
|
6
|
-
//
|
|
7
|
-
export {
|
|
6
|
+
// Session 4: task() context + outcome correlation
|
|
7
|
+
export { task, currentTaskId } from './task';
|
|
8
|
+
// OpenTelemetry Exporter + task-correlation processor (Phase 2). Install the
|
|
9
|
+
// processor ALONGSIDE the exporter so task() ids survive BatchSpanProcessor's
|
|
10
|
+
// deferred flush (see MetrxbotSpanProcessor).
|
|
11
|
+
export { MetrxbotSpanExporter, MetrxbotSpanProcessor, METRX_TASK_ID_ATTR } from './otel';
|
|
12
|
+
// Cascade routing (Phase 1 S2 — docs/roi-engine-cascade-sdk-phase1-spec.md §5).
|
|
13
|
+
// Additive: existing telemetry API is untouched. Complete responses only —
|
|
14
|
+
// streaming call sites must stay on their original path.
|
|
15
|
+
export { runWithPolicy, routerFor, MetrxRouter, semverLt, SDK_VERSION } from './routing';
|
|
16
|
+
export { runValidators, parseScore } from './routing-gate';
|
|
8
17
|
// Errors
|
|
9
18
|
export { MetrxbotError, AuthenticationError, RateLimitError, GatewayError, ValidationError, TimeoutError, isMetrxbotError, } from './errors';
|
|
10
19
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,kDAAkD;AAClD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAS7C,6EAA6E;AAC7E,8EAA8E;AAC9E,8CAA8C;AAC9C,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAEzF,gFAAgF;AAChF,2EAA2E;AAC3E,yDAAyD;AACzD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAWzF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA6B3D,SAAS;AACT,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,eAAe,GAChB,MAAM,UAAU,CAAC"}
|
package/dist/otel.d.ts
CHANGED
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
* Uses duck typing to avoid @opentelemetry dependencies (zero-dependency SDK).
|
|
6
6
|
*/
|
|
7
7
|
import type { OtelExporterConfig } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Span attribute carrying the Metrx task() correlation id. Stamped at span
|
|
10
|
+
* lifecycle time (in the task ALS context) by MetrxbotSpanProcessor and read by
|
|
11
|
+
* the exporter at flush time — see the "silent-zero-value-arms" note below.
|
|
12
|
+
*/
|
|
13
|
+
export declare const METRX_TASK_ID_ATTR = "metrxbot.task_id";
|
|
8
14
|
/**
|
|
9
15
|
* Minimal SpanExporter interface (duck-typed from OpenTelemetry)
|
|
10
16
|
*/
|
|
@@ -111,5 +117,36 @@ export declare class MetrxbotSpanExporter implements SpanExporter {
|
|
|
111
117
|
*/
|
|
112
118
|
private sendEvents;
|
|
113
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Minimal writable-span shape (duck-typed from OpenTelemetry's Span). onStart
|
|
122
|
+
* receives a live, writable span; setAttribute is the public API, but we also
|
|
123
|
+
* tolerate direct attribute mutation for exotic span implementations.
|
|
124
|
+
*/
|
|
125
|
+
interface StartableSpan {
|
|
126
|
+
setAttribute?: (key: string, value: string) => void;
|
|
127
|
+
attributes?: Record<string, unknown>;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* MetrxbotSpanProcessor — stamps the current task() id onto each span as it
|
|
131
|
+
* starts, WHILE the task AsyncLocalStorage context is still live.
|
|
132
|
+
*
|
|
133
|
+
* Why a processor (not just the exporter): under the default NodeSDK wiring
|
|
134
|
+
* (BatchSpanProcessor), the exporter's export() runs later on a flush timer,
|
|
135
|
+
* OUTSIDE the task context — so reading currentTaskId() there returns undefined
|
|
136
|
+
* for every span (the silent-zero-value-arms trap). onStart runs synchronously
|
|
137
|
+
* at span creation, inside the caller's context, so the id is captured onto the
|
|
138
|
+
* span and survives the deferred flush. Install it ALONGSIDE the exporter:
|
|
139
|
+
*
|
|
140
|
+
* provider.addSpanProcessor(new MetrxbotSpanProcessor());
|
|
141
|
+
* provider.addSpanProcessor(new BatchSpanProcessor(new MetrxbotSpanExporter({...})));
|
|
142
|
+
*
|
|
143
|
+
* No-op for spans started outside any task() (backward compatible).
|
|
144
|
+
*/
|
|
145
|
+
export declare class MetrxbotSpanProcessor {
|
|
146
|
+
onStart(span: StartableSpan): void;
|
|
147
|
+
onEnd(): void;
|
|
148
|
+
shutdown(): Promise<void>;
|
|
149
|
+
forceFlush(): Promise<void>;
|
|
150
|
+
}
|
|
114
151
|
export {};
|
|
115
152
|
//# sourceMappingURL=otel.d.ts.map
|
package/dist/otel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"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"}
|
package/dist/otel.js
CHANGED
|
@@ -4,6 +4,13 @@
|
|
|
4
4
|
* Exports LLM-related spans to Metrx's event ingestion API.
|
|
5
5
|
* Uses duck typing to avoid @opentelemetry dependencies (zero-dependency SDK).
|
|
6
6
|
*/
|
|
7
|
+
import { currentTaskId } from './task';
|
|
8
|
+
/**
|
|
9
|
+
* Span attribute carrying the Metrx task() correlation id. Stamped at span
|
|
10
|
+
* lifecycle time (in the task ALS context) by MetrxbotSpanProcessor and read by
|
|
11
|
+
* the exporter at flush time — see the "silent-zero-value-arms" note below.
|
|
12
|
+
*/
|
|
13
|
+
export const METRX_TASK_ID_ATTR = 'metrxbot.task_id';
|
|
7
14
|
/**
|
|
8
15
|
* Export result status codes
|
|
9
16
|
*/
|
|
@@ -116,6 +123,17 @@ export class MetrxbotSpanExporter {
|
|
|
116
123
|
trace_id: spanContext.traceId,
|
|
117
124
|
span_id: spanContext.spanId,
|
|
118
125
|
};
|
|
126
|
+
// Task correlation (Phase 2). PREFER the attribute stamped by
|
|
127
|
+
// MetrxbotSpanProcessor.onEnd (run synchronously at span.end(), INSIDE the
|
|
128
|
+
// task ALS context — correct under BatchSpanProcessor, the default NodeSDK
|
|
129
|
+
// wiring, where export() runs later on the flush timer OUTSIDE the context).
|
|
130
|
+
// Fall back to currentTaskId() so SimpleSpanProcessor / direct-export users
|
|
131
|
+
// (export() invoked in-context) still work with no processor installed.
|
|
132
|
+
const stamped = span.attributes?.[METRX_TASK_ID_ATTR];
|
|
133
|
+
const taskId = typeof stamped === 'string' && stamped ? stamped : currentTaskId();
|
|
134
|
+
if (taskId) {
|
|
135
|
+
event.task_id = taskId;
|
|
136
|
+
}
|
|
119
137
|
// Add optional fields
|
|
120
138
|
if (this.agentId) {
|
|
121
139
|
event.agent_id = this.agentId;
|
|
@@ -246,4 +264,42 @@ export class MetrxbotSpanExporter {
|
|
|
246
264
|
}
|
|
247
265
|
}
|
|
248
266
|
}
|
|
267
|
+
/**
|
|
268
|
+
* MetrxbotSpanProcessor — stamps the current task() id onto each span as it
|
|
269
|
+
* starts, WHILE the task AsyncLocalStorage context is still live.
|
|
270
|
+
*
|
|
271
|
+
* Why a processor (not just the exporter): under the default NodeSDK wiring
|
|
272
|
+
* (BatchSpanProcessor), the exporter's export() runs later on a flush timer,
|
|
273
|
+
* OUTSIDE the task context — so reading currentTaskId() there returns undefined
|
|
274
|
+
* for every span (the silent-zero-value-arms trap). onStart runs synchronously
|
|
275
|
+
* at span creation, inside the caller's context, so the id is captured onto the
|
|
276
|
+
* span and survives the deferred flush. Install it ALONGSIDE the exporter:
|
|
277
|
+
*
|
|
278
|
+
* provider.addSpanProcessor(new MetrxbotSpanProcessor());
|
|
279
|
+
* provider.addSpanProcessor(new BatchSpanProcessor(new MetrxbotSpanExporter({...})));
|
|
280
|
+
*
|
|
281
|
+
* No-op for spans started outside any task() (backward compatible).
|
|
282
|
+
*/
|
|
283
|
+
export class MetrxbotSpanProcessor {
|
|
284
|
+
onStart(span) {
|
|
285
|
+
const taskId = currentTaskId();
|
|
286
|
+
if (!taskId)
|
|
287
|
+
return;
|
|
288
|
+
if (typeof span.setAttribute === 'function') {
|
|
289
|
+
span.setAttribute(METRX_TASK_ID_ATTR, taskId);
|
|
290
|
+
}
|
|
291
|
+
else if (span.attributes && typeof span.attributes === 'object') {
|
|
292
|
+
span.attributes[METRX_TASK_ID_ATTR] = taskId;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
onEnd() {
|
|
296
|
+
// Span already carries the attribute from onStart; nothing to do at end.
|
|
297
|
+
}
|
|
298
|
+
async shutdown() {
|
|
299
|
+
// No buffered state — the exporter owns flushing.
|
|
300
|
+
}
|
|
301
|
+
async forceFlush() {
|
|
302
|
+
// No buffered state.
|
|
303
|
+
}
|
|
304
|
+
}
|
|
249
305
|
//# sourceMappingURL=otel.js.map
|
package/dist/otel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confidence gate for the SDK cascade (spec §5.3): G1 structural validators
|
|
3
|
+
* (zero-cost floor) + G4 cheap checker call (the primary signal).
|
|
4
|
+
*
|
|
5
|
+
* Gate contract: any error or timeout inside the gate means ESCALATE — the
|
|
6
|
+
* gate fails toward quality, never toward serving an unchecked answer (F5).
|
|
7
|
+
*/
|
|
8
|
+
import type { ModelCaller, ModelCallContext } from './routing';
|
|
9
|
+
export interface ValidatorConfig {
|
|
10
|
+
/** Output must JSON.parse. */
|
|
11
|
+
require_json?: boolean;
|
|
12
|
+
/** With require_json: these top-level fields must be present. */
|
|
13
|
+
required_fields?: string[];
|
|
14
|
+
min_length?: number;
|
|
15
|
+
max_length?: number;
|
|
16
|
+
/** Output must match this pattern (e.g. a citation marker). */
|
|
17
|
+
regex?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface GateOutcome {
|
|
20
|
+
/** Composite score in [0,1]; 0 when a validator hard-fails. */
|
|
21
|
+
score: number;
|
|
22
|
+
/** True when the candidate answer may be served (score >= threshold). */
|
|
23
|
+
pass: boolean;
|
|
24
|
+
/** Why the gate escalated, for decision-row telemetry. */
|
|
25
|
+
reason?: string;
|
|
26
|
+
}
|
|
27
|
+
/** G1 — structural validators. Cheap, high-precision, low-recall. */
|
|
28
|
+
export declare function runValidators(output: string, config: ValidatorConfig | undefined): {
|
|
29
|
+
pass: boolean;
|
|
30
|
+
reason?: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* G4 — cheap checker call via the customer-supplied checkerCaller.
|
|
34
|
+
* Throws on any failure (timeout, unparsable verdict) — the caller escalates.
|
|
35
|
+
*/
|
|
36
|
+
export declare function runChecker(opts: {
|
|
37
|
+
checkerCaller: ModelCaller;
|
|
38
|
+
checkerModel: string;
|
|
39
|
+
input: unknown;
|
|
40
|
+
output: string;
|
|
41
|
+
rubric?: string;
|
|
42
|
+
timeoutMs: number;
|
|
43
|
+
/** v0.2.1: forwarded to the checkerCaller as its 3rd arg (phase: 'checker'). */
|
|
44
|
+
ctx?: ModelCallContext;
|
|
45
|
+
}): Promise<number>;
|
|
46
|
+
/** Extract {"score": x} from checker output, tolerating stray text. */
|
|
47
|
+
export declare function parseScore(text: string): number | null;
|
|
48
|
+
export declare function withTimeout<T>(promise: Promise<T>, ms: number, label: string): Promise<T>;
|
|
49
|
+
//# sourceMappingURL=routing-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing-gate.d.ts","sourceRoot":"","sources":["../src/routing-gate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,IAAI,EAAE,OAAO,CAAC;IACd,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAuCpC;AAQD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,aAAa,EAAE,WAAW,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,GAAG,CAAC,EAAE,gBAAgB,CAAC;CACxB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlB;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUtD;AAgBD,wBAAsB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAY/F"}
|