ai.matey.core 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 +21 -0
- package/dist/cjs/bridge.js +657 -0
- package/dist/cjs/bridge.js.map +1 -0
- package/dist/cjs/capability-inference.js +349 -0
- package/dist/cjs/capability-inference.js.map +1 -0
- package/dist/cjs/capability-matcher.js +216 -0
- package/dist/cjs/capability-matcher.js.map +1 -0
- package/dist/cjs/index.js +31 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/middleware-stack.js +256 -0
- package/dist/cjs/middleware-stack.js.map +1 -0
- package/dist/cjs/model-pricing.js +350 -0
- package/dist/cjs/model-pricing.js.map +1 -0
- package/dist/cjs/model-translation.js +171 -0
- package/dist/cjs/model-translation.js.map +1 -0
- package/dist/cjs/router.js +1388 -0
- package/dist/cjs/router.js.map +1 -0
- package/dist/esm/bridge.js +652 -0
- package/dist/esm/bridge.js.map +1 -0
- package/dist/esm/capability-inference.js +343 -0
- package/dist/esm/capability-inference.js.map +1 -0
- package/dist/esm/capability-matcher.js +210 -0
- package/dist/esm/capability-matcher.js.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/middleware-stack.js +250 -0
- package/dist/esm/middleware-stack.js.map +1 -0
- package/dist/esm/model-pricing.js +340 -0
- package/dist/esm/model-pricing.js.map +1 -0
- package/dist/esm/model-translation.js +163 -0
- package/dist/esm/model-translation.js.map +1 -0
- package/dist/esm/router.js +1383 -0
- package/dist/esm/router.js.map +1 -0
- package/dist/types/bridge.d.ts +254 -0
- package/dist/types/bridge.d.ts.map +1 -0
- package/dist/types/capability-inference.d.ts +35 -0
- package/dist/types/capability-inference.d.ts.map +1 -0
- package/dist/types/capability-matcher.d.ts +104 -0
- package/dist/types/capability-matcher.d.ts.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/middleware-stack.d.ts +102 -0
- package/dist/types/middleware-stack.d.ts.map +1 -0
- package/dist/types/model-pricing.d.ts +81 -0
- package/dist/types/model-pricing.d.ts.map +1 -0
- package/dist/types/model-translation.d.ts +171 -0
- package/dist/types/model-translation.d.ts.map +1 -0
- package/dist/types/router.d.ts +287 -0
- package/dist/types/router.d.ts.map +1 -0
- package/package.json +70 -0
- package/readme.md +34 -0
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability Inference
|
|
3
|
+
*
|
|
4
|
+
* Infers model capabilities from model names and metadata when explicit
|
|
5
|
+
* capability data is not available.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { getModelCapabilities } from './model-pricing.js';
|
|
10
|
+
/**
|
|
11
|
+
* Infer capabilities for a model based on its name and optional metadata.
|
|
12
|
+
*
|
|
13
|
+
* Uses pattern matching on model names to determine likely capabilities.
|
|
14
|
+
* Falls back to pricing database if available.
|
|
15
|
+
*
|
|
16
|
+
* @param modelName - The model name/ID
|
|
17
|
+
* @param metadata - Optional metadata to aid inference
|
|
18
|
+
* @returns Inferred capabilities
|
|
19
|
+
*/
|
|
20
|
+
export function inferCapabilities(modelName, metadata) {
|
|
21
|
+
// Try pricing database first
|
|
22
|
+
const dbCapabilities = getModelCapabilities(modelName);
|
|
23
|
+
if (dbCapabilities) {
|
|
24
|
+
return dbCapabilities;
|
|
25
|
+
}
|
|
26
|
+
// Infer from model name patterns
|
|
27
|
+
const normalized = modelName.toLowerCase();
|
|
28
|
+
// Detect model family
|
|
29
|
+
const modelFamily = detectModelFamily(normalized);
|
|
30
|
+
// Infer capabilities by family
|
|
31
|
+
const familyCapabilities = modelFamily ? getDefaultCapabilitiesByFamily(modelFamily) : {};
|
|
32
|
+
// Override with pattern-specific capabilities
|
|
33
|
+
const patternCapabilities = inferFromPatterns(normalized);
|
|
34
|
+
// Apply metadata if provided
|
|
35
|
+
const metadataCapabilities = metadata ? inferFromMetadata(metadata) : {};
|
|
36
|
+
// Merge all sources
|
|
37
|
+
return {
|
|
38
|
+
...familyCapabilities,
|
|
39
|
+
...patternCapabilities,
|
|
40
|
+
...metadataCapabilities,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Detect model family from model name.
|
|
45
|
+
*/
|
|
46
|
+
function detectModelFamily(normalizedName) {
|
|
47
|
+
// GPT family
|
|
48
|
+
if (normalizedName.includes('gpt-4o')) {
|
|
49
|
+
return 'gpt-4';
|
|
50
|
+
}
|
|
51
|
+
if (normalizedName.includes('gpt-4')) {
|
|
52
|
+
return 'gpt-4';
|
|
53
|
+
}
|
|
54
|
+
if (normalizedName.includes('gpt-3.5')) {
|
|
55
|
+
return 'gpt-3.5';
|
|
56
|
+
}
|
|
57
|
+
if (normalizedName.includes('gpt-3')) {
|
|
58
|
+
return 'gpt-3';
|
|
59
|
+
}
|
|
60
|
+
// Claude family
|
|
61
|
+
if (normalizedName.includes('claude-3.5')) {
|
|
62
|
+
return 'claude-3';
|
|
63
|
+
}
|
|
64
|
+
if (normalizedName.includes('claude-3')) {
|
|
65
|
+
return 'claude-3';
|
|
66
|
+
}
|
|
67
|
+
if (normalizedName.includes('claude-2')) {
|
|
68
|
+
return 'claude-2';
|
|
69
|
+
}
|
|
70
|
+
// Gemini family
|
|
71
|
+
if (normalizedName.includes('gemini-1.5')) {
|
|
72
|
+
return 'gemini-1.5';
|
|
73
|
+
}
|
|
74
|
+
if (normalizedName.includes('gemini-1.0')) {
|
|
75
|
+
return 'gemini-1.0';
|
|
76
|
+
}
|
|
77
|
+
if (normalizedName.includes('gemini')) {
|
|
78
|
+
return 'gemini-1.5';
|
|
79
|
+
}
|
|
80
|
+
// Mistral family
|
|
81
|
+
if (normalizedName.includes('mistral')) {
|
|
82
|
+
return 'mistral';
|
|
83
|
+
}
|
|
84
|
+
// Llama family
|
|
85
|
+
if (normalizedName.includes('llama-3')) {
|
|
86
|
+
return 'llama-3';
|
|
87
|
+
}
|
|
88
|
+
if (normalizedName.includes('llama-2')) {
|
|
89
|
+
return 'llama-2';
|
|
90
|
+
}
|
|
91
|
+
if (normalizedName.includes('llama')) {
|
|
92
|
+
return 'llama-2';
|
|
93
|
+
}
|
|
94
|
+
// Other families
|
|
95
|
+
if (normalizedName.includes('deepseek')) {
|
|
96
|
+
return 'deepseek';
|
|
97
|
+
}
|
|
98
|
+
if (normalizedName.includes('qwen')) {
|
|
99
|
+
return 'qwen';
|
|
100
|
+
}
|
|
101
|
+
if (normalizedName.includes('phi')) {
|
|
102
|
+
return 'phi';
|
|
103
|
+
}
|
|
104
|
+
if (normalizedName.includes('mixtral')) {
|
|
105
|
+
return 'mixtral';
|
|
106
|
+
}
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get default capabilities for a model family.
|
|
111
|
+
*/
|
|
112
|
+
function getDefaultCapabilitiesByFamily(family) {
|
|
113
|
+
const defaults = {
|
|
114
|
+
'gpt-4': {
|
|
115
|
+
contextWindow: 8192,
|
|
116
|
+
maxTokens: 4096,
|
|
117
|
+
supportsStreaming: true,
|
|
118
|
+
supportsTools: true,
|
|
119
|
+
supportsJSON: true,
|
|
120
|
+
qualityScore: 90,
|
|
121
|
+
},
|
|
122
|
+
'gpt-3.5': {
|
|
123
|
+
contextWindow: 16385,
|
|
124
|
+
maxTokens: 4096,
|
|
125
|
+
supportsStreaming: true,
|
|
126
|
+
supportsTools: true,
|
|
127
|
+
supportsJSON: true,
|
|
128
|
+
qualityScore: 75,
|
|
129
|
+
},
|
|
130
|
+
'claude-3': {
|
|
131
|
+
contextWindow: 200000,
|
|
132
|
+
maxTokens: 4096,
|
|
133
|
+
supportsStreaming: true,
|
|
134
|
+
supportsTools: true,
|
|
135
|
+
supportsJSON: false,
|
|
136
|
+
qualityScore: 92,
|
|
137
|
+
},
|
|
138
|
+
'claude-2': {
|
|
139
|
+
contextWindow: 100000,
|
|
140
|
+
maxTokens: 4096,
|
|
141
|
+
supportsStreaming: true,
|
|
142
|
+
supportsTools: false,
|
|
143
|
+
supportsJSON: false,
|
|
144
|
+
qualityScore: 85,
|
|
145
|
+
},
|
|
146
|
+
'gemini-1.5': {
|
|
147
|
+
contextWindow: 1000000,
|
|
148
|
+
maxTokens: 8192,
|
|
149
|
+
supportsStreaming: true,
|
|
150
|
+
supportsVision: true,
|
|
151
|
+
supportsTools: true,
|
|
152
|
+
supportsJSON: true,
|
|
153
|
+
qualityScore: 88,
|
|
154
|
+
},
|
|
155
|
+
mistral: {
|
|
156
|
+
contextWindow: 32000,
|
|
157
|
+
maxTokens: 4096,
|
|
158
|
+
supportsStreaming: true,
|
|
159
|
+
supportsTools: true,
|
|
160
|
+
supportsJSON: true,
|
|
161
|
+
qualityScore: 82,
|
|
162
|
+
},
|
|
163
|
+
'llama-3': {
|
|
164
|
+
contextWindow: 8192,
|
|
165
|
+
maxTokens: 2048,
|
|
166
|
+
supportsStreaming: true,
|
|
167
|
+
supportsTools: false,
|
|
168
|
+
supportsJSON: false,
|
|
169
|
+
qualityScore: 78,
|
|
170
|
+
},
|
|
171
|
+
'llama-2': {
|
|
172
|
+
contextWindow: 4096,
|
|
173
|
+
maxTokens: 2048,
|
|
174
|
+
supportsStreaming: true,
|
|
175
|
+
supportsTools: false,
|
|
176
|
+
supportsJSON: false,
|
|
177
|
+
qualityScore: 70,
|
|
178
|
+
},
|
|
179
|
+
deepseek: {
|
|
180
|
+
contextWindow: 64000,
|
|
181
|
+
maxTokens: 4096,
|
|
182
|
+
supportsStreaming: true,
|
|
183
|
+
supportsTools: true,
|
|
184
|
+
supportsJSON: true,
|
|
185
|
+
qualityScore: 82,
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
return defaults[family] ?? {};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Infer capabilities from specific patterns in the model name.
|
|
192
|
+
*/
|
|
193
|
+
function inferFromPatterns(normalizedName) {
|
|
194
|
+
const capabilities = {};
|
|
195
|
+
// Vision support
|
|
196
|
+
if (normalizedName.includes('vision') ||
|
|
197
|
+
normalizedName.includes('gpt-4o') ||
|
|
198
|
+
normalizedName.includes('gpt-4-turbo') ||
|
|
199
|
+
normalizedName.includes('gemini')) {
|
|
200
|
+
capabilities.supportsVision = true;
|
|
201
|
+
}
|
|
202
|
+
// Extended context windows
|
|
203
|
+
if (normalizedName.includes('turbo') && normalizedName.includes('gpt-4')) {
|
|
204
|
+
capabilities.contextWindow = 128000;
|
|
205
|
+
}
|
|
206
|
+
if (normalizedName.includes('128k')) {
|
|
207
|
+
capabilities.contextWindow = 128000;
|
|
208
|
+
}
|
|
209
|
+
if (normalizedName.includes('32k')) {
|
|
210
|
+
capabilities.contextWindow = 32000;
|
|
211
|
+
}
|
|
212
|
+
// Speed indicators
|
|
213
|
+
if (normalizedName.includes('flash') || normalizedName.includes('haiku')) {
|
|
214
|
+
capabilities.latency = { p50: 500, p95: 1000 };
|
|
215
|
+
}
|
|
216
|
+
if (normalizedName.includes('turbo')) {
|
|
217
|
+
capabilities.latency = { p50: 1000, p95: 2000 };
|
|
218
|
+
}
|
|
219
|
+
return capabilities;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Infer capabilities from model metadata.
|
|
223
|
+
*/
|
|
224
|
+
function inferFromMetadata(metadata) {
|
|
225
|
+
const capabilities = {};
|
|
226
|
+
// Check for explicit capability flags
|
|
227
|
+
if (typeof metadata.supportsVision === 'boolean') {
|
|
228
|
+
capabilities.supportsVision = metadata.supportsVision;
|
|
229
|
+
}
|
|
230
|
+
if (typeof metadata.supportsTools === 'boolean') {
|
|
231
|
+
capabilities.supportsTools = metadata.supportsTools;
|
|
232
|
+
}
|
|
233
|
+
if (typeof metadata.supportsJSON === 'boolean') {
|
|
234
|
+
capabilities.supportsJSON = metadata.supportsJSON;
|
|
235
|
+
}
|
|
236
|
+
if (typeof metadata.supportsStreaming === 'boolean') {
|
|
237
|
+
capabilities.supportsStreaming = metadata.supportsStreaming;
|
|
238
|
+
}
|
|
239
|
+
// Extract context window
|
|
240
|
+
if (typeof metadata.contextWindow === 'number') {
|
|
241
|
+
capabilities.contextWindow = metadata.contextWindow;
|
|
242
|
+
}
|
|
243
|
+
else if (typeof metadata.context_window === 'number') {
|
|
244
|
+
capabilities.contextWindow = metadata.context_window;
|
|
245
|
+
}
|
|
246
|
+
else if (typeof metadata.max_context_length === 'number') {
|
|
247
|
+
capabilities.contextWindow = metadata.max_context_length;
|
|
248
|
+
}
|
|
249
|
+
// Extract max tokens
|
|
250
|
+
if (typeof metadata.maxTokens === 'number') {
|
|
251
|
+
capabilities.maxTokens = metadata.maxTokens;
|
|
252
|
+
}
|
|
253
|
+
else if (typeof metadata.max_tokens === 'number') {
|
|
254
|
+
capabilities.maxTokens = metadata.max_tokens;
|
|
255
|
+
}
|
|
256
|
+
return capabilities;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Merge multiple capability sources with priority.
|
|
260
|
+
* Later sources override earlier ones.
|
|
261
|
+
*/
|
|
262
|
+
export function mergeCapabilities(...sources) {
|
|
263
|
+
const merged = {};
|
|
264
|
+
for (const source of sources) {
|
|
265
|
+
if (!source) {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
Object.assign(merged, source);
|
|
269
|
+
}
|
|
270
|
+
return merged;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Check if a model meets minimum capability requirements.
|
|
274
|
+
*/
|
|
275
|
+
export function meetsRequirements(capabilities, requirements) {
|
|
276
|
+
// Check boolean capabilities
|
|
277
|
+
if (requirements.supportsStreaming && !capabilities.supportsStreaming) {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
if (requirements.supportsVision && !capabilities.supportsVision) {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
if (requirements.supportsTools && !capabilities.supportsTools) {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
if (requirements.supportsJSON && !capabilities.supportsJSON) {
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
// Check numeric capabilities (minimums)
|
|
290
|
+
if (requirements.contextWindow &&
|
|
291
|
+
(!capabilities.contextWindow || capabilities.contextWindow < requirements.contextWindow)) {
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
if (requirements.maxTokens &&
|
|
295
|
+
(!capabilities.maxTokens || capabilities.maxTokens < requirements.maxTokens)) {
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Calculate similarity score between two capability sets.
|
|
302
|
+
* Returns a score from 0-100.
|
|
303
|
+
*/
|
|
304
|
+
export function calculateCapabilitySimilarity(caps1, caps2) {
|
|
305
|
+
let matches = 0;
|
|
306
|
+
let total = 0;
|
|
307
|
+
// Compare boolean capabilities
|
|
308
|
+
const booleanFields = [
|
|
309
|
+
'supportsStreaming',
|
|
310
|
+
'supportsVision',
|
|
311
|
+
'supportsTools',
|
|
312
|
+
'supportsJSON',
|
|
313
|
+
];
|
|
314
|
+
for (const field of booleanFields) {
|
|
315
|
+
if (caps1[field] !== undefined || caps2[field] !== undefined) {
|
|
316
|
+
total++;
|
|
317
|
+
if (caps1[field] === caps2[field]) {
|
|
318
|
+
matches++;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Compare model family
|
|
323
|
+
if (caps1.modelFamily || caps2.modelFamily) {
|
|
324
|
+
total++;
|
|
325
|
+
if (caps1.modelFamily === caps2.modelFamily) {
|
|
326
|
+
matches++;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
// Compare numeric ranges (within 20% = similar)
|
|
330
|
+
if (caps1.contextWindow && caps2.contextWindow) {
|
|
331
|
+
total++;
|
|
332
|
+
const ratio = Math.min(caps1.contextWindow, caps2.contextWindow) /
|
|
333
|
+
Math.max(caps1.contextWindow, caps2.contextWindow);
|
|
334
|
+
if (ratio >= 0.8) {
|
|
335
|
+
matches++;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
if (total === 0) {
|
|
339
|
+
return 0;
|
|
340
|
+
}
|
|
341
|
+
return (matches / total) * 100;
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=capability-inference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-inference.js","sourceRoot":"","sources":["../../src/capability-inference.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability Matcher
|
|
3
|
+
*
|
|
4
|
+
* Intelligent model matching based on capability requirements.
|
|
5
|
+
* Scores and ranks models to find the best match for user needs.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { inferCapabilities, meetsRequirements } from './capability-inference.js';
|
|
10
|
+
/**
|
|
11
|
+
* Default scoring weights by optimization strategy.
|
|
12
|
+
*/
|
|
13
|
+
const OPTIMIZATION_WEIGHTS = {
|
|
14
|
+
cost: { cost: 0.6, speed: 0.2, quality: 0.2 },
|
|
15
|
+
speed: { cost: 0.2, speed: 0.6, quality: 0.2 },
|
|
16
|
+
quality: { cost: 0.2, speed: 0.2, quality: 0.6 },
|
|
17
|
+
balanced: { cost: 0.33, speed: 0.33, quality: 0.34 },
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Match and score models based on capability requirements.
|
|
21
|
+
*
|
|
22
|
+
* @param requirements - Capability requirements to match
|
|
23
|
+
* @param availableModels - Available models with their backends
|
|
24
|
+
* @returns Sorted array of scored models (best matches first)
|
|
25
|
+
*/
|
|
26
|
+
export function matchModels(requirements, availableModels) {
|
|
27
|
+
const scoredModels = [];
|
|
28
|
+
for (const { model, backend } of availableModels) {
|
|
29
|
+
// Get or infer capabilities
|
|
30
|
+
const capabilities = model.capabilities ?? inferCapabilities(model.id, model.metadata);
|
|
31
|
+
// Check hard requirements
|
|
32
|
+
const meetsHardRequirements = requirements.required
|
|
33
|
+
? meetsRequirements(capabilities, requirements.required)
|
|
34
|
+
: true;
|
|
35
|
+
// Score the model
|
|
36
|
+
const scored = scoreModel(model, backend, capabilities, requirements);
|
|
37
|
+
scored.meetsRequirements = meetsHardRequirements;
|
|
38
|
+
scoredModels.push(scored);
|
|
39
|
+
}
|
|
40
|
+
// Sort by score (descending), then by whether requirements are met
|
|
41
|
+
return scoredModels.sort((a, b) => {
|
|
42
|
+
// Prioritize models that meet requirements
|
|
43
|
+
if (a.meetsRequirements !== b.meetsRequirements) {
|
|
44
|
+
return a.meetsRequirements ? -1 : 1;
|
|
45
|
+
}
|
|
46
|
+
// Then by score
|
|
47
|
+
return b.score - a.score;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Score a single model based on requirements.
|
|
52
|
+
*/
|
|
53
|
+
function scoreModel(model, backend, capabilities, requirements) {
|
|
54
|
+
// Get scoring weights
|
|
55
|
+
const weights = requirements.weights ?? OPTIMIZATION_WEIGHTS[requirements.optimization ?? 'balanced'];
|
|
56
|
+
// Calculate individual scores
|
|
57
|
+
const costScore = scoreCost(capabilities, requirements.preferred);
|
|
58
|
+
const speedScore = scoreSpeed(capabilities, requirements.preferred);
|
|
59
|
+
const qualityScore = scoreQuality(capabilities, requirements.preferred);
|
|
60
|
+
// Calculate weighted total
|
|
61
|
+
const totalScore = Math.round(costScore * weights.cost + speedScore * weights.speed + qualityScore * weights.quality);
|
|
62
|
+
// Determine match reason
|
|
63
|
+
const matchReason = determineMatchReason({ costScore, speedScore, qualityScore }, weights, requirements.optimization ?? 'balanced');
|
|
64
|
+
return {
|
|
65
|
+
model,
|
|
66
|
+
backend,
|
|
67
|
+
score: totalScore,
|
|
68
|
+
breakdown: {
|
|
69
|
+
costScore,
|
|
70
|
+
speedScore,
|
|
71
|
+
qualityScore,
|
|
72
|
+
},
|
|
73
|
+
matchReason,
|
|
74
|
+
meetsRequirements: true, // Will be set correctly by matchModels
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Score cost (lower cost = higher score).
|
|
79
|
+
*/
|
|
80
|
+
function scoreCost(capabilities, preferred) {
|
|
81
|
+
if (!capabilities.pricing) {
|
|
82
|
+
return 50; // Neutral score if no pricing data
|
|
83
|
+
}
|
|
84
|
+
// Calculate average cost per 1k tokens (assuming 50/50 input/output ratio)
|
|
85
|
+
const avgCost = (capabilities.pricing.input + capabilities.pricing.output) / 2;
|
|
86
|
+
// If max cost specified, score based on how far below it is
|
|
87
|
+
if (preferred?.maxCostPer1kTokens) {
|
|
88
|
+
if (avgCost > preferred.maxCostPer1kTokens) {
|
|
89
|
+
return 0; // Exceeds max cost
|
|
90
|
+
}
|
|
91
|
+
// Score: 100 at free, 0 at maxCost
|
|
92
|
+
return Math.round(100 * (1 - avgCost / preferred.maxCostPer1kTokens));
|
|
93
|
+
}
|
|
94
|
+
// Otherwise, score based on absolute cost (cheaper = better)
|
|
95
|
+
// Assume $0.10/1k tokens is expensive (score=0), free is perfect (score=100)
|
|
96
|
+
const maxExpensiveCost = 0.1;
|
|
97
|
+
const score = Math.max(0, 100 * (1 - avgCost / maxExpensiveCost));
|
|
98
|
+
return Math.round(score);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Score speed (lower latency = higher score).
|
|
102
|
+
*/
|
|
103
|
+
function scoreSpeed(capabilities, preferred) {
|
|
104
|
+
const latency = capabilities.latency?.p95 ?? capabilities.latency?.p50;
|
|
105
|
+
if (!latency) {
|
|
106
|
+
return 50; // Neutral score if no latency data
|
|
107
|
+
}
|
|
108
|
+
// If max latency specified, score based on how far below it is
|
|
109
|
+
if (preferred?.maxLatencyMs) {
|
|
110
|
+
if (latency > preferred.maxLatencyMs) {
|
|
111
|
+
return 0; // Exceeds max latency
|
|
112
|
+
}
|
|
113
|
+
// Score: 100 at instant, 0 at maxLatency
|
|
114
|
+
return Math.round(100 * (1 - latency / preferred.maxLatencyMs));
|
|
115
|
+
}
|
|
116
|
+
// Otherwise, score based on absolute latency (faster = better)
|
|
117
|
+
// Assume 5000ms is slow (score=0), instant is perfect (score=100)
|
|
118
|
+
const maxSlowLatency = 5000;
|
|
119
|
+
const score = Math.max(0, 100 * (1 - latency / maxSlowLatency));
|
|
120
|
+
return Math.round(score);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Score quality (higher quality = higher score).
|
|
124
|
+
*/
|
|
125
|
+
function scoreQuality(capabilities, preferred) {
|
|
126
|
+
const quality = capabilities.qualityScore;
|
|
127
|
+
if (!quality) {
|
|
128
|
+
return 50; // Neutral score if no quality data
|
|
129
|
+
}
|
|
130
|
+
// If min quality specified, check threshold
|
|
131
|
+
if (preferred?.minQualityScore) {
|
|
132
|
+
if (quality < preferred.minQualityScore) {
|
|
133
|
+
return 0; // Below minimum quality
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Quality score is already 0-100, return as-is
|
|
137
|
+
return Math.round(quality);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Determine human-readable match reason.
|
|
141
|
+
*/
|
|
142
|
+
function determineMatchReason(breakdown, _weights, optimization) {
|
|
143
|
+
const { costScore, speedScore, qualityScore } = breakdown;
|
|
144
|
+
// Determine which metric is prioritized
|
|
145
|
+
if (optimization === 'cost') {
|
|
146
|
+
if (costScore >= 80) {
|
|
147
|
+
return 'Best cost efficiency';
|
|
148
|
+
}
|
|
149
|
+
if (costScore >= 60) {
|
|
150
|
+
return 'Good cost/quality balance';
|
|
151
|
+
}
|
|
152
|
+
return 'Meets cost requirements';
|
|
153
|
+
}
|
|
154
|
+
if (optimization === 'speed') {
|
|
155
|
+
if (speedScore >= 80) {
|
|
156
|
+
return 'Fastest response time';
|
|
157
|
+
}
|
|
158
|
+
if (speedScore >= 60) {
|
|
159
|
+
return 'Good speed/quality balance';
|
|
160
|
+
}
|
|
161
|
+
return 'Meets speed requirements';
|
|
162
|
+
}
|
|
163
|
+
if (optimization === 'quality') {
|
|
164
|
+
if (qualityScore >= 90) {
|
|
165
|
+
return 'Highest quality';
|
|
166
|
+
}
|
|
167
|
+
if (qualityScore >= 80) {
|
|
168
|
+
return 'Excellent quality';
|
|
169
|
+
}
|
|
170
|
+
return 'Good quality';
|
|
171
|
+
}
|
|
172
|
+
// Balanced strategy
|
|
173
|
+
const avgScore = (costScore + speedScore + qualityScore) / 3;
|
|
174
|
+
if (avgScore >= 80) {
|
|
175
|
+
return 'Best overall balance';
|
|
176
|
+
}
|
|
177
|
+
if (avgScore >= 60) {
|
|
178
|
+
return 'Good balance of cost/speed/quality';
|
|
179
|
+
}
|
|
180
|
+
return 'Meets requirements';
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Filter models by hard requirements only.
|
|
184
|
+
*/
|
|
185
|
+
export function filterByRequirements(availableModels, requirements) {
|
|
186
|
+
if (!requirements) {
|
|
187
|
+
return availableModels;
|
|
188
|
+
}
|
|
189
|
+
return availableModels.filter(({ model }) => {
|
|
190
|
+
const capabilities = model.capabilities ?? inferCapabilities(model.id, model.metadata);
|
|
191
|
+
return meetsRequirements(capabilities, requirements);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Find the best model match for requirements.
|
|
196
|
+
* Returns null if no models meet requirements.
|
|
197
|
+
*/
|
|
198
|
+
export function findBestModel(requirements, availableModels) {
|
|
199
|
+
const scored = matchModels(requirements, availableModels);
|
|
200
|
+
const best = scored.find((m) => m.meetsRequirements);
|
|
201
|
+
return best ?? null;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get top N model matches.
|
|
205
|
+
*/
|
|
206
|
+
export function getTopMatches(requirements, availableModels, count = 3) {
|
|
207
|
+
const scored = matchModels(requirements, availableModels);
|
|
208
|
+
return scored.filter((m) => m.meetsRequirements).slice(0, count);
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=capability-matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-matcher.js","sourceRoot":"","sources":["../../src/capability-matcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Components
|
|
3
|
+
*
|
|
4
|
+
* Export core bridge, router, and middleware stack.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
export * from './bridge.js';
|
|
9
|
+
export * from './router.js';
|
|
10
|
+
export * from './middleware-stack.js';
|
|
11
|
+
export * from './model-pricing.js';
|
|
12
|
+
export * from './capability-matcher.js';
|
|
13
|
+
export * from './capability-inference.js';
|
|
14
|
+
export * from './model-translation.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC"}
|