@mupt-ai/dari-router 0.2.3 → 0.2.5

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 (75) hide show
  1. package/README.md +14 -1
  2. package/dist/anonymous_actions.d.ts +18 -8
  3. package/dist/anonymous_actions.js +123 -46
  4. package/dist/anonymous_actions.js.map +1 -1
  5. package/dist/cache_behavior.js +1 -1
  6. package/dist/cache_behavior.js.map +1 -1
  7. package/dist/cache_scope.js +4 -1
  8. package/dist/cache_scope.js.map +1 -1
  9. package/dist/continuation_state.d.ts +1 -0
  10. package/dist/continuation_state.js +6 -1
  11. package/dist/continuation_state.js.map +1 -1
  12. package/dist/cost.d.ts +1 -0
  13. package/dist/cost.js +57 -36
  14. package/dist/cost.js.map +1 -1
  15. package/dist/eval_score_imputation.d.ts +14 -3
  16. package/dist/eval_score_imputation.js +82 -59
  17. package/dist/eval_score_imputation.js.map +1 -1
  18. package/dist/fixed_turn_cost_config.d.ts +2 -0
  19. package/dist/fixed_turn_cost_config.js +8 -0
  20. package/dist/fixed_turn_cost_config.js.map +1 -1
  21. package/dist/index.d.ts +0 -2
  22. package/dist/index.js +0 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/jev_client.d.ts +31 -0
  25. package/dist/jev_client.js +115 -0
  26. package/dist/jev_client.js.map +1 -0
  27. package/dist/jev_eval_relevance.d.ts +49 -0
  28. package/dist/jev_eval_relevance.js +176 -0
  29. package/dist/jev_eval_relevance.js.map +1 -0
  30. package/dist/jev_selector.d.ts +3 -27
  31. package/dist/jev_selector.js +31 -221
  32. package/dist/jev_selector.js.map +1 -1
  33. package/dist/model_ids.js +10 -3
  34. package/dist/model_ids.js.map +1 -1
  35. package/dist/pi_context.js.map +1 -1
  36. package/dist/pi_options.js +83 -26
  37. package/dist/pi_options.js.map +1 -1
  38. package/dist/pi_output.js +2 -2
  39. package/dist/pi_output.js.map +1 -1
  40. package/dist/policy-engine.d.ts +2 -0
  41. package/dist/policy-engine.js +2 -0
  42. package/dist/policy-engine.js.map +1 -1
  43. package/dist/prompts/anonymous_action.md +33 -0
  44. package/dist/prompts/anonymous_rules.md +5 -0
  45. package/dist/prompts/custom_rules.md +10 -0
  46. package/dist/prompts/jev_eval_relevance.json +12 -0
  47. package/dist/prompts/jev_selector.json +22 -0
  48. package/dist/prompts/selector.md +21 -0
  49. package/dist/prompts.d.ts +28 -3
  50. package/dist/prompts.js +58 -80
  51. package/dist/prompts.js.map +1 -1
  52. package/dist/route.d.ts +1 -0
  53. package/dist/route.js +21 -0
  54. package/dist/route.js.map +1 -1
  55. package/dist/routing_history.d.ts +3 -0
  56. package/dist/routing_history.js +90 -55
  57. package/dist/routing_history.js.map +1 -1
  58. package/dist/selector_input.d.ts +0 -2
  59. package/dist/selector_input.js +15 -7
  60. package/dist/selector_input.js.map +1 -1
  61. package/dist/selector_request.d.ts +0 -1
  62. package/dist/selector_request.js +14 -37
  63. package/dist/selector_request.js.map +1 -1
  64. package/dist/selector_truncation.d.ts +0 -1
  65. package/dist/selector_truncation.js +6 -39
  66. package/dist/selector_truncation.js.map +1 -1
  67. package/dist/thinking_level_graph.d.ts +10 -0
  68. package/dist/thinking_level_graph.js +64 -0
  69. package/dist/thinking_level_graph.js.map +1 -0
  70. package/dist/types.d.ts +2 -0
  71. package/package.json +4 -5
  72. package/dist/jev_router.d.ts +0 -5
  73. package/dist/jev_router.js +0 -22
  74. package/dist/jev_router.js.map +0 -1
  75. package/examples/jev_router.ts +0 -50
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;AAC1B,OAAO,EACL,eAAe,GAChB,MAAM,iBAAiB,CAAC;AAwDzB,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,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAuD1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { RouterCoreError } from "./errors.js";
2
+ import type { JsonValue } from "./json.js";
3
+ export declare const DEFAULT_JEV_ENDPOINT = "https://api.typesafe.ai/v1";
4
+ export declare const DEFAULT_JEV_MODEL = "jev-latest";
5
+ export type JevConfig = {
6
+ apiKey: string;
7
+ endpoint?: string;
8
+ model?: string;
9
+ timeoutMs?: number;
10
+ };
11
+ export type ResolvedJevConfig = {
12
+ apiKey: string;
13
+ endpoint: string;
14
+ model: string;
15
+ timeoutMs: number;
16
+ };
17
+ export type JevTokenUsage = {
18
+ input_tokens: number;
19
+ output_tokens: number;
20
+ };
21
+ export declare class JevOutputError extends RouterCoreError {
22
+ readonly usage: JevTokenUsage | null;
23
+ constructor(message: string, code: string, usage?: JevTokenUsage | null);
24
+ }
25
+ export declare function resolveJevConfig(input: JevConfig): ResolvedJevConfig;
26
+ export declare function postSystemOne(request: {
27
+ model: string;
28
+ state: JsonValue;
29
+ questions: Record<string, unknown>;
30
+ }, config: ResolvedJevConfig, signal: AbortSignal | undefined): Promise<unknown>;
31
+ export declare function invalidJevResponse(message: string, usage?: JevTokenUsage | null): JevOutputError;
@@ -0,0 +1,115 @@
1
+ // TypeSafe Jev System One transport. Jev (docs.typesafe.ai) is a System One
2
+ // model: it answers typed questions about a state instead of generating
3
+ // text, and the answers come back as calibrated probabilities. Callers own
4
+ // the questions; this module owns the connection, retries, and errors.
5
+ import { RouterCoreError } from "./errors.js";
6
+ import { RouterFrameworkError } from "./framework_error.js";
7
+ export const DEFAULT_JEV_ENDPOINT = "https://api.typesafe.ai/v1";
8
+ export const DEFAULT_JEV_MODEL = "jev-latest";
9
+ const DEFAULT_JEV_TIMEOUT_MS = 30_000;
10
+ // Rate-limit and overload responses get one backoff retry; anything else is
11
+ // the caller's failure to surface.
12
+ const JEV_RETRY_STATUSES = new Set([429, 529]);
13
+ const JEV_ATTEMPTS = 2;
14
+ const JEV_RETRY_DELAY_MS = 500;
15
+ const JEV_RETRY_MAX_DELAY_MS = 5_000;
16
+ // Jev answered 200 with a body the caller cannot use. Token counts are on
17
+ // the body even then, so hosts can still bill the call.
18
+ export class JevOutputError extends RouterCoreError {
19
+ usage;
20
+ constructor(message, code, usage = null) {
21
+ super("selector_output", message, code);
22
+ this.name = "JevOutputError";
23
+ this.usage = usage;
24
+ }
25
+ }
26
+ export function resolveJevConfig(input) {
27
+ const apiKey = input.apiKey?.trim() ?? "";
28
+ if (!apiKey)
29
+ throw configurationError("Jev requires an apiKey.", "apiKey");
30
+ const endpoint = (input.endpoint ?? DEFAULT_JEV_ENDPOINT).trim().replace(/\/+$/, "");
31
+ let url;
32
+ try {
33
+ url = new URL(endpoint);
34
+ }
35
+ catch {
36
+ throw configurationError("Jev endpoint must be a valid URL.", "endpoint");
37
+ }
38
+ if ((url.protocol !== "https:" && url.protocol !== "http:") || url.username || url.password) {
39
+ throw configurationError("Jev endpoint must be an HTTP(S) URL without embedded credentials.", "endpoint");
40
+ }
41
+ const model = (input.model ?? DEFAULT_JEV_MODEL).trim();
42
+ if (!model)
43
+ throw configurationError("Jev model must not be empty.", "model");
44
+ const timeoutMs = input.timeoutMs ?? DEFAULT_JEV_TIMEOUT_MS;
45
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {
46
+ throw configurationError("Jev timeoutMs must be a positive integer.", "timeoutMs");
47
+ }
48
+ return { apiKey, endpoint, model, timeoutMs };
49
+ }
50
+ // One System One call: POSTs the request, retries once on rate limits and
51
+ // overload, and returns the parsed body for the caller to interpret.
52
+ export async function postSystemOne(request, config, signal) {
53
+ for (let attempt = 1;; attempt += 1) {
54
+ const response = await fetchSystemOne(request, config, signal);
55
+ if (response.ok) {
56
+ try {
57
+ return await response.json();
58
+ }
59
+ catch {
60
+ throw invalidJevResponse("Jev returned a non-JSON response body.");
61
+ }
62
+ }
63
+ if (attempt < JEV_ATTEMPTS && JEV_RETRY_STATUSES.has(response.status)) {
64
+ await delay(retryDelayMs(response.headers.get("retry-after")), signal);
65
+ continue;
66
+ }
67
+ const body = await response.text().catch(() => "");
68
+ throw new RouterFrameworkError("policy", `Jev returned HTTP ${response.status}: ${body}`, "jev_http_error");
69
+ }
70
+ }
71
+ export function invalidJevResponse(message, usage = null) {
72
+ return new JevOutputError(message, "selector_invalid_response", usage);
73
+ }
74
+ async function fetchSystemOne(request, config, signal) {
75
+ const timeout = AbortSignal.timeout(config.timeoutMs);
76
+ try {
77
+ return await fetch(`${config.endpoint}/systemone`, {
78
+ method: "POST",
79
+ headers: {
80
+ Authorization: `Bearer ${config.apiKey}`,
81
+ "Content-Type": "application/json",
82
+ },
83
+ body: JSON.stringify(request),
84
+ signal: signal === undefined ? timeout : AbortSignal.any([signal, timeout]),
85
+ });
86
+ }
87
+ catch (error) {
88
+ if (signal?.aborted)
89
+ throw error;
90
+ throw new RouterFrameworkError("policy", `Jev request failed: ${error instanceof Error ? error.message : String(error)}`, "jev_request_failed", undefined, { cause: error });
91
+ }
92
+ }
93
+ function retryDelayMs(retryAfter) {
94
+ const seconds = Number(retryAfter);
95
+ if (retryAfter === null || !Number.isFinite(seconds) || seconds <= 0)
96
+ return JEV_RETRY_DELAY_MS;
97
+ return Math.min(seconds * 1000, JEV_RETRY_MAX_DELAY_MS);
98
+ }
99
+ function delay(ms, signal) {
100
+ return new Promise((resolve, reject) => {
101
+ const timer = setTimeout(() => {
102
+ signal?.removeEventListener("abort", onAbort);
103
+ resolve();
104
+ }, ms);
105
+ const onAbort = () => {
106
+ clearTimeout(timer);
107
+ reject(signal?.reason);
108
+ };
109
+ signal?.addEventListener("abort", onAbort, { once: true });
110
+ });
111
+ }
112
+ function configurationError(message, param) {
113
+ return new RouterCoreError("configuration", message, "jev_configuration_invalid", param);
114
+ }
115
+ //# sourceMappingURL=jev_client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jev_client.js","sourceRoot":"","sources":["../src/jev_client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { JsonValue } from "./json.js";
2
+ import { type ResolvedJevConfig } from "./jev_client.js";
3
+ import { type ChatMessage, type RouterEval } from "./types.js";
4
+ export declare const JEV_EVAL_RELEVANCE_THRESHOLD = 0.3;
5
+ export declare const JEV_EVAL_RELEVANCE_BATCH_SIZE = 100;
6
+ export declare const JEV_EVAL_RELEVANCE_HISTORY_CHAR_BUDGET = 16000;
7
+ export type JevEvalRelevanceState = {
8
+ task: ChatMessage | null;
9
+ conversation: ChatMessage[];
10
+ };
11
+ export type JevNoulQuestion = {
12
+ type: "noul";
13
+ instructions: JsonValue;
14
+ criteria: {
15
+ true: string;
16
+ false: string;
17
+ };
18
+ };
19
+ export type JevEvalRelevanceRequest = {
20
+ model: string;
21
+ state: JsonValue;
22
+ questions: Record<string, JevNoulQuestion>;
23
+ };
24
+ export type JevEvalRelevanceCard = {
25
+ id: string;
26
+ name: string;
27
+ relevance: number;
28
+ kept: boolean;
29
+ };
30
+ export type JevEvalRelevanceSelection = {
31
+ evals: RouterEval[];
32
+ cards: JevEvalRelevanceCard[];
33
+ model: string;
34
+ usage: {
35
+ input_tokens: number;
36
+ output_tokens: number;
37
+ };
38
+ requests: JevEvalRelevanceRequest[];
39
+ };
40
+ export declare function buildJevEvalRelevanceRequest(cards: readonly RouterEval[], state: JevEvalRelevanceState, model: string): JevEvalRelevanceRequest;
41
+ export declare function parseJevEvalRelevanceResponse(body: unknown, cards: readonly RouterEval[]): {
42
+ cards: JevEvalRelevanceCard[];
43
+ model: string;
44
+ usage: {
45
+ input_tokens: number;
46
+ output_tokens: number;
47
+ };
48
+ };
49
+ export declare function selectRelevantEvals(cards: readonly RouterEval[], state: JevEvalRelevanceState, config: ResolvedJevConfig, signal?: AbortSignal): Promise<JevEvalRelevanceSelection>;
@@ -0,0 +1,176 @@
1
+ // Jev-decided eval relevance. Instead of the router owner curating which
2
+ // benchmark scorecards the selector sees, every candidate card is put to Jev
3
+ // as one yes/no (Noul) question — does this benchmark measure the kind of
4
+ // work the agent is doing? — all cards in a single System One call, and the
5
+ // cards Jev answers yes to become the selector's imported_evals.
6
+ //
7
+ // Jev is literal, so the question names the exact condition and the criteria
8
+ // carry the boundary: a benchmark of the same kind of work (coding, legal,
9
+ // visual design, ...) is relevant even when its exact task differs; a
10
+ // benchmark of a different kind of work is not, however capable a model
11
+ // scoring well on it might be.
12
+ import { JEV_EVAL_RELEVANCE_PROMPT } from "./prompts.js";
13
+ import { invalidJevResponse, postSystemOne } from "./jev_client.js";
14
+ import { compactRoutingHistory, contentText, elideMiddle, ROUTER_USER_MESSAGE_CHAR_CAP, } from "./routing_history.js";
15
+ import { isRecord } from "./types.js";
16
+ // A card is kept when Jev's probability that it is relevant exceeds this.
17
+ // Below even odds on purpose: an irrelevant card is noise the selector can
18
+ // discount, while a missed card is evidence it never sees.
19
+ export const JEV_EVAL_RELEVANCE_THRESHOLD = 0.3;
20
+ // Cards per System One call. Jev evaluates every question against the
21
+ // state in one pass and its latency grows slowly with question count, but
22
+ // each question also counts toward the request's token cap alongside the
23
+ // state; probed against the API, 100 cards plus a 64k-char conversation fit
24
+ // with room to spare while 400 cards alone did not.
25
+ export const JEV_EVAL_RELEVANCE_BATCH_SIZE = 100;
26
+ export const JEV_EVAL_RELEVANCE_HISTORY_CHAR_BUDGET = 16_000;
27
+ export function buildJevEvalRelevanceRequest(cards, state, model) {
28
+ const questions = {};
29
+ for (const card of cards) {
30
+ questions[card.id] = {
31
+ type: "noul",
32
+ instructions: {
33
+ question: JEV_EVAL_RELEVANCE_PROMPT.question,
34
+ benchmark: {
35
+ name: card.name,
36
+ ...(card.description ? { description: card.description } : {}),
37
+ },
38
+ rules: JEV_EVAL_RELEVANCE_PROMPT.rules,
39
+ },
40
+ criteria: JEV_EVAL_RELEVANCE_PROMPT.criteria,
41
+ };
42
+ }
43
+ return {
44
+ model,
45
+ state: {
46
+ task: state.task,
47
+ conversation: state.conversation,
48
+ },
49
+ questions,
50
+ };
51
+ }
52
+ // Maps a System One body back onto the cards it was asked about. Every card
53
+ // must be answered; a missing or non-Noul answer is a malformed response.
54
+ export function parseJevEvalRelevanceResponse(body, cards) {
55
+ if (!isRecord(body) || typeof body.model !== "string" || !isRecord(body.answers)) {
56
+ throw invalidJevResponse("Jev returned an unrecognized eval relevance response body.");
57
+ }
58
+ const usage = body.usage;
59
+ if (!isRecord(usage)
60
+ || typeof usage.input_tokens !== "number"
61
+ || typeof usage.output_tokens !== "number") {
62
+ throw invalidJevResponse("Jev eval relevance response is missing token usage.");
63
+ }
64
+ const answers = body.answers;
65
+ const scored = cards.map((card) => {
66
+ const answer = answers[card.id];
67
+ if (!isRecord(answer)
68
+ || answer.type !== "noul"
69
+ || typeof answer.noul !== "number"
70
+ || !Number.isFinite(answer.noul)
71
+ || answer.noul < 0
72
+ || answer.noul > 1) {
73
+ throw invalidJevResponse(`Jev eval relevance response has an invalid noul answer for ${card.id}.`);
74
+ }
75
+ return {
76
+ id: card.id,
77
+ name: card.name,
78
+ relevance: answer.noul,
79
+ kept: answer.noul > JEV_EVAL_RELEVANCE_THRESHOLD,
80
+ };
81
+ });
82
+ return {
83
+ cards: scored,
84
+ model: body.model,
85
+ usage: { input_tokens: usage.input_tokens, output_tokens: usage.output_tokens },
86
+ };
87
+ }
88
+ // Asks Jev about every card (batched, batches in parallel) and returns the
89
+ // kept cards in their original order plus the per-card probabilities.
90
+ export async function selectRelevantEvals(cards, state, config, signal) {
91
+ const unique = dedupeById(cards);
92
+ if (unique.length === 0) {
93
+ return {
94
+ evals: [],
95
+ cards: [],
96
+ model: config.model,
97
+ usage: { input_tokens: 0, output_tokens: 0 },
98
+ requests: [],
99
+ };
100
+ }
101
+ const batches = [];
102
+ for (let start = 0; start < unique.length; start += JEV_EVAL_RELEVANCE_BATCH_SIZE) {
103
+ batches.push(unique.slice(start, start + JEV_EVAL_RELEVANCE_BATCH_SIZE));
104
+ }
105
+ // History compaction leaves a lone message and the leading instructions
106
+ // verbatim, so every message is also capped: one large paste must not push
107
+ // the request past Jev's token limit.
108
+ const boundedState = {
109
+ task: state.task === null ? null : boundedMessage(state.task, ROUTER_USER_MESSAGE_CHAR_CAP),
110
+ conversation: compactRoutingHistory(state.conversation, JEV_EVAL_RELEVANCE_HISTORY_CHAR_BUDGET).map((message) => boundedMessage(message, JEV_EVAL_RELEVANCE_HISTORY_CHAR_BUDGET)),
111
+ };
112
+ const requests = batches.map((batch) => buildJevEvalRelevanceRequest(batch, boundedState, config.model));
113
+ const parsed = await Promise.all(requests.map(async (request, index) => parseJevEvalRelevanceResponse(await postSystemOne(request, config, signal), batches[index])));
114
+ const scored = parsed.flatMap((result) => result.cards);
115
+ const kept = new Set(scored.filter((card) => card.kept).map((card) => card.id));
116
+ return {
117
+ evals: unique.filter((card) => kept.has(card.id)),
118
+ cards: scored,
119
+ model: parsed[0].model,
120
+ usage: parsed.reduce((total, result) => ({
121
+ input_tokens: total.input_tokens + result.usage.input_tokens,
122
+ output_tokens: total.output_tokens + result.usage.output_tokens,
123
+ }), { input_tokens: 0, output_tokens: 0 }),
124
+ requests,
125
+ };
126
+ }
127
+ // Jev only needs the words, so an oversized message becomes its text with the
128
+ // middle of each long part elided, shrinking until the JSON (escapes
129
+ // included) fits.
130
+ function boundedMessage(message, maxChars) {
131
+ if (JSON.stringify(message).length <= maxChars)
132
+ return message;
133
+ const parts = typeof message.content === "string"
134
+ ? [message.content]
135
+ : Array.isArray(message.content)
136
+ ? message.content.map((part) => contentText([part])).filter((text) => text !== "")
137
+ : [];
138
+ for (let keepChars = maxChars;; keepChars = Math.floor(keepChars * 0.75)) {
139
+ const bounded = { role: message.role, content: elideParts(parts, keepChars) };
140
+ if (keepChars === 0 || JSON.stringify(bounded).length <= maxChars)
141
+ return bounded;
142
+ }
143
+ }
144
+ // Shares the budget across text parts so a short ask between long harness
145
+ // parts (reminders, environment dumps) survives: parts within an even share
146
+ // stay whole and the longer parts split what remains.
147
+ function elideParts(parts, maxChars) {
148
+ const limits = new Array(parts.length).fill(0);
149
+ let remaining = Math.max(0, maxChars - (parts.length - 1));
150
+ const bySize = parts.map((_, index) => index).sort((left, right) => parts[left].length - parts[right].length);
151
+ for (let open = 0; open < bySize.length; open += 1) {
152
+ const share = Math.floor(remaining / (bySize.length - open));
153
+ const index = bySize[open];
154
+ if (parts[index].length > share) {
155
+ for (const rest of bySize.slice(open))
156
+ limits[rest] = share;
157
+ break;
158
+ }
159
+ limits[index] = parts[index].length;
160
+ remaining -= parts[index].length;
161
+ }
162
+ return parts.map((part, index) => elideMiddle(part, limits[index])).join("\n");
163
+ }
164
+ // The candidate pool is the router's own cards plus the public catalog; a
165
+ // card the router imported from the catalog appears in both, and the first
166
+ // occurrence (the router's copy) wins.
167
+ function dedupeById(cards) {
168
+ const seen = new Set();
169
+ return cards.filter((card) => {
170
+ if (seen.has(card.id))
171
+ return false;
172
+ seen.add(card.id);
173
+ return true;
174
+ });
175
+ }
176
+ //# sourceMappingURL=jev_eval_relevance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jev_eval_relevance.js","sourceRoot":"","sources":["../src/jev_eval_relevance.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,11 @@
1
1
  import { type AnonymousActionSlot, type AnonymousSelectorInput } from "./anonymous_actions.js";
