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.
Files changed (146) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +234 -0
  3. package/dist/banner.d.ts +24 -0
  4. package/dist/banner.d.ts.map +1 -0
  5. package/dist/banner.js +125 -0
  6. package/dist/banner.js.map +1 -0
  7. package/dist/benchmarks/index.d.ts +4 -0
  8. package/dist/benchmarks/index.d.ts.map +1 -0
  9. package/dist/benchmarks/index.js +3 -0
  10. package/dist/benchmarks/index.js.map +1 -0
  11. package/dist/benchmarks/registry.d.ts +69 -0
  12. package/dist/benchmarks/registry.d.ts.map +1 -0
  13. package/dist/benchmarks/registry.js +128 -0
  14. package/dist/benchmarks/registry.js.map +1 -0
  15. package/dist/benchmarks/standard.d.ts +6 -0
  16. package/dist/benchmarks/standard.d.ts.map +1 -0
  17. package/dist/benchmarks/standard.js +115 -0
  18. package/dist/benchmarks/standard.js.map +1 -0
  19. package/dist/budget.d.ts +65 -0
  20. package/dist/budget.d.ts.map +1 -0
  21. package/dist/budget.js +344 -0
  22. package/dist/budget.js.map +1 -0
  23. package/dist/cache/index.d.ts +27 -0
  24. package/dist/cache/index.d.ts.map +1 -0
  25. package/dist/cache/index.js +63 -0
  26. package/dist/cache/index.js.map +1 -0
  27. package/dist/centroids/data/centroids_all-MiniLM-L6-v2.json +1 -0
  28. package/dist/centroids/data/trainingQueries.json +246 -0
  29. package/dist/centroids/generator.d.ts +63 -0
  30. package/dist/centroids/generator.d.ts.map +1 -0
  31. package/dist/centroids/generator.js +120 -0
  32. package/dist/centroids/generator.js.map +1 -0
  33. package/dist/centroids/index.d.ts +3 -0
  34. package/dist/centroids/index.d.ts.map +1 -0
  35. package/dist/centroids/index.js +3 -0
  36. package/dist/centroids/index.js.map +1 -0
  37. package/dist/centroids/loader.d.ts +87 -0
  38. package/dist/centroids/loader.d.ts.map +1 -0
  39. package/dist/centroids/loader.js +236 -0
  40. package/dist/centroids/loader.js.map +1 -0
  41. package/dist/classifiers/base.d.ts +56 -0
  42. package/dist/classifiers/base.d.ts.map +1 -0
  43. package/dist/classifiers/base.js +42 -0
  44. package/dist/classifiers/base.js.map +1 -0
  45. package/dist/classifiers/embedding.d.ts +68 -0
  46. package/dist/classifiers/embedding.d.ts.map +1 -0
  47. package/dist/classifiers/embedding.js +0 -0
  48. package/dist/classifiers/embedding.js.map +1 -0
  49. package/dist/classifiers/hybrid.d.ts +31 -0
  50. package/dist/classifiers/hybrid.d.ts.map +1 -0
  51. package/dist/classifiers/hybrid.js +61 -0
  52. package/dist/classifiers/hybrid.js.map +1 -0
  53. package/dist/classifiers/index.d.ts +4 -0
  54. package/dist/classifiers/index.d.ts.map +1 -0
  55. package/dist/classifiers/index.js +3 -0
  56. package/dist/classifiers/index.js.map +1 -0
  57. package/dist/classifiers/keyword.d.ts +29 -0
  58. package/dist/classifiers/keyword.d.ts.map +1 -0
  59. package/dist/classifiers/keyword.js +264 -0
  60. package/dist/classifiers/keyword.js.map +1 -0
  61. package/dist/cli.d.ts +15 -0
  62. package/dist/cli.d.ts.map +1 -0
  63. package/dist/cli.js +597 -0
  64. package/dist/cli.js.map +1 -0
  65. package/dist/client-types.d.ts +101 -0
  66. package/dist/client-types.d.ts.map +1 -0
  67. package/dist/client-types.js +5 -0
  68. package/dist/client-types.js.map +1 -0
  69. package/dist/client.d.ts +50 -0
  70. package/dist/client.d.ts.map +1 -0
  71. package/dist/client.js +279 -0
  72. package/dist/client.js.map +1 -0
  73. package/dist/config.d.ts +45 -0
  74. package/dist/config.d.ts.map +1 -0
  75. package/dist/config.js +37 -0
  76. package/dist/config.js.map +1 -0
  77. package/dist/dashboard/index.d.ts +48 -0
  78. package/dist/dashboard/index.d.ts.map +1 -0
  79. package/dist/dashboard/index.js +166 -0
  80. package/dist/dashboard/index.js.map +1 -0
  81. package/dist/embeddings/base.d.ts +66 -0
  82. package/dist/embeddings/base.d.ts.map +1 -0
  83. package/dist/embeddings/base.js +77 -0
  84. package/dist/embeddings/base.js.map +1 -0
  85. package/dist/embeddings/index.d.ts +3 -0
  86. package/dist/embeddings/index.d.ts.map +1 -0
  87. package/dist/embeddings/index.js +3 -0
  88. package/dist/embeddings/index.js.map +1 -0
  89. package/dist/embeddings/local.d.ts +42 -0
  90. package/dist/embeddings/local.d.ts.map +1 -0
  91. package/dist/embeddings/local.js +89 -0
  92. package/dist/embeddings/local.js.map +1 -0
  93. package/dist/index.d.ts +44 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +45 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/integrations/index.d.ts +3 -0
  98. package/dist/integrations/index.d.ts.map +1 -0
  99. package/dist/integrations/index.js +2 -0
  100. package/dist/integrations/index.js.map +1 -0
  101. package/dist/integrations/openrouter.d.ts +84 -0
  102. package/dist/integrations/openrouter.d.ts.map +1 -0
  103. package/dist/integrations/openrouter.js +253 -0
  104. package/dist/integrations/openrouter.js.map +1 -0
  105. package/dist/registry/index.d.ts +2 -0
  106. package/dist/registry/index.d.ts.map +1 -0
  107. package/dist/registry/index.js +2 -0
  108. package/dist/registry/index.js.map +1 -0
  109. package/dist/registry/models.d.ts +76 -0
  110. package/dist/registry/models.d.ts.map +1 -0
  111. package/dist/registry/models.js +170 -0
  112. package/dist/registry/models.js.map +1 -0
  113. package/dist/registry/presets/defaultModels.json +435 -0
  114. package/dist/router.d.ts +178 -0
  115. package/dist/router.d.ts.map +1 -0
  116. package/dist/router.js +259 -0
  117. package/dist/router.js.map +1 -0
  118. package/dist/scoring/benchmarks.d.ts +35 -0
  119. package/dist/scoring/benchmarks.d.ts.map +1 -0
  120. package/dist/scoring/benchmarks.js +68 -0
  121. package/dist/scoring/benchmarks.js.map +1 -0
  122. package/dist/scoring/engine.d.ts +43 -0
  123. package/dist/scoring/engine.d.ts.map +1 -0
  124. package/dist/scoring/engine.js +267 -0
  125. package/dist/scoring/engine.js.map +1 -0
  126. package/dist/scoring/index.d.ts +6 -0
  127. package/dist/scoring/index.d.ts.map +1 -0
  128. package/dist/scoring/index.js +4 -0
  129. package/dist/scoring/index.js.map +1 -0
  130. package/dist/scoring/priorities.d.ts +41 -0
  131. package/dist/scoring/priorities.d.ts.map +1 -0
  132. package/dist/scoring/priorities.js +49 -0
  133. package/dist/scoring/priorities.js.map +1 -0
  134. package/dist/types.d.ts +47 -0
  135. package/dist/types.d.ts.map +1 -0
  136. package/dist/types.js +5 -0
  137. package/dist/types.js.map +1 -0
  138. package/dist/utils/cosine.d.ts +10 -0
  139. package/dist/utils/cosine.d.ts.map +1 -0
  140. package/dist/utils/cosine.js +18 -0
  141. package/dist/utils/cosine.js.map +1 -0
  142. package/dist/utils/math.d.ts +18 -0
  143. package/dist/utils/math.d.ts.map +1 -0
  144. package/dist/utils/math.js +54 -0
  145. package/dist/utils/math.js.map +1 -0
  146. 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}