ai-model-advisor-mcp 1.0.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/README.md +135 -0
- package/build/cache.d.ts +3 -0
- package/build/cache.d.ts.map +1 -0
- package/build/cache.js +25 -0
- package/build/cache.js.map +1 -0
- package/build/cli.d.ts +3 -0
- package/build/cli.d.ts.map +1 -0
- package/build/cli.js +14 -0
- package/build/cli.js.map +1 -0
- package/build/data/quality.d.ts +6 -0
- package/build/data/quality.d.ts.map +1 -0
- package/build/data/quality.js +61 -0
- package/build/data/quality.js.map +1 -0
- package/build/providers/fal.d.ts +3 -0
- package/build/providers/fal.d.ts.map +1 -0
- package/build/providers/fal.js +155 -0
- package/build/providers/fal.js.map +1 -0
- package/build/providers/openrouter.d.ts +3 -0
- package/build/providers/openrouter.d.ts.map +1 -0
- package/build/providers/openrouter.js +78 -0
- package/build/providers/openrouter.js.map +1 -0
- package/build/providers/registry.d.ts +7 -0
- package/build/providers/registry.d.ts.map +1 -0
- package/build/providers/registry.js +23 -0
- package/build/providers/registry.js.map +1 -0
- package/build/server.d.ts +186 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +164 -0
- package/build/server.js.map +1 -0
- package/build/server.test.d.ts +2 -0
- package/build/server.test.d.ts.map +1 -0
- package/build/server.test.js +256 -0
- package/build/server.test.js.map +1 -0
- package/build/tools/compare.d.ts +15 -0
- package/build/tools/compare.d.ts.map +1 -0
- package/build/tools/compare.js +61 -0
- package/build/tools/compare.js.map +1 -0
- package/build/tools/discover.d.ts +15 -0
- package/build/tools/discover.d.ts.map +1 -0
- package/build/tools/discover.js +68 -0
- package/build/tools/discover.js.map +1 -0
- package/build/tools/estimate.d.ts +15 -0
- package/build/tools/estimate.d.ts.map +1 -0
- package/build/tools/estimate.js +42 -0
- package/build/tools/estimate.js.map +1 -0
- package/build/tools/info.d.ts +15 -0
- package/build/tools/info.d.ts.map +1 -0
- package/build/tools/info.js +76 -0
- package/build/tools/info.js.map +1 -0
- package/build/tools/list.d.ts +8 -0
- package/build/tools/list.d.ts.map +1 -0
- package/build/tools/list.js +56 -0
- package/build/tools/list.js.map +1 -0
- package/build/tools/recommend.d.ts +15 -0
- package/build/tools/recommend.d.ts.map +1 -0
- package/build/tools/recommend.js +121 -0
- package/build/tools/recommend.js.map +1 -0
- package/build/types.d.ts +50 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +3 -0
- package/build/types.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export function handleCompareModels(models, args) {
|
|
2
|
+
const modelIds = args.model_ids;
|
|
3
|
+
if (!Array.isArray(modelIds) || modelIds.length === 0) {
|
|
4
|
+
return {
|
|
5
|
+
content: [{ type: "text", text: "model_ids must be a non-empty array of model ID strings." }],
|
|
6
|
+
isError: true,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
const found = [];
|
|
10
|
+
const notFound = [];
|
|
11
|
+
for (const id of modelIds) {
|
|
12
|
+
const m = models.find((model) => model.id === id);
|
|
13
|
+
if (m)
|
|
14
|
+
found.push(m);
|
|
15
|
+
else
|
|
16
|
+
notFound.push(id);
|
|
17
|
+
}
|
|
18
|
+
if (found.length === 0) {
|
|
19
|
+
// Try fuzzy matching
|
|
20
|
+
const suggestions = modelIds.flatMap((id) => models
|
|
21
|
+
.filter((m) => m.id.toLowerCase().includes(id.toLowerCase()))
|
|
22
|
+
.slice(0, 3)
|
|
23
|
+
.map((m) => m.id));
|
|
24
|
+
let text = `None of the specified models were found: ${notFound.join(", ")}`;
|
|
25
|
+
if (suggestions.length > 0) {
|
|
26
|
+
text += `\n\nDid you mean one of these?\n ${[...new Set(suggestions)].join("\n ")}`;
|
|
27
|
+
}
|
|
28
|
+
return { content: [{ type: "text", text }], isError: true };
|
|
29
|
+
}
|
|
30
|
+
// Determine which columns to show based on model mix
|
|
31
|
+
const hasLLMs = found.some((m) => m.category === "llm");
|
|
32
|
+
const hasMedia = found.some((m) => m.category !== "llm");
|
|
33
|
+
let header;
|
|
34
|
+
let separator;
|
|
35
|
+
let rows;
|
|
36
|
+
if (hasLLMs && !hasMedia) {
|
|
37
|
+
// All LLMs: show capabilities
|
|
38
|
+
const capFlag = (m, cap) => m.capabilities.includes(cap) ? "✅" : "❌";
|
|
39
|
+
header = `| Model | Provider | Pricing | Context | Tools | Reasoning | Vision | Quality |`;
|
|
40
|
+
separator = `|-------|----------|---------|---------|-------|-----------|--------|---------|`;
|
|
41
|
+
rows = found.map((m) => `| ${m.id} | ${m.provider} | ${m.pricing.formatted} | ${m.contextLength?.toLocaleString() ?? "N/A"} | ${capFlag(m, "tool_use")} | ${capFlag(m, "reasoning")} | ${capFlag(m, "vision")} | ${m.qualityTier ?? "—"} |`);
|
|
42
|
+
}
|
|
43
|
+
else if (!hasLLMs && hasMedia) {
|
|
44
|
+
// All media: show media-specific cols
|
|
45
|
+
header = `| Model | Provider | Category | Pricing | Quality | License |`;
|
|
46
|
+
separator = `|-------|----------|----------|---------|---------|---------|`;
|
|
47
|
+
rows = found.map((m) => `| ${m.id} | ${m.provider} | ${m.category} | ${m.pricing.formatted} | ${m.qualityTier ?? "—"} | ${m.licenseType ?? "—"} |`);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Mixed: generic table
|
|
51
|
+
header = `| Model | Provider | Category | Pricing | Quality |`;
|
|
52
|
+
separator = `|-------|----------|----------|---------|---------|`;
|
|
53
|
+
rows = found.map((m) => `| ${m.id} | ${m.provider} | ${m.category} | ${m.pricing.formatted} | ${m.qualityTier ?? "—"} |`);
|
|
54
|
+
}
|
|
55
|
+
let text = `${header}\n${separator}\n${rows.join("\n")}`;
|
|
56
|
+
if (notFound.length > 0) {
|
|
57
|
+
text += `\n\n⚠️ Models not found: ${notFound.join(", ")}`;
|
|
58
|
+
}
|
|
59
|
+
return { content: [{ type: "text", text }] };
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=compare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/tools/compare.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { UnifiedModel } from "../types.js";
|
|
2
|
+
export declare function handleWhatsNew(models: UnifiedModel[], args: Record<string, unknown>): {
|
|
3
|
+
content: {
|
|
4
|
+
type: "text";
|
|
5
|
+
text: string;
|
|
6
|
+
}[];
|
|
7
|
+
isError: boolean;
|
|
8
|
+
} | {
|
|
9
|
+
content: {
|
|
10
|
+
type: "text";
|
|
11
|
+
text: string;
|
|
12
|
+
}[];
|
|
13
|
+
isError?: undefined;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=discover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/tools/discover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,aAAa,CAAC;AAE/D,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,EAAE,EACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;EAuE9B"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export function handleWhatsNew(models, args) {
|
|
2
|
+
const sinceStr = String(args.since ?? "7d");
|
|
3
|
+
const category = args.category;
|
|
4
|
+
const limit = Math.min(Math.max(Number(args.limit) || 20, 1), 100);
|
|
5
|
+
// Parse time window
|
|
6
|
+
const match = sinceStr.match(/^(\d+)(d|h|w)$/);
|
|
7
|
+
if (!match) {
|
|
8
|
+
return {
|
|
9
|
+
content: [{
|
|
10
|
+
type: "text",
|
|
11
|
+
text: `Invalid "since" format. Use "7d" (days), "24h" (hours), or "2w" (weeks).`,
|
|
12
|
+
}],
|
|
13
|
+
isError: true,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const amount = parseInt(match[1]);
|
|
17
|
+
const unit = match[2];
|
|
18
|
+
let msAgo;
|
|
19
|
+
switch (unit) {
|
|
20
|
+
case "h":
|
|
21
|
+
msAgo = amount * 60 * 60 * 1000;
|
|
22
|
+
break;
|
|
23
|
+
case "d":
|
|
24
|
+
msAgo = amount * 24 * 60 * 60 * 1000;
|
|
25
|
+
break;
|
|
26
|
+
case "w":
|
|
27
|
+
msAgo = amount * 7 * 24 * 60 * 60 * 1000;
|
|
28
|
+
break;
|
|
29
|
+
default: msAgo = 7 * 24 * 60 * 60 * 1000;
|
|
30
|
+
}
|
|
31
|
+
const cutoff = Date.now() - msAgo;
|
|
32
|
+
let recent = models.filter((m) => {
|
|
33
|
+
if (!m.addedDate)
|
|
34
|
+
return false;
|
|
35
|
+
return new Date(m.addedDate).getTime() >= cutoff;
|
|
36
|
+
});
|
|
37
|
+
if (category) {
|
|
38
|
+
recent = recent.filter((m) => m.category === category);
|
|
39
|
+
}
|
|
40
|
+
// Sort newest first
|
|
41
|
+
recent.sort((a, b) => {
|
|
42
|
+
const da = a.addedDate ? new Date(a.addedDate).getTime() : 0;
|
|
43
|
+
const db = b.addedDate ? new Date(b.addedDate).getTime() : 0;
|
|
44
|
+
return db - da;
|
|
45
|
+
});
|
|
46
|
+
const results = recent.slice(0, limit);
|
|
47
|
+
if (results.length === 0) {
|
|
48
|
+
return {
|
|
49
|
+
content: [{
|
|
50
|
+
type: "text",
|
|
51
|
+
text: `No new models found in the last ${sinceStr}${category ? ` for category "${category}"` : ""}. Try a wider window like "30d" or "4w".`,
|
|
52
|
+
}],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const tierBadge = (t) => (t ? ` [${t}]` : "");
|
|
56
|
+
const lines = [
|
|
57
|
+
`🆕 ${results.length} new models in the last ${sinceStr}${category ? ` (${category})` : ""}:`,
|
|
58
|
+
"",
|
|
59
|
+
...results.map((m, i) => {
|
|
60
|
+
const date = m.addedDate ? new Date(m.addedDate).toLocaleDateString() : "?";
|
|
61
|
+
return `${i + 1}. ${m.name} (${m.id})${tierBadge(m.qualityTier)}\n ${m.provider} | ${m.category} | ${m.pricing.formatted} | Added: ${date}`;
|
|
62
|
+
}),
|
|
63
|
+
];
|
|
64
|
+
return {
|
|
65
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/tools/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { UnifiedModel } from "../types.js";
|
|
2
|
+
export declare function handleEstimateCost(models: UnifiedModel[], args: Record<string, unknown>): {
|
|
3
|
+
content: {
|
|
4
|
+
type: "text";
|
|
5
|
+
text: string;
|
|
6
|
+
}[];
|
|
7
|
+
isError: boolean;
|
|
8
|
+
} | {
|
|
9
|
+
content: {
|
|
10
|
+
type: "text";
|
|
11
|
+
text: string;
|
|
12
|
+
}[];
|
|
13
|
+
isError?: undefined;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=estimate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estimate.d.ts","sourceRoot":"","sources":["../../src/tools/estimate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EAAE,EACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;EAwE9B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function handleEstimateCost(models, args) {
|
|
2
|
+
const modelId = String(args.model_id ?? "");
|
|
3
|
+
const model = models.find((m) => m.id === modelId);
|
|
4
|
+
if (!model) {
|
|
5
|
+
return {
|
|
6
|
+
content: [{ type: "text", text: `Model "${modelId}" not found.` }],
|
|
7
|
+
isError: true,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
const usage = args.usage ?? {};
|
|
11
|
+
const lines = [
|
|
12
|
+
`💰 Cost Estimate for **${model.name}** (${model.id})`,
|
|
13
|
+
`Provider: ${model.provider}`,
|
|
14
|
+
"",
|
|
15
|
+
];
|
|
16
|
+
let totalCost = 0;
|
|
17
|
+
if (model.category === "llm") {
|
|
18
|
+
// LLM cost estimation
|
|
19
|
+
const inputTokens = usage.input_tokens ?? usage.prompt_tokens ?? 0;
|
|
20
|
+
const outputTokens = usage.output_tokens ?? usage.completion_tokens ?? 0;
|
|
21
|
+
const requests = usage.requests ?? 1;
|
|
22
|
+
const inputCost = inputTokens * (model.pricing.inputPrice ?? 0);
|
|
23
|
+
const outputCost = outputTokens * (model.pricing.outputPrice ?? 0);
|
|
24
|
+
totalCost = (inputCost + outputCost) * requests;
|
|
25
|
+
lines.push(`## Usage`, `- Input tokens: ${inputTokens.toLocaleString()}`, `- Output tokens: ${outputTokens.toLocaleString()}`, `- Requests: ${requests.toLocaleString()}`, "", `## Cost Breakdown`, `- Input cost: $${(inputCost * requests).toFixed(6)}`, `- Output cost: $${(outputCost * requests).toFixed(6)}`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Media cost estimation (per-unit)
|
|
29
|
+
const units = usage.units ?? usage.images ?? usage.seconds ?? usage.requests ?? 1;
|
|
30
|
+
if (model.pricing.unitPrice < 0) {
|
|
31
|
+
lines.push(`⚠️ Pricing data unavailable. Set FAL_KEY for fal.ai pricing.`);
|
|
32
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
33
|
+
}
|
|
34
|
+
totalCost = units * model.pricing.unitPrice;
|
|
35
|
+
lines.push(`## Usage`, `- Units (${model.pricing.unit}): ${units.toLocaleString()}`, `- Unit price: $${model.pricing.unitPrice.toFixed(4)} / ${model.pricing.unit}`, "", `## Cost Breakdown`, `- Total: ${units} × $${model.pricing.unitPrice.toFixed(4)}`);
|
|
36
|
+
}
|
|
37
|
+
lines.push("", `## Total Estimated Cost`, `**$${totalCost.toFixed(4)}**`);
|
|
38
|
+
return {
|
|
39
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=estimate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estimate.js","sourceRoot":"","sources":["../../src/tools/estimate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { UnifiedModel } from "../types.js";
|
|
2
|
+
export declare function handleGetModelInfo(models: UnifiedModel[], args: Record<string, unknown>): {
|
|
3
|
+
content: {
|
|
4
|
+
type: "text";
|
|
5
|
+
text: string;
|
|
6
|
+
}[];
|
|
7
|
+
isError: boolean;
|
|
8
|
+
} | {
|
|
9
|
+
content: {
|
|
10
|
+
type: "text";
|
|
11
|
+
text: string;
|
|
12
|
+
}[];
|
|
13
|
+
isError?: undefined;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/tools/info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EAAE,EACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;EA6F9B"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export function handleGetModelInfo(models, args) {
|
|
2
|
+
const modelId = String(args.model_id ?? "");
|
|
3
|
+
const model = models.find((m) => m.id === modelId);
|
|
4
|
+
if (!model) {
|
|
5
|
+
const fuzzy = models
|
|
6
|
+
.filter((m) => m.id.toLowerCase().includes(modelId.toLowerCase()))
|
|
7
|
+
.slice(0, 8);
|
|
8
|
+
if (fuzzy.length > 0) {
|
|
9
|
+
const suggestions = fuzzy.map((m) => ` ${m.id} (${m.provider}, ${m.category})`).join("\n");
|
|
10
|
+
return {
|
|
11
|
+
content: [{
|
|
12
|
+
type: "text",
|
|
13
|
+
text: `Model "${modelId}" not found. Did you mean one of these?\n${suggestions}`,
|
|
14
|
+
}],
|
|
15
|
+
isError: true,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
content: [{ type: "text", text: `Model "${modelId}" not found.` }],
|
|
20
|
+
isError: true,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const lines = [
|
|
24
|
+
`# ${model.name}`,
|
|
25
|
+
`**ID:** ${model.id}`,
|
|
26
|
+
`**Provider:** ${model.provider}`,
|
|
27
|
+
`**Category:** ${model.category}`,
|
|
28
|
+
model.qualityTier ? `**Quality Tier:** ${model.qualityTier}` : "",
|
|
29
|
+
"",
|
|
30
|
+
];
|
|
31
|
+
if (model.description) {
|
|
32
|
+
lines.push(`## Description`, model.description, "");
|
|
33
|
+
}
|
|
34
|
+
// Pricing section
|
|
35
|
+
lines.push(`## Pricing`, `${model.pricing.formatted}`);
|
|
36
|
+
if (model.pricing.inputPrice !== undefined) {
|
|
37
|
+
const ip = model.pricing.inputPrice * 1_000_000;
|
|
38
|
+
const op = (model.pricing.outputPrice ?? 0) * 1_000_000;
|
|
39
|
+
lines.push(`- Input: $${ip.toFixed(2)} / 1M tokens`, `- Output: $${op.toFixed(2)} / 1M tokens`);
|
|
40
|
+
}
|
|
41
|
+
lines.push("");
|
|
42
|
+
// LLM-specific
|
|
43
|
+
if (model.category === "llm") {
|
|
44
|
+
lines.push(`## Model Details`);
|
|
45
|
+
if (model.contextLength) {
|
|
46
|
+
lines.push(`- Context Length: ${model.contextLength.toLocaleString()} tokens`);
|
|
47
|
+
}
|
|
48
|
+
if (model.maxOutputTokens) {
|
|
49
|
+
lines.push(`- Max Output: ${model.maxOutputTokens.toLocaleString()} tokens`);
|
|
50
|
+
}
|
|
51
|
+
lines.push("");
|
|
52
|
+
}
|
|
53
|
+
// Capabilities
|
|
54
|
+
if (model.capabilities.length > 0) {
|
|
55
|
+
lines.push(`## Capabilities`, ...model.capabilities.map((c) => `- ✅ ${c.replace(/_/g, " ")}`), "");
|
|
56
|
+
}
|
|
57
|
+
// Tags
|
|
58
|
+
if (model.tags && model.tags.length > 0) {
|
|
59
|
+
lines.push(`## Tags`, model.tags.join(", "), "");
|
|
60
|
+
}
|
|
61
|
+
// License
|
|
62
|
+
if (model.licenseType) {
|
|
63
|
+
lines.push(`**License:** ${model.licenseType}`);
|
|
64
|
+
}
|
|
65
|
+
// Added date
|
|
66
|
+
if (model.addedDate) {
|
|
67
|
+
lines.push(`**Added:** ${new Date(model.addedDate).toLocaleDateString()}`);
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
content: [{
|
|
71
|
+
type: "text",
|
|
72
|
+
text: lines.filter((l) => l !== undefined).join("\n"),
|
|
73
|
+
}],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/tools/info.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,aAAa,CAAC;AAE7E,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EAAE,EACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;EAuE9B"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export function handleListModels(models, args) {
|
|
2
|
+
const category = args.category;
|
|
3
|
+
const provider = args.provider;
|
|
4
|
+
const capability = args.capability;
|
|
5
|
+
const maxPrice = args.max_price;
|
|
6
|
+
const limit = Math.min(Math.max(Number(args.limit) || 25, 1), 100);
|
|
7
|
+
let filtered = [...models];
|
|
8
|
+
if (category) {
|
|
9
|
+
filtered = filtered.filter((m) => m.category === category);
|
|
10
|
+
}
|
|
11
|
+
if (provider) {
|
|
12
|
+
filtered = filtered.filter((m) => m.provider === provider);
|
|
13
|
+
}
|
|
14
|
+
if (capability) {
|
|
15
|
+
const cap = capability.toLowerCase();
|
|
16
|
+
filtered = filtered.filter((m) => m.capabilities.some((c) => c.toLowerCase().includes(cap)) ||
|
|
17
|
+
m.tags?.some((t) => t.toLowerCase().includes(cap)));
|
|
18
|
+
}
|
|
19
|
+
if (maxPrice !== undefined && maxPrice >= 0) {
|
|
20
|
+
filtered = filtered.filter((m) => m.pricing.unitPrice >= 0 && m.pricing.unitPrice <= maxPrice);
|
|
21
|
+
}
|
|
22
|
+
// Sort: quality tier first (S > A > B > C > unrated), then by price
|
|
23
|
+
const tierOrder = { S: 0, A: 1, B: 2, C: 3 };
|
|
24
|
+
filtered.sort((a, b) => {
|
|
25
|
+
const ta = a.qualityTier ? tierOrder[a.qualityTier] : 9;
|
|
26
|
+
const tb = b.qualityTier ? tierOrder[b.qualityTier] : 9;
|
|
27
|
+
if (ta !== tb)
|
|
28
|
+
return ta - tb;
|
|
29
|
+
return a.pricing.unitPrice - b.pricing.unitPrice;
|
|
30
|
+
});
|
|
31
|
+
const results = filtered.slice(0, limit);
|
|
32
|
+
if (results.length === 0) {
|
|
33
|
+
const filters = [
|
|
34
|
+
category && `category=${category}`,
|
|
35
|
+
provider && `provider=${provider}`,
|
|
36
|
+
capability && `capability=${capability}`,
|
|
37
|
+
maxPrice !== undefined && `max_price=${maxPrice}`,
|
|
38
|
+
].filter(Boolean);
|
|
39
|
+
return {
|
|
40
|
+
content: [{
|
|
41
|
+
type: "text",
|
|
42
|
+
text: `No models found matching filters: ${filters.join(", ")}.\n\nAvailable categories: llm, text-to-image, image-to-image, text-to-video, image-to-video, video-to-video, text-to-speech, speech-to-text, text-to-audio, image-to-3d, vision`,
|
|
43
|
+
}],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const tierBadge = (t) => (t ? `[${t}]` : "");
|
|
47
|
+
const lines = [
|
|
48
|
+
`Found ${filtered.length} models${results.length < filtered.length ? ` (showing top ${results.length})` : ""}:`,
|
|
49
|
+
"",
|
|
50
|
+
...results.map((m, i) => `${i + 1}. ${tierBadge(m.qualityTier)} ${m.id} (${m.provider})\n ${m.category} | ${m.pricing.formatted}`),
|
|
51
|
+
];
|
|
52
|
+
return {
|
|
53
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { UnifiedModel } from "../types.js";
|
|
2
|
+
export declare function handleRecommendModel(models: UnifiedModel[], args: Record<string, unknown>): {
|
|
3
|
+
content: {
|
|
4
|
+
type: "text";
|
|
5
|
+
text: string;
|
|
6
|
+
}[];
|
|
7
|
+
isError: boolean;
|
|
8
|
+
} | {
|
|
9
|
+
content: {
|
|
10
|
+
type: "text";
|
|
11
|
+
text: string;
|
|
12
|
+
}[];
|
|
13
|
+
isError?: undefined;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=recommend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../src/tools/recommend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,aAAa,CAAC;AAqE/D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EAAE,EACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;EAsE9B"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// ─── Category aliases for natural language matching ─────────────────────────
|
|
2
|
+
const CATEGORY_ALIASES = {
|
|
3
|
+
"image": ["text-to-image", "image-to-image"],
|
|
4
|
+
"image generation": ["text-to-image"],
|
|
5
|
+
"image gen": ["text-to-image"],
|
|
6
|
+
"img2img": ["image-to-image"],
|
|
7
|
+
"image editing": ["image-to-image"],
|
|
8
|
+
"video": ["text-to-video", "image-to-video", "video-to-video"],
|
|
9
|
+
"video generation": ["text-to-video"],
|
|
10
|
+
"video gen": ["text-to-video"],
|
|
11
|
+
"img2vid": ["image-to-video"],
|
|
12
|
+
"tts": ["text-to-speech"],
|
|
13
|
+
"speech": ["text-to-speech"],
|
|
14
|
+
"voice": ["text-to-speech"],
|
|
15
|
+
"stt": ["speech-to-text"],
|
|
16
|
+
"transcription": ["speech-to-text"],
|
|
17
|
+
"transcribe": ["speech-to-text"],
|
|
18
|
+
"audio": ["text-to-audio"],
|
|
19
|
+
"3d": ["image-to-3d"],
|
|
20
|
+
"llm": ["llm"],
|
|
21
|
+
"text": ["llm"],
|
|
22
|
+
"chat": ["llm"],
|
|
23
|
+
"code": ["llm"],
|
|
24
|
+
"coding": ["llm"],
|
|
25
|
+
"reasoning": ["llm"],
|
|
26
|
+
"embedding": ["embedding"],
|
|
27
|
+
"embeddings": ["embedding"],
|
|
28
|
+
"vision": ["vision"],
|
|
29
|
+
};
|
|
30
|
+
function resolveCategories(task) {
|
|
31
|
+
const lower = task.toLowerCase().trim();
|
|
32
|
+
// Direct category match
|
|
33
|
+
for (const [alias, cats] of Object.entries(CATEGORY_ALIASES)) {
|
|
34
|
+
if (lower.includes(alias))
|
|
35
|
+
return cats;
|
|
36
|
+
}
|
|
37
|
+
// Fallback: return all categories
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
function matchesRequirements(model, requirements) {
|
|
41
|
+
let score = 0;
|
|
42
|
+
const lower = requirements.map((r) => r.toLowerCase());
|
|
43
|
+
for (const req of lower) {
|
|
44
|
+
// Check capabilities
|
|
45
|
+
if (model.capabilities.some((c) => c.toLowerCase().includes(req)))
|
|
46
|
+
score += 2;
|
|
47
|
+
// Check tags
|
|
48
|
+
if (model.tags?.some((t) => t.toLowerCase().includes(req)))
|
|
49
|
+
score += 1;
|
|
50
|
+
// Check description
|
|
51
|
+
if (model.description.toLowerCase().includes(req))
|
|
52
|
+
score += 1;
|
|
53
|
+
// Check name
|
|
54
|
+
if (model.name.toLowerCase().includes(req))
|
|
55
|
+
score += 1;
|
|
56
|
+
}
|
|
57
|
+
// Quality tier bonus
|
|
58
|
+
if (model.qualityTier === "S")
|
|
59
|
+
score += 4;
|
|
60
|
+
else if (model.qualityTier === "A")
|
|
61
|
+
score += 3;
|
|
62
|
+
else if (model.qualityTier === "B")
|
|
63
|
+
score += 2;
|
|
64
|
+
else if (model.qualityTier === "C")
|
|
65
|
+
score += 1;
|
|
66
|
+
return score;
|
|
67
|
+
}
|
|
68
|
+
export function handleRecommendModel(models, args) {
|
|
69
|
+
const task = String(args.task ?? "");
|
|
70
|
+
const requirements = args.requirements ?? [];
|
|
71
|
+
const budget = String(args.budget ?? "").toLowerCase();
|
|
72
|
+
const limit = Math.min(Math.max(Number(args.limit) || 10, 1), 50);
|
|
73
|
+
if (!task) {
|
|
74
|
+
return {
|
|
75
|
+
content: [{ type: "text", text: "Please provide a `task` description (e.g. 'image generation', 'coding', 'transcription')." }],
|
|
76
|
+
isError: true,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// Filter by category
|
|
80
|
+
const categories = resolveCategories(task);
|
|
81
|
+
let candidates = categories.length > 0
|
|
82
|
+
? models.filter((m) => categories.includes(m.category))
|
|
83
|
+
: models.filter((m) => m.name.toLowerCase().includes(task.toLowerCase()) ||
|
|
84
|
+
m.description.toLowerCase().includes(task.toLowerCase()));
|
|
85
|
+
// Budget filter
|
|
86
|
+
if (budget === "free") {
|
|
87
|
+
candidates = candidates.filter((m) => m.pricing.unitPrice === 0);
|
|
88
|
+
}
|
|
89
|
+
else if (budget === "low") {
|
|
90
|
+
candidates = candidates.filter((m) => m.pricing.unitPrice >= 0);
|
|
91
|
+
candidates.sort((a, b) => a.pricing.unitPrice - b.pricing.unitPrice);
|
|
92
|
+
}
|
|
93
|
+
// Score and rank
|
|
94
|
+
const scored = candidates.map((m) => ({
|
|
95
|
+
model: m,
|
|
96
|
+
score: matchesRequirements(m, [task, ...requirements]),
|
|
97
|
+
}));
|
|
98
|
+
scored.sort((a, b) => b.score - a.score);
|
|
99
|
+
const results = scored.slice(0, limit);
|
|
100
|
+
if (results.length === 0) {
|
|
101
|
+
return {
|
|
102
|
+
content: [{
|
|
103
|
+
type: "text",
|
|
104
|
+
text: `No models found for task "${task}". Try broader terms like "image", "video", "llm", "tts", "stt", or "3d".`,
|
|
105
|
+
}],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const tierLabel = (t) => t ? ` [${t}-tier]` : "";
|
|
109
|
+
const lines = [
|
|
110
|
+
`🎯 Top ${results.length} models for "${task}"${requirements.length ? ` (${requirements.join(", ")})` : ""}:`,
|
|
111
|
+
"",
|
|
112
|
+
];
|
|
113
|
+
for (let i = 0; i < results.length; i++) {
|
|
114
|
+
const { model: m } = results[i];
|
|
115
|
+
lines.push(`${i + 1}. **${m.name}** (${m.id})${tierLabel(m.qualityTier)}`, ` Provider: ${m.provider} | Category: ${m.category}`, ` 💰 ${m.pricing.formatted}`, m.description ? ` ${m.description.slice(0, 150)}${m.description.length > 150 ? "..." : ""}` : "", "");
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
content: [{ type: "text", text: lines.filter(Boolean).join("\n") }],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=recommend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../src/tools/recommend.ts"],"names":[],"mappings":"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"}
|
package/build/types.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type ModelCategory = "llm" | "text-to-image" | "image-to-image" | "text-to-video" | "image-to-video" | "video-to-video" | "text-to-speech" | "speech-to-text" | "text-to-audio" | "image-to-3d" | "vision" | "embedding" | "other";
|
|
2
|
+
export type QualityTier = "S" | "A" | "B" | "C";
|
|
3
|
+
export type ProviderName = "openrouter" | "fal";
|
|
4
|
+
export interface UnifiedPricing {
|
|
5
|
+
/** The billing unit: "token", "image", "megapixel", "second", "request" */
|
|
6
|
+
unit: string;
|
|
7
|
+
/** Price per billing unit in USD */
|
|
8
|
+
unitPrice: number;
|
|
9
|
+
/** For LLMs: prompt/input cost per token */
|
|
10
|
+
inputPrice?: number;
|
|
11
|
+
/** For LLMs: completion/output cost per token */
|
|
12
|
+
outputPrice?: number;
|
|
13
|
+
/** Human-readable formatted price string */
|
|
14
|
+
formatted: string;
|
|
15
|
+
}
|
|
16
|
+
export interface UnifiedModel {
|
|
17
|
+
/** Provider-specific model ID (e.g. "openai/gpt-4o" or "fal-ai/flux-pro/v1.1") */
|
|
18
|
+
id: string;
|
|
19
|
+
/** Human-readable model name */
|
|
20
|
+
name: string;
|
|
21
|
+
/** Which provider this model comes from */
|
|
22
|
+
provider: ProviderName;
|
|
23
|
+
/** Model description — what it does, what it's good at */
|
|
24
|
+
description: string;
|
|
25
|
+
/** Category of the model */
|
|
26
|
+
category: ModelCategory;
|
|
27
|
+
/** Pricing information */
|
|
28
|
+
pricing: UnifiedPricing;
|
|
29
|
+
/** Free-form capability tags */
|
|
30
|
+
capabilities: string[];
|
|
31
|
+
/** Curated quality tier (S/A/B/C) — may be undefined for unrated models */
|
|
32
|
+
qualityTier?: QualityTier;
|
|
33
|
+
/** When the model was added/updated (ISO string) */
|
|
34
|
+
addedDate?: string;
|
|
35
|
+
/** Context window size in tokens */
|
|
36
|
+
contextLength?: number;
|
|
37
|
+
/** Maximum output/completion tokens */
|
|
38
|
+
maxOutputTokens?: number;
|
|
39
|
+
/** Supported output resolutions */
|
|
40
|
+
maxResolution?: string;
|
|
41
|
+
/** License type */
|
|
42
|
+
licenseType?: string;
|
|
43
|
+
/** Tags from the provider */
|
|
44
|
+
tags?: string[];
|
|
45
|
+
}
|
|
46
|
+
export interface ModelProvider {
|
|
47
|
+
name: ProviderName;
|
|
48
|
+
fetchModels(): Promise<UnifiedModel[]>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GACrB,KAAK,GACL,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,eAAe,GACf,aAAa,GACb,QAAQ,GACR,WAAW,GACX,OAAO,CAAC;AAEZ,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEhD,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,KAAK,CAAC;AAIhD,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,kFAAkF;IAClF,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,QAAQ,EAAE,YAAY,CAAC;IACvB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,QAAQ,EAAE,aAAa,CAAC;IACxB,0BAA0B;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,gCAAgC;IAChC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,mCAAmC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAID,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CACxC"}
|
package/build/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,gFAAgF"}
|