@mupt-ai/dari-router 0.1.0 → 0.2.0

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 (118) hide show
  1. package/README.md +89 -60
  2. package/dist/anonymous_actions.js +32 -10
  3. package/dist/anonymous_actions.js.map +1 -1
  4. package/dist/auto_router.d.ts +4 -1
  5. package/dist/auto_router.js +3 -3
  6. package/dist/auto_router.js.map +1 -1
  7. package/dist/cache_behavior.d.ts +8 -6
  8. package/dist/cache_behavior.js +56 -30
  9. package/dist/cache_behavior.js.map +1 -1
  10. package/dist/cache_scope.d.ts +2 -2
  11. package/dist/cache_scope.js +23 -18
  12. package/dist/cache_scope.js.map +1 -1
  13. package/dist/cost.d.ts +3 -2
  14. package/dist/cost.js +32 -23
  15. package/dist/cost.js.map +1 -1
  16. package/dist/dari_policy.d.ts +8 -2
  17. package/dist/dari_policy.js +39 -1
  18. package/dist/dari_policy.js.map +1 -1
  19. package/dist/eval_score_imputation.d.ts +26 -0
  20. package/dist/eval_score_imputation.js +83 -0
  21. package/dist/eval_score_imputation.js.map +1 -0
  22. package/dist/framework_lifecycle.d.ts +1 -1
  23. package/dist/framework_lifecycle.js +4 -1
  24. package/dist/framework_lifecycle.js.map +1 -1
  25. package/dist/framework_models.js +6 -0
  26. package/dist/framework_models.js.map +1 -1
  27. package/dist/framework_router.js +22 -11
  28. package/dist/framework_router.js.map +1 -1
  29. package/dist/framework_types.d.ts +9 -5
  30. package/dist/index.d.ts +9 -35
  31. package/dist/index.js +6 -37
  32. package/dist/index.js.map +1 -1
  33. package/dist/model_ids.js +4 -0
  34. package/dist/model_ids.js.map +1 -1
  35. package/dist/pi_runtime.js +19 -11
  36. package/dist/pi_runtime.js.map +1 -1
  37. package/dist/pi_types.d.ts +2 -2
  38. package/{src/index.ts → dist/policy-engine.d.ts} +2 -14
  39. package/dist/policy-engine.js +25 -0
  40. package/dist/policy-engine.js.map +1 -0
  41. package/dist/prompts.d.ts +1 -1
  42. package/dist/prompts.js +3 -3
  43. package/dist/prompts.js.map +1 -1
  44. package/dist/protocols.d.ts +5 -0
  45. package/dist/protocols.js +6 -0
  46. package/dist/protocols.js.map +1 -0
  47. package/dist/route.d.ts +3 -4
  48. package/dist/route.js +17 -10
  49. package/dist/route.js.map +1 -1
  50. package/dist/selector_input.d.ts +1 -0
  51. package/dist/selector_input.js +66 -78
  52. package/dist/selector_input.js.map +1 -1
  53. package/dist/selector_parse.d.ts +1 -0
  54. package/dist/selector_parse.js +2 -1
  55. package/dist/selector_parse.js.map +1 -1
  56. package/dist/selector_request.d.ts +1 -0
  57. package/dist/selector_request.js +1 -0
  58. package/dist/selector_request.js.map +1 -1
  59. package/dist/types.d.ts +1 -1
  60. package/examples/auto_router.ts +40 -0
  61. package/examples/basic_route.ts +130 -0
  62. package/examples/create_router.ts +114 -0
  63. package/examples/dari_policy.ts +86 -0
  64. package/examples/lease_stores.ts +159 -0
  65. package/examples/managed/README.md +50 -0
  66. package/examples/managed/byok-router/README.md +13 -0
  67. package/examples/managed/byok-router/router.yml +13 -0
  68. package/examples/managed/custom-rules-router/README.md +12 -0
  69. package/examples/managed/custom-rules-router/router.yml +24 -0
  70. package/examples/managed/eval-router/README.md +18 -0
  71. package/examples/managed/eval-router/router.yml +11 -0
  72. package/examples/managed/slm-router/README.md +12 -0
  73. package/examples/managed/slm-router/router.yml +8 -0
  74. package/examples/pi_runtime.ts +55 -0
  75. package/package.json +26 -7
  76. package/src/anonymous_actions.ts +0 -434
  77. package/src/auto_router.ts +0 -95
  78. package/src/cache_behavior.ts +0 -130
  79. package/src/cache_scope.ts +0 -58
  80. package/src/cache_switch_decision.ts +0 -53
  81. package/src/candidate_pruning.ts +0 -257
  82. package/src/candidate_resolution.ts +0 -208
  83. package/src/compatibility.ts +0 -162
  84. package/src/continuation_state.ts +0 -368
  85. package/src/cost.ts +0 -455
  86. package/src/dari_policy.ts +0 -360
  87. package/src/errors.ts +0 -27
  88. package/src/fingerprint.ts +0 -148
  89. package/src/fixed_turn_cost_config.ts +0 -24
  90. package/src/framework_error.ts +0 -38
  91. package/src/framework_lifecycle.ts +0 -74
  92. package/src/framework_models.ts +0 -186
  93. package/src/framework_router.ts +0 -490
  94. package/src/framework_streaming.ts +0 -613
  95. package/src/framework_types.ts +0 -372
  96. package/src/framework_validation.ts +0 -235
  97. package/src/json.ts +0 -43
  98. package/src/model_ids.ts +0 -29
  99. package/src/pi_context.ts +0 -251
  100. package/src/pi_options.ts +0 -295
  101. package/src/pi_output.ts +0 -387
  102. package/src/pi_reasoning_signature.ts +0 -41
  103. package/src/pi_runtime.ts +0 -238
  104. package/src/pi_types.ts +0 -71
  105. package/src/portable_reasoning_state.ts +0 -129
  106. package/src/previous_decision.ts +0 -109
  107. package/src/prompts.ts +0 -69
  108. package/src/protocol_anthropic.ts +0 -571
  109. package/src/protocol_openai_chat.ts +0 -645
  110. package/src/protocol_validation.ts +0 -202
  111. package/src/route.ts +0 -490
  112. package/src/routing_history.ts +0 -157
  113. package/src/selector_input.ts +0 -246
  114. package/src/selector_parse.ts +0 -138
  115. package/src/selector_request.ts +0 -130
  116. package/src/selector_truncation.ts +0 -48
  117. package/src/selector_wire.ts +0 -167
  118. package/src/types.ts +0 -231
