tryaii-dre 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.
- package/LICENSE +190 -0
- package/README.md +234 -0
- package/dist/banner.d.ts +24 -0
- package/dist/banner.d.ts.map +1 -0
- package/dist/banner.js +125 -0
- package/dist/banner.js.map +1 -0
- package/dist/benchmarks/index.d.ts +4 -0
- package/dist/benchmarks/index.d.ts.map +1 -0
- package/dist/benchmarks/index.js +3 -0
- package/dist/benchmarks/index.js.map +1 -0
- package/dist/benchmarks/registry.d.ts +69 -0
- package/dist/benchmarks/registry.d.ts.map +1 -0
- package/dist/benchmarks/registry.js +128 -0
- package/dist/benchmarks/registry.js.map +1 -0
- package/dist/benchmarks/standard.d.ts +6 -0
- package/dist/benchmarks/standard.d.ts.map +1 -0
- package/dist/benchmarks/standard.js +115 -0
- package/dist/benchmarks/standard.js.map +1 -0
- package/dist/budget.d.ts +65 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +344 -0
- package/dist/budget.js.map +1 -0
- package/dist/cache/index.d.ts +27 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +63 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/centroids/data/centroids_all-MiniLM-L6-v2.json +1 -0
- package/dist/centroids/data/trainingQueries.json +246 -0
- package/dist/centroids/generator.d.ts +63 -0
- package/dist/centroids/generator.d.ts.map +1 -0
- package/dist/centroids/generator.js +120 -0
- package/dist/centroids/generator.js.map +1 -0
- package/dist/centroids/index.d.ts +3 -0
- package/dist/centroids/index.d.ts.map +1 -0
- package/dist/centroids/index.js +3 -0
- package/dist/centroids/index.js.map +1 -0
- package/dist/centroids/loader.d.ts +87 -0
- package/dist/centroids/loader.d.ts.map +1 -0
- package/dist/centroids/loader.js +236 -0
- package/dist/centroids/loader.js.map +1 -0
- package/dist/classifiers/base.d.ts +56 -0
- package/dist/classifiers/base.d.ts.map +1 -0
- package/dist/classifiers/base.js +42 -0
- package/dist/classifiers/base.js.map +1 -0
- package/dist/classifiers/embedding.d.ts +68 -0
- package/dist/classifiers/embedding.d.ts.map +1 -0
- package/dist/classifiers/embedding.js +0 -0
- package/dist/classifiers/embedding.js.map +1 -0
- package/dist/classifiers/hybrid.d.ts +31 -0
- package/dist/classifiers/hybrid.d.ts.map +1 -0
- package/dist/classifiers/hybrid.js +61 -0
- package/dist/classifiers/hybrid.js.map +1 -0
- package/dist/classifiers/index.d.ts +4 -0
- package/dist/classifiers/index.d.ts.map +1 -0
- package/dist/classifiers/index.js +3 -0
- package/dist/classifiers/index.js.map +1 -0
- package/dist/classifiers/keyword.d.ts +29 -0
- package/dist/classifiers/keyword.d.ts.map +1 -0
- package/dist/classifiers/keyword.js +264 -0
- package/dist/classifiers/keyword.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +597 -0
- package/dist/cli.js.map +1 -0
- package/dist/client-types.d.ts +101 -0
- package/dist/client-types.d.ts.map +1 -0
- package/dist/client-types.js +5 -0
- package/dist/client-types.js.map +1 -0
- package/dist/client.d.ts +50 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +279 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +45 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +37 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/index.d.ts +48 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +166 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/embeddings/base.d.ts +66 -0
- package/dist/embeddings/base.d.ts.map +1 -0
- package/dist/embeddings/base.js +77 -0
- package/dist/embeddings/base.js.map +1 -0
- package/dist/embeddings/index.d.ts +3 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +3 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/local.d.ts +42 -0
- package/dist/embeddings/local.d.ts.map +1 -0
- package/dist/embeddings/local.js +89 -0
- package/dist/embeddings/local.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/index.d.ts +3 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +2 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/openrouter.d.ts +84 -0
- package/dist/integrations/openrouter.d.ts.map +1 -0
- package/dist/integrations/openrouter.js +253 -0
- package/dist/integrations/openrouter.js.map +1 -0
- package/dist/registry/index.d.ts +2 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +2 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/models.d.ts +76 -0
- package/dist/registry/models.d.ts.map +1 -0
- package/dist/registry/models.js +170 -0
- package/dist/registry/models.js.map +1 -0
- package/dist/registry/presets/defaultModels.json +435 -0
- package/dist/router.d.ts +178 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +259 -0
- package/dist/router.js.map +1 -0
- package/dist/scoring/benchmarks.d.ts +35 -0
- package/dist/scoring/benchmarks.d.ts.map +1 -0
- package/dist/scoring/benchmarks.js +68 -0
- package/dist/scoring/benchmarks.js.map +1 -0
- package/dist/scoring/engine.d.ts +43 -0
- package/dist/scoring/engine.d.ts.map +1 -0
- package/dist/scoring/engine.js +267 -0
- package/dist/scoring/engine.js.map +1 -0
- package/dist/scoring/index.d.ts +6 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +4 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/scoring/priorities.d.ts +41 -0
- package/dist/scoring/priorities.d.ts.map +1 -0
- package/dist/scoring/priorities.js +49 -0
- package/dist/scoring/priorities.js.map +1 -0
- package/dist/types.d.ts +47 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/cosine.d.ts +10 -0
- package/dist/utils/cosine.d.ts.map +1 -0
- package/dist/utils/cosine.js +18 -0
- package/dist/utils/cosine.js.map +1 -0
- package/dist/utils/math.d.ts +18 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +54 -0
- package/dist/utils/math.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic model scoring engine.
|
|
3
|
+
*
|
|
4
|
+
* Combines benchmark performance, cost, and speed into a single score
|
|
5
|
+
* weighted by user priorities. This is the heart of the routing logic.
|
|
6
|
+
*/
|
|
7
|
+
import { BenchmarkNormalizer } from './benchmarks.js';
|
|
8
|
+
import { DEFAULT_PRIORITIES } from './priorities.js';
|
|
9
|
+
/** Speed tier -> numeric score. */
|
|
10
|
+
export const SPEED_SCORES = {
|
|
11
|
+
'very fast': 1.0,
|
|
12
|
+
'fast': 0.8,
|
|
13
|
+
'medium': 0.6,
|
|
14
|
+
'slow': 0.3,
|
|
15
|
+
'very slow': 0.1,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* How many of the prompt's most-relevant benchmarks contribute to model scoring.
|
|
19
|
+
*
|
|
20
|
+
* History: was 3. Bumped to 5 alongside the median-imputation change so a
|
|
21
|
+
* single very-similar benchmark can't dominate the decision -- giving the
|
|
22
|
+
* scorer a wider, more stable view of what the prompt looks like.
|
|
23
|
+
*/
|
|
24
|
+
const TOP_BENCHMARKS_FOR_SCORING = 5;
|
|
25
|
+
/**
|
|
26
|
+
* Neutral quality used only as a last-resort fallback when a prompt matches no
|
|
27
|
+
* benchmark at all (every similarity clamps to 0), so it stays routable on
|
|
28
|
+
* cost/speed instead of being dropped. See scoreModels' neutralFallback retry.
|
|
29
|
+
*/
|
|
30
|
+
const NEUTRAL_QUALITY_SCORE = 0.5;
|
|
31
|
+
/**
|
|
32
|
+
* Compute the median raw benchmark score across the registry, per benchmark.
|
|
33
|
+
*
|
|
34
|
+
* Used to impute missing data: if a model has no score on a benchmark that
|
|
35
|
+
* the prompt cares about, we fill in the registry-wide median rather than
|
|
36
|
+
* silently dropping the benchmark. Dropping was the source of a real routing
|
|
37
|
+
* bug (sparse-data models inflated their own averages by erasing weak
|
|
38
|
+
* benchmarks instead of being penalised by them); imputing keeps things
|
|
39
|
+
* neutral instead of harsh.
|
|
40
|
+
*
|
|
41
|
+
* Benchmarks no model in the registry has are *omitted* from the result --
|
|
42
|
+
* the caller treats that as "truly unknown, skip" (preserves the long-standing
|
|
43
|
+
* behaviour of dropping models that don't intersect any of the prompt's top
|
|
44
|
+
* benchmarks).
|
|
45
|
+
*/
|
|
46
|
+
function computeBenchmarkMedians(models, benchmarkNames) {
|
|
47
|
+
const medians = {};
|
|
48
|
+
for (const name of benchmarkNames) {
|
|
49
|
+
const values = [];
|
|
50
|
+
for (const m of models) {
|
|
51
|
+
const v = m.benchmarkScores[name];
|
|
52
|
+
// Number.isFinite skips NaN/Infinity as well as undefined -- a NaN
|
|
53
|
+
// benchmark value must not poison the registry-wide median.
|
|
54
|
+
if (Number.isFinite(v))
|
|
55
|
+
values.push(v);
|
|
56
|
+
}
|
|
57
|
+
if (values.length === 0)
|
|
58
|
+
continue; // omit -> caller skips this benchmark for this model
|
|
59
|
+
values.sort((a, b) => a - b);
|
|
60
|
+
const mid = Math.floor(values.length / 2);
|
|
61
|
+
medians[name] = values.length % 2 === 1
|
|
62
|
+
? values[mid]
|
|
63
|
+
: (values[mid - 1] + values[mid]) / 2;
|
|
64
|
+
}
|
|
65
|
+
return medians;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Scores models against a classified prompt.
|
|
69
|
+
*
|
|
70
|
+
* Takes benchmark similarity scores (from the classifier) and user priorities,
|
|
71
|
+
* then ranks all available models using a three-factor weighted algorithm:
|
|
72
|
+
*
|
|
73
|
+
* final = (quality * qW + cost * cW + speed * sW) / (qW + cW + sW)
|
|
74
|
+
*
|
|
75
|
+
* Where weights are derived from user priorities (1-5 scale).
|
|
76
|
+
*/
|
|
77
|
+
export class ScoringEngine {
|
|
78
|
+
constructor(normalizer) {
|
|
79
|
+
this._normalizer = normalizer ?? new BenchmarkNormalizer();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Score and rank models based on benchmark similarities and priorities.
|
|
83
|
+
*/
|
|
84
|
+
scoreModels(models, benchmarkSimilarities, priorities = DEFAULT_PRIORITIES, topK = 5) {
|
|
85
|
+
// Pick the prompt's most-relevant benchmarks. See TOP_BENCHMARKS_FOR_SCORING
|
|
86
|
+
// for why this is 5 -- short version: a wider view stops one near-perfect
|
|
87
|
+
// similarity from dominating the decision.
|
|
88
|
+
const sortedBenchmarks = Object.entries(benchmarkSimilarities)
|
|
89
|
+
.sort((a, b) => b[1] - a[1])
|
|
90
|
+
.slice(0, TOP_BENCHMARKS_FOR_SCORING);
|
|
91
|
+
const topBenchmarkDict = {};
|
|
92
|
+
for (const [name, score] of sortedBenchmarks) {
|
|
93
|
+
topBenchmarkDict[name] = score;
|
|
94
|
+
}
|
|
95
|
+
// Per-benchmark medians for the benchmarks we actually care about. Built
|
|
96
|
+
// once per call from the same `models` argument we're about to score
|
|
97
|
+
// against -- so adding/removing/filtering models flows through correctly
|
|
98
|
+
// without needing a separate "rebuild medians" step.
|
|
99
|
+
const benchmarkMedians = computeBenchmarkMedians(models, sortedBenchmarks.map(([name]) => name));
|
|
100
|
+
const scores = [];
|
|
101
|
+
for (const model of models) {
|
|
102
|
+
const score = this._scoreSingleModel(model, topBenchmarkDict, benchmarkMedians, priorities);
|
|
103
|
+
if (score !== null) {
|
|
104
|
+
scores.push(score);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Fallback: if NO model scored, the prompt matched no benchmark at all (its
|
|
108
|
+
// embedding is orthogonal/negative to every centroid, so all similarities
|
|
109
|
+
// clamped to 0). Rather than return nothing -- which makes a single route()
|
|
110
|
+
// throw and a budget run report the whole dataset infeasible -- re-score
|
|
111
|
+
// every model on a neutral quality baseline so the prompt stays routable on
|
|
112
|
+
// cost/speed. The per-model skip above still applies when only *some* models
|
|
113
|
+
// lack signal.
|
|
114
|
+
if (scores.length === 0) {
|
|
115
|
+
for (const model of models) {
|
|
116
|
+
const score = this._scoreSingleModel(model, topBenchmarkDict, benchmarkMedians, priorities, true);
|
|
117
|
+
if (score !== null) {
|
|
118
|
+
scores.push(score);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Sort by final score descending, with a deterministic secondary key so
|
|
123
|
+
// median-imputation ties favour real data and are reproducible:
|
|
124
|
+
// 1. higher finalScore
|
|
125
|
+
// 2. more real (non-imputed) benchmark coverage -- topBenchmarks only
|
|
126
|
+
// holds the model's own non-imputed benchmarks
|
|
127
|
+
// 3. ascending modelId by Unicode code point (NOT locale-aware)
|
|
128
|
+
scores.sort((a, b) => {
|
|
129
|
+
if (b.finalScore !== a.finalScore)
|
|
130
|
+
return b.finalScore - a.finalScore;
|
|
131
|
+
if (b.topBenchmarks.length !== a.topBenchmarks.length) {
|
|
132
|
+
return b.topBenchmarks.length - a.topBenchmarks.length;
|
|
133
|
+
}
|
|
134
|
+
return a.modelId < b.modelId ? -1 : a.modelId > b.modelId ? 1 : 0;
|
|
135
|
+
});
|
|
136
|
+
if (scores.length > 1) {
|
|
137
|
+
// Normalize to 0.1-0.95 range (best model ~ 0.95)
|
|
138
|
+
const maxRaw = scores[0].finalScore;
|
|
139
|
+
const minRaw = scores[scores.length - 1].finalScore;
|
|
140
|
+
for (const s of scores) {
|
|
141
|
+
if (maxRaw === minRaw) {
|
|
142
|
+
s.finalScore = 0.5;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
const normalized = (s.finalScore - minRaw) / (maxRaw - minRaw);
|
|
146
|
+
s.finalScore = Math.round((0.1 + 0.85 * normalized) * 10000) / 10000;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else if (scores.length === 1) {
|
|
151
|
+
// Single surviving model: don't rescale against a hardcoded 0 floor
|
|
152
|
+
// (that forced ~0.95 regardless of how good the model actually is).
|
|
153
|
+
// Surface its own unnormalized weighted score, clamped to [0,1].
|
|
154
|
+
const only = scores[0];
|
|
155
|
+
only.finalScore = Math.round(Math.max(0, Math.min(1, only.finalScore)) * 10000) / 10000;
|
|
156
|
+
}
|
|
157
|
+
return scores.slice(0, topK);
|
|
158
|
+
}
|
|
159
|
+
_scoreSingleModel(model, topBenchmarks, benchmarkMedians, priorities,
|
|
160
|
+
// When true, a model with no usable similarity signal is scored on a neutral
|
|
161
|
+
// quality baseline instead of being dropped -- used only for the
|
|
162
|
+
// all-models-signal-less case (see scoreModels).
|
|
163
|
+
neutralFallback = false) {
|
|
164
|
+
// --- Quality score ---
|
|
165
|
+
let weightedQualitySum = 0;
|
|
166
|
+
let totalSimilarityWeight = 0;
|
|
167
|
+
let imputedCount = 0;
|
|
168
|
+
// Only the model's *own* benchmark data goes in this list -- it powers
|
|
169
|
+
// the human-readable reasoning string, which should reflect real strengths,
|
|
170
|
+
// not registry-median guesses.
|
|
171
|
+
const modelTopBenchmarks = [];
|
|
172
|
+
for (const [benchmarkName, userSimilarity] of Object.entries(topBenchmarks)) {
|
|
173
|
+
let rawScore = model.benchmarkScores[benchmarkName];
|
|
174
|
+
let imputed = false;
|
|
175
|
+
// !Number.isFinite treats NaN/Infinity like a missing score so a junk
|
|
176
|
+
// value is imputed from the median rather than poisoning the result.
|
|
177
|
+
if (!Number.isFinite(rawScore)) {
|
|
178
|
+
const median = benchmarkMedians[benchmarkName];
|
|
179
|
+
// No model in the registry has data on this benchmark -> nothing to
|
|
180
|
+
// impute from. Falling through to `continue` here preserves the old
|
|
181
|
+
// "skip the model entirely if it intersects nothing" semantic, which
|
|
182
|
+
// is exactly what the test at line ~140 of engine.test.ts pins.
|
|
183
|
+
if (median == null)
|
|
184
|
+
continue;
|
|
185
|
+
rawScore = median;
|
|
186
|
+
imputed = true;
|
|
187
|
+
imputedCount += 1;
|
|
188
|
+
}
|
|
189
|
+
const normalized = this._normalizer.normalize(benchmarkName, rawScore);
|
|
190
|
+
weightedQualitySum += userSimilarity * normalized;
|
|
191
|
+
totalSimilarityWeight += userSimilarity;
|
|
192
|
+
if (!imputed)
|
|
193
|
+
modelTopBenchmarks.push([benchmarkName, normalized]);
|
|
194
|
+
}
|
|
195
|
+
// No usable similarity signal: normally drop the model so models with real
|
|
196
|
+
// signal win. But when EVERY model is signal-less, scoreModels retries with
|
|
197
|
+
// neutralFallback=true so the prompt stays routable on cost/speed -- flagged
|
|
198
|
+
// in the reasoning below so the "no signal" case is observable, not mistaken
|
|
199
|
+
// for a real quality judgement.
|
|
200
|
+
const noSignal = totalSimilarityWeight === 0;
|
|
201
|
+
if (noSignal && !neutralFallback)
|
|
202
|
+
return null;
|
|
203
|
+
const qualityScore = noSignal ? NEUTRAL_QUALITY_SCORE : weightedQualitySum / totalSimilarityWeight;
|
|
204
|
+
// --- Cost score ---
|
|
205
|
+
// Always compute when pricing data exists: gating on priority dropped the
|
|
206
|
+
// numerator while keeping the weight in totalWeight (denominator), which is
|
|
207
|
+
// mathematically inconsistent. The priority weight already scales the term.
|
|
208
|
+
let costScore = 0;
|
|
209
|
+
if (model.pricing) {
|
|
210
|
+
const avgCost = (model.pricing.inputPer1k + model.pricing.outputPer1k) / 2;
|
|
211
|
+
// Normalize against $0.10/1k tokens baseline
|
|
212
|
+
costScore = Math.max(0.0, 1.0 - avgCost / 0.1);
|
|
213
|
+
}
|
|
214
|
+
// --- Speed score ---
|
|
215
|
+
let speedScore = 0;
|
|
216
|
+
if (model.latency) {
|
|
217
|
+
speedScore = SPEED_SCORES[model.latency] ?? 0.3;
|
|
218
|
+
}
|
|
219
|
+
// --- Combine with priority weights ---
|
|
220
|
+
const qWeight = priorities.qualityWeight;
|
|
221
|
+
const cWeight = priorities.costWeight;
|
|
222
|
+
const sWeight = priorities.speedWeight;
|
|
223
|
+
const qContrib = qualityScore * qWeight;
|
|
224
|
+
const cContrib = costScore * cWeight;
|
|
225
|
+
const sContrib = speedScore * sWeight;
|
|
226
|
+
const totalWeight = qWeight + cWeight + sWeight;
|
|
227
|
+
let final = (qContrib + cContrib + sContrib) / totalWeight;
|
|
228
|
+
final = Math.max(0.0, Math.min(1.0, final));
|
|
229
|
+
// Generate reasoning
|
|
230
|
+
const topBenchStr = modelTopBenchmarks
|
|
231
|
+
.slice(0, 2)
|
|
232
|
+
.map(([b, s]) => `${b} (${Math.round(s * 100)}%)`)
|
|
233
|
+
.join(', ');
|
|
234
|
+
let reasoning;
|
|
235
|
+
if (noSignal) {
|
|
236
|
+
reasoning = 'No benchmark signal -- routed on cost/speed';
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
reasoning = `Quality: ${qualityScore.toFixed(2)} on [${topBenchStr}]`;
|
|
240
|
+
if (imputedCount > 0) {
|
|
241
|
+
// Tell the reader the score is partly an estimate. Useful when reading
|
|
242
|
+
// eval output and wondering why a model with thin coverage ranked here.
|
|
243
|
+
const total = Object.keys(topBenchmarks).length;
|
|
244
|
+
reasoning += ` | imputed: ${imputedCount}/${total}`;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (costScore > 0) {
|
|
248
|
+
reasoning += ` | Cost efficiency: ${costScore.toFixed(2)}`;
|
|
249
|
+
}
|
|
250
|
+
if (speedScore > 0) {
|
|
251
|
+
reasoning += ` | Speed: ${speedScore.toFixed(2)} (${model.latency})`;
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
modelId: model.modelId,
|
|
255
|
+
finalScore: final,
|
|
256
|
+
qualityScore: Math.round(qualityScore * 10000) / 10000,
|
|
257
|
+
costScore: Math.round(costScore * 10000) / 10000,
|
|
258
|
+
speedScore: Math.round(speedScore * 10000) / 10000,
|
|
259
|
+
qualityContribution: Math.round(qContrib * 10000) / 10000,
|
|
260
|
+
costContribution: Math.round(cContrib * 10000) / 10000,
|
|
261
|
+
speedContribution: Math.round(sContrib * 10000) / 10000,
|
|
262
|
+
topBenchmarks: modelTopBenchmarks,
|
|
263
|
+
reasoning,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/scoring/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ScoringEngine, SPEED_SCORES } from './engine.js';
|
|
2
|
+
export type { ModelScore } from './engine.js';
|
|
3
|
+
export { Priorities, DEFAULT_PRIORITIES } from './priorities.js';
|
|
4
|
+
export type { PrioritiesData } from './priorities.js';
|
|
5
|
+
export { BenchmarkNormalizer, NormalizationRange, NORMALIZATION_RANGES } from './benchmarks.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scoring/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scoring/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User priority system for model selection.
|
|
3
|
+
*
|
|
4
|
+
* Priorities let users express what matters to them (quality, cost, speed)
|
|
5
|
+
* on a 1-5 scale. These get transformed into weights that influence scoring.
|
|
6
|
+
*/
|
|
7
|
+
export interface PrioritiesData {
|
|
8
|
+
quality: number;
|
|
9
|
+
cost: number;
|
|
10
|
+
speed: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class Priorities {
|
|
13
|
+
/**
|
|
14
|
+
* Each value is on a 1-5 scale:
|
|
15
|
+
* 1 = don't care about this dimension
|
|
16
|
+
* 3 = balanced (default)
|
|
17
|
+
* 5 = this is critical
|
|
18
|
+
*/
|
|
19
|
+
readonly quality: number;
|
|
20
|
+
readonly cost: number;
|
|
21
|
+
readonly speed: number;
|
|
22
|
+
constructor(quality?: number, cost?: number, speed?: number);
|
|
23
|
+
/** Quality weight: 0.3 to 1.2 (always has baseline influence). */
|
|
24
|
+
get qualityWeight(): number;
|
|
25
|
+
/** Cost weight: 0.1 to 1.0 (can be fully suppressed). */
|
|
26
|
+
get costWeight(): number;
|
|
27
|
+
/** Speed weight: 0.1 to 1.0 (can be fully suppressed). */
|
|
28
|
+
get speedWeight(): number;
|
|
29
|
+
toDict(): PrioritiesData;
|
|
30
|
+
static fromDict(d: Partial<PrioritiesData>): Priorities;
|
|
31
|
+
/** Preset: maximize quality, ignore cost and speed. */
|
|
32
|
+
static performance(): Priorities;
|
|
33
|
+
/** Preset: minimize cost, moderate quality. */
|
|
34
|
+
static budget(): Priorities;
|
|
35
|
+
/** Preset: fastest response, moderate quality. */
|
|
36
|
+
static fast(): Priorities;
|
|
37
|
+
/** Preset: balanced across all dimensions. */
|
|
38
|
+
static balanced(): Priorities;
|
|
39
|
+
}
|
|
40
|
+
export declare const DEFAULT_PRIORITIES: Priorities;
|
|
41
|
+
//# sourceMappingURL=priorities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"priorities.d.ts","sourceRoot":"","sources":["../../src/scoring/priorities.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,UAAU;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,OAAO,SAAI,EAAE,IAAI,SAAI,EAAE,KAAK,SAAI;IAM5C,kEAAkE;IAClE,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,yDAAyD;IACzD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,0DAA0D;IAC1D,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,MAAM,IAAI,cAAc;IAIxB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,UAAU;IAIvD,uDAAuD;IACvD,MAAM,CAAC,WAAW,IAAI,UAAU;IAIhC,+CAA+C;IAC/C,MAAM,CAAC,MAAM,IAAI,UAAU;IAI3B,kDAAkD;IAClD,MAAM,CAAC,IAAI,IAAI,UAAU;IAIzB,8CAA8C;IAC9C,MAAM,CAAC,QAAQ,IAAI,UAAU;CAG9B;AAED,eAAO,MAAM,kBAAkB,YAA0B,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User priority system for model selection.
|
|
3
|
+
*
|
|
4
|
+
* Priorities let users express what matters to them (quality, cost, speed)
|
|
5
|
+
* on a 1-5 scale. These get transformed into weights that influence scoring.
|
|
6
|
+
*/
|
|
7
|
+
export class Priorities {
|
|
8
|
+
constructor(quality = 3, cost = 3, speed = 3) {
|
|
9
|
+
this.quality = Math.max(1, Math.min(5, Math.round(quality)));
|
|
10
|
+
this.cost = Math.max(1, Math.min(5, Math.round(cost)));
|
|
11
|
+
this.speed = Math.max(1, Math.min(5, Math.round(speed)));
|
|
12
|
+
}
|
|
13
|
+
/** Quality weight: 0.3 to 1.2 (always has baseline influence). */
|
|
14
|
+
get qualityWeight() {
|
|
15
|
+
return 0.3 + (this.quality / 5) * 0.9;
|
|
16
|
+
}
|
|
17
|
+
/** Cost weight: 0.1 to 1.0 (can be fully suppressed). */
|
|
18
|
+
get costWeight() {
|
|
19
|
+
return 0.1 + (this.cost / 5) * 0.9;
|
|
20
|
+
}
|
|
21
|
+
/** Speed weight: 0.1 to 1.0 (can be fully suppressed). */
|
|
22
|
+
get speedWeight() {
|
|
23
|
+
return 0.1 + (this.speed / 5) * 0.9;
|
|
24
|
+
}
|
|
25
|
+
toDict() {
|
|
26
|
+
return { quality: this.quality, cost: this.cost, speed: this.speed };
|
|
27
|
+
}
|
|
28
|
+
static fromDict(d) {
|
|
29
|
+
return new Priorities(d.quality ?? 3, d.cost ?? 3, d.speed ?? 3);
|
|
30
|
+
}
|
|
31
|
+
/** Preset: maximize quality, ignore cost and speed. */
|
|
32
|
+
static performance() {
|
|
33
|
+
return new Priorities(5, 1, 1);
|
|
34
|
+
}
|
|
35
|
+
/** Preset: minimize cost, moderate quality. */
|
|
36
|
+
static budget() {
|
|
37
|
+
return new Priorities(2, 5, 3);
|
|
38
|
+
}
|
|
39
|
+
/** Preset: fastest response, moderate quality. */
|
|
40
|
+
static fast() {
|
|
41
|
+
return new Priorities(2, 3, 5);
|
|
42
|
+
}
|
|
43
|
+
/** Preset: balanced across all dimensions. */
|
|
44
|
+
static balanced() {
|
|
45
|
+
return new Priorities(3, 3, 3);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export const DEFAULT_PRIORITIES = new Priorities(3, 3, 3);
|
|
49
|
+
//# sourceMappingURL=priorities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"priorities.js","sourceRoot":"","sources":["../../src/scoring/priorities.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,OAAO,UAAU;IAWrB,YAAY,OAAO,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,kEAAkE;IAClE,IAAI,aAAa;QACf,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IACxC,CAAC;IAED,yDAAyD;IACzD,IAAI,UAAU;QACZ,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IACrC,CAAC;IAED,0DAA0D;IAC1D,IAAI,WAAW;QACb,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IACtC,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,CAA0B;QACxC,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,uDAAuD;IACvD,MAAM,CAAC,WAAW;QAChB,OAAO,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,+CAA+C;IAC/C,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,kDAAkD;IAClD,MAAM,CAAC,IAAI;QACT,OAAO,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,8CAA8C;IAC9C,MAAM,CAAC,QAAQ;QACb,OAAO,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared type definitions for TryAii-DRE.
|
|
3
|
+
*/
|
|
4
|
+
/** Latency tier for a model. */
|
|
5
|
+
export type LatencyTier = 'very fast' | 'fast' | 'medium' | 'slow' | 'very slow';
|
|
6
|
+
/** Scoring strategy preset name. */
|
|
7
|
+
export type ScoringStrategy = 'balanced' | 'performance' | 'cost' | 'speed';
|
|
8
|
+
/** Pricing per 1k tokens in USD. */
|
|
9
|
+
export interface ModelPricingData {
|
|
10
|
+
input_per_1k: number;
|
|
11
|
+
output_per_1k: number;
|
|
12
|
+
}
|
|
13
|
+
/** Raw model data as stored in JSON. */
|
|
14
|
+
export interface ModelData {
|
|
15
|
+
model_id: string;
|
|
16
|
+
provider: string;
|
|
17
|
+
benchmark_scores?: Record<string, number | null>;
|
|
18
|
+
capabilities?: string[];
|
|
19
|
+
pricing?: ModelPricingData | null;
|
|
20
|
+
latency?: LatencyTier | null;
|
|
21
|
+
description?: string;
|
|
22
|
+
}
|
|
23
|
+
/** Models JSON file structure. */
|
|
24
|
+
export interface ModelsJson {
|
|
25
|
+
version?: string;
|
|
26
|
+
updated?: string;
|
|
27
|
+
models: ModelData[];
|
|
28
|
+
}
|
|
29
|
+
/** Training queries JSON file structure. */
|
|
30
|
+
export interface TrainingQueriesJson {
|
|
31
|
+
version?: string;
|
|
32
|
+
description?: string;
|
|
33
|
+
benchmarks: Record<string, {
|
|
34
|
+
description: string;
|
|
35
|
+
queries: string[];
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
/** Centroids JSON file structure. */
|
|
39
|
+
export interface CentroidsJson {
|
|
40
|
+
metadata: {
|
|
41
|
+
model: string;
|
|
42
|
+
dimension: number;
|
|
43
|
+
benchmark_count: number;
|
|
44
|
+
};
|
|
45
|
+
centroids: Record<string, number[]>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gCAAgC;AAChC,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAEjF,oCAAoC;AACpC,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5E,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wCAAwC;AACxC,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACjD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,kCAAkC;AAClC,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,4CAA4C;AAC5C,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC,CAAC;CACJ;AAED,qCAAqC;AACrC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACrC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cosine similarity between two vectors.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Compute cosine similarity between two vectors.
|
|
6
|
+
*
|
|
7
|
+
* @returns A value between -1 and 1 (1 = identical direction, 0 = orthogonal).
|
|
8
|
+
*/
|
|
9
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
10
|
+
//# sourceMappingURL=cosine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosine.d.ts","sourceRoot":"","sources":["../../src/utils/cosine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAMjE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cosine similarity between two vectors.
|
|
3
|
+
*/
|
|
4
|
+
import { dotProduct, vectorNorm } from './math.js';
|
|
5
|
+
/**
|
|
6
|
+
* Compute cosine similarity between two vectors.
|
|
7
|
+
*
|
|
8
|
+
* @returns A value between -1 and 1 (1 = identical direction, 0 = orthogonal).
|
|
9
|
+
*/
|
|
10
|
+
export function cosineSimilarity(a, b) {
|
|
11
|
+
const dot = dotProduct(a, b);
|
|
12
|
+
const normA = vectorNorm(a);
|
|
13
|
+
const normB = vectorNorm(b);
|
|
14
|
+
if (normA === 0 || normB === 0)
|
|
15
|
+
return 0.0;
|
|
16
|
+
return dot / (normA * normB);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=cosine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosine.js","sourceRoot":"","sources":["../../src/utils/cosine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEnD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC3C,OAAO,GAAG,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Basic vector math utilities.
|
|
3
|
+
*
|
|
4
|
+
* Replaces numpy operations with plain TypeScript array math.
|
|
5
|
+
*/
|
|
6
|
+
/** Compute the dot product of two vectors. */
|
|
7
|
+
export declare function dotProduct(a: number[], b: number[]): number;
|
|
8
|
+
/** Compute the L2 (Euclidean) norm of a vector. */
|
|
9
|
+
export declare function vectorNorm(v: number[]): number;
|
|
10
|
+
/** Compute the element-wise mean of a list of vectors. */
|
|
11
|
+
export declare function vectorMean(vectors: number[][]): number[];
|
|
12
|
+
/** Scale a vector by a scalar. */
|
|
13
|
+
export declare function vectorScale(v: number[], scalar: number): number[];
|
|
14
|
+
/** Add two vectors element-wise. */
|
|
15
|
+
export declare function vectorAdd(a: number[], b: number[]): number[];
|
|
16
|
+
/** Normalize a vector to unit length. Returns zero vector if norm is 0. */
|
|
17
|
+
export declare function vectorNormalize(v: number[]): number[];
|
|
18
|
+
//# sourceMappingURL=math.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8CAA8C;AAC9C,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAM3D;AAED,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAM9C;AAED,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,CAcxD;AAED,kCAAkC;AAClC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjE;AAED,oCAAoC;AACpC,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE5D;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAIrD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Basic vector math utilities.
|
|
3
|
+
*
|
|
4
|
+
* Replaces numpy operations with plain TypeScript array math.
|
|
5
|
+
*/
|
|
6
|
+
/** Compute the dot product of two vectors. */
|
|
7
|
+
export function dotProduct(a, b) {
|
|
8
|
+
let sum = 0;
|
|
9
|
+
for (let i = 0; i < a.length; i++) {
|
|
10
|
+
sum += a[i] * b[i];
|
|
11
|
+
}
|
|
12
|
+
return sum;
|
|
13
|
+
}
|
|
14
|
+
/** Compute the L2 (Euclidean) norm of a vector. */
|
|
15
|
+
export function vectorNorm(v) {
|
|
16
|
+
let sum = 0;
|
|
17
|
+
for (let i = 0; i < v.length; i++) {
|
|
18
|
+
sum += v[i] * v[i];
|
|
19
|
+
}
|
|
20
|
+
return Math.sqrt(sum);
|
|
21
|
+
}
|
|
22
|
+
/** Compute the element-wise mean of a list of vectors. */
|
|
23
|
+
export function vectorMean(vectors) {
|
|
24
|
+
if (vectors.length === 0)
|
|
25
|
+
return [];
|
|
26
|
+
const dim = vectors[0].length;
|
|
27
|
+
const result = new Array(dim).fill(0);
|
|
28
|
+
for (const v of vectors) {
|
|
29
|
+
for (let i = 0; i < dim; i++) {
|
|
30
|
+
result[i] += v[i];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const n = vectors.length;
|
|
34
|
+
for (let i = 0; i < dim; i++) {
|
|
35
|
+
result[i] /= n;
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
/** Scale a vector by a scalar. */
|
|
40
|
+
export function vectorScale(v, scalar) {
|
|
41
|
+
return v.map((x) => x * scalar);
|
|
42
|
+
}
|
|
43
|
+
/** Add two vectors element-wise. */
|
|
44
|
+
export function vectorAdd(a, b) {
|
|
45
|
+
return a.map((x, i) => x + b[i]);
|
|
46
|
+
}
|
|
47
|
+
/** Normalize a vector to unit length. Returns zero vector if norm is 0. */
|
|
48
|
+
export function vectorNormalize(v) {
|
|
49
|
+
const norm = vectorNorm(v);
|
|
50
|
+
if (norm === 0)
|
|
51
|
+
return v.slice();
|
|
52
|
+
return v.map((x) => x / norm);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=math.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8CAA8C;AAC9C,MAAM,UAAU,UAAU,CAAC,CAAW,EAAE,CAAW;IACjD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,UAAU,CAAC,CAAW;IACpC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,UAAU,CAAC,OAAmB;IAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,KAAK,CAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,WAAW,CAAC,CAAW,EAAE,MAAc;IACrD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,SAAS,CAAC,CAAW,EAAE,CAAW;IAChD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,CAAW;IACzC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;IACjC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAChC,CAAC"}
|