@mupt-ai/dari-router 0.2.1 → 0.2.2
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 +1 -1
- package/dist/anonymous_actions.d.ts +31 -2
- package/dist/anonymous_actions.js +225 -16
- package/dist/anonymous_actions.js.map +1 -1
- package/dist/cache_behavior.d.ts +1 -1
- package/dist/cache_behavior.js +23 -14
- package/dist/cache_behavior.js.map +1 -1
- package/dist/cache_scope.js +14 -7
- package/dist/cache_scope.js.map +1 -1
- package/dist/candidate_resolution.d.ts +2 -1
- package/dist/candidate_resolution.js +5 -2
- package/dist/candidate_resolution.js.map +1 -1
- package/dist/compatibility.d.ts +1 -0
- package/dist/compatibility.js +6 -0
- package/dist/compatibility.js.map +1 -1
- package/dist/continuation_state.d.ts +12 -0
- package/dist/continuation_state.js +48 -7
- package/dist/continuation_state.js.map +1 -1
- package/dist/cost.d.ts +8 -0
- package/dist/cost.js +47 -30
- package/dist/cost.js.map +1 -1
- package/dist/dari_policy.d.ts +1 -1
- package/dist/dari_policy.js +4 -2
- package/dist/dari_policy.js.map +1 -1
- package/dist/eval_score_imputation.d.ts +1 -0
- package/dist/eval_score_imputation.js +27 -2
- package/dist/eval_score_imputation.js.map +1 -1
- package/dist/fingerprint.js +45 -12
- package/dist/fingerprint.js.map +1 -1
- package/dist/fixed_turn_cost_config.d.ts +2 -0
- package/dist/fixed_turn_cost_config.js +7 -0
- package/dist/fixed_turn_cost_config.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/jev_router.d.ts +5 -0
- package/dist/jev_router.js +22 -0
- package/dist/jev_router.js.map +1 -0
- package/dist/jev_selector.d.ts +77 -0
- package/dist/jev_selector.js +418 -0
- package/dist/jev_selector.js.map +1 -0
- package/dist/model_ids.d.ts +1 -0
- package/dist/model_ids.js +26 -0
- package/dist/model_ids.js.map +1 -1
- package/dist/pi_context.js +37 -6
- package/dist/pi_context.js.map +1 -1
- package/dist/pi_options.js +6 -3
- package/dist/pi_options.js.map +1 -1
- package/dist/policy-engine.d.ts +1 -0
- package/dist/policy-engine.js +1 -0
- package/dist/policy-engine.js.map +1 -1
- package/dist/prompts.d.ts +1 -0
- package/dist/prompts.js +21 -4
- package/dist/prompts.js.map +1 -1
- package/dist/route.d.ts +3 -0
- package/dist/route.js +64 -5
- package/dist/route.js.map +1 -1
- package/dist/routing_history.d.ts +1 -0
- package/dist/routing_history.js +2 -0
- package/dist/routing_history.js.map +1 -1
- package/dist/selector_input.d.ts +26 -1
- package/dist/selector_input.js +17 -1
- package/dist/selector_input.js.map +1 -1
- package/dist/selector_request.d.ts +3 -1
- package/dist/selector_request.js +52 -12
- package/dist/selector_request.js.map +1 -1
- package/dist/selector_truncation.d.ts +2 -0
- package/dist/selector_truncation.js +42 -0
- package/dist/selector_truncation.js.map +1 -1
- package/dist/types.d.ts +9 -2
- package/examples/basic_route.ts +1 -1
- package/examples/jev_router.ts +50 -0
- package/examples/managed/README.md +2 -2
- package/examples/managed/byok-router/router.yml +1 -1
- package/examples/managed/custom-rules-router/router.yml +5 -5
- package/examples/managed/{slm-router → dari}/README.md +1 -1
- package/examples/managed/{slm-router → dari}/router.yml +2 -2
- package/examples/managed/eval-router/router.yml +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
// TypeSafe Jev selector over the anonymous-action protocol. Jev
|
|
2
|
+
// (docs.typesafe.ai) is a System One model: it answers typed questions about
|
|
3
|
+
// a state instead of generating text, so the routing decision is two Choice
|
|
4
|
+
// questions over the same state — which anonymous candidate action serves
|
|
5
|
+
// the next turns, and how long a lease to commit to — and the answer comes
|
|
6
|
+
// back as calibrated probabilities rather than parsed JSON.
|
|
7
|
+
//
|
|
8
|
+
// This is an alternative to Dari's trained routing policy. Candidates are
|
|
9
|
+
// de-identified through the same anonymous-action protocol Dari uses
|
|
10
|
+
// (anonymous_actions.ts), so Jev decides on benchmark and cost evidence and
|
|
11
|
+
// never sees a model identity; comparisons Jev is weak at (cost ordering,
|
|
12
|
+
// benchmark standing) are computed here and passed as text.
|
|
13
|
+
import { anonymizeSelectorInput, assignAnonymousActions, sessionRng, } from "./anonymous_actions.js";
|
|
14
|
+
import { RouterCoreError } from "./errors.js";
|
|
15
|
+
import { RouterFrameworkError } from "./framework_error.js";
|
|
16
|
+
import { FIXED_TURN_COST_COMPARISON_TURNS, SELECTOR_LEASE_TURNS } from "./fixed_turn_cost_config.js";
|
|
17
|
+
import { isRecord, } from "./types.js";
|
|
18
|
+
export const DEFAULT_JEV_ENDPOINT = "https://api.typesafe.ai/v1";
|
|
19
|
+
export const DEFAULT_JEV_MODEL = "jev-latest";
|
|
20
|
+
const DEFAULT_JEV_TIMEOUT_MS = 30_000;
|
|
21
|
+
// Jev evaluates up to 32k tokens of state plus the longest question, and
|
|
22
|
+
// JSON-shaped conversation state tokenizes at roughly 2.7 characters per
|
|
23
|
+
// token. The selector request is sized on its JSON-escaped messages, which
|
|
24
|
+
// overstate the state Jev receives, so this budget leaves room for the
|
|
25
|
+
// questions and the action descriptions.
|
|
26
|
+
export const JEV_SELECTOR_CONTEXT_WINDOW_CHARS = 64_000;
|
|
27
|
+
// Rate-limit and overload responses get one backoff retry; anything else is
|
|
28
|
+
// the caller's failure to surface.
|
|
29
|
+
const JEV_RETRY_STATUSES = new Set([429, 529]);
|
|
30
|
+
const JEV_ATTEMPTS = 2;
|
|
31
|
+
const JEV_RETRY_DELAY_MS = 500;
|
|
32
|
+
const JEV_RETRY_MAX_DELAY_MS = 5_000;
|
|
33
|
+
// selector_output after TypeSafe returned 200. Token counts are on the body
|
|
34
|
+
// even when the action or lease answer is rejected, so hosts can still bill
|
|
35
|
+
// the selector call.
|
|
36
|
+
export class JevSelectorOutputError extends RouterCoreError {
|
|
37
|
+
usage;
|
|
38
|
+
constructor(message, code, usage = null) {
|
|
39
|
+
super("selector_output", message, code);
|
|
40
|
+
this.name = "JevSelectorOutputError";
|
|
41
|
+
this.usage = usage;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function resolveJevSelectorConfig(input) {
|
|
45
|
+
const apiKey = input.apiKey?.trim() ?? "";
|
|
46
|
+
if (!apiKey)
|
|
47
|
+
throw configurationError("Jev selector requires an apiKey.", "apiKey");
|
|
48
|
+
const endpoint = (input.endpoint ?? DEFAULT_JEV_ENDPOINT).trim().replace(/\/+$/, "");
|
|
49
|
+
let url;
|
|
50
|
+
try {
|
|
51
|
+
url = new URL(endpoint);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
throw configurationError("Jev selector endpoint must be a valid URL.", "endpoint");
|
|
55
|
+
}
|
|
56
|
+
if ((url.protocol !== "https:" && url.protocol !== "http:") || url.username || url.password) {
|
|
57
|
+
throw configurationError("Jev selector endpoint must be an HTTP(S) URL without embedded credentials.", "endpoint");
|
|
58
|
+
}
|
|
59
|
+
const model = (input.model ?? DEFAULT_JEV_MODEL).trim();
|
|
60
|
+
if (!model)
|
|
61
|
+
throw configurationError("Jev selector model must not be empty.", "model");
|
|
62
|
+
const leaseTurns = input.leaseTurns ?? SELECTOR_LEASE_TURNS;
|
|
63
|
+
if (leaseTurns.some((turns, index) => !Number.isSafeInteger(turns) || turns <= 0 || (index > 0 && turns <= leaseTurns[index - 1]))) {
|
|
64
|
+
throw configurationError("Jev selector leaseTurns must be ascending positive integers.", "leaseTurns");
|
|
65
|
+
}
|
|
66
|
+
const timeoutMs = input.timeoutMs ?? DEFAULT_JEV_TIMEOUT_MS;
|
|
67
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {
|
|
68
|
+
throw configurationError("Jev selector timeoutMs must be a positive integer.", "timeoutMs");
|
|
69
|
+
}
|
|
70
|
+
return { apiKey, endpoint, model, leaseTurns, timeoutMs };
|
|
71
|
+
}
|
|
72
|
+
// Renders the de-identified selector input as a Jev request. Every candidate
|
|
73
|
+
// identity has already been replaced by its action letter; the only evidence
|
|
74
|
+
// an action carries is its projected cost and its benchmark standing.
|
|
75
|
+
export function buildJevSelectorRequest(anonymousInput, options) {
|
|
76
|
+
const costs = actionCosts(anonymousInput.cost_estimates);
|
|
77
|
+
const criteria = {};
|
|
78
|
+
for (const { action } of anonymousInput.candidate_actions) {
|
|
79
|
+
const cost = costs.get(action);
|
|
80
|
+
const benchmarks = {};
|
|
81
|
+
for (const card of anonymousInput.imported_evals) {
|
|
82
|
+
const score = card.scores.find((entry) => entry.action === action);
|
|
83
|
+
if (score === undefined)
|
|
84
|
+
continue;
|
|
85
|
+
benchmarks[card.name] = {
|
|
86
|
+
score: score.score,
|
|
87
|
+
rank: `${score.rank} of ${score.rank_total}`,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
criteria[action] = cost === undefined && Object.keys(benchmarks).length === 0
|
|
91
|
+
? null
|
|
92
|
+
: {
|
|
93
|
+
...(cost === undefined ? {} : { cost }),
|
|
94
|
+
...(Object.keys(benchmarks).length === 0 ? {} : { benchmarks }),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const state = {
|
|
98
|
+
task: anonymousInput.task,
|
|
99
|
+
previous_action: anonymousInput.previous_action === null
|
|
100
|
+
? null
|
|
101
|
+
: anonymousInput.previous_action.action,
|
|
102
|
+
lease_history: anonymousInput.lease_history,
|
|
103
|
+
conversation: anonymousInput.messages,
|
|
104
|
+
};
|
|
105
|
+
const glossary = {};
|
|
106
|
+
for (const card of anonymousInput.imported_evals) {
|
|
107
|
+
glossary[card.name] = {
|
|
108
|
+
...(card.description === null ? {} : { description: card.description }),
|
|
109
|
+
scale: `${card.min_score} to ${card.max_score}, higher is better`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const questions = {
|
|
113
|
+
action: {
|
|
114
|
+
type: "choice",
|
|
115
|
+
instructions: {
|
|
116
|
+
question: "Which action should serve the coding agent's next turns?",
|
|
117
|
+
rules: [
|
|
118
|
+
"Capability first: the action must be able to handle the task; capability is never traded away for cost.",
|
|
119
|
+
"Judge the task's difficulty and how much work remains from `task`, `lease_history`, and the latest turns of `conversation`.",
|
|
120
|
+
"Use each action's benchmark scores and ranks as evidence of capability. A missing benchmark means the action was not measured on it, not that it scored poorly.",
|
|
121
|
+
"When several actions are capable enough, choose the one with the best (lowest-numbered) cost rank.",
|
|
122
|
+
"Prefer `previous_action` while the task and its current phase have not changed.",
|
|
123
|
+
],
|
|
124
|
+
...(Object.keys(glossary).length === 0 ? {} : { benchmarks: glossary }),
|
|
125
|
+
},
|
|
126
|
+
criteria,
|
|
127
|
+
},
|
|
128
|
+
...(options.leaseTurns.length === 0 ? {} : { lease: leaseQuestion(options.leaseTurns) }),
|
|
129
|
+
};
|
|
130
|
+
return { model: options.model, state, questions };
|
|
131
|
+
}
|
|
132
|
+
function leaseQuestion(leaseTurns) {
|
|
133
|
+
const last = leaseTurns.length - 1;
|
|
134
|
+
const criteria = {};
|
|
135
|
+
leaseTurns.forEach((turns, index) => {
|
|
136
|
+
criteria[String(turns)] = index === 0
|
|
137
|
+
? `${turns} turns: the task is nearly done, or the next step may change what the agent needs.`
|
|
138
|
+
: index === last
|
|
139
|
+
? `${turns} turns: a long stretch of similar work remains, such as a large implementation or many edit-and-test cycles.`
|
|
140
|
+
: `${turns} turns: a bounded stretch of similar work remains.`;
|
|
141
|
+
});
|
|
142
|
+
return {
|
|
143
|
+
type: "choice",
|
|
144
|
+
instructions: {
|
|
145
|
+
question: "How many consecutive turns should the chosen action serve before the router reconsiders?",
|
|
146
|
+
guidance: "A longer lease amortizes the cold start paid on its first turn across warm cache hits on the turns that follow. The lease ends early only if the task finishes or the provider fails. Judge from how much similar work remains after the latest turn of `conversation`.",
|
|
147
|
+
},
|
|
148
|
+
criteria,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
export function parseJevSelectorResponse(body, args) {
|
|
152
|
+
if (!isRecord(body) || typeof body.model !== "string" || !isRecord(body.answers)) {
|
|
153
|
+
throw invalidResponse("Jev returned an unrecognized response body.");
|
|
154
|
+
}
|
|
155
|
+
const usage = body.usage;
|
|
156
|
+
if (!isRecord(usage)
|
|
157
|
+
|| typeof usage.input_tokens !== "number"
|
|
158
|
+
|| typeof usage.output_tokens !== "number") {
|
|
159
|
+
throw invalidResponse("Jev response is missing token usage.");
|
|
160
|
+
}
|
|
161
|
+
const tokenUsage = {
|
|
162
|
+
input_tokens: usage.input_tokens,
|
|
163
|
+
output_tokens: usage.output_tokens,
|
|
164
|
+
};
|
|
165
|
+
const action = choiceAnswer(body.answers.action, "action", tokenUsage);
|
|
166
|
+
const slot = args.slots.find((entry) => entry.action === action.choice);
|
|
167
|
+
if (slot === undefined) {
|
|
168
|
+
throw new JevSelectorOutputError("Jev selected an action outside this router's candidates.", "selector_invalid_candidate", tokenUsage);
|
|
169
|
+
}
|
|
170
|
+
let lease;
|
|
171
|
+
let turns;
|
|
172
|
+
if (args.leaseTurns.length > 0) {
|
|
173
|
+
lease = choiceAnswer(body.answers.lease, "lease", tokenUsage);
|
|
174
|
+
turns = Number(lease.choice);
|
|
175
|
+
if (!args.leaseTurns.includes(turns)) {
|
|
176
|
+
throw invalidResponse(`Jev lease answer ${lease.choice} is not on the offered menu.`, tokenUsage);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const response = {
|
|
180
|
+
model: body.model,
|
|
181
|
+
answers: { action, ...(lease === undefined ? {} : { lease }) },
|
|
182
|
+
usage: tokenUsage,
|
|
183
|
+
};
|
|
184
|
+
return {
|
|
185
|
+
decision: {
|
|
186
|
+
selectedModel: slot.candidate.model,
|
|
187
|
+
reasoningEffort: slot.candidate.reasoningEffort,
|
|
188
|
+
// The reason is persisted into lease history and replayed to later
|
|
189
|
+
// selectors, so it stays anonymous like the rest of the protocol.
|
|
190
|
+
reason: decisionReason(action, turns, lease),
|
|
191
|
+
...(turns === undefined ? {} : { leaseTurnsRemaining: turns - 1 }),
|
|
192
|
+
},
|
|
193
|
+
response,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function decisionReason(action, turns, lease) {
|
|
197
|
+
const pick = `Jev selected Action ${action.choice} `
|
|
198
|
+
+ `(probability ${percent(action.probabilities[action.choice] ?? 0)}, confidence ${percent(action.confidence)})`;
|
|
199
|
+
if (turns === undefined || lease === undefined)
|
|
200
|
+
return `${pick}.`;
|
|
201
|
+
return `${pick} with a ${turns}-turn lease (probability ${percent(lease.probabilities[lease.choice] ?? 0)}).`;
|
|
202
|
+
}
|
|
203
|
+
// Anonymizes the named selector input against the slots, asks Jev, and maps
|
|
204
|
+
// the answers back onto the slots' candidates.
|
|
205
|
+
export async function selectWithJev(selectorInput, slots, config, signal) {
|
|
206
|
+
if ("custom_rules" in selectorInput || "default_target" in selectorInput) {
|
|
207
|
+
throw new RouterCoreError("configuration", "The Jev selector serves only the default routing policy and cannot apply custom routing rules.", "custom_rules_not_supported");
|
|
208
|
+
}
|
|
209
|
+
const anonymousInput = anonymizeSelectorInput(selectorInput, slots);
|
|
210
|
+
const request = buildJevSelectorRequest(anonymousInput, config);
|
|
211
|
+
const body = await postSystemOne(request, config, signal);
|
|
212
|
+
const { decision, response } = parseJevSelectorResponse(body, {
|
|
213
|
+
slots,
|
|
214
|
+
leaseTurns: config.leaseTurns,
|
|
215
|
+
});
|
|
216
|
+
return { decision, request, response };
|
|
217
|
+
}
|
|
218
|
+
// A Selector for createDariRoutingPolicy: decodes the selector input from the
|
|
219
|
+
// chat-shaped request and returns a routing_decision JSON the parser already
|
|
220
|
+
// understands, including lease_turns_remaining and the raw Jev answers.
|
|
221
|
+
// Letters are assigned per call: the framework path carries no conversation
|
|
222
|
+
// identity, and every candidate-bearing field is re-lettered together, so
|
|
223
|
+
// correctness never depends on cross-turn stability.
|
|
224
|
+
export function createJevSelector(input) {
|
|
225
|
+
const config = resolveJevSelectorConfig(input);
|
|
226
|
+
return {
|
|
227
|
+
async select(request, signal) {
|
|
228
|
+
const selectorInput = selectorInputFromRequest(request);
|
|
229
|
+
const single = singleCandidate(selectorInput);
|
|
230
|
+
if (single !== undefined) {
|
|
231
|
+
return JSON.stringify({
|
|
232
|
+
selected_model: single.model,
|
|
233
|
+
reasoning_effort: single.reasoningEffort,
|
|
234
|
+
reason: "The router has only one compatible model/thinking-level pair.",
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
const candidates = selectorInput.candidate_pairs.map((pair) => ({
|
|
238
|
+
model: pair.model,
|
|
239
|
+
reasoningEffort: pair.thinking_level,
|
|
240
|
+
}));
|
|
241
|
+
const rng = typeof request.prompt_cache_key === "string" && request.prompt_cache_key !== ""
|
|
242
|
+
? sessionRng(request.prompt_cache_key)
|
|
243
|
+
: Math.random;
|
|
244
|
+
let selection;
|
|
245
|
+
try {
|
|
246
|
+
selection = await selectWithJev(selectorInput, assignAnonymousActions(candidates, rng), config, signal);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
throw frameworkError(error);
|
|
250
|
+
}
|
|
251
|
+
const { decision, response } = selection;
|
|
252
|
+
return JSON.stringify({
|
|
253
|
+
selected_model: decision.selectedModel,
|
|
254
|
+
reasoning_effort: decision.reasoningEffort,
|
|
255
|
+
reason: decision.reason,
|
|
256
|
+
...(decision.leaseTurnsRemaining === undefined
|
|
257
|
+
? {}
|
|
258
|
+
: { lease_turns_remaining: decision.leaseTurnsRemaining }),
|
|
259
|
+
jev: response,
|
|
260
|
+
});
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
function singleCandidate(selectorInput) {
|
|
265
|
+
if (selectorInput.candidate_pairs.length !== 1)
|
|
266
|
+
return undefined;
|
|
267
|
+
const pair = selectorInput.candidate_pairs[0];
|
|
268
|
+
return { model: pair.model, reasoningEffort: pair.thinking_level };
|
|
269
|
+
}
|
|
270
|
+
async function postSystemOne(request, config, signal) {
|
|
271
|
+
for (let attempt = 1;; attempt += 1) {
|
|
272
|
+
const response = await fetchSystemOne(request, config, signal);
|
|
273
|
+
if (response.ok) {
|
|
274
|
+
try {
|
|
275
|
+
return await response.json();
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
throw invalidResponse("Jev returned a non-JSON response body.");
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (attempt < JEV_ATTEMPTS && JEV_RETRY_STATUSES.has(response.status)) {
|
|
282
|
+
await delay(retryDelayMs(response.headers.get("retry-after")), signal);
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
const body = await response.text().catch(() => "");
|
|
286
|
+
throw new RouterFrameworkError("policy", `Jev returned HTTP ${response.status}: ${body}`, "jev_http_error");
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
async function fetchSystemOne(request, config, signal) {
|
|
290
|
+
const timeout = AbortSignal.timeout(config.timeoutMs);
|
|
291
|
+
try {
|
|
292
|
+
return await fetch(`${config.endpoint}/systemone`, {
|
|
293
|
+
method: "POST",
|
|
294
|
+
headers: {
|
|
295
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
296
|
+
"Content-Type": "application/json",
|
|
297
|
+
},
|
|
298
|
+
body: JSON.stringify(request),
|
|
299
|
+
signal: signal === undefined ? timeout : AbortSignal.any([signal, timeout]),
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
if (signal?.aborted)
|
|
304
|
+
throw error;
|
|
305
|
+
throw new RouterFrameworkError("policy", `Jev request failed: ${error instanceof Error ? error.message : String(error)}`, "jev_request_failed", undefined, { cause: error });
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
function retryDelayMs(retryAfter) {
|
|
309
|
+
const seconds = Number(retryAfter);
|
|
310
|
+
if (retryAfter === null || !Number.isFinite(seconds) || seconds <= 0)
|
|
311
|
+
return JEV_RETRY_DELAY_MS;
|
|
312
|
+
return Math.min(seconds * 1000, JEV_RETRY_MAX_DELAY_MS);
|
|
313
|
+
}
|
|
314
|
+
function delay(ms, signal) {
|
|
315
|
+
return new Promise((resolve, reject) => {
|
|
316
|
+
const timer = setTimeout(() => {
|
|
317
|
+
signal?.removeEventListener("abort", onAbort);
|
|
318
|
+
resolve();
|
|
319
|
+
}, ms);
|
|
320
|
+
const onAbort = () => {
|
|
321
|
+
clearTimeout(timer);
|
|
322
|
+
reject(signal?.reason);
|
|
323
|
+
};
|
|
324
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
function selectorInputFromRequest(request) {
|
|
328
|
+
const user = request.messages?.find((message) => message.role === "user");
|
|
329
|
+
if (typeof user?.content !== "string") {
|
|
330
|
+
throw new RouterCoreError("invalid_request", "Selector request is missing the JSON user message.", "invalid_request_error");
|
|
331
|
+
}
|
|
332
|
+
let parsed;
|
|
333
|
+
try {
|
|
334
|
+
parsed = JSON.parse(user.content);
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
throw new RouterCoreError("invalid_request", "Selector request user message is not valid JSON.", "invalid_request_error");
|
|
338
|
+
}
|
|
339
|
+
if (!isRecord(parsed) || !Array.isArray(parsed.candidate_pairs) || !Array.isArray(parsed.messages)) {
|
|
340
|
+
throw new RouterCoreError("invalid_request", "Selector input is missing candidate_pairs or messages.", "invalid_request_error");
|
|
341
|
+
}
|
|
342
|
+
return parsed;
|
|
343
|
+
}
|
|
344
|
+
// Cost per action as text Jev can compare literally: the loop projections at
|
|
345
|
+
// each lease length, plus a rank across actions on the comparison horizon.
|
|
346
|
+
function actionCosts(costs) {
|
|
347
|
+
const scalars = new Map();
|
|
348
|
+
const rendered = new Map();
|
|
349
|
+
for (const cost of costs) {
|
|
350
|
+
if (cost.projections.length === 0)
|
|
351
|
+
continue;
|
|
352
|
+
const comparison = cost.projections.find((projection) => projection.projected_turns === FIXED_TURN_COST_COMPARISON_TURNS) ?? cost.projections[cost.projections.length - 1];
|
|
353
|
+
scalars.set(cost.action, comparison.total_cost_usd);
|
|
354
|
+
rendered.set(cost.action, {
|
|
355
|
+
projected_loop_cost: Object.fromEntries(cost.projections.map((projection) => [
|
|
356
|
+
`${projection.projected_turns} turns`,
|
|
357
|
+
usd(projection.total_cost_usd),
|
|
358
|
+
])),
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
const ranked = [...scalars.entries()].sort((left, right) => left[1] - right[1]);
|
|
362
|
+
ranked.forEach(([, value], index) => {
|
|
363
|
+
// Competition ranking: tied costs share the better rank.
|
|
364
|
+
const rank = ranked.findIndex(([, other]) => other === value) + 1;
|
|
365
|
+
const suffix = ranked.length === 1
|
|
366
|
+
? ""
|
|
367
|
+
: rank === 1
|
|
368
|
+
? " (cheapest)"
|
|
369
|
+
: index === ranked.length - 1 && rank === ranked.length
|
|
370
|
+
? " (most expensive)"
|
|
371
|
+
: "";
|
|
372
|
+
const action = ranked[index][0];
|
|
373
|
+
rendered.get(action).rank = `${rank} of ${ranked.length}${suffix}`;
|
|
374
|
+
});
|
|
375
|
+
return rendered;
|
|
376
|
+
}
|
|
377
|
+
function choiceAnswer(value, name, usage) {
|
|
378
|
+
if (!isRecord(value)
|
|
379
|
+
|| value.type !== "choice"
|
|
380
|
+
|| typeof value.choice !== "string"
|
|
381
|
+
|| typeof value.confidence !== "number"
|
|
382
|
+
|| !isRecord(value.probabilities)) {
|
|
383
|
+
throw invalidResponse(`Jev response is missing a choice answer for ${name}.`, usage);
|
|
384
|
+
}
|
|
385
|
+
const probabilities = {};
|
|
386
|
+
for (const [label, probability] of Object.entries(value.probabilities)) {
|
|
387
|
+
if (typeof probability === "number")
|
|
388
|
+
probabilities[label] = probability;
|
|
389
|
+
}
|
|
390
|
+
return {
|
|
391
|
+
type: "choice",
|
|
392
|
+
choice: value.choice,
|
|
393
|
+
confidence: value.confidence,
|
|
394
|
+
probabilities,
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
function usd(value) {
|
|
398
|
+
if (value >= 1)
|
|
399
|
+
return `$${value.toFixed(2)}`;
|
|
400
|
+
const trimmed = value.toPrecision(3).replace(/0+$/, "").replace(/\.$/, "");
|
|
401
|
+
return `$${trimmed}`;
|
|
402
|
+
}
|
|
403
|
+
function percent(value) {
|
|
404
|
+
return `${Math.round(value * 100)}%`;
|
|
405
|
+
}
|
|
406
|
+
function invalidResponse(message, usage = null) {
|
|
407
|
+
return new JevSelectorOutputError(message, "selector_invalid_response", usage);
|
|
408
|
+
}
|
|
409
|
+
function configurationError(message, param) {
|
|
410
|
+
return new RouterCoreError("configuration", message, "jev_configuration_invalid", param);
|
|
411
|
+
}
|
|
412
|
+
function frameworkError(error) {
|
|
413
|
+
if (!(error instanceof RouterCoreError))
|
|
414
|
+
return error;
|
|
415
|
+
const kind = error.kind === "selector_output" ? "policy" : error.kind;
|
|
416
|
+
return new RouterFrameworkError(kind, error.message, error.code, error.param, { cause: error });
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=jev_selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jev_selector.js","sourceRoot":"","sources":["../src/jev_selector.ts"],"names":[],"mappings":"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"}
|
package/dist/model_ids.d.ts
CHANGED
|
@@ -2,3 +2,4 @@ import type { Provider } from "./types.js";
|
|
|
2
2
|
export declare function providerForModel(model: string): Provider;
|
|
3
3
|
export declare function nativeModelId(model: string): string;
|
|
4
4
|
export declare function canonicalModelId(modelId: string): string;
|
|
5
|
+
export declare function modelFamilyProvider(model: string, provider?: string): string;
|
package/dist/model_ids.js
CHANGED
|
@@ -27,4 +27,30 @@ export function canonicalModelId(modelId) {
|
|
|
27
27
|
return modelId;
|
|
28
28
|
return modelId.slice(0, slash).toLowerCase() + modelId.slice(slash);
|
|
29
29
|
}
|
|
30
|
+
// Serving-provider adapters that execute a canonical model owner's models
|
|
31
|
+
// retain the owner's tokenizer, prompt-cache, and cost family. Warm-prefix
|
|
32
|
+
// provenance is checked separately against the actual serving provider, so
|
|
33
|
+
// an alias here never lets one provider claim another's cached prefix.
|
|
34
|
+
// Returns null when the serving provider is not an alias.
|
|
35
|
+
function aliasFamilyProvider(model, provider) {
|
|
36
|
+
if (provider === "openai-codex")
|
|
37
|
+
return "openai";
|
|
38
|
+
if (provider !== "amazon-bedrock" && provider !== "azure")
|
|
39
|
+
return null;
|
|
40
|
+
const slash = canonicalModelId(model).indexOf("/");
|
|
41
|
+
if (slash <= 0)
|
|
42
|
+
return null;
|
|
43
|
+
const owner = canonicalModelId(model).slice(0, slash).toLowerCase();
|
|
44
|
+
return owner === "openai" || owner === "anthropic" ? owner : null;
|
|
45
|
+
}
|
|
46
|
+
// The provider whose family behavior (tokenizer, prompt cache, cost class)
|
|
47
|
+
// a model follows: the serving provider itself, or the canonical model owner
|
|
48
|
+
// when serving through a provider alias. Callers that know the serving
|
|
49
|
+
// provider pass it; otherwise the model id's prefix decides, and an id with
|
|
50
|
+
// no parseable prefix is an error, not a silently generic model.
|
|
51
|
+
export function modelFamilyProvider(model, provider) {
|
|
52
|
+
const resolved = (provider ?? providerForModel(model)).toLowerCase();
|
|
53
|
+
const aliased = aliasFamilyProvider(model, resolved);
|
|
54
|
+
return aliased ?? resolved;
|
|
55
|
+
}
|
|
30
56
|
//# sourceMappingURL=model_ids.js.map
|
package/dist/model_ids.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model_ids.js","sourceRoot":"","sources":["../src/model_ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAErD,4EAA4E;AAC5E,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,iBAAiB,EAAE,kCAAkC,KAAK,EAAE,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACxH,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACrD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,eAAe,CAAC,iBAAiB,EAAE,kCAAkC,KAAK,EAAE,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACxH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,0EAA0E;AAC1E,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,yEAAyE;AACzE,0EAA0E;AAC1E,2EAA2E;AAC3E,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/B,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACtE,CAAC"}
|
|
1
|
+
{"version":3,"file":"model_ids.js","sourceRoot":"","sources":["../src/model_ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAErD,4EAA4E;AAC5E,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,iBAAiB,EAAE,kCAAkC,KAAK,EAAE,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACxH,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACrD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,eAAe,CAAC,iBAAiB,EAAE,kCAAkC,KAAK,EAAE,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACxH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,0EAA0E;AAC1E,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,yEAAyE;AACzE,0EAA0E;AAC1E,2EAA2E;AAC3E,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/B,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,0EAA0E;AAC1E,2EAA2E;AAC3E,2EAA2E;AAC3E,uEAAuE;AACvE,0DAA0D;AAC1D,SAAS,mBAAmB,CAAC,KAAa,EAAE,QAAgB;IAC1D,IAAI,QAAQ,KAAK,cAAc;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,QAAQ,KAAK,gBAAgB,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACvE,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC;AAED,2EAA2E;AAC3E,6EAA6E;AAC7E,uEAAuE;AACvE,4EAA4E;AAC5E,iEAAiE;AACjE,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,QAAiB;IAClE,MAAM,QAAQ,GAAG,CAAC,QAAQ,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACrE,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrD,OAAO,OAAO,IAAI,QAAQ,CAAC;AAC7B,CAAC"}
|
package/dist/pi_context.js
CHANGED
|
@@ -8,6 +8,7 @@ export function piContext(request, model) {
|
|
|
8
8
|
const calls = new Map();
|
|
9
9
|
const timestamp = Date.now();
|
|
10
10
|
let assistant;
|
|
11
|
+
let sawConversationItem = false;
|
|
11
12
|
const flushAssistant = () => {
|
|
12
13
|
if (assistant === undefined)
|
|
13
14
|
return;
|
|
@@ -35,16 +36,27 @@ export function piContext(request, model) {
|
|
|
35
36
|
for (const item of request.items) {
|
|
36
37
|
if (item.type === "message" && (item.role === "system" || item.role === "developer")) {
|
|
37
38
|
flushAssistant();
|
|
38
|
-
|
|
39
|
+
const text = systemText(item.content);
|
|
40
|
+
if (!text)
|
|
41
|
+
continue;
|
|
42
|
+
if (!sawConversationItem) {
|
|
43
|
+
// Leading preamble is identical on every request, so folding it into
|
|
44
|
+
// the system prompt keeps the provider payload prefix stable.
|
|
45
|
+
system.push(text);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
// Mid-conversation system/developer notes arrive between turns (Claude
|
|
49
|
+
// Code appends a `<total_tokens>` reminder after every tool result).
|
|
50
|
+
// Folding them into the system prompt mutates the front of the provider
|
|
51
|
+
// payload, so prefix-matching prompt caches miss and re-write the whole
|
|
52
|
+
// conversation at cache-write prices. Keep them positional instead.
|
|
53
|
+
appendPositionalNote(messages, text, timestamp);
|
|
39
54
|
continue;
|
|
40
55
|
}
|
|
56
|
+
sawConversationItem = true;
|
|
41
57
|
if (item.type === "message" && item.role === "user") {
|
|
42
58
|
flushAssistant();
|
|
43
|
-
messages.
|
|
44
|
-
role: "user",
|
|
45
|
-
content: piContent(item.content, "user message"),
|
|
46
|
-
timestamp,
|
|
47
|
-
});
|
|
59
|
+
appendUserMessage(messages, piContent(item.content, "user message"), timestamp);
|
|
48
60
|
continue;
|
|
49
61
|
}
|
|
50
62
|
if (item.type === "message") {
|
|
@@ -150,6 +162,25 @@ function thinkingContent(item, continuation) {
|
|
|
150
162
|
redacted: true,
|
|
151
163
|
};
|
|
152
164
|
}
|
|
165
|
+
function appendPositionalNote(messages, text, timestamp) {
|
|
166
|
+
const previous = messages.at(-1);
|
|
167
|
+
if (previous?.role === "toolResult") {
|
|
168
|
+
previous.content = [...piContentBlocks(previous.content), { type: "text", text }];
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
appendUserMessage(messages, [{ type: "text", text }], timestamp);
|
|
172
|
+
}
|
|
173
|
+
function appendUserMessage(messages, content, timestamp) {
|
|
174
|
+
const previous = messages.at(-1);
|
|
175
|
+
if (previous?.role === "user") {
|
|
176
|
+
previous.content = [...piContentBlocks(previous.content), ...piContentBlocks(content)];
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
messages.push({ role: "user", content, timestamp });
|
|
180
|
+
}
|
|
181
|
+
function piContentBlocks(content) {
|
|
182
|
+
return typeof content === "string" ? [{ type: "text", text: content }] : content;
|
|
183
|
+
}
|
|
153
184
|
function systemText(content) {
|
|
154
185
|
return content.map((part) => {
|
|
155
186
|
if (part.type !== "text") {
|
package/dist/pi_context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi_context.js","sourceRoot":"","sources":["../src/pi_context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAMtC,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,GAErB,MAAM,yBAAyB,CAAC;AAGjC,MAAM,UAAU,SAAS,CAAC,OAAsB,EAAE,KAAc;IAC9D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAwB,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,SAAkF,CAAC;
|
|
1
|
+
{"version":3,"file":"pi_context.js","sourceRoot":"","sources":["../src/pi_context.ts"],"names":[],"mappings":"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"}
|
package/dist/pi_options.js
CHANGED
|
@@ -53,7 +53,7 @@ export async function piOptions(runtime, execution, model) {
|
|
|
53
53
|
execution.reasoningEffort !== "max") {
|
|
54
54
|
options.thinkingBudgets = { [execution.reasoningEffort]: budget };
|
|
55
55
|
}
|
|
56
|
-
const patch = payloadPatch(request, model);
|
|
56
|
+
const patch = payloadPatch(request, model, execution);
|
|
57
57
|
if (patch !== undefined)
|
|
58
58
|
options.onPayload = patch;
|
|
59
59
|
return options;
|
|
@@ -106,7 +106,7 @@ function piToolChoice(choice) {
|
|
|
106
106
|
return choice;
|
|
107
107
|
return { type: "function", function: { name: choice.name } };
|
|
108
108
|
}
|
|
109
|
-
function payloadPatch(request, model) {
|
|
109
|
+
function payloadPatch(request, model, execution) {
|
|
110
110
|
const strictTools = request.tools.some((tool) => tool.strict !== undefined);
|
|
111
111
|
const parallel = request.parallelToolCalls;
|
|
112
112
|
const imageDetails = imageDetailQueues(request);
|
|
@@ -118,7 +118,10 @@ function payloadPatch(request, model) {
|
|
|
118
118
|
[...imageDetails.values()].some((queue) => queue.some((detail) => detail !== "auto"))) {
|
|
119
119
|
throw new RouterFrameworkError("invalid_request", `Pi API '${model.api}' cannot preserve image detail controls.`, "pi_image_detail_unsupported");
|
|
120
120
|
}
|
|
121
|
-
if (!strictTools &&
|
|
121
|
+
if (!strictTools &&
|
|
122
|
+
parallel === undefined &&
|
|
123
|
+
!thinkingPatch &&
|
|
124
|
+
!imageDetailPatch) {
|
|
122
125
|
return undefined;
|
|
123
126
|
}
|
|
124
127
|
if ((strictTools || parallel !== undefined) && !PAYLOAD_PATCH_APIS.has(model.api)) {
|