@mupt-ai/dari-router 0.1.0 → 0.2.1
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 +89 -60
- package/dist/anonymous_actions.js +32 -10
- package/dist/anonymous_actions.js.map +1 -1
- package/dist/auto_router.d.ts +4 -1
- package/dist/auto_router.js +3 -3
- package/dist/auto_router.js.map +1 -1
- package/dist/cache_behavior.d.ts +8 -6
- package/dist/cache_behavior.js +60 -30
- package/dist/cache_behavior.js.map +1 -1
- package/dist/cache_scope.d.ts +2 -2
- package/dist/cache_scope.js +23 -18
- package/dist/cache_scope.js.map +1 -1
- package/dist/cost.d.ts +3 -2
- package/dist/cost.js +32 -23
- package/dist/cost.js.map +1 -1
- package/dist/dari_policy.d.ts +8 -2
- package/dist/dari_policy.js +39 -1
- package/dist/dari_policy.js.map +1 -1
- package/dist/eval_score_imputation.d.ts +26 -0
- package/dist/eval_score_imputation.js +121 -0
- package/dist/eval_score_imputation.js.map +1 -0
- package/dist/framework_lifecycle.d.ts +1 -1
- package/dist/framework_lifecycle.js +4 -1
- package/dist/framework_lifecycle.js.map +1 -1
- package/dist/framework_models.js +6 -0
- package/dist/framework_models.js.map +1 -1
- package/dist/framework_router.js +22 -11
- package/dist/framework_router.js.map +1 -1
- package/dist/framework_types.d.ts +9 -5
- package/dist/index.d.ts +9 -35
- package/dist/index.js +6 -37
- package/dist/index.js.map +1 -1
- package/dist/model_ids.js +4 -0
- package/dist/model_ids.js.map +1 -1
- package/dist/pi_runtime.js +19 -11
- package/dist/pi_runtime.js.map +1 -1
- package/dist/pi_types.d.ts +2 -2
- package/{src/index.ts → dist/policy-engine.d.ts} +2 -14
- package/dist/policy-engine.js +25 -0
- package/dist/policy-engine.js.map +1 -0
- package/dist/prompts.d.ts +1 -1
- package/dist/prompts.js +3 -3
- package/dist/prompts.js.map +1 -1
- package/dist/protocols.d.ts +5 -0
- package/dist/protocols.js +6 -0
- package/dist/protocols.js.map +1 -0
- package/dist/route.d.ts +3 -4
- package/dist/route.js +17 -10
- package/dist/route.js.map +1 -1
- package/dist/selector_input.d.ts +1 -0
- package/dist/selector_input.js +66 -78
- package/dist/selector_input.js.map +1 -1
- package/dist/selector_parse.d.ts +1 -0
- package/dist/selector_parse.js +2 -1
- package/dist/selector_parse.js.map +1 -1
- package/dist/selector_request.d.ts +1 -0
- package/dist/selector_request.js +1 -0
- package/dist/selector_request.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/examples/auto_router.ts +40 -0
- package/examples/basic_route.ts +130 -0
- package/examples/create_router.ts +114 -0
- package/examples/dari_policy.ts +86 -0
- package/examples/lease_stores.ts +159 -0
- package/examples/managed/README.md +50 -0
- package/examples/managed/byok-router/README.md +13 -0
- package/examples/managed/byok-router/router.yml +13 -0
- package/examples/managed/custom-rules-router/README.md +12 -0
- package/examples/managed/custom-rules-router/router.yml +24 -0
- package/examples/managed/eval-router/README.md +18 -0
- package/examples/managed/eval-router/router.yml +11 -0
- package/examples/managed/slm-router/README.md +12 -0
- package/examples/managed/slm-router/router.yml +8 -0
- package/examples/pi_runtime.ts +55 -0
- package/package.json +26 -7
- package/src/anonymous_actions.ts +0 -434
- package/src/auto_router.ts +0 -95
- package/src/cache_behavior.ts +0 -130
- package/src/cache_scope.ts +0 -58
- package/src/cache_switch_decision.ts +0 -53
- package/src/candidate_pruning.ts +0 -257
- package/src/candidate_resolution.ts +0 -208
- package/src/compatibility.ts +0 -162
- package/src/continuation_state.ts +0 -368
- package/src/cost.ts +0 -455
- package/src/dari_policy.ts +0 -360
- package/src/errors.ts +0 -27
- package/src/fingerprint.ts +0 -148
- package/src/fixed_turn_cost_config.ts +0 -24
- package/src/framework_error.ts +0 -38
- package/src/framework_lifecycle.ts +0 -74
- package/src/framework_models.ts +0 -186
- package/src/framework_router.ts +0 -490
- package/src/framework_streaming.ts +0 -613
- package/src/framework_types.ts +0 -372
- package/src/framework_validation.ts +0 -235
- package/src/json.ts +0 -43
- package/src/model_ids.ts +0 -29
- package/src/pi_context.ts +0 -251
- package/src/pi_options.ts +0 -295
- package/src/pi_output.ts +0 -387
- package/src/pi_reasoning_signature.ts +0 -41
- package/src/pi_runtime.ts +0 -238
- package/src/pi_types.ts +0 -71
- package/src/portable_reasoning_state.ts +0 -129
- package/src/previous_decision.ts +0 -109
- package/src/prompts.ts +0 -69
- package/src/protocol_anthropic.ts +0 -571
- package/src/protocol_openai_chat.ts +0 -645
- package/src/protocol_validation.ts +0 -202
- package/src/route.ts +0 -490
- package/src/routing_history.ts +0 -157
- package/src/selector_input.ts +0 -246
- package/src/selector_parse.ts +0 -138
- package/src/selector_request.ts +0 -130
- package/src/selector_truncation.ts +0 -48
- package/src/selector_wire.ts +0 -167
- 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
|
-
|
|
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,
|
|
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
|
|
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":"AAAA,4EAA4E;AAC5E,sEAAsE;AACtE,6EAA6E;AAC7E,oBAAoB;AAEpB,OAAO,EAAE,2BAA2B,EAAgC,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,GAGnB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"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"}
|
package/dist/selector_input.d.ts
CHANGED
|
@@ -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 {};
|
package/dist/selector_input.js
CHANGED
|
@@ -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 {
|
|
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.
|
|
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
|
-
|
|
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
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
//
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const
|
|
140
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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":"AAAA,wEAAwE;AACxE,2EAA2E;AAC3E,yCAAyC;AAEzC,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"selector_input.js","sourceRoot":"","sources":["../src/selector_input.ts"],"names":[],"mappings":"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"}
|
package/dist/selector_parse.d.ts
CHANGED
package/dist/selector_parse.js
CHANGED
|
@@ -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
|
-
|
|
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;
|
package/dist/selector_request.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,6BAA6B,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EACL,kBAAkB,GAGnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
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);
|