package/dist/route.js CHANGED
@@ -5,7 +5,8 @@
5
5
  import { resolveCompatibleCandidates } from "./compatibility.js";
6
6
  import { conversationBlockCount, conversationMessages } from "./fingerprint.js";
7
7
  import { deepestIdentityHit, deriveModelChainHits, estimateCandidateCosts, selectPromptAnchor, } from "./cost.js";
8
- import { warmPrefixHits } from "./cache_behavior.js";
8
+ import { prefixHitMatchesProvider, warmPrefixHits } from "./cache_behavior.js";
9
+ import { reasoningCacheScope } from "./cache_scope.js";
9
10
  import { RouterCoreError } from "./errors.js";
10
11
  import { activeLeaseFromHit, compatiblePreviousDecision, pendingLeaseFromHit, previousDecisionFromHit, } from "./previous_decision.js";
11
12
  import { resolveStrategyCandidates, } from "./candidate_resolution.js";
@@ -30,8 +31,8 @@ function prepareCandidatesWithAccounting(input, promptAccounting) {
30
31
  metadataLookup: input.metadataLookup,
31
32
  modelThinkingLevels: input.modelThinkingLevels,
32
33
  });
33
- const blockDepth = promptAccounting.defaultBlockDepth;
34
34
  const warnings = [];
35
+ const cacheScope = input.cacheScope ?? ((model) => reasoningCacheScope(model, input.metadataLookup(model).provider));
35
36
  let hits = { perModel: new Map(), perModelBuckets: new Map() };
36
37
  let costEstimates = [];
37
38
  let previousDecision = compatiblePreviousDecision(input.previousDecision, compatible.candidates);
