@mupt-ai/dari-router 0.2.4 → 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 (57) hide show
  1. package/README.md +148 -55
  2. package/dist/anonymous_actions.d.ts +1 -0
  3. package/dist/anonymous_actions.js +18 -7
  4. package/dist/anonymous_actions.js.map +1 -1
  5. package/dist/auto_router.d.ts +1 -1
  6. package/dist/auto_router.js.map +1 -1
  7. package/dist/cache_scope.js +8 -5
  8. package/dist/cache_scope.js.map +1 -1
  9. package/dist/cost.js +55 -38
  10. package/dist/cost.js.map +1 -1
  11. package/dist/dari_policy.d.ts +0 -3
  12. package/dist/dari_policy.js +2 -2
  13. package/dist/dari_policy.js.map +1 -1
  14. package/dist/eval_score_imputation.js +2 -0
  15. package/dist/eval_score_imputation.js.map +1 -1
  16. package/dist/framework_router.d.ts +2 -1
  17. package/dist/framework_router.js +264 -47
  18. package/dist/framework_router.js.map +1 -1
  19. package/dist/framework_types.d.ts +9 -0
  20. package/dist/framework_validation.js +1 -0
  21. package/dist/framework_validation.js.map +1 -1
  22. package/dist/gateway_executor.d.ts +16 -0
  23. package/dist/gateway_executor.js +523 -0
  24. package/dist/gateway_executor.js.map +1 -0
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.js +1 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/prompts/anonymous_action.md +5 -1
  29. package/dist/prompts.js +1 -2
  30. package/dist/prompts.js.map +1 -1
  31. package/dist/types.d.ts +1 -0
  32. package/examples/auto_router.ts +16 -11
  33. package/examples/basic_route.ts +19 -19
  34. package/examples/lease_stores.ts +21 -15
  35. package/examples/managed/README.md +3 -4
  36. package/examples/managed/byok-router/router.yml +4 -4
  37. package/examples/managed/custom-rules-router/router.yml +9 -9
  38. package/examples/managed/dari/router.yml +3 -2
  39. package/package.json +5 -14
  40. package/dist/pi_context.d.ts +0 -4
  41. package/dist/pi_context.js +0 -237
  42. package/dist/pi_context.js.map +0 -1
  43. package/dist/pi_options.d.ts +0 -3
  44. package/dist/pi_options.js +0 -300
  45. package/dist/pi_options.js.map +0 -1
  46. package/dist/pi_output.d.ts +0 -4
  47. package/dist/pi_output.js +0 -328
  48. package/dist/pi_output.js.map +0 -1
  49. package/dist/pi_runtime.d.ts +0 -3
  50. package/dist/pi_runtime.js +0 -163
  51. package/dist/pi_runtime.js.map +0 -1
  52. package/dist/pi_types.d.ts +0 -35
  53. package/dist/pi_types.js +0 -2
  54. package/dist/pi_types.js.map +0 -1
  55. package/examples/managed/eval-router/README.md +0 -18
  56. package/examples/managed/eval-router/router.yml +0 -11
  57. 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"}
@@ -16,11 +16,15 @@
16
16
  - Lease history records prior actions, turns, errors, tool results, and tests.
17
17
  - Action labels remain fixed; the Model line identifies each historical action. Labels sharing a letter (A:high, A:low) are one model at different thinking levels with a shared prompt cache.
18
18
 
19
+ ## Escalate when the user is dissatisfied
20
+ - Consider the full conversation, not just the latest task. If the user is clearly dissatisfied with the quality of prior work—for example, pointing out repeated mistakes, inadequate reasoning, or failure to follow instructions—upgrade to a more capable model when one is available. Escalate by as many intelligence levels as needed to address the dissatisfaction; do not limit the upgrade to one level.
21
+ - Do not treat routine follow-up requests or changes in preference as dissatisfaction. If no more capable model is available, choose the best available action; do not assume an unavailable upgrade.
22
+
19
23
  ## Switching and cache
20
24
  - Switching changes the model, not the available conversation: the selected model will ALWAYS receives the context above.
21
25
  - Cache warmth affects cost and latency only.
22
26
  - Changing thinking level within a letter keeps the cache warm; switching to another letter may start cold, while switching back may reuse a warm cache.