2
- import { RouterCoreError } from "./errors.js";
2
+ import { type JevTokenUsage, type ResolvedJevConfig } from "./jev_client.js";
3
3
  import type { JsonValue } from "./json.js";
4
- import type { Selector } from "./route.js";
5
4
  import type { CustomSelectorInput, SelectorInput } from "./selector_input.js";
6
5
  import { type RoutingDecision } from "./types.js";
7
- export declare const DEFAULT_JEV_ENDPOINT = "https://api.typesafe.ai/v1";
8
- export declare const DEFAULT_JEV_MODEL = "jev-latest";
9
6
  export declare const JEV_SELECTOR_CONTEXT_WINDOW_CHARS = 64000;
10
- export type JevSelectorConfig = {
11
- apiKey: string;
12
- endpoint?: string;
13
- model?: string;
14
- leaseTurns?: readonly number[];
15
- timeoutMs?: number;
16
- };
17
- export type ResolvedJevSelectorConfig = {
18
- apiKey: string;
19
- endpoint: string;
20
- model: string;
7
+ export type JevSelectorConfig = ResolvedJevConfig & {
21
8
  leaseTurns: readonly number[];
22
- timeoutMs: number;
23
9
  };
24
10
  export type JevChoiceQuestion = {
25
11
  type: "choice";
@@ -40,10 +26,6 @@ export type JevChoiceAnswer = {
40
26
  confidence: number;
41
27
  probabilities: Record<string, number>;
42
28
  };
43
- export type JevTokenUsage = {
44
- input_tokens: number;
45
- output_tokens: number;
46
- };
47
29
  export type JevSystemOneResponse = {
48
30
  model: string;
49
31
  answers: {
@@ -52,16 +34,11 @@ export type JevSystemOneResponse = {
52
34
  };
53
35
  usage: JevTokenUsage;
54
36
  };
55
- export declare class JevSelectorOutputError extends RouterCoreError {
56
- readonly usage: JevTokenUsage | null;
57
- constructor(message: string, code: string, usage?: JevTokenUsage | null);
58
- }
59
37
  export type JevSelection = {
60
38
  decision: RoutingDecision;
61
39
  request: JevSystemOneRequest;
62
40
  response: JevSystemOneResponse;
63
41
  };
64
- export declare function resolveJevSelectorConfig(input: JevSelectorConfig): ResolvedJevSelectorConfig;
65
42
  export declare function buildJevSelectorRequest(anonymousInput: AnonymousSelectorInput, options: {
66
43
  model: string;
67
44
  leaseTurns: readonly number[];
@@ -73,5 +50,4 @@ export declare function parseJevSelectorResponse(body: unknown, args: {
73
50
  decision: RoutingDecision;
74
51
  response: JevSystemOneResponse;
75
52
  };
76
- export declare function selectWithJev(selectorInput: SelectorInput | CustomSelectorInput, slots: readonly AnonymousActionSlot[], config: ResolvedJevSelectorConfig, signal?: AbortSignal): Promise<JevSelection>;
77
- export declare function createJevSelector(input: JevSelectorConfig): Selector;
53
+ export declare function selectWithJev(selectorInput: SelectorInput | CustomSelectorInput, slots: readonly AnonymousActionSlot[], config: JevSelectorConfig, signal?: AbortSignal): Promise<JevSelection>;