@@ -45,7 +46,13 @@ function prepareCandidatesWithAccounting(input, promptAccounting) {
45
46
  // estimation and the freshness touch must reflect what the provider cache
46
47
  // can actually re-read. Identity: either tier over every recent hit — a
47
48
  // stale or loose-only match still names the same conversation.
48
- hits = deriveModelChainHits(input.chainsByModel, warmPrefixHits(input.prefixHits, input.nowMs));
49
+ const providersByCandidate = new Map(compatible.candidates.map(({ model }) => [model, input.metadataLookup(model).provider]));
50
+ const providerCompatibleWarmHits = warmPrefixHits(input.prefixHits, input.nowMs)
51
+ .filter((hit) => {
52
+ const provider = providersByCandidate.get(hit.model);
53
+ return provider !== undefined && prefixHitMatchesProvider(hit, provider);
54
+ });
55
+ hits = deriveModelChainHits(input.chainsByModel, providerCompatibleWarmHits);
49
56
  identityHit = deepestIdentityHit(input.chainsByModel, input.looseChain, input.prefixHits);
50
57
  if (identityHit) {
51
58
  conversationId = identityHit.entry.conversation_id;
@@ -71,7 +78,7 @@ function prepareCandidatesWithAccounting(input, promptAccounting) {
71
78
  }
72
79
  }
73
80
  const promptEstimatesByCandidate = new Map(compatible.candidates.map((candidate) => {
74
- const anchor = selectPromptAnchor(hits, candidate.model, candidate.reasoningEffort, input.cacheScope);
81
+ const anchor = selectPromptAnchor(hits, candidate.model, candidate.reasoningEffort, cacheScope);
75
82
  const candidateAnchor = promptAnchorFor({
76
83
  accounting: promptAccounting,
77
84
  // Stored prompt tokens include the previous response-format schema.
@@ -88,14 +95,14 @@ function prepareCandidatesWithAccounting(input, promptAccounting) {
88
95
  costEstimates = estimateCandidateCosts({
89
96
  candidates: compatible.candidates,
90
97
  hits,
91
- incomingBlockCount: blockDepth,
92
98
  incomingProviderBlockCountFor: promptAccounting.providerBlockDepthFor,
93
99
  promptEstimatesByCandidate,
94
100
  toolChoiceFp: input.toolChoiceFp,
95
101
  responseFormatFp: input.responseFormatFp,
96
102
  pricing: input.pricing,
97
103
  averageOutputTokensByModel: input.averageOutputTokensByModel,
98
- cacheScope: input.cacheScope,
104
+ cacheScope,
105
+ modelProvider: (model) => input.metadataLookup(model).provider,
99
106
  });
100
107
  }
101
108
  catch (error) {
@@ -110,7 +117,6 @@ function prepareCandidatesWithAccounting(input, promptAccounting) {
110
117
  modelPrices: input.modelPrices ?? {},
111
118
  });
112
119
  return {
113
- blockDepth,
114
120
  hits,
115
121
  conversationId,
116
122
  identityMatchDepth,
@@ -132,8 +138,9 @@ export function prepareRoute(input) {
132
138
  requiresDifferentProvider: input.fallbackRequiresDifferentProvider !== false,
133
139
  };
134
140
  const custom = resolution.strategy === "custom" ? resolution.custom : undefined;
141
+ const modelProvider = (model) => input.metadataLookup(model).provider;
135
142
  if (custom === null) {
136
- return { ...preparation, fallbackConfig, selectorPreparation: null };
143
+ return { ...preparation, modelProvider, fallbackConfig, selectorPreparation: null };
137
144
  }
138
145
  const selectorPreparation = buildSizedSelectorRequest({
139
146
  candidates: resolution.candidates,
@@ -149,7 +156,7 @@ export function prepareRoute(input) {
149
156
  modelFallbackEnabled: fallbackConfig.enabled,
150
157
  fallbackRequiresDifferentProvider: fallbackConfig.requiresDifferentProvider,
151
158
  });
152
- return { ...preparation, fallbackConfig, selectorPreparation };
159
+ return { ...preparation, modelProvider, fallbackConfig, selectorPreparation };
153
160
  }
154
161
  // Parses and validates the selector's raw output against the prepared
155
162
  // candidate set and fallback policy.
@@ -163,6 +170,7 @@ export function finalizeRoute(prepared, selectorOutputText) {
163
170
  candidates: prepared.candidateResolution.candidates,
164
171
  modelFallbackEnabled: prepared.fallbackConfig.enabled,
165
172
  fallbackRequiresDifferentProvider: prepared.fallbackConfig.requiresDifferentProvider,
173
+ providerForModel: prepared.modelProvider,
166
174
  });
167
175
  return {
168
176
  decision: parsed.decision,
@@ -185,7 +193,6 @@ export function chatPromptAccounting(messages, tailCharsFor) {
185
193
  const blockDepth = conversationBlockCount({ messages });
186
194
  return {
187
195
  anchorSemantics: "matched_prefix",
188
- defaultBlockDepth: blockDepth,
189
196
  providerBlockDepthFor: () => blockDepth,
190
197
  promptEstimateFor: (model, anchor) => {
191
198
  if (anchor) {
package/dist/route.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"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"}
@@ -38,5 +38,6 @@ export declare function buildSelectorInput(args: {
38
38
  modelFallbackEnabled?: boolean;
39
39
  fallbackRequiresDifferentProvider?: boolean;
40
40
  imputeEvalScores?: boolean;
41
+ imputationReferenceEvals?: RouterEval[];
41
42
  }): SelectorInput | CustomSelectorInput;
42
43
  export {};
@@ -1,7 +1,8 @@
1
1
  // Builds the selector input: candidate pairs, matched eval scores, cost
2
2
  // estimates, the previous decision, and the (image-scrubbed) conversation.
3
3
  // The system prompts live in prompts.ts.
4
- import { isRecord, REASONING_EFFORTS, routingCandidateKey, } from "./types.js";
4
+ import { createThinkingLevelRatios, resolveRouterEvalScore, } from "./eval_score_imputation.js";
5
+ import { isRecord, routingCandidateKey, } from "./types.js";
5
6
  const IMAGE_OMITTED_PLACEHOLDER = "<image omitted>";
6
7
  // Selector serialization must not include image bytes. The provider-facing
7
8
  // request and prefix fingerprint still use the original content, while this
@@ -19,12 +20,13 @@ export function selectorSafeMessages(messages) {
19
20
  });
20
21
  }
21
22
  export function buildSelectorInput(args) {
23
+ const imputeEvalScores = args.imputeEvalScores ?? false;
22
24
  const input = {
23
25
  candidate_pairs: args.candidates.map(({ model, reasoningEffort }) => ({
24
26
  model,
25
27
  thinking_level: reasoningEffort,
26
28
  })),
27
- imported_evals: formatImportedEvals(args.evals, args.candidates, args.imputeEvalScores ?? false),
29
+ imported_evals: formatImportedEvals(args.evals, args.candidates, imputeEvalScores, args.imputationReferenceEvals ?? []),
28
30
  previous_decision: args.previousDecision
29
31
  ? {
30
32
  model: args.previousDecision.model,
@@ -49,9 +51,17 @@ export function buildSelectorInput(args) {
49
51
  }
50
52
  return input;
51
53
  }
52
- function formatImportedEvals(evals, candidates, imputeEvalScores) {
54
+ function formatImportedEvals(evals, candidates, imputeEvalScores, imputationReferenceEvals) {
55
+ const selectedEvalIds = new Set(evals.map((evalCard) => evalCard.id));
56
+ const ratioEvals = imputeEvalScores
57
+ ? [
58
+ ...evals,
59
+ ...imputationReferenceEvals.filter((evalCard) => !selectedEvalIds.has(evalCard.id)),
60
+ ]
61
+ : [];
62
+ const thinkingLevelRatios = createThinkingLevelRatios(ratioEvals);
53
63
  return evals.flatMap((evalCard) => {
54
- const scores = matchingEvalScores(evalCard.scores, candidates, imputeEvalScores);
64
+ const scores = matchingEvalScores(evalCard.scores, candidates, imputeEvalScores, evalCard.min_score, evalCard.max_score, thinkingLevelRatios);
55
65
  if (scores.length === 0)
56
66
  return [];
57
67
  return [
@@ -66,86 +76,64 @@ function formatImportedEvals(evals, candidates, imputeEvalScores) {
66
76
  ];
67
77
  });
68
78
  }
69
- function matchingEvalScores(scores, candidates, imputeEvalScores) {
79
+ function matchingEvalScores(scores, candidates, imputeEvalScores, minScore, maxScore, thinkingLevelRatios) {
70
80
  const uniqueCandidates = new Map(candidates.map((candidate) => [routingCandidateKey(candidate), candidate]));
71
- return [...uniqueCandidates.values()].flatMap((candidate) => {
81
+ const resolvedScores = [...uniqueCandidates.values()]
82
+ .map((candidate) => {
83
+ const resolved = resolveRouterEvalScore({
84
+ scores,
85
+ modelId: candidate.model,
86
+ thinkingLevel: candidate.reasoningEffort,
87
+ minScore,
88
+ maxScore,
89
+ impute: imputeEvalScores,
90
+ ratios: thinkingLevelRatios,
91
+ });
92
+ if (resolved === null)
93
+ return null;
72
94
  const modelScores = scores.filter((score) => score.model_id === candidate.model);
73
- const exact = modelScores.find((score) => score.thinking_level === candidate.reasoningEffort);
74
- const generic = modelScores.find((score) => score.thinking_level == null);
75
- const match = exact ?? generic;
76
- if (match) {
77
- return [
78
- {
79
- model_id: candidate.model,
80
- thinking_level: candidate.reasoningEffort,
81
- score: match.score,
82
- ...normalizedScore(match.score, scores),
83
- notes: match.notes ?? null,
84
- },
85
- ];
86
- }
87
- if (!imputeEvalScores)
88
- return [];
89
- const imputed = interpolatedScore(candidate, modelScores);
90
- if (imputed === null)
91
- return [];
92
- return [
93
- {
94
- model_id: candidate.model,
95
- thinking_level: candidate.reasoningEffort,
96
- score: imputed,
97
- ...normalizedScore(imputed, scores),
98
- notes: null,
99
- imputed: true,
100
- },
101
- ];
102
- });
103
- }
104
- // Linear interpolation between the two per-level scores that bracket the
105
- // requested thinking level. A single known level (or zero) is not enough to
106
- // pin a line, so we only interpolate when the candidate has scores on both
107
- // sides of the requested level; one-sided cases stay empty.
108
- function interpolatedScore(candidate, modelScores) {
109
- const requestedIndex = REASONING_EFFORTS.indexOf(candidate.reasoningEffort);
110
- if (requestedIndex < 0)
111
- return null;
112
- let below = null;
113
- let above = null;
114
- for (const entry of modelScores) {
115
- if (entry.thinking_level == null)
116
- continue;
117
- const index = REASONING_EFFORTS.indexOf(entry.thinking_level);
118
- if (index < 0)
119
- continue;
120
- if (index < requestedIndex && (below === null || index > below.index)) {
121
- below = { index, score: entry.score };
122
- }
123
- else if (index > requestedIndex &&
124
- (above === null || index < above.index)) {
125
- above = { index, score: entry.score };
126
- }
127
- }
128
- if (below === null || above === null)
129
- return null;
130
- const ratio = (requestedIndex - below.index) / (above.index - below.index);
131
- return round2(below.score + (above.score - below.score) * ratio);
95
+ const measured = resolved.imputed
96
+ ? null
97
+ : (modelScores.find((score) => score.thinking_level === candidate.reasoningEffort) ?? modelScores.find((score) => score.thinking_level == null));
98
+ return {
99
+ model_id: candidate.model,
100
+ thinking_level: candidate.reasoningEffort,
101
+ score: resolved.score,
102
+ notes: measured?.notes ?? null,
103
+ ...(resolved.imputed ? { imputed: true } : {}),
104
+ };
105
+ })
106
+ .filter((score) => score !== null);
107
+ return normalizeResolvedScores(resolvedScores);
132
108
  }
133
- // Positions a candidate's score against every model on the scorecard, not just
134
- // the candidates that survived pruning. Candidate-relative normalization would
135
- // move with the pruned set (with two candidates a z-score is always +/-1), so
136
- // the selector would read pure ordering as if it carried magnitude.
137
- function normalizedScore(score, population) {
138
- const values = population.map((entry) => entry.score);
139
- const mean = values.reduce((total, value) => total + value, 0) / values.length;
140
- const variance = values.reduce((total, value) => total + (value - mean) ** 2, 0) /
109
+ // The selector compares current actions, so exact, generic, and imputed rows
110
+ // share one candidate-only population. Unresolved actions never enter the
111
+ // denominator or the distribution.
112
+ function normalizeResolvedScores(scores) {
113
+ if (scores.length === 0)
114
+ return [];
115
+ const values = scores.map((entry) => entry.score);
116
+ const populationMean = mean(values);
117
+ const variance = values.reduce((total, value) => total + (value - populationMean) ** 2, 0) /
141
118
  values.length;
142
119
  const stdDev = Math.sqrt(variance);
143
- return {
120
+ const ranks = new Map();
121
+ [...values]
122
+ .sort((left, right) => right - left)
123
+ .forEach((score, index) => {
144
124
  // Competition ranking, best score first; tied scores share the low rank.
145
- rank: 1 + values.filter((value) => value > score).length,
146
- rank_total: values.length,
147
- z_score: stdDev === 0 ? 0 : round2((score - mean) / stdDev),
148
- };
125
+ if (!ranks.has(score))
126
+ ranks.set(score, index + 1);
127
+ });
128
+ return scores.map((score) => ({
129
+ ...score,
130
+ rank: ranks.get(score.score),
131
+ rank_total: scores.length,
132
+ z_score: stdDev === 0 ? 0 : round2((score.score - populationMean) / stdDev),
133
+ }));
134
+ }
135
+ function mean(values) {
136
+ return values.reduce((total, value) => total + value, 0) / values.length;
149
137
  }
150
138
  function round2(value) {
151
139
  return Math.round(value * 100) / 100;
@@ -1 +1 @@
1
- {"version":3,"file":"selector_input.js","sourceRoot":"","sources":["../src/selector_input.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"selector_input.js","sourceRoot":"","sources":["../src/selector_input.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,2EAA2E;AAC3E,yCAAyC;AAEzC,OAAO,EACL,yBAAyB,EACzB,sBAAsB,GAEvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,QAAQ,EAER,mBAAmB,GASpB,MAAM,YAAY,CAAC;AAEpB,MAAM,yBAAyB,GAAG,iBAAiB,CAAC;AAqCpD,2EAA2E;AAC3E,4EAA4E;AAC5E,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,QAAuB;IAC1D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC;QACpD,OAAO;YACL,GAAG,OAAO;YACV,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACpC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;gBACzC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,yBAAyB,EAAE,EAAE;gBACtE,CAAC,CAAC,IAAI,CACT;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAmBlC;IACC,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,KAAK,CAAC;IACxD,MAAM,KAAK,GAAkB;QAC3B,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC;YACpE,KAAK;YACL,cAAc,EAAE,eAAe;SAChC,CAAC,CAAC;QACH,cAAc,EAAE,mBAAmB,CACjC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,UAAU,EACf,gBAAgB,EAChB,IAAI,CAAC,wBAAwB,IAAI,EAAE,CACpC;QACD,iBAAiB,EAAE,IAAI,CAAC,gBAAgB;YACtC,CAAC,CAAC;gBACE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK;gBAClC,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,eAAe;gBACrD,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM;aACrC;YACH,CAAC,CAAC,IAAI;QACR,cAAc,EAAE,IAAI,CAAC,aAAa;QAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC;IACF,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAClC,KAA6B,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAChE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACT,GAAG,IAAI;YACP,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI;SAC5C,CAAC,CACH,CAAC;QACD,KAA6B,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa;YAChE,CAAC,CAAC;gBACE,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK;gBAC/B,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa;aACjD;YACH,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAmB,EACnB,UAA8B,EAC9B,gBAAyB,EACzB,wBAAsC;IAEtC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,gBAAgB;QACjC,CAAC,CAAC;YACE,GAAG,KAAK;YACR,GAAG,wBAAwB,CAAC,MAAM,CAChC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAChD;SACF;QACH,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,kBAAkB,CAC/B,QAAQ,CAAC,MAAM,EACf,UAAU,EACV,gBAAgB,EAChB,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,SAAS,EAClB,mBAAmB,CACpB,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACnC,OAAO;YACL;gBACE,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,IAAI;gBACzC,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,MAAM;aACP;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CACzB,MAAyB,EACzB,UAA8B,EAC9B,gBAAyB,EACzB,QAAgB,EAChB,QAAgB,EAChB,mBAAwC;IAExC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,CAC3E,CAAC;IACF,MAAM,cAAc,GAAG,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC;SAClD,GAAG,CAAC,CAAC,SAAS,EAA4B,EAAE;QAC3C,MAAM,QAAQ,GAAG,sBAAsB,CAAC;YACtC,MAAM;YACN,OAAO,EAAE,SAAS,CAAC,KAAK;YACxB,aAAa,EAAE,SAAS,CAAC,eAAe;YACxC,QAAQ;YACR,QAAQ;YACR,MAAM,EAAE,gBAAgB;YACxB,MAAM,EAAE,mBAAmB;SAC5B,CAAC,CAAC;QACH,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAC/B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,KAAK,CAC9C,CAAC;QACF,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO;YAC/B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CACf,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,KAAK,SAAS,CAAC,eAAe,CAC9D,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC;QACpE,OAAO;YACL,QAAQ,EAAE,SAAS,CAAC,KAAK;YACzB,cAAc,EAAE,SAAS,CAAC,eAAe;YACzC,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,IAAI;YAC9B,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,KAAK,EAA8B,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IACjE,OAAO,uBAAuB,CAAC,cAAc,CAAC,CAAC;AACjD,CAAC;AAED,6EAA6E;AAC7E,0EAA0E;AAC1E,mCAAmC;AACnC,SAAS,uBAAuB,CAC9B,MAA2B;IAE3B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,QAAQ,GACZ,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC;IAChB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,CAAC,GAAG,MAAM,CAAC;SACR,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;SACnC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACxB,yEAAyE;QACzE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEL,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5B,GAAG,KAAK;QACR,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAE;QAC7B,UAAU,EAAE,MAAM,CAAC,MAAM;QACzB,OAAO,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,cAAc,CAAC,GAAG,MAAM,CAAC;KAC5E,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,IAAI,CAAC,MAAgB;IAC5B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;AAC3E,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACvC,CAAC"}
@@ -10,4 +10,5 @@ export declare function validateSelectorDecisions(args: {
10
10
  candidates: RoutingCandidate[];
11
11
  modelFallbackEnabled?: boolean;
12
12
  fallbackRequiresDifferentProvider?: boolean;
13
+ providerForModel?: (model: string) => string;
13
14
  }): void;
@@ -74,9 +74,10 @@ export function validateSelectorDecisions(args) {
74
74
  if (!args.candidates.some((candidate) => sameRoutingCandidate(candidate, selected))) {
75
75
  throw new RouterCoreError("selector_output", "Selector returned a model/thinking-level pair outside this router's candidates.", "selector_invalid_candidate");
76
76
  }
77
+ const resolveProvider = args.providerForModel ?? providerForModel;
77
78
  const eligibleFallbacks = args.candidates.filter((candidate) => candidate.model !== selected.model &&
78
79
  (!args.fallbackRequiresDifferentProvider ||
79
- providerForModel(candidate.model) !== providerForModel(selected.model)));
80
+ resolveProvider(candidate.model) !== resolveProvider(selected.model)));
80
81
  if (args.modelFallbackEnabled) {
81
82
  if (!args.fallbackDecision && eligibleFallbacks.length > 0) {
82
83
  throw new RouterCoreError("selector_output", "Selector response missing an eligible fallback model.", "selector_invalid_response");
@@ -1 +1 @@
1
- {"version":3,"file":"selector_parse.js","sourceRoot":"","sources":["../src/selector_parse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"selector_parse.js","sourceRoot":"","sources":["../src/selector_parse.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@ export type SelectorRequestArgs = {
19
19
  modelFallbackEnabled?: boolean;
20
20
  fallbackRequiresDifferentProvider?: boolean;
21
21
  imputeEvalScores?: boolean;
22
+ imputationReferenceEvals?: RouterEval[];
22
23
  };
23
24
  export declare function buildSizedSelectorRequest(args: SelectorRequestArgs & {
24
25
  contextWindowChars: number;
@@ -39,6 +39,7 @@ export function buildSelectorRequest(args) {
39
39
  modelFallbackEnabled: args.modelFallbackEnabled,
40
40
  fallbackRequiresDifferentProvider: args.fallbackRequiresDifferentProvider,
41
41
  imputeEvalScores: args.imputeEvalScores,
42
+ imputationReferenceEvals: args.imputationReferenceEvals,
42
43
  });
43
44
  return {
44
45
  selectorInput,
@@ -1 +1 @@
1
- {"version":3,"file":"selector_request.js","sourceRoot":"","sources":["../src/selector_request.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"selector_request.js","sourceRoot":"","sources":["../src/selector_request.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -76,10 +76,10 @@ export type RouterPrefixHit = {
76
76
  loose_hash?: string | null;
77
77
  conversation_id: string;
78
78
  model: string;
79
+ provider?: string | null;
79
80
  next_model?: string | null;
80
81
  next_reasoning_effort?: ReasoningEffort | null;
81
82
  message_depth: number;
82
- block_depth: number;
83
83
  provider_block_depth?: number | null;
84
84
  prompt_anchor_depth?: number | null;
85
85
  prompt_tokens: number;
@@ -0,0 +1,40 @@
1
+ // Dari Auto Router — use Dari's hosted routing model as a service.
2
+ //
3
+ // This is the simplest way to use @mupt-ai/dari-router: declare your models,
4
+ // drop createAutoRouter in as the policy, and Dari's routing model picks
5
+ // the best model for each request. You're billed per selection call.
6
+ //
7
+ // Requires DARI_API_KEY, OPENAI_API_KEY, and ANTHROPIC_API_KEY.
8
+
9
+ import { createAutoRouter, createPiRuntime, createRouter } from "../src/index.js";
10
+
11
+ const pi = await createPiRuntime({
12
+ apiKey: ({ provider }) => {
13
+ const key = process.env[`${provider.toUpperCase()}_API_KEY`];
14
+ if (!key) throw new Error(`Missing ${provider.toUpperCase()}_API_KEY`);
15
+ return key;
16
+ },
17
+ });
18
+
19
+ const router = createRouter({
20
+ models: [
21
+ pi.model("openai/gpt-5.6-sol"),
22
+ pi.model("anthropic/claude-sonnet-5"),
23
+ ],
24
+ policy: createAutoRouter({ apiKey: process.env.DARI_API_KEY! }),
25
+ executor: pi,
26
+ });
27
+
28
+ const response = await router.fetch(
29
+ new Request("https://example.test/v1/chat/completions", {
30
+ method: "POST",
31
+ headers: { "Content-Type": "application/json" },
32
+ body: JSON.stringify({
33
+ model: "dari/routing",
34
+ messages: [{ role: "user", content: "Explain speculative decoding in one paragraph." }],
35
+ }),
36
+ }),
37
+ );
38
+
39
+ if (!response.ok) throw new Error(await response.text());
40
+ console.log(await response.json());
@@ -0,0 +1,130 @@
1
+ // Deterministic end-to-end example: prepare a route, run a fake selector,
2
+ // finalize the decision. No network access, no credentials, no paid APIs —
3
+ // the "selector" here is a scripted stand-in for a real model call.
4
+ //
5
+ // Run with: bun run example (or: bun run examples/basic_route.ts)
6
+
7
+ import {
8
+ finalizeRoute,
9
+ prepareRoute,
10
+ type CandidateModelMetadata,
11
+ type ModelPricing,
12
+ type RouteInput,
13
+ } from "../src/policy-engine.js";
14
+
15
+ const FABLE = "anthropic/claude-fable-5";
16
+ const SOL = "openai/gpt-5.6-sol";
17
+ const GLM = "zai-org/GLM-5.2";
18
+
19
+ const metadata: Record<string, CandidateModelMetadata> = {
20
+ [FABLE]: {
21
+ provider: "anthropic",
22
+ api: "anthropic-messages",
23
+ supportsImageInput: true,
24
+ supportsHostedWebSearch: false,
25
+ supportsStructuredOutput: false,
26
+ supportedThinkingLevels: ["medium", "high", "max"],
27
+ },
28
+ [SOL]: {
29
+ provider: "openai",
30
+ api: "openai-responses",
31
+ supportsImageInput: true,
32
+ supportsHostedWebSearch: true,
33
+ supportsStructuredOutput: true,
34
+ supportedThinkingLevels: ["low", "medium", "high", "xhigh"],
35
+ },
36
+ [GLM]: {
37
+ provider: "fireworks",
38
+ api: "openai-completions",
39
+ supportsImageInput: false,
40
+ supportsHostedWebSearch: false,
41
+ supportsStructuredOutput: true,
42
+ supportedThinkingLevels: ["off", "medium"],
43
+ },
44
+ };
45
+
46
+ // Illustrative $/MTok rates; supply your real catalog rates in production.
47
+ const pricing: Record<string, ModelPricing> = {
48
+ [FABLE]: { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
49
+ [SOL]: { input: 1.25, output: 10, cacheRead: 0.125, cacheWrite: 1.25 },
50
+ [GLM]: { input: 0.6, output: 2.2, cacheRead: 0.15, cacheWrite: 0.6 },
51
+ };
52
+
53
+ const input: RouteInput = {
54
+ candidateModels: [FABLE, SOL, GLM],
55
+ metadataLookup: (modelId) => {
56
+ const entry = metadata[modelId];
57
+ if (!entry) throw new Error(`unknown model ${modelId}`);
58
+ return entry;
59
+ },
60
+ requiredCapabilities: [],
61
+ strategy: "slm",
62
+ pricing: (model) => pricing[model] ?? null,
63
+ // Keep the candidate list broad but the pairs manageable: pin each model to
64
+ // a subset of its supported levels, as a router configuration would.
65
+ modelThinkingLevels: {
66
+ [FABLE]: ["high"],
67
+ [SOL]: ["medium", "high"],
68
+ [GLM]: ["off", "medium"],
69
+ },
70
+ messages: [
71
+ { role: "system", content: "You are a helpful assistant." },
72
+ { role: "user", content: "Summarize the latest release notes." },
73
+ ],
74
+ // A fresh conversation: no fingerprint chains or warm-prefix hits yet. A
75
+ // host would compute chains with prefixChain() and look hits up in its own
76
+ // storage.
77
+ chainsByModel: new Map([
78
+ [FABLE, []],
79
+ [SOL, []],
80
+ [GLM, []],
81
+ ]),
82
+ prefixHits: [],
83
+ nowMs: Date.now(),
84
+ toolChoiceFp: "",
85
+ responseFormatFp: "",
86
+ evals: [
87
+ {
88
+ id: "evl_swe",
89
+ name: "SWE-bench Verified",
90
+ min_score: 0,
91
+ max_score: 100,
92
+ scores: [
93
+ { model_id: FABLE, score: 87, notes: "high row", thinking_level: "high" },
94
+ { model_id: SOL, score: 78, notes: "generic row" },
95
+ { model_id: GLM, score: 64, notes: "medium row", thinking_level: "medium" },
96
+ ],
97
+ },
98
+ ],
99
+ selectorModel: "openai/gpt-5.6-luna",
100
+ selectorContextWindowChars: 400_000,
101
+ };
102
+
103
+ const prepared = prepareRoute(input);
104
+ if (!prepared.selectorPreparation) throw new Error("selector preparation missing");
105
+
106
+ console.log("candidate pairs:", prepared.candidateResolution.candidates);
107
+ console.log(
108
+ "cost estimates:",
109
+ prepared.costEstimates.map((estimate) => ({
110
+ model: estimate.model,
111
+ reasoning_effort: estimate.reasoning_effort,
112
+ est_prompt_tokens: estimate.est_prompt_tokens,
113
+ est_input_cost_usd: estimate.est_input_cost_usd,
114
+ })),
115
+ );
116
+
117
+ // A real host would POST selectorRequest to an OpenAI-compatible endpoint.
118
+ // This scripted selector always picks the cheapest viable pair.
119
+ const selectorOutput = JSON.stringify({
120
+ selected_model: GLM,
121
+ reasoning_effort: "medium",
122
+ reason: "Simple summarization task; the cheapest candidate suffices.",
123
+ fallback_model: SOL,
124
+ fallback_reasoning_effort: "medium",
125
+ fallback_reason: "Cross-provider fallback if the primary fails.",
126
+ });
127
+
128
+ const result = finalizeRoute(prepared, selectorOutput);
129
+ console.log("decision:", result.decision);
130
+ console.log("fallback:", result.fallbackDecision);