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
package/dist/cli.js
ADDED
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* TryAii-DRE CLI.
|
|
4
|
+
*
|
|
5
|
+
* Commands (kept in parity with the Python SDK's `tryaii-dre`):
|
|
6
|
+
* tryaii-dre route "your prompt here" -- Route a prompt and show recommendations
|
|
7
|
+
* tryaii-dre eval prompts.json -- Route a JSON prompt dataset
|
|
8
|
+
* tryaii-dre setup -- Download the embedding model + warm centroids
|
|
9
|
+
* tryaii-dre models -- List available models
|
|
10
|
+
* tryaii-dre benchmarks -- List available benchmarks
|
|
11
|
+
*
|
|
12
|
+
* Global flags: --no-banner, --version, --help.
|
|
13
|
+
*/
|
|
14
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
15
|
+
import { join, resolve } from 'node:path';
|
|
16
|
+
import { parseArgs } from 'node:util';
|
|
17
|
+
import { showBanner } from './banner.js';
|
|
18
|
+
import { routeDatasetWithBudget } from './budget.js';
|
|
19
|
+
import { benchmarkToDict, BenchmarkRegistry } from './benchmarks/registry.js';
|
|
20
|
+
import { CentroidGenerator } from './centroids/generator.js';
|
|
21
|
+
import { centroidFilePath, createDefaultConfig, DEFAULT_EMBEDDING_MODEL } from './config.js';
|
|
22
|
+
import { LocalEmbeddingProvider } from './embeddings/local.js';
|
|
23
|
+
import { renderDashboard } from './dashboard/index.js';
|
|
24
|
+
import { ModelRegistry } from './registry/models.js';
|
|
25
|
+
import { Router, routeResultBestReasoning, routeResultBestScore, } from './router.js';
|
|
26
|
+
import { Priorities } from './scoring/priorities.js';
|
|
27
|
+
/** Error type whose message is shown to the user without a stack trace. */
|
|
28
|
+
class CliError extends Error {
|
|
29
|
+
}
|
|
30
|
+
const out = process.stdout;
|
|
31
|
+
function intOpt(value, fallback = 0) {
|
|
32
|
+
const parsed = Number.parseInt(String(value), 10);
|
|
33
|
+
return Number.isFinite(parsed) ? parsed : fallback;
|
|
34
|
+
}
|
|
35
|
+
function round(value, digits) {
|
|
36
|
+
const factor = 10 ** digits;
|
|
37
|
+
return Math.round(value * factor) / factor;
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// route
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
async function cmdRoute(subArgs) {
|
|
43
|
+
const { values, positionals } = parseArgs({
|
|
44
|
+
args: subArgs,
|
|
45
|
+
allowPositionals: true,
|
|
46
|
+
options: {
|
|
47
|
+
quality: { type: 'string', default: '3' },
|
|
48
|
+
cost: { type: 'string', default: '3' },
|
|
49
|
+
speed: { type: 'string', default: '3' },
|
|
50
|
+
'top-k': { type: 'string', default: '5' },
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
const prompt = positionals[0];
|
|
54
|
+
if (!prompt) {
|
|
55
|
+
throw new CliError('route requires a prompt, e.g. tryaii-dre route "Write a quicksort"');
|
|
56
|
+
}
|
|
57
|
+
const priorities = new Priorities(intOpt(values.quality, 3), intOpt(values.cost, 3), intOpt(values.speed, 3));
|
|
58
|
+
const topK = intOpt(values['top-k'], 5);
|
|
59
|
+
const router = new Router();
|
|
60
|
+
const result = await router.route(prompt, { priorities, topK });
|
|
61
|
+
const classification = result.classification;
|
|
62
|
+
out.write(`\nPrompt: ${prompt}\n`);
|
|
63
|
+
out.write(`Category: ${classification?.broadCategory ?? ''} > ${classification?.subcategory ?? ''}\n`);
|
|
64
|
+
out.write(`Confidence: ${(classification?.confidence ?? 0).toFixed(3)}\n`);
|
|
65
|
+
out.write(`Classifier: ${classification?.classifierUsed ?? ''}\n`);
|
|
66
|
+
out.write(`\nTop ${result.scores.length} Recommendations:\n`);
|
|
67
|
+
out.write('-'.repeat(70) + '\n');
|
|
68
|
+
result.scores.forEach((score, index) => {
|
|
69
|
+
const model = router.models.getModel(score.modelId);
|
|
70
|
+
const provider = model ? model.provider : '?';
|
|
71
|
+
out.write(` ${index + 1}. ${score.modelId}\n`);
|
|
72
|
+
out.write(` Provider: ${provider} | Score: ${score.finalScore.toFixed(3)}\n`);
|
|
73
|
+
out.write(` Quality: ${score.qualityScore.toFixed(3)} | ` +
|
|
74
|
+
`Cost: ${score.costScore.toFixed(3)} | Speed: ${score.speedScore.toFixed(3)}\n`);
|
|
75
|
+
if (model?.pricing) {
|
|
76
|
+
out.write(` Pricing: $${model.pricing.inputPer1k.toFixed(4)}/` +
|
|
77
|
+
`$${model.pricing.outputPer1k.toFixed(4)} per 1k\n`);
|
|
78
|
+
}
|
|
79
|
+
out.write(` Reason: ${score.reasoning}\n\n`);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// models
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
async function cmdModels(subArgs) {
|
|
86
|
+
const { values } = parseArgs({
|
|
87
|
+
args: subArgs,
|
|
88
|
+
allowPositionals: true,
|
|
89
|
+
options: {
|
|
90
|
+
provider: { type: 'string' },
|
|
91
|
+
json: { type: 'boolean', default: false },
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
const registry = ModelRegistry.default();
|
|
95
|
+
let models = registry.allModels;
|
|
96
|
+
if (values.provider) {
|
|
97
|
+
const provider = values.provider.toLowerCase();
|
|
98
|
+
models = models.filter((m) => m.provider.toLowerCase() === provider);
|
|
99
|
+
}
|
|
100
|
+
if (values.json) {
|
|
101
|
+
out.write(JSON.stringify(models.map((m) => m.toDict()), null, 2) + '\n');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
out.write(`\nAvailable Models (${models.length}):\n`);
|
|
105
|
+
out.write('-'.repeat(70) + '\n');
|
|
106
|
+
const byProvider = new Map();
|
|
107
|
+
for (const model of models) {
|
|
108
|
+
const list = byProvider.get(model.provider) ?? [];
|
|
109
|
+
list.push(model);
|
|
110
|
+
byProvider.set(model.provider, list);
|
|
111
|
+
}
|
|
112
|
+
for (const provider of [...byProvider.keys()].sort()) {
|
|
113
|
+
const providerModels = byProvider.get(provider);
|
|
114
|
+
out.write(`\n ${provider} (${providerModels.length} models):\n`);
|
|
115
|
+
for (const model of providerModels) {
|
|
116
|
+
const latency = model.latency ?? '?';
|
|
117
|
+
let price = '';
|
|
118
|
+
if (model.pricing) {
|
|
119
|
+
price = ` | $${model.pricing.inputPer1k.toFixed(4)}/${model.pricing.outputPer1k.toFixed(4)}`;
|
|
120
|
+
}
|
|
121
|
+
out.write(` - ${model.modelId} [${latency}]${price}\n`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// benchmarks
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
async function cmdBenchmarks(subArgs) {
|
|
129
|
+
const { values } = parseArgs({
|
|
130
|
+
args: subArgs,
|
|
131
|
+
allowPositionals: true,
|
|
132
|
+
options: { json: { type: 'boolean', default: false } },
|
|
133
|
+
});
|
|
134
|
+
const registry = BenchmarkRegistry.default();
|
|
135
|
+
if (values.json) {
|
|
136
|
+
out.write(JSON.stringify(registry.allBenchmarks.map(benchmarkToDict), null, 2) + '\n');
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
out.write(`\nAvailable Benchmarks (${registry.length}):\n`);
|
|
140
|
+
out.write('-'.repeat(60) + '\n');
|
|
141
|
+
for (const benchmark of registry.allBenchmarks) {
|
|
142
|
+
const norm = `[${benchmark.normalization.minScore}-${benchmark.normalization.maxScore}]`;
|
|
143
|
+
out.write(` ${benchmark.name.padEnd(30)} ${norm.padEnd(15)} ${benchmark.description}\n`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// setup
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
async function cmdSetup(subArgs) {
|
|
150
|
+
const { values } = parseArgs({
|
|
151
|
+
args: subArgs,
|
|
152
|
+
allowPositionals: true,
|
|
153
|
+
options: { model: { type: 'string' } },
|
|
154
|
+
});
|
|
155
|
+
const embeddingModel = values.model ?? DEFAULT_EMBEDDING_MODEL;
|
|
156
|
+
out.write(`Setting up TryAii-DRE with embedding model: ${embeddingModel}\n`);
|
|
157
|
+
out.write('This will download the model and load benchmark centroids (one-time operation)...\n\n');
|
|
158
|
+
const router = values.model
|
|
159
|
+
? new Router({ config: { embeddingModel: values.model } })
|
|
160
|
+
: new Router();
|
|
161
|
+
await router.route('warmup');
|
|
162
|
+
out.write(`Setup complete! ${router.benchmarks.length} benchmark centroids ready.\n`);
|
|
163
|
+
}
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
// regenerate
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
async function cmdRegenerate(subArgs) {
|
|
168
|
+
const { values } = parseArgs({
|
|
169
|
+
args: subArgs,
|
|
170
|
+
allowPositionals: true,
|
|
171
|
+
options: { model: { type: 'string' } },
|
|
172
|
+
});
|
|
173
|
+
const embeddingModel = values.model ?? DEFAULT_EMBEDDING_MODEL;
|
|
174
|
+
out.write(`Regenerating centroids for: ${embeddingModel}\n`);
|
|
175
|
+
const config = createDefaultConfig(values.model ? { embeddingModel } : undefined);
|
|
176
|
+
const provider = new LocalEmbeddingProvider(`Xenova/${embeddingModel}`);
|
|
177
|
+
const generator = new CentroidGenerator(provider);
|
|
178
|
+
const centroids = await generator.generateAsync();
|
|
179
|
+
const path = centroidFilePath(config);
|
|
180
|
+
generator.save(centroids, path);
|
|
181
|
+
out.write(`Done! Generated ${Object.keys(centroids).length} centroids at ${path}\n`);
|
|
182
|
+
}
|
|
183
|
+
function loadEvalPrompts(path) {
|
|
184
|
+
let raw = readFileSync(path, 'utf-8');
|
|
185
|
+
if (raw.charCodeAt(0) === 0xfeff)
|
|
186
|
+
raw = raw.slice(1); // strip BOM
|
|
187
|
+
const data = JSON.parse(raw);
|
|
188
|
+
if (!Array.isArray(data)) {
|
|
189
|
+
throw new CliError(`Expected top-level JSON array in ${path}`);
|
|
190
|
+
}
|
|
191
|
+
return data.map((item, index) => {
|
|
192
|
+
const ordinal = index + 1;
|
|
193
|
+
if (typeof item === 'string') {
|
|
194
|
+
return { id: `p${ordinal}`, prompt: item, category: 'unknown' };
|
|
195
|
+
}
|
|
196
|
+
if (item != null &&
|
|
197
|
+
typeof item === 'object' &&
|
|
198
|
+
typeof item.prompt === 'string') {
|
|
199
|
+
const obj = item;
|
|
200
|
+
return {
|
|
201
|
+
id: String(obj.id ?? `p${ordinal}`),
|
|
202
|
+
prompt: obj.prompt,
|
|
203
|
+
category: String(obj.category ?? 'unknown'),
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
throw new CliError(`Item at index ${index} is neither a string nor an object with prompt`);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
function topBenchmarksOf(classification, limit = 5) {
|
|
210
|
+
if (!classification)
|
|
211
|
+
return [];
|
|
212
|
+
return Object.entries(classification.benchmarkScores)
|
|
213
|
+
.sort((a, b) => b[1] - a[1])
|
|
214
|
+
.slice(0, limit)
|
|
215
|
+
.map(([name, score]) => ({ name, score: round(score, 4) }));
|
|
216
|
+
}
|
|
217
|
+
async function routeEvalRow(router, row, priorities, topK) {
|
|
218
|
+
const started = Date.now();
|
|
219
|
+
try {
|
|
220
|
+
const result = await router.route(row.prompt, { priorities, topK });
|
|
221
|
+
const classification = result.classification;
|
|
222
|
+
return {
|
|
223
|
+
id: row.id,
|
|
224
|
+
category: row.category,
|
|
225
|
+
prompt: row.prompt,
|
|
226
|
+
bestModel: result.bestModel,
|
|
227
|
+
bestScore: routeResultBestScore(result),
|
|
228
|
+
bestReasoning: routeResultBestReasoning(result),
|
|
229
|
+
topK: result.scores.map((s) => ({ modelId: s.modelId, finalScore: s.finalScore })),
|
|
230
|
+
topBenchmarks: topBenchmarksOf(classification),
|
|
231
|
+
broadCategory: classification?.broadCategory ?? '',
|
|
232
|
+
subcategory: classification?.subcategory ?? '',
|
|
233
|
+
confidence: classification?.confidence ?? 0,
|
|
234
|
+
routeMs: round(Date.now() - started, 2),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
return {
|
|
239
|
+
id: row.id,
|
|
240
|
+
category: row.category,
|
|
241
|
+
prompt: row.prompt,
|
|
242
|
+
bestModel: '',
|
|
243
|
+
bestScore: 0,
|
|
244
|
+
bestReasoning: '',
|
|
245
|
+
topK: [],
|
|
246
|
+
topBenchmarks: [],
|
|
247
|
+
broadCategory: '',
|
|
248
|
+
subcategory: '',
|
|
249
|
+
confidence: 0,
|
|
250
|
+
routeMs: round(Date.now() - started, 2),
|
|
251
|
+
error: error instanceof Error ? error.message : String(error),
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function counts(values) {
|
|
256
|
+
const map = new Map();
|
|
257
|
+
for (const value of values)
|
|
258
|
+
map.set(value, (map.get(value) ?? 0) + 1);
|
|
259
|
+
return map;
|
|
260
|
+
}
|
|
261
|
+
/** count desc, ties by insertion order (matches Python Counter.most_common). */
|
|
262
|
+
function mostCommon(map) {
|
|
263
|
+
return [...map.entries()].sort((a, b) => b[1] - a[1]);
|
|
264
|
+
}
|
|
265
|
+
function buildEvalSummary(results, priorities) {
|
|
266
|
+
const successes = results.filter((row) => !row.error);
|
|
267
|
+
const totalMs = results.reduce((sum, row) => sum + Number(row.routeMs), 0);
|
|
268
|
+
const modelCounts = counts(successes.map((row) => String(row.bestModel)));
|
|
269
|
+
const distribution = mostCommon(modelCounts).map(([model, count]) => ({
|
|
270
|
+
model,
|
|
271
|
+
count,
|
|
272
|
+
pct: round((count / Math.max(1, successes.length)) * 100, 2),
|
|
273
|
+
}));
|
|
274
|
+
const byCategory = new Map();
|
|
275
|
+
for (const row of successes) {
|
|
276
|
+
const category = String(row.category);
|
|
277
|
+
const list = byCategory.get(category) ?? [];
|
|
278
|
+
list.push(row);
|
|
279
|
+
byCategory.set(category, list);
|
|
280
|
+
}
|
|
281
|
+
const categories = [];
|
|
282
|
+
for (const [category, rows] of byCategory) {
|
|
283
|
+
const categoryModels = counts(rows.map((row) => String(row.bestModel)));
|
|
284
|
+
const benchTotals = new Map();
|
|
285
|
+
const benchCounts = new Map();
|
|
286
|
+
for (const row of rows) {
|
|
287
|
+
const benches = (row.topBenchmarks ?? []);
|
|
288
|
+
for (const bench of benches) {
|
|
289
|
+
if (!bench.name)
|
|
290
|
+
continue;
|
|
291
|
+
benchTotals.set(bench.name, (benchTotals.get(bench.name) ?? 0) + Number(bench.score ?? 0));
|
|
292
|
+
benchCounts.set(bench.name, (benchCounts.get(bench.name) ?? 0) + 1);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
const benchAvgs = [...benchTotals.keys()]
|
|
296
|
+
.map((name) => ({
|
|
297
|
+
name,
|
|
298
|
+
avgScore: round(benchTotals.get(name) / benchCounts.get(name), 4),
|
|
299
|
+
}))
|
|
300
|
+
.sort((a, b) => b.avgScore - a.avgScore);
|
|
301
|
+
categories.push({
|
|
302
|
+
category,
|
|
303
|
+
count: rows.length,
|
|
304
|
+
topModels: mostCommon(categoryModels).map(([model, count]) => ({
|
|
305
|
+
model,
|
|
306
|
+
count,
|
|
307
|
+
pct: round((count / rows.length) * 100, 2),
|
|
308
|
+
})),
|
|
309
|
+
topBenchmarks: benchAvgs.slice(0, 5),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
totalPrompts: results.length,
|
|
314
|
+
successCount: successes.length,
|
|
315
|
+
errorCount: results.length - successes.length,
|
|
316
|
+
distinctModels: modelCounts.size,
|
|
317
|
+
avgRouteMs: round(totalMs / Math.max(1, results.length), 2),
|
|
318
|
+
totalRouteMs: round(totalMs, 2),
|
|
319
|
+
priorities: priorities.toDict(),
|
|
320
|
+
distribution,
|
|
321
|
+
byCategory: categories.sort((a, b) => b.count - a.count),
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
function evalStampDir() {
|
|
325
|
+
const now = new Date();
|
|
326
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
327
|
+
return (`tryaii-dre-eval-${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}` +
|
|
328
|
+
`-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`);
|
|
329
|
+
}
|
|
330
|
+
async function cmdEval(subArgs) {
|
|
331
|
+
const { values, positionals } = parseArgs({
|
|
332
|
+
args: subArgs,
|
|
333
|
+
allowPositionals: true,
|
|
334
|
+
options: {
|
|
335
|
+
output: { type: 'string', short: 'o' },
|
|
336
|
+
quality: { type: 'string', default: '3' },
|
|
337
|
+
cost: { type: 'string', default: '3' },
|
|
338
|
+
speed: { type: 'string', default: '3' },
|
|
339
|
+
'top-k': { type: 'string', default: '5' },
|
|
340
|
+
'max-price': { type: 'string' },
|
|
341
|
+
'output-tokens': { type: 'string', default: '1000' },
|
|
342
|
+
'budget-mode': { type: 'string', default: 'strict' },
|
|
343
|
+
},
|
|
344
|
+
});
|
|
345
|
+
const inputArg = positionals[0];
|
|
346
|
+
if (!inputArg) {
|
|
347
|
+
throw new CliError('eval requires an input JSON file, e.g. tryaii-dre eval prompts.json');
|
|
348
|
+
}
|
|
349
|
+
const inputPath = resolve(inputArg);
|
|
350
|
+
const outputDir = values.output ? resolve(values.output) : resolve(process.cwd(), evalStampDir());
|
|
351
|
+
const priorities = new Priorities(intOpt(values.quality, 3), intOpt(values.cost, 3), intOpt(values.speed, 3));
|
|
352
|
+
const topK = intOpt(values['top-k'], 5);
|
|
353
|
+
const maxPrice = values['max-price'] != null ? Number(values['max-price']) : null;
|
|
354
|
+
const outputTokens = intOpt(values['output-tokens'], 1000);
|
|
355
|
+
const budgetMode = (values['budget-mode'] ?? 'strict');
|
|
356
|
+
if (budgetMode !== 'strict' && budgetMode !== 'fit-output') {
|
|
357
|
+
throw new CliError("--budget-mode must be 'strict' or 'fit-output'");
|
|
358
|
+
}
|
|
359
|
+
const rows = loadEvalPrompts(inputPath);
|
|
360
|
+
out.write(`[eval] input : ${inputPath}\n`);
|
|
361
|
+
out.write(`[eval] output : ${outputDir}\n`);
|
|
362
|
+
if (maxPrice == null) {
|
|
363
|
+
out.write(`[eval] priorities : quality=${priorities.quality} ` +
|
|
364
|
+
`cost=${priorities.cost} speed=${priorities.speed}\n`);
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
out.write('[eval] objective : maximize quality under total budget\n');
|
|
368
|
+
out.write('[eval] priorities : ignored for budgeted runs\n');
|
|
369
|
+
}
|
|
370
|
+
out.write(`[eval] loaded ${rows.length} prompt(s)\n`);
|
|
371
|
+
const router = new Router();
|
|
372
|
+
out.write('[eval] warming up router...\n');
|
|
373
|
+
await router.route('warmup', { priorities, topK: 1 });
|
|
374
|
+
let results;
|
|
375
|
+
let budgetSummary = null;
|
|
376
|
+
if (maxPrice != null) {
|
|
377
|
+
out.write(`[eval] budget : $${maxPrice.toFixed(6)} total, ` +
|
|
378
|
+
`${outputTokens} output tokens/prompt, mode=${budgetMode}\n`);
|
|
379
|
+
let nextPct = 10;
|
|
380
|
+
const progress = (done, total) => {
|
|
381
|
+
const pct = Math.floor((done / Math.max(1, total)) * 100);
|
|
382
|
+
if (pct >= nextPct || done === total) {
|
|
383
|
+
out.write(`[eval] built candidates ${done}/${total} (${Math.min(pct, 100)}%)\n`);
|
|
384
|
+
while (nextPct <= pct)
|
|
385
|
+
nextPct += 10;
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
const { results: budgeted, optimization } = await routeDatasetWithBudget({
|
|
389
|
+
router,
|
|
390
|
+
prompts: rows.map((row) => row.prompt),
|
|
391
|
+
priorities,
|
|
392
|
+
maxPrice,
|
|
393
|
+
outputTokens,
|
|
394
|
+
budgetMode,
|
|
395
|
+
progressCallback: progress,
|
|
396
|
+
});
|
|
397
|
+
results = budgeted.map((budgetedResult) => {
|
|
398
|
+
const selected = budgetedResult.selected;
|
|
399
|
+
const row = rows[selected.promptIndex];
|
|
400
|
+
const classification = budgetedResult.routeResult.classification;
|
|
401
|
+
return {
|
|
402
|
+
id: row.id,
|
|
403
|
+
category: row.category,
|
|
404
|
+
prompt: row.prompt,
|
|
405
|
+
bestModel: selected.modelId,
|
|
406
|
+
normalBestModel: selected.normalBestModel,
|
|
407
|
+
budgetConstrained: selected.modelId !== selected.normalBestModel,
|
|
408
|
+
bestScore: selected.finalScore,
|
|
409
|
+
bestReasoning: selected.reasoning,
|
|
410
|
+
estimatedCost: round(selected.estimatedCost, 8),
|
|
411
|
+
cumulativeCost: round(budgetedResult.cumulativeCost, 8),
|
|
412
|
+
remainingBudget: round(budgetedResult.remainingBudget, 8),
|
|
413
|
+
inputTokens: selected.inputTokens,
|
|
414
|
+
outputTokens: selected.outputTokens,
|
|
415
|
+
topK: budgetedResult.routeResult.scores
|
|
416
|
+
.slice(0, topK)
|
|
417
|
+
.map((s) => ({ modelId: s.modelId, finalScore: s.finalScore })),
|
|
418
|
+
topBenchmarks: topBenchmarksOf(classification),
|
|
419
|
+
broadCategory: classification?.broadCategory ?? '',
|
|
420
|
+
subcategory: classification?.subcategory ?? '',
|
|
421
|
+
confidence: classification?.confidence ?? 0,
|
|
422
|
+
routeMs: budgetedResult.routeMs,
|
|
423
|
+
optimizerStatus: optimization.status,
|
|
424
|
+
};
|
|
425
|
+
});
|
|
426
|
+
const minRequired = optimization.minimumRequiredBudget;
|
|
427
|
+
const requestedMin = optimization.requestedMinimumRequiredBudget;
|
|
428
|
+
const shortfall = optimization.budgetShortfall;
|
|
429
|
+
budgetSummary = {
|
|
430
|
+
status: optimization.status,
|
|
431
|
+
budget: optimization.budget,
|
|
432
|
+
budgetMode: optimization.budgetMode,
|
|
433
|
+
selectionObjective: 'maximizeQualityUnderBudget',
|
|
434
|
+
prioritiesIgnored: true,
|
|
435
|
+
requestedOutputTokens: optimization.requestedOutputTokens,
|
|
436
|
+
effectiveOutputTokens: optimization.effectiveOutputTokens,
|
|
437
|
+
outputTokens: optimization.effectiveOutputTokens,
|
|
438
|
+
totalEstimatedCost: round(optimization.totalEstimatedCost, 8),
|
|
439
|
+
minimumRequiredBudget: Number.isFinite(minRequired) ? round(minRequired, 8) : null,
|
|
440
|
+
requestedMinimumRequiredBudget: requestedMin != null && Number.isFinite(requestedMin) ? round(requestedMin, 8) : null,
|
|
441
|
+
budgetShortfall: shortfall != null && Number.isFinite(shortfall) ? round(shortfall, 8) : null,
|
|
442
|
+
costUnit: optimization.costUnit,
|
|
443
|
+
message: optimization.message,
|
|
444
|
+
};
|
|
445
|
+
out.write(`[eval] optimizer status: ${optimization.status}\n`);
|
|
446
|
+
if (optimization.requestedOutputTokens != null &&
|
|
447
|
+
optimization.effectiveOutputTokens != null &&
|
|
448
|
+
optimization.effectiveOutputTokens !== optimization.requestedOutputTokens) {
|
|
449
|
+
out.write(`[eval] output fit : ${optimization.requestedOutputTokens} -> ` +
|
|
450
|
+
`${optimization.effectiveOutputTokens} tokens/prompt\n`);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
results = [];
|
|
455
|
+
let nextPct = 10;
|
|
456
|
+
const total = rows.length;
|
|
457
|
+
for (let index = 0; index < rows.length; index++) {
|
|
458
|
+
results.push(await routeEvalRow(router, rows[index], priorities, topK));
|
|
459
|
+
const pct = Math.floor(((index + 1) / Math.max(1, total)) * 100);
|
|
460
|
+
if (pct >= nextPct || index + 1 === total) {
|
|
461
|
+
out.write(`[eval] routed ${index + 1}/${total} (${Math.min(pct, 100)}%)\n`);
|
|
462
|
+
while (nextPct <= pct)
|
|
463
|
+
nextPct += 10;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
mkdirSync(outputDir, { recursive: true });
|
|
468
|
+
const resultsPath = join(outputDir, 'results.jsonl');
|
|
469
|
+
const summaryPath = join(outputDir, 'summary.json');
|
|
470
|
+
const dashboardPath = join(outputDir, 'index.html');
|
|
471
|
+
writeFileSync(resultsPath, results.map((row) => JSON.stringify(row)).join('\n') + (results.length ? '\n' : ''), 'utf-8');
|
|
472
|
+
const summary = buildEvalSummary(results, priorities);
|
|
473
|
+
if (budgetSummary)
|
|
474
|
+
summary.budget = budgetSummary;
|
|
475
|
+
writeFileSync(summaryPath, JSON.stringify(summary, null, 2), 'utf-8');
|
|
476
|
+
writeFileSync(dashboardPath, renderDashboard(summary, inputPath), 'utf-8');
|
|
477
|
+
out.write('\n[eval] === Summary ===\n');
|
|
478
|
+
out.write(`Prompts : ${summary.totalPrompts}\n`);
|
|
479
|
+
out.write(`Successes : ${summary.successCount}\n`);
|
|
480
|
+
out.write(`Errors : ${summary.errorCount}\n`);
|
|
481
|
+
out.write(`Distinct models: ${summary.distinctModels}\n`);
|
|
482
|
+
out.write(`Avg route time : ${summary.avgRouteMs} ms\n`);
|
|
483
|
+
if (budgetSummary) {
|
|
484
|
+
out.write(`Budget status : ${budgetSummary.status}\n`);
|
|
485
|
+
out.write(`Estimated cost : $${Number(budgetSummary.totalEstimatedCost).toFixed(6)}\n`);
|
|
486
|
+
out.write(`Budget : $${Number(budgetSummary.budget).toFixed(6)}\n`);
|
|
487
|
+
}
|
|
488
|
+
out.write('\nTop recommended models:\n');
|
|
489
|
+
for (const row of summary.distribution.slice(0, 10)) {
|
|
490
|
+
out.write(` ${row.model.padEnd(40)} ${String(row.count).padStart(5)} (${row.pct}%)\n`);
|
|
491
|
+
}
|
|
492
|
+
out.write(`\n[eval] per-prompt results -> ${resultsPath}\n`);
|
|
493
|
+
out.write(`[eval] summary -> ${summaryPath}\n`);
|
|
494
|
+
out.write(`[eval] dashboard -> ${dashboardPath}\n`);
|
|
495
|
+
// Exit non-zero when every prompt errored so callers / CI can detect a total failure.
|
|
496
|
+
if (summary.totalPrompts > 0 && summary.errorCount === summary.totalPrompts) {
|
|
497
|
+
const firstError = results.find((row) => row.error)?.error ?? 'all prompts failed to route';
|
|
498
|
+
process.stderr.write(`[eval] error: all ${summary.totalPrompts} prompt(s) failed: ${firstError}\n`);
|
|
499
|
+
process.exitCode = 1;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
// ---------------------------------------------------------------------------
|
|
503
|
+
// help / dispatch
|
|
504
|
+
// ---------------------------------------------------------------------------
|
|
505
|
+
const HELP = `tryaii-dre -- Embedding-based AI model router
|
|
506
|
+
|
|
507
|
+
Usage:
|
|
508
|
+
tryaii-dre <command> [options]
|
|
509
|
+
|
|
510
|
+
Commands:
|
|
511
|
+
route <prompt> Route a prompt to the best model and show recommendations
|
|
512
|
+
eval <input.json> Route a JSON dataset; writes results.jsonl, summary.json, index.html
|
|
513
|
+
models List available models (--provider <name>, --json)
|
|
514
|
+
benchmarks List available benchmarks (--json)
|
|
515
|
+
setup Download the embedding model and warm centroids (--model <name>)
|
|
516
|
+
regenerate Rebuild benchmark centroids, e.g. after changing the embedding model (--model <name>)
|
|
517
|
+
|
|
518
|
+
Common options:
|
|
519
|
+
--quality <1-5> Quality priority for route/eval (default 3)
|
|
520
|
+
--cost <1-5> Cost priority for route/eval (default 3)
|
|
521
|
+
--speed <1-5> Speed priority for route/eval (default 3)
|
|
522
|
+
--top-k <n> Number of recommendations (default 5)
|
|
523
|
+
|
|
524
|
+
Eval-only options:
|
|
525
|
+
-o, --output <dir> Output directory (default: ./tryaii-dre-eval-<timestamp>)
|
|
526
|
+
--max-price <usd> Total dataset budget; switches eval to budget-optimized mode
|
|
527
|
+
--output-tokens <n> Expected output tokens per prompt for budget estimation (default 1000)
|
|
528
|
+
--budget-mode <mode> 'strict' (default) or 'fit-output'
|
|
529
|
+
|
|
530
|
+
Global flags:
|
|
531
|
+
--no-banner Disable the startup banner (also honored via TRYAII_NO_BANNER)
|
|
532
|
+
--version Print the version and exit
|
|
533
|
+
-h, --help Show this help
|
|
534
|
+
|
|
535
|
+
Examples:
|
|
536
|
+
tryaii-dre route "Write a Python function to merge sorted arrays" --quality=5 --cost=1
|
|
537
|
+
tryaii-dre eval prompts.json --output results/run --quality=5 --cost=1 --speed=1
|
|
538
|
+
tryaii-dre eval prompts.json --max-price=0.10 --output-tokens=2000 --budget-mode=fit-output
|
|
539
|
+
`;
|
|
540
|
+
function version() {
|
|
541
|
+
try {
|
|
542
|
+
// dist/cli.js -> ../package.json resolves to the package root.
|
|
543
|
+
return (JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf-8')).version ?? '0.0.0');
|
|
544
|
+
}
|
|
545
|
+
catch {
|
|
546
|
+
return '0.0.0';
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
async function main() {
|
|
550
|
+
const argv = process.argv.slice(2);
|
|
551
|
+
if (argv.includes('--version') || argv.includes('-V')) {
|
|
552
|
+
out.write(version() + '\n');
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
const noBanner = argv.includes('--no-banner') || Boolean(process.env.TRYAII_NO_BANNER);
|
|
556
|
+
const filtered = argv.filter((arg) => arg !== '--no-banner');
|
|
557
|
+
const command = filtered[0];
|
|
558
|
+
const subArgs = filtered.slice(1);
|
|
559
|
+
if (!noBanner)
|
|
560
|
+
await showBanner();
|
|
561
|
+
if (!command || command === '-h' || command === '--help' || command === 'help') {
|
|
562
|
+
out.write(HELP);
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
switch (command) {
|
|
566
|
+
case 'route':
|
|
567
|
+
await cmdRoute(subArgs);
|
|
568
|
+
break;
|
|
569
|
+
case 'eval':
|
|
570
|
+
await cmdEval(subArgs);
|
|
571
|
+
break;
|
|
572
|
+
case 'models':
|
|
573
|
+
await cmdModels(subArgs);
|
|
574
|
+
break;
|
|
575
|
+
case 'benchmarks':
|
|
576
|
+
await cmdBenchmarks(subArgs);
|
|
577
|
+
break;
|
|
578
|
+
case 'setup':
|
|
579
|
+
await cmdSetup(subArgs);
|
|
580
|
+
break;
|
|
581
|
+
case 'regenerate':
|
|
582
|
+
await cmdRegenerate(subArgs);
|
|
583
|
+
break;
|
|
584
|
+
default:
|
|
585
|
+
throw new CliError(`Unknown command: ${command}\nRun "tryaii-dre --help" for usage.`);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
main().catch((error) => {
|
|
589
|
+
const message = error instanceof CliError
|
|
590
|
+
? error.message
|
|
591
|
+
: error instanceof Error
|
|
592
|
+
? error.message
|
|
593
|
+
: String(error);
|
|
594
|
+
process.stderr.write(`error: ${message}\n`);
|
|
595
|
+
process.exitCode = 1;
|
|
596
|
+
});
|
|
597
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|