23
- - Since prompts grow, cold starts can cost more later. The displayed cost already reflects current cache warmth, averaged over the next {{comparison_turns}} turns; use it rather than assuming a fixed switch penalty.
27
+ - Since prompts grow, cold starts can cost more later. Each action shows its cold start cost (paid on the first turn if its cache is cold) and its per turn cost once warm; use them rather than assuming a fixed switch penalty.
24
28
 
25
29
  # Decide
26
30
  Finish successfully at the lowest total cost. Weigh capability, progress, task phase, benchmark scores, per-turn cost, and $/task. Choose a lease appropriate to how long the action should remain suitable—not just to preserve cache. Switch when its likely capability or progress benefit justifies the estimated cost and latency; do not stay with an unsuitable action for cache warmth.
package/dist/prompts.js CHANGED
@@ -3,12 +3,11 @@
3
3
  // request-assembly code. Per-request candidate data rides in the user
4
4
  // message, keeping these byte-stable for provider prompt caching.
5
5
  import { readFileSync } from "node:fs";
6
- import { FIXED_TURN_COST_COMPARISON_TURNS, FIXED_TURN_COST_PROJECTED_TURNS, } from "./fixed_turn_cost_config.js";
6
+ import { FIXED_TURN_COST_PROJECTED_TURNS, } from "./fixed_turn_cost_config.js";
7
7
  // Placeholders interpolated where a prompt names the projection horizons, so
8
8
  // the wording cannot drift from the config that produces the data.
9
9
  const PROMPT_VARIABLES = {
10
10
  projected_turns: FIXED_TURN_COST_PROJECTED_TURNS.join(", "),
11
- comparison_turns: String(FIXED_TURN_COST_COMPARISON_TURNS),
12
11
  };
13
12
  function loadPrompt(name) {
14
13
  const template = readFileSync(new URL(`./prompts/${name}.md`, import.meta.url), "utf8");
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,uEAAuE;AACvE,sEAAsE;AACtE,kEAAkE;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EACL,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,6BAA6B,CAAC;AAErC,6EAA6E;AAC7E,mEAAmE;AACnE,MAAM,gBAAgB,GAA2B;IAC/C,eAAe,EAAE,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3D,gBAAgB,EAAE,MAAM,CAAC,gCAAgC,CAAC;CAC3D,CAAC;AAEF,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,aAAa,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IACxF,OAAO,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,WAAW,IAAI,KAAK,CAAC,CAAC;AAChF,CAAC;AAED,uEAAuE;AACvE,0EAA0E;AAC1E,qCAAqC;AACrC,SAAS,cAAc,CAAI,IAAY,EAAE,eAAkC,EAAE;IAC3E,MAAM,MAAM,GAAG,WAAW,IAAI,OAAO,CAAC;IACtC,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAChC,YAAY,CAAC,IAAI,GAAG,CAAC,aAAa,IAAI,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CACzE,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,CAAC,KAAc,EAAW,EAAE;QACvC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,gBAAgB,EAAE,GAAG,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QAClG,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAChD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAM,CAAC;AAC3B,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,UAAU,CACxB,QAAgB,EAChB,MAAwC,EACxC,MAAM,GAAG,iBAAiB;IAE1B,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;QAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,SAAS,MAAM,EAAE,CAAC,CAAC;QACxF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;AAE7D,yEAAyE;AACzE,mEAAmE;AACnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;AAE9D,iEAAiE;AACjE,6EAA6E;AAC7E,4EAA4E;AAC5E,+CAA+C;AAC/C,MAAM,CAAC,MAAM,8BAA8B,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAE7E,2EAA2E;AAC3E,gCAAgC;AAChC,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAEpE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAIpD,oBAAoB,CAAC,CAAC;AAEzB,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAO9C,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -140,6 +140,7 @@ export type TurnCostProjection = {
140
140
  export type FixedTurnCostEstimate = {
141
141
  output_tokens_per_turn: number;
142
142
  assumed_reasoning_effort: ReasoningEffort;
143
+ cold_start_usd: number;
143
144
  projections: TurnCostProjection[];
144
145
  };
145
146
  export type CandidateCostEstimate = {