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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +135 -0
  3. package/build/cache.d.ts +3 -0
  4. package/build/cache.d.ts.map +1 -0
  5. package/build/cache.js +25 -0
  6. package/build/cache.js.map +1 -0
  7. package/build/cli.d.ts +3 -0
  8. package/build/cli.d.ts.map +1 -0
  9. package/build/cli.js +14 -0
  10. package/build/cli.js.map +1 -0
  11. package/build/data/quality.d.ts +6 -0
  12. package/build/data/quality.d.ts.map +1 -0
  13. package/build/data/quality.js +61 -0
  14. package/build/data/quality.js.map +1 -0
  15. package/build/providers/fal.d.ts +3 -0
  16. package/build/providers/fal.d.ts.map +1 -0
  17. package/build/providers/fal.js +155 -0
  18. package/build/providers/fal.js.map +1 -0
  19. package/build/providers/openrouter.d.ts +3 -0
  20. package/build/providers/openrouter.d.ts.map +1 -0
  21. package/build/providers/openrouter.js +78 -0
  22. package/build/providers/openrouter.js.map +1 -0
  23. package/build/providers/registry.d.ts +7 -0
  24. package/build/providers/registry.d.ts.map +1 -0
  25. package/build/providers/registry.js +23 -0
  26. package/build/providers/registry.js.map +1 -0
  27. package/build/server.d.ts +186 -0
  28. package/build/server.d.ts.map +1 -0
  29. package/build/server.js +164 -0
  30. package/build/server.js.map +1 -0
  31. package/build/server.test.d.ts +2 -0
  32. package/build/server.test.d.ts.map +1 -0
  33. package/build/server.test.js +256 -0
  34. package/build/server.test.js.map +1 -0
  35. package/build/tools/compare.d.ts +15 -0
  36. package/build/tools/compare.d.ts.map +1 -0
  37. package/build/tools/compare.js +61 -0
  38. package/build/tools/compare.js.map +1 -0
  39. package/build/tools/discover.d.ts +15 -0
  40. package/build/tools/discover.d.ts.map +1 -0
  41. package/build/tools/discover.js +68 -0
  42. package/build/tools/discover.js.map +1 -0
  43. package/build/tools/estimate.d.ts +15 -0
  44. package/build/tools/estimate.d.ts.map +1 -0
  45. package/build/tools/estimate.js +42 -0
  46. package/build/tools/estimate.js.map +1 -0
  47. package/build/tools/info.d.ts +15 -0
  48. package/build/tools/info.d.ts.map +1 -0
  49. package/build/tools/info.js +76 -0
  50. package/build/tools/info.js.map +1 -0
  51. package/build/tools/list.d.ts +8 -0
  52. package/build/tools/list.d.ts.map +1 -0
  53. package/build/tools/list.js +56 -0
  54. package/build/tools/list.js.map +1 -0
  55. package/build/tools/recommend.d.ts +15 -0
  56. package/build/tools/recommend.d.ts.map +1 -0
  57. package/build/tools/recommend.js +121 -0
  58. package/build/tools/recommend.js.map +1 -0
  59. package/build/types.d.ts +50 -0
  60. package/build/types.d.ts.map +1 -0
  61. package/build/types.js +3 -0
  62. package/build/types.js.map +1 -0
  63. 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,8 @@
1
+ import type { UnifiedModel } from "../types.js";
2
+ export declare function handleListModels(models: UnifiedModel[], args: Record<string, unknown>): {
3
+ content: {
4
+ type: "text";
5
+ text: string;
6
+ }[];
7
+ };
8
+ //# sourceMappingURL=list.d.ts.map
@@ -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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"}
@@ -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,3 @@
1
+ // ─── Categories ──────────────────────────────────────────────────────────────
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,gFAAgF"}