llm-checker 3.2.7 → 3.2.8

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/README.md CHANGED
@@ -97,6 +97,12 @@ LLM Checker is published in all primary channels:
97
97
  - GitHub Releases: [Release history](https://github.com/Pavelevich/llm-checker/releases)
98
98
  - GitHub Packages: [`@pavelevich/llm-checker`](https://github.com/users/Pavelevich/packages/npm/package/llm-checker)
99
99
 
100
+ ### v3.2.8 Highlights
101
+
102
+ - Fixed multimodal recommendation false positives from noisy metadata.
103
+ - Coding-only models with incidental `input_types: image` flags are no longer treated as vision models.
104
+ - Added regression tests to keep multimodal category picks aligned with true vision-capable models.
105
+
100
106
  ### v3.2.7 Highlights
101
107
 
102
108
  - License updated to **NPDL-1.0**: paid redistribution and paid hosted/API delivery now require a separate commercial license.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "llm-checker",
3
- "version": "3.2.7",
3
+ "version": "3.2.8",
4
4
  "description": "Intelligent CLI tool with AI-powered model selection that analyzes your hardware and recommends optimal LLM models for your system",
5
5
  "bin": {
6
6
  "llm-checker": "bin/cli.js",
@@ -1042,6 +1042,9 @@ class DeterministicModelSelector {
1042
1042
 
1043
1043
  inferModalities(model, variantTag = '') {
1044
1044
  const inputTypes = Array.isArray(model.input_types) ? model.input_types.map((x) => String(x).toLowerCase()) : [];
1045
+ const primaryCategory = String(model.primary_category || '').toLowerCase();
1046
+ const categories = Array.isArray(model.categories) ? model.categories.map((x) => String(x).toLowerCase()) : [];
1047
+ const useCases = Array.isArray(model.use_cases) ? model.use_cases.map((x) => String(x).toLowerCase()) : [];
1045
1048
  const text = [
1046
1049
  model.model_identifier,
1047
1050
  model.model_name,
@@ -1050,9 +1053,19 @@ class DeterministicModelSelector {
1050
1053
  variantTag
1051
1054
  ].filter(Boolean).join(' ').toLowerCase();
1052
1055
 
1053
- const hasVision = inputTypes.includes('image') ||
1054
- inputTypes.includes('vision') ||
1055
- /vision|vl\b|llava|pixtral|moondream|image|multimodal/.test(text);
1056
+ const hasVisionInputFlag = inputTypes.includes('image') || inputTypes.includes('vision');
1057
+ const hasVisionMetadataHint =
1058
+ primaryCategory === 'multimodal' ||
1059
+ categories.some((cat) => cat.includes('multimodal') || cat.includes('vision')) ||
1060
+ useCases.some((useCase) => useCase.includes('multimodal') || useCase.includes('vision'));
1061
+ const hasVisionTextHint =
1062
+ /(?:\bmultimodal\b|\bvision\b|\bllava\b|\bbakllava\b|\bmoondream\b|\bpixtral\b|\bidefics\b|\bpaligemma\b|\bminicpm-?v\b|\bqwen[\w.-]*vl\b|\bllama3\.2[-_ ]?vision\b|\bdeepseek-ocr\b)/.test(text);
1063
+ const hasVisionContextHint =
1064
+ /\b(image[- ]?(understanding|caption|analysis)|vision[- ]?language|vlm)\b/.test(text);
1065
+
1066
+ // Some upstream scrapers may over-report `image` support by scanning generic page text.
1067
+ // Trust image input flags only when accompanied by multimodal metadata or explicit vision naming.
1068
+ const hasVision = hasVisionTextHint || hasVisionMetadataHint || (hasVisionInputFlag && hasVisionContextHint);
1056
1069
 
1057
1070
  return hasVision ? ['text', 'vision'] : ['text'];
1058
1071
  }