@mupt-ai/dari-router 0.2.5 → 1.0.290

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 (48) hide show
  1. package/README.md +148 -55
  2. package/dist/auto_router.d.ts +1 -1
  3. package/dist/auto_router.js.map +1 -1
  4. package/dist/cache_scope.js +5 -5
  5. package/dist/cache_scope.js.map +1 -1
  6. package/dist/dari_policy.d.ts +0 -3
  7. package/dist/dari_policy.js +2 -2
  8. package/dist/dari_policy.js.map +1 -1
  9. package/dist/eval_score_imputation.js +2 -0
  10. package/dist/eval_score_imputation.js.map +1 -1
  11. package/dist/framework_router.d.ts +2 -1
  12. package/dist/framework_router.js +264 -47
  13. package/dist/framework_router.js.map +1 -1
  14. package/dist/framework_types.d.ts +9 -0
  15. package/dist/framework_validation.js +1 -0
  16. package/dist/framework_validation.js.map +1 -1
  17. package/dist/gateway_executor.d.ts +16 -0
  18. package/dist/gateway_executor.js +523 -0
  19. package/dist/gateway_executor.js.map +1 -0
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.js +1 -1
  22. package/dist/index.js.map +1 -1
  23. package/examples/auto_router.ts +16 -11
  24. package/examples/basic_route.ts +19 -19
  25. package/examples/lease_stores.ts +21 -15
  26. package/examples/managed/README.md +3 -4
  27. package/examples/managed/byok-router/router.yml +4 -4
  28. package/examples/managed/custom-rules-router/router.yml +9 -9
  29. package/examples/managed/dari/router.yml +3 -2
  30. package/package.json +5 -14
  31. package/dist/pi_context.d.ts +0 -4
  32. package/dist/pi_context.js +0 -237
  33. package/dist/pi_context.js.map +0 -1
  34. package/dist/pi_options.d.ts +0 -3
  35. package/dist/pi_options.js +0 -300
  36. package/dist/pi_options.js.map +0 -1
  37. package/dist/pi_output.d.ts +0 -4
  38. package/dist/pi_output.js +0 -328
  39. package/dist/pi_output.js.map +0 -1
  40. package/dist/pi_runtime.d.ts +0 -3
  41. package/dist/pi_runtime.js +0 -163
  42. package/dist/pi_runtime.js.map +0 -1
  43. package/dist/pi_types.d.ts +0 -35
  44. package/dist/pi_types.js +0 -2
  45. package/dist/pi_types.js.map +0 -1
  46. package/examples/managed/eval-router/README.md +0 -18
  47. package/examples/managed/eval-router/router.yml +0 -11
  48. package/examples/pi_runtime.ts +0 -55
@@ -0,0 +1,523 @@
1
+ // Executes the router's selected model on a Dari gateway.
2
+ //
3
+ // The router owns selection and leases; the gateway owns credentials,
4
+ // subscriptions, provider calls, and credential-level failover. The executor
5
+ // sends each request as a pinned `dari/model/<id>` call, which the gateway
6
+ // serves without its own selector or leases.
7
+ //
8
+ // It speaks the gateway's Anthropic Messages wire: that is the only gateway
9
+ // wire whose stream closes each thinking block with its continuation
10
+ // envelope before the next block starts, which the router's stream contract
11
+ // requires. Requests the wire cannot express fail with an explicit error
12
+ // rather than being silently altered.
13
+ import { decodeUntrustedProviderContinuationState, encodeProviderContinuationState, } from "./continuation_state.js";
14
+ import { RouterFrameworkError } from "./framework_error.js";
15
+ import { decodeUntrustedPortableReasoningState, encodePortableReasoningState, } from "./portable_reasoning_state.js";
16
+ import { isRecord } from "./types.js";
17
+ export function createGatewayExecutor(options) {
18
+ const baseUrl = options.baseUrl?.trim().replace(/\/+$/, "");
19
+ if (!baseUrl) {
20
+ throw new RouterFrameworkError("configuration", "createGatewayExecutor requires a baseUrl.", "gateway_base_url_missing");
21
+ }
22
+ const apiKey = options.apiKey?.trim();
23
+ if (!apiKey) {
24
+ throw new RouterFrameworkError("configuration", "createGatewayExecutor requires an apiKey.", "gateway_api_key_missing");
25
+ }
26
+ const defaultMaxOutputTokens = options.defaultMaxOutputTokens;
27
+ if (defaultMaxOutputTokens !== undefined &&
28
+ (!Number.isSafeInteger(defaultMaxOutputTokens) || defaultMaxOutputTokens <= 0)) {
29
+ throw new RouterFrameworkError("configuration", "createGatewayExecutor defaultMaxOutputTokens must be a positive integer.", "gateway_max_output_tokens_invalid");
30
+ }
31
+ const fetchImpl = options.fetch ?? ((url, init) => fetch(url, init));
32
+ return {
33
+ async execute({ request, model, decision, signal }) {
34
+ const body = gatewayMessagesBody(request, {
35
+ modelId: model.id,
36
+ reasoningEffort: decision.reasoningEffort,
37
+ defaultMaxOutputTokens,
38
+ });
39
+ let response;
40
+ try {
41
+ response = await fetchImpl(`${baseUrl}/v1/messages`, {
42
+ method: "POST",
43
+ headers: {
44
+ Authorization: `Bearer ${apiKey}`,
45
+ "Content-Type": "application/json",
46
+ },
47
+ body: JSON.stringify(body),
48
+ signal,
49
+ });
50
+ }
51
+ catch (error) {
52
+ if (signal.aborted)
53
+ throw error;
54
+ throw new RouterFrameworkError("executor", `Gateway request failed: ${errorMessage(error)}`, "gateway_request_failed", undefined, { cause: error });
55
+ }
56
+ if (!response.ok)
57
+ throw await gatewayHttpError(response);
58
+ if (!request.stream) {
59
+ return { type: "complete", output: gatewayCompletion(await response.json()) };
60
+ }
61
+ if (response.body === null) {
62
+ throw new RouterFrameworkError("executor", "Gateway returned an empty stream.", "gateway_stream_empty");
63
+ }
64
+ return { type: "stream", events: gatewayStreamEvents(response.body) };
65
+ },
66
+ };
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Request: RouterRequest -> gateway Anthropic Messages body
70
+ export function gatewayMessagesBody(request, args) {
71
+ const maxTokens = request.generation.maxOutputTokens ?? args.defaultMaxOutputTokens;
72
+ if (maxTokens === undefined) {
73
+ throw unrepresentable("The request sets no output token limit and the gateway executor has no defaultMaxOutputTokens.", "max_tokens");
74
+ }
75
+ const temperature = request.generation.temperature;
76
+ if (temperature !== undefined && temperature > 1) {
77
+ throw unrepresentable("Temperatures above 1 cannot be sent to the gateway executor.", "temperature");
78
+ }
79
+ const stop = request.generation.stop;
80
+ const { system, messages } = gatewayMessages(request.items);
81
+ const toolChoice = gatewayToolChoice(request);
82
+ const metadata = gatewayMetadata(request);
83
+ const responseFormat = gatewayResponseFormat(request);
84
+ return {
85
+ model: `dari/model/${args.modelId}`,
86
+ max_tokens: maxTokens,
87
+ ...(system.length === 0 ? {} : { system }),
88
+ messages,
89
+ ...(request.tools.length === 0
90
+ ? {}
91
+ : {
92
+ tools: request.tools.map((tool) => ({
93
+ name: tool.name,
94
+ ...(tool.description === undefined ? {} : { description: tool.description }),
95
+ input_schema: tool.inputSchema,
96
+ ...(tool.strict === undefined ? {} : { strict: tool.strict }),
97
+ })),
98
+ }),
99
+ ...(toolChoice === undefined ? {} : { tool_choice: toolChoice }),
100
+ ...reasoningFields(args.reasoningEffort, responseFormat, request.reasoning?.budgetTokens),
101
+ ...(temperature === undefined ? {} : { temperature }),
102
+ ...(request.generation.topP === undefined ? {} : { top_p: request.generation.topP }),
103
+ ...(stop === undefined ? {} : { stop_sequences: typeof stop === "string" ? [stop] : stop }),
104
+ ...(request.stream ? { stream: true } : {}),
105
+ ...(metadata === undefined ? {} : { metadata }),
106
+ };
107
+ }
108
+ function gatewayMessages(items) {
109
+ const system = [];
110
+ const messages = [];
111
+ const append = (role, blocks) => {
112
+ const last = messages.at(-1);
113
+ if (last?.role === role)
114
+ last.content.push(...blocks);
115
+ else
116
+ messages.push({ role, content: [...blocks] });
117
+ };
118
+ for (const [index, item] of items.entries()) {
119
+ if (item.type === "message") {
120
+ const role = item.role;
121
+ if (role !== "system" && role !== "developer") {
122
+ if (role === "assistant" && item.content.some((part) => part.type === "image")) {
123
+ throw unrepresentable("Assistant images cannot be sent to the gateway executor.", `items.${index}`);
124
+ }
125
+ append(role, item.content.map(contentBlock));
126
+ continue;
127
+ }
128
+ if (messages.length > 0) {
129
+ throw unrepresentable("System and developer messages after the conversation starts cannot be sent to the gateway executor.", `items.${index}`);
130
+ }
131
+ for (const part of item.content) {
132
+ if (part.type !== "text") {
133
+ throw unrepresentable("System messages can only contain text on the gateway executor.", `items.${index}`);
134
+ }
135
+ system.push({ type: "text", text: part.text });
136
+ }
137
+ continue;
138
+ }
139
+ if (item.type === "reasoning") {
140
+ append("assistant", [reasoningBlock(item)]);
141
+ continue;
142
+ }
143
+ if (item.type === "tool_call") {
144
+ append("assistant", [{
145
+ type: "tool_use",
146
+ id: item.id,
147
+ name: item.name,
148
+ input: toolInput(item.arguments, `items.${index}.arguments`),
149
+ }]);
150
+ continue;
151
+ }
152
+ if (item.type === "tool_result") {
153
+ append("user", [{
154
+ type: "tool_result",
155
+ tool_use_id: item.toolCallId,
156
+ content: item.content.map(contentBlock),
157
+ ...(item.isError === undefined ? {} : { is_error: item.isError }),
158
+ }]);
159
+ continue;
160
+ }
161
+ throw unrepresentable("Hosted tool calls cannot be sent to the gateway executor; serve hosted-tool models directly.", `items.${index}`);
162
+ }
163
+ for (const message of messages) {
164
+ if (message.content.length === 0)
165
+ message.content.push({ type: "text", text: "" });
166
+ }
167
+ return { system, messages };
168
+ }
169
+ function contentBlock(part) {
170
+ if (part.type === "text")
171
+ return { type: "text", text: part.text };
172
+ const match = /^data:([^;,]+);base64,(.*)$/s.exec(part.url);
173
+ if (match) {
174
+ return { type: "image", source: { type: "base64", media_type: match[1], data: match[2] } };
175
+ }
176
+ return { type: "image", source: { type: "url", url: part.url } };
177
+ }
178
+ function reasoningBlock(item) {
179
+ if (item.continuation?.kind === "anthropic_redacted_thinking") {
180
+ return { type: "redacted_thinking", data: encodeProviderContinuationState(item.continuation) };
181
+ }
182
+ return {
183
+ type: "thinking",
184
+ thinking: [...(item.summary ?? []), ...item.content].join("\n"),
185
+ signature: item.continuation
186
+ ? encodeProviderContinuationState(item.continuation)
187
+ : encodePortableReasoningState({
188
+ ...(item.source === undefined ? {} : { source: item.source }),
189
+ ...(item.id === undefined ? {} : { itemId: item.id }),
190
+ }),
191
+ };
192
+ }
193
+ function toolInput(value, param) {
194
+ if (isRecord(value))
195
+ return value;
196
+ // Providers emit "" for a call with no arguments.
197
+ if (!value.trim())
198
+ return {};
199
+ let parsed;
200
+ try {
201
+ parsed = JSON.parse(value);
202
+ }
203
+ catch {
204
+ parsed = undefined;
205
+ }
206
+ if (!isRecord(parsed)) {
207
+ throw unrepresentable("Tool call arguments must be a JSON object for the gateway executor.", param);
208
+ }
209
+ return parsed;
210
+ }
211
+ function gatewayToolChoice(request) {
212
+ const choice = request.toolChoice;
213
+ const disableParallel = request.parallelToolCalls === false ? { disable_parallel_tool_use: true } : {};
214
+ if (choice === undefined) {
215
+ return request.parallelToolCalls === false ? { type: "auto", ...disableParallel } : undefined;
216
+ }
217
+ if (choice === "auto" || choice === "none")
218
+ return { type: choice, ...disableParallel };
219
+ if (choice === "required")
220
+ return { type: "any", ...disableParallel };
221
+ return { type: "tool", name: choice.name, ...disableParallel };
222
+ }
223
+ // A client's explicit thinking budget is kept; otherwise the model thinks
224
+ // adaptively at the selected effort.
225
+ function reasoningFields(effort, format, budgetTokens) {
226
+ const outputConfig = (extra) => {
227
+ const config = { ...extra, ...(format === undefined ? {} : { format }) };
228
+ return Object.keys(config).length === 0 ? {} : { output_config: config };
229
+ };
230
+ if (effort === "off")
231
+ return { thinking: { type: "disabled" }, ...outputConfig({}) };
232
+ if (effort === "minimal") {
233
+ throw unrepresentable("Minimal reasoning effort cannot be sent to the gateway executor.", "reasoning_effort");
234
+ }
235
+ return {
236
+ thinking: budgetTokens === undefined
237
+ ? { type: "adaptive" }
238
+ : { type: "enabled", budget_tokens: budgetTokens },
239
+ ...outputConfig({ effort }),
240
+ };
241
+ }
242
+ function gatewayResponseFormat(request) {
243
+ const format = request.responseFormat;
244
+ if (format === undefined || format.type === "text")
245
+ return undefined;
246
+ if (format.type === "json_object") {
247
+ throw unrepresentable("json_object response formats cannot be sent to the gateway executor; use json_schema.", "response_format");
248
+ }
249
+ return { type: "json_schema", name: format.name, schema: format.schema };
250
+ }
251
+ // The gateway keys conversations on metadata.user_id's session_id (the
252
+ // Claude Code convention); prompt_cache_key has no Anthropic field.
253
+ function gatewayMetadata(request) {
254
+ const metadata = { ...(request.metadata ?? {}) };
255
+ const user = typeof metadata.user_id === "string" ? metadata.user_id : request.user;
256
+ if (request.cacheKey !== undefined) {
257
+ metadata.user_id = JSON.stringify({
258
+ session_id: request.cacheKey,
259
+ ...(user === undefined ? {} : { user_id: user }),
260
+ });
261
+ }
262
+ else if (user !== undefined) {
263
+ metadata.user_id = user;
264
+ }
265
+ return Object.keys(metadata).length === 0 ? undefined : metadata;
266
+ }
267
+ // ---------------------------------------------------------------------------
268
+ // Response: gateway Anthropic Messages -> RouterCompletion
269
+ export function gatewayCompletion(body) {
270
+ if (!isRecord(body) || !Array.isArray(body.content)) {
271
+ throw gatewayOutputError("Gateway returned a response without a content array.");
272
+ }
273
+ const content = body.content.map((block) => outputItem(block));
274
+ const usage = gatewayUsage(body.usage);
275
+ return {
276
+ ...(typeof body.id === "string" ? { id: body.id } : {}),
277
+ content,
278
+ finishReason: finishReason(body.stop_reason),
279
+ ...(usage === undefined ? {} : { usage }),
280
+ };
281
+ }
282
+ function outputItem(block) {
283
+ if (!isRecord(block))
284
+ throw gatewayOutputError("Gateway returned a malformed content block.");
285
+ if (block.type === "text" && typeof block.text === "string") {
286
+ return { type: "text", text: block.text };
287
+ }
288
+ if (block.type === "thinking" && typeof block.thinking === "string") {
289
+ const { itemId: _itemId, ...state } = reasoningState(block.signature);
290
+ return { type: "reasoning", text: block.thinking, ...state };
291
+ }
292
+ if (block.type === "redacted_thinking") {
293
+ const { itemId: _itemId, ...state } = reasoningState(block.data);
294
+ return { type: "reasoning", text: "", redacted: true, ...state };
295
+ }
296
+ if (block.type === "tool_use" &&
297
+ typeof block.id === "string" &&
298
+ typeof block.name === "string" &&
299
+ isRecord(block.input)) {
300
+ return { type: "tool_call", id: block.id, name: block.name, arguments: block.input };
301
+ }
302
+ throw gatewayOutputError(`Gateway returned an unsupported content block '${String(block.type)}'.`);
303
+ }
304
+ function reasoningState(encoded) {
305
+ if (typeof encoded !== "string" || encoded.length === 0) {
306
+ throw gatewayOutputError("Gateway returned a thinking block without a reasoning-state envelope.");
307
+ }
308
+ const continuation = decodeUntrustedProviderContinuationState(encoded);
309
+ if (continuation)
310
+ return { source: continuation.source, continuation };
311
+ const portable = decodeUntrustedPortableReasoningState(encoded);
312
+ if (!portable)
313
+ throw gatewayOutputError("Gateway returned a thinking block with an unreadable envelope.");
314
+ return {
315
+ ...(portable.source === undefined ? {} : { source: portable.source }),
316
+ ...(portable.itemId === undefined ? {} : { itemId: portable.itemId }),
317
+ };
318
+ }
319
+ function finishReason(value) {
320
+ if (value === "tool_use")
321
+ return "tool_calls";
322
+ if (value === "max_tokens")
323
+ return "length";
324
+ return "stop";
325
+ }
326
+ function gatewayUsage(value, base) {
327
+ if (!isRecord(value))
328
+ return base;
329
+ const count = (field) => typeof value[field] === "number" && Number.isFinite(value[field]) ? value[field] : undefined;
330
+ const inputTokens = count("input_tokens") ?? base?.inputTokens ?? 0;
331
+ const outputTokens = count("output_tokens") ?? base?.outputTokens ?? 0;
332
+ const cacheReadTokens = count("cache_read_input_tokens") ?? base?.cacheReadTokens;
333
+ const cacheWriteTokens = count("cache_creation_input_tokens") ?? base?.cacheWriteTokens;
334
+ return {
335
+ inputTokens,
336
+ outputTokens,
337
+ ...(cacheReadTokens === undefined ? {} : { cacheReadTokens }),
338
+ ...(cacheWriteTokens === undefined ? {} : { cacheWriteTokens }),
339
+ };
340
+ }
341
+ export async function* gatewayStreamEvents(body) {
342
+ const blocks = new Map();
343
+ let usage;
344
+ let stopReason;
345
+ for await (const { event, data } of sseEvents(body)) {
346
+ if (event === "ping")
347
+ continue;
348
+ if (event === "error") {
349
+ const message = isRecord(data) && isRecord(data.error) && typeof data.error.message === "string"
350
+ ? data.error.message
351
+ : "Gateway stream failed.";
352
+ throw new RouterFrameworkError("executor", message, "gateway_stream_error");
353
+ }
354
+ if (!isRecord(data))
355
+ throw gatewayOutputError(`Gateway sent a malformed '${event}' event.`);
356
+ if (event === "message_start") {
357
+ usage = gatewayUsage(isRecord(data.message) ? data.message.usage : undefined);
358
+ continue;
359
+ }
360
+ if (event === "message_delta") {
361
+ if (isRecord(data.delta) && data.delta.stop_reason !== undefined)
362
+ stopReason = data.delta.stop_reason;
363
+ usage = gatewayUsage(data.usage, usage);
364
+ continue;
365
+ }
366
+ if (event === "message_stop") {
367
+ yield { type: "finish", finishReason: finishReason(stopReason), ...(usage === undefined ? {} : { usage }) };
368
+ return;
369
+ }
370
+ const index = data.index;
371
+ if (typeof index !== "number" || !Number.isSafeInteger(index) || index < 0) {
372
+ throw gatewayOutputError(`Gateway sent a '${event}' event without a valid index.`);
373
+ }
374
+ if (event === "content_block_start") {
375
+ const block = data.content_block;
376
+ if (!isRecord(block))
377
+ throw gatewayOutputError("Gateway started a malformed content block.");
378
+ if (block.type === "text") {
379
+ blocks.set(index, { kind: "text" });
380
+ if (typeof block.text === "string" && block.text)
381
+ yield { type: "text_delta", index, delta: block.text };
382
+ }
383
+ else if (block.type === "thinking") {
384
+ blocks.set(index, { kind: "thinking" });
385
+ if (typeof block.thinking === "string" && block.thinking) {
386
+ yield { type: "reasoning_delta", index, delta: block.thinking };
387
+ }
388
+ }
389
+ else if (block.type === "redacted_thinking") {
390
+ blocks.set(index, { kind: "redacted", data: block.data });
391
+ }
392
+ else if (block.type === "tool_use" && typeof block.id === "string" && typeof block.name === "string") {
393
+ blocks.set(index, { kind: "tool" });
394
+ yield { type: "tool_call_start", index, id: block.id, name: block.name };
395
+ }
396
+ else {
397
+ throw gatewayOutputError(`Gateway streamed an unsupported content block '${String(block.type)}'.`);
398
+ }
399
+ continue;
400
+ }
401
+ const open = blocks.get(index);
402
+ if (open === undefined)
403
+ throw gatewayOutputError(`Gateway sent '${event}' for unopened block ${index}.`);
404
+ if (event === "content_block_delta") {
405
+ const delta = data.delta;
406
+ if (!isRecord(delta))
407
+ throw gatewayOutputError("Gateway sent a malformed content delta.");
408
+ if (delta.type === "text_delta" && typeof delta.text === "string") {
409
+ if (delta.text)
410
+ yield { type: "text_delta", index, delta: delta.text };
411
+ }
412
+ else if (delta.type === "thinking_delta" && typeof delta.thinking === "string") {
413
+ if (delta.thinking)
414
+ yield { type: "reasoning_delta", index, delta: delta.thinking };
415
+ }
416
+ else if (delta.type === "signature_delta" && open.kind === "thinking" && typeof delta.signature === "string") {
417
+ open.signature = delta.signature;
418
+ }
419
+ else if (delta.type === "input_json_delta" && typeof delta.partial_json === "string") {
420
+ if (delta.partial_json)
421
+ yield { type: "tool_call_delta", index, delta: delta.partial_json };
422
+ }
423
+ else {
424
+ throw gatewayOutputError(`Gateway sent an unsupported '${String(delta.type)}' delta.`);
425
+ }
426
+ continue;
427
+ }
428
+ if (event === "content_block_stop") {
429
+ blocks.delete(index);
430
+ if (open.kind === "thinking") {
431
+ yield { type: "reasoning_end", index, ...reasoningState(open.signature) };
432
+ }
433
+ else if (open.kind === "redacted") {
434
+ yield { type: "reasoning_end", index, redacted: true, ...reasoningState(open.data) };
435
+ }
436
+ else if (open.kind === "tool") {
437
+ yield { type: "tool_call_end", index };
438
+ }
439
+ continue;
440
+ }
441
+ throw gatewayOutputError(`Gateway sent an unsupported '${event}' event.`);
442
+ }
443
+ throw gatewayOutputError("Gateway stream ended before message_stop.");
444
+ }
445
+ async function* sseEvents(body) {
446
+ const reader = body.getReader();
447
+ const decoder = new TextDecoder();
448
+ let buffer = "";
449
+ try {
450
+ while (true) {
451
+ const { value, done } = await reader.read();
452
+ buffer += done ? decoder.decode() : decoder.decode(value, { stream: true });
453
+ let boundary = buffer.search(/\r?\n\r?\n/);
454
+ while (boundary !== -1) {
455
+ const frame = buffer.slice(0, boundary);
456
+ buffer = buffer.slice(boundary).replace(/^\r?\n\r?\n/, "");
457
+ const parsed = sseFrame(frame);
458
+ if (parsed)
459
+ yield parsed;
460
+ boundary = buffer.search(/\r?\n\r?\n/);
461
+ }
462
+ if (done)
463
+ break;
464
+ }
465
+ const parsed = sseFrame(buffer);
466
+ if (parsed)
467
+ yield parsed;
468
+ }
469
+ finally {
470
+ reader.releaseLock();
471
+ }
472
+ }
473
+ function sseFrame(frame) {
474
+ let event = "message";
475
+ const dataLines = [];
476
+ for (const line of frame.split(/\r?\n/)) {
477
+ if (line.startsWith("event:"))
478
+ event = line.slice(6).trim();
479
+ else if (line.startsWith("data:"))
480
+ dataLines.push(line.slice(5).replace(/^ /, ""));
481
+ }
482
+ if (dataLines.length === 0)
483
+ return null;
484
+ try {
485
+ return { event, data: JSON.parse(dataLines.join("\n")) };
486
+ }
487
+ catch {
488
+ throw gatewayOutputError(`Gateway sent a '${event}' event whose data is not JSON.`);
489
+ }
490
+ }
491
+ // ---------------------------------------------------------------------------
492
+ // Errors
493
+ async function gatewayHttpError(response) {
494
+ const text = await response.text().catch(() => "");
495
+ let message = text;
496
+ try {
497
+ const parsed = JSON.parse(text);
498
+ if (isRecord(parsed) && isRecord(parsed.error) && typeof parsed.error.message === "string") {
499
+ message = parsed.error.message;
500
+ }
501
+ }
502
+ catch {
503
+ // Keep the raw body as the message.
504
+ }
505
+ const detail = `Gateway returned HTTP ${response.status}: ${message}`;
506
+ if (response.status === 401 || response.status === 403) {
507
+ return new RouterFrameworkError("configuration", detail, "gateway_unauthorized");
508
+ }
509
+ if (response.status >= 400 && response.status < 500 && response.status !== 408 && response.status !== 429) {
510
+ return new RouterFrameworkError("invalid_request", detail, "gateway_rejected_request");
511
+ }
512
+ return new RouterFrameworkError("executor", detail, "gateway_http_error");
513
+ }
514
+ function unrepresentable(message, param) {
515
+ return new RouterFrameworkError("invalid_request", message, "gateway_unrepresentable_request", param);
516
+ }
517
+ function gatewayOutputError(message) {
518
+ return new RouterFrameworkError("executor", message, "gateway_output_invalid");
519
+ }
520
+ function errorMessage(error) {
521
+ return error instanceof Error ? error.message : String(error);
522
+ }
523
+ //# sourceMappingURL=gateway_executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway_executor.js","sourceRoot":"","sources":["../src/gateway_executor.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  export { createRouter, } from "./framework_router.js";
2
- export { createPiRuntime, } from "./pi_runtime.js";
3
2
  export { createAutoRouter, } from "./auto_router.js";
3
+ export { createGatewayExecutor, } from "./gateway_executor.js";
4
4
  export type { RouterProtocol, RouterTextContent, RouterImageContent, RouterContent, RouterMessageItem, RouterToolCallItem, RouterToolResultItem, RouterHostedToolCallStatus, RouterHostedToolCallItem, RouterReasoningItem, RouterInputItem, RouterTool, RouterToolChoice, RouterResponseFormat, RouterRequest, RouterModelCapabilities, RouterModel, RouterCandidate, RoutingPolicyInput, RoutingPolicyDecision, RoutingPolicy, RouterSelection, RouterUsage, RouterFinishReason, RouterOutputText, RouterOutputToolCall, RouterOutputReasoning, RouterOutputHostedToolCall, RouterOutputItem, RouterCompletion, RouterStreamEvent, RouterExecutorResult, RouterExecutorInput, RouterExecutor, CreateRouterOptions, Router, RouterLease, LeaseStore, RouterHookResult, RouterHooks, RouterFallbackConfig, } from "./framework_types.js";
5
- export type { CreatePiRuntimeOptions, PiApiKey, PiCredentialInput, PiModelRegistry, PiRouterModelOptions, PiRuntime, } from "./pi_runtime.js";
6
5
  export type { CreateAutoRouterOptions } from "./auto_router.js";
6
+ export type { CreateGatewayExecutorOptions } from "./gateway_executor.js";
7
7
  export type { ReasoningEffort } from "./types.js";
8
8
  export { RouterFrameworkError } from "./framework_error.js";
9
9
  export type { RouterFrameworkErrorKind } from "./framework_error.js";
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Stable framework API. Advanced policy-engine and protocol helpers live in
2
2
  // explicit subpath exports so the root remains discoverable and refactorable.
3
3
  export { createRouter, } from "./framework_router.js";
4
- export { createPiRuntime, } from "./pi_runtime.js";
5
4
  export { createAutoRouter, } from "./auto_router.js";
5
+ export { createGatewayExecutor, } from "./gateway_executor.js";
6
6
  export { RouterFrameworkError } from "./framework_error.js";
7
7
  //# 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,4EAA4E;AAC5E,8EAA8E;AAC9E,OAAO,EACL,YAAY,GACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAuD1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,8EAA8E;AAC9E,OAAO,EACL,YAAY,GACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAgD/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -4,25 +4,30 @@
4
4
  // drop createAutoRouter in as the policy, and Dari's routing model picks
5
5
  // the best model for each request. You're billed per selection call.
6
6
  //
7
- // Requires DARI_API_KEY, OPENAI_API_KEY, and ANTHROPIC_API_KEY.
7
+ // Requires DARI_API_KEY. The executor below is a local stub: replace it with
8
+ // a call to your provider to serve real traffic.
8
9
 
9
- import { createAutoRouter, createPiRuntime, createRouter } from "../src/index.js";
10
+ import { createAutoRouter, createRouter, type RouterExecutor } from "../src/index.js";
10
11
 
11
- const pi = await createPiRuntime({
12
- apiKey: ({ provider }) => {
13
- const key = process.env[`${provider.toUpperCase()}_API_KEY`];
14
- if (!key) throw new Error(`Missing ${provider.toUpperCase()}_API_KEY`);
15
- return key;
12
+ const stub: RouterExecutor = {
13
+ execute({ model }) {
14
+ return {
15
+ type: "complete",
16
+ output: {
17
+ content: [{ type: "text", text: `Served by ${model.id}` }],
18
+ finishReason: "stop",
19
+ },
20
+ };
16
21
  },
17
- });
22
+ };
18
23
 
19
24
  const router = createRouter({
20
25
  models: [
21
- pi.model("openai/gpt-5.6-sol"),
22
- pi.model("anthropic/claude-sonnet-5"),
26
+ { id: "openai/gpt-6-luna", executor: "stub" },
27
+ { id: "anthropic/claude-fable-5-1", executor: "stub" },
23
28
  ],
24
29
  policy: createAutoRouter({ apiKey: process.env.DARI_API_KEY! }),
25
- executor: pi,
30
+ executors: { stub },
26
31
  });
27
32
 
28
33
  const response = await router.fetch(