Find the local LLM that actually runs and performs best on your hardware. Ranked by real, recency-aware benchmarks, not parameter count. One command, run it instantly.
This report summarizes scanner evidence for Andyyyy64/whichllm, a Python project with 6,745 GitHub stars. SynthScan examined 24,753 lines of code across 143 source files, recording 745 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 34.9 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 451 finding(s).
Are imports declared and package/API names verified? 221 finding(s).
Are wrappers, guards, and repeated structures necessary? 484 finding(s).
Which changes need focused human review? 745 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 745 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_utils.py | 10 | def test_cache_dir_defaults_to_dot_cache(monkeypatch): | CODE |
| LOW⚡ | tests/test_utils.py | 16 | def test_cache_dir_respects_xdg_cache_home(monkeypatch, tmp_path): | CODE |
| LOW⚡ | tests/test_utils.py | 22 | def test_cache_dir_falls_back_on_empty_xdg(monkeypatch): | CODE |
| LOW⚡ | tests/test_utils.py | 28 | def test_cache_dir_ignores_relative_xdg(monkeypatch): | CODE |
| LOW⚡ | tests/test_utils.py | 52 | def test_parse_fractional_suffix(): | CODE |
| LOW⚡ | tests/test_utils.py | 57 | def test_parse_whitespace_is_stripped(): | CODE |
| LOW⚡ | tests/test_utils.py | 61 | def test_parse_rejects_invalid_string(): | CODE |
| LOW⚡ | tests/test_utils.py | 71 | def test_parse_rejects_negative(): | CODE |
| LOW⚡ | tests/test_utils.py | 76 | def test_click_type_passes_int_through(): | CODE |
| LOW⚡ | tests/test_utils.py | 80 | def test_click_type_parses_shorthand(): | CODE |
| LOW | tests/test_output_formatting.py | 25 | def test_format_speed_colors_by_runtime_speed_not_confidence(): | CODE |
| LOW | tests/test_output_formatting.py | 35 | def test_display_ranking_includes_weights_column(): | CODE |
| LOW | tests/test_output_formatting.py | 182 | def test_display_ranking_weights_synthetic_and_missing_metadata(): | CODE |
| LOW | tests/test_output_formatting.py | 249 | def test_display_ranking_weights_exact_metadata_no_footnote(): | CODE |
| LOW | tests/test_output_formatting.py | 292 | def test_gguf_variants_preserve_estimated_flag(): | CODE |
| LOW | tests/test_output_formatting.py | 321 | def test_split_gguf_with_missing_size_is_estimated(): | CODE |
| LOW | tests/test_gtx1650_variants.py | 32 | def test_variant_table_present_and_reexported(): | CODE |
| LOW | tests/test_gtx1650_variants.py | 54 | def test_unknown_clock_falls_back_to_curated_default(): | CODE |
| LOW | tests/test_gtx1650_variants.py | 68 | def test_non_variant_card_ignores_memory_clock(): | CODE |
| LOW | tests/test_gtx1650_variants.py | 147 | def test_smi_na_clock_falls_back_to_curated(monkeypatch): | CODE |
| LOW | tests/test_gtx1650_variants.py | 166 | def test_smi_both_queries_fail_returns_empty(monkeypatch): | CODE |
| LOW | tests/test_compatibility.py | 73 | def test_usable_vram_budget_can_turn_full_gpu_into_partial_offload(): | CODE |
| LOW | tests/test_compatibility.py | 86 | def test_ram_budget_limits_partial_offload_pool(): | CODE |
| LOW | tests/test_compatibility.py | 98 | def test_ram_budget_caps_shared_memory_gpu_fit_pool(): | CODE |
| LOW | tests/test_compatibility.py | 126 | def test_shared_memory_manual_vram_override_caps_available_gpu_memory(): | CODE |
| LOW | tests/test_compatibility.py | 153 | def test_shared_memory_amd_apu_uses_system_memory_pool(): | CODE |
| LOW | tests/test_compatibility.py | 182 | def test_windows_shared_memory_amd_apu_does_not_emit_rocm_warning(): | CODE |
| LOW | tests/test_compatibility.py | 211 | def test_shared_memory_igpu_is_not_summed_with_dedicated_gpu(): | CODE |
| LOW | tests/test_compatibility.py | 244 | def test_homogeneous_multi_gpu_uses_conservative_fit_budget(): | CODE |
| LOW | tests/test_compatibility.py | 282 | def test_heterogeneous_multi_gpu_warns_about_split_assumptions(): | CODE |
| LOW | tests/test_compatibility.py | 318 | def test_multiple_shared_memory_gpus_are_not_summed(): | CODE |
| LOW | tests/test_compatibility.py | 352 | def test_apple_silicon_does_not_double_count_unified_memory(): | CODE |
| LOW | tests/test_compatibility.py | 385 | def test_apple_silicon_full_gpu_fit(): | CODE |
| LOW | tests/test_compatibility.py | 413 | def test_apple_silicon_vendor_guard_handles_legacy_shared_memory_false(): | CODE |
| LOW | tests/test_compatibility.py | 461 | def test_low_compute_capability(): | CODE |
| LOW⚡ | tests/test_compatibility.py | 479 | def test_context_fits_true_when_model_supports(): | CODE |
| LOW⚡ | tests/test_compatibility.py | 487 | def test_context_fits_false_when_model_too_small(): | CODE |
| LOW⚡ | tests/test_compatibility.py | 496 | def test_context_fits_unknown_is_true(): | CODE |
| LOW | tests/test_ranker.py | 38 | def test_ranker_picks_highest_scoring_variant(): | CODE |
| LOW | tests/test_ranker.py | 74 | def test_quant_filter_applies_to_non_gguf_models(): | CODE |
| LOW | tests/test_ranker.py | 131 | def test_darwin_backend_filters_out_non_gguf_models(): | CODE |
| LOW | tests/test_ranker.py | 163 | def test_cpu_only_backend_filters_out_non_gguf_models(): | CODE |
| LOW | tests/test_ranker.py | 211 | def test_rank_models_clamps_non_positive_top_n(): | CODE |
| LOW | tests/test_ranker.py | 232 | def test_popularity_has_no_effect_with_direct_benchmark(): | CODE |
| LOW | tests/test_ranker.py | 277 | def test_general_profile_excludes_specialized_models(): | CODE |
| LOW | tests/test_ranker.py | 323 | def test_require_direct_top_prioritizes_direct_benchmark(): | CODE |
| LOW | tests/test_ranker.py | 371 | def test_min_params_filter_excludes_small_models(): | CODE |
| LOW | tests/test_ranker.py | 418 | def test_general_profile_prefers_full_gpu_when_direct_is_partial(): | CODE |
| LOW | tests/test_ranker.py | 454 | def test_family_dedup_prefers_direct_when_enabled(): | CODE |
| LOW | tests/test_ranker.py | 494 | def test_full_gpu_estimated_ranks_above_partial_direct(): | CODE |
| LOW | tests/test_ranker.py | 535 | def test_strong_partial_offload_not_buried_below_weaker_full_gpu(): | CODE |
| LOW | tests/test_ranker.py | 638 | def test_moe_partial_offload_penalty_uses_active_working_set(): | CODE |
| LOW | tests/test_ranker.py | 658 | def test_evidence_strict_filters_out_estimated_models(): | CODE |
| LOW | tests/test_ranker.py | 706 | def test_evidence_base_keeps_base_model_match_and_drops_line_interp(): | CODE |
| LOW | tests/test_ranker.py | 758 | def test_unknown_speed_heavy_partial_offload_does_not_top_rank(): | CODE |
| LOW | tests/test_ranker.py | 827 | def test_fit_filter_full_gpu_excludes_partial_offload_and_cpu_only(): | CODE |
| LOW | tests/test_ranker.py | 887 | def test_fit_filter_full_gpu_returns_empty_when_no_full_gpu_candidate(): | CODE |
| LOW | tests/test_ranker.py | 916 | def test_multi_gpu_speed_confidence_is_low(): | CODE |
| LOW | tests/test_ranker.py | 980 | def test_benchmark_source_and_confidence_exposed_for_direct(): | CODE |
| LOW | tests/test_ranker.py | 1010 | def test_benchmark_source_and_confidence_exposed_for_estimated(): | CODE |
| 349 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_p1_p3_regressions.py | 18 | CODE | |
| LOW | tests/test_apple_detection.py | 3 | CODE | |
| LOW | tests/test_intel_gpu.py | 3 | CODE | |
| LOW | tests/test_cache_encoding.py | 3 | CODE | |
| LOW | tests/test_asahi_detection.py | 3 | CODE | |
| LOW | tests/test_aa_index.py | 9 | CODE | |
| LOW | tests/test_newer_qwen_coverage.py | 10 | CODE | |
| LOW | tests/test_windows_gpu.py | 3 | CODE | |
| LOW | tests/test_r3_regressions.py | 18 | CODE | |
| LOW | tests/test_amd_detection.py | 3 | CODE | |
| LOW | tests/test_windows_cpu_detection.py | 3 | CODE | |
| LOW | scripts/import_livebench_csv.py | 11 | CODE | |
| LOW | src/whichllm/cli_commands.py | 3 | CODE | |
| LOW | src/whichllm/cli_commands.py | 4 | CODE | |
| LOW | src/whichllm/cli_commands.py | 5 | CODE | |
| LOW | src/whichllm/cli_commands.py | 6 | CODE | |
| LOW | src/whichllm/cli_commands.py | 7 | CODE | |
| LOW | src/whichllm/cli_commands.py | 8 | CODE | |
| LOW | src/whichllm/cli_models.py | 3 | CODE | |
| LOW | src/whichllm/constants.py | 8 | CODE | |
| LOW | src/whichllm/constants.py | 8 | CODE | |
| LOW | src/whichllm/constants.py | 8 | CODE | |
| LOW | src/whichllm/constants.py | 13 | CODE | |
| LOW | src/whichllm/constants.py | 13 | CODE | |
| LOW | src/whichllm/constants.py | 13 | CODE | |
| LOW | src/whichllm/constants.py | 13 | CODE | |
| LOW | src/whichllm/constants.py | 13 | CODE | |
| LOW | src/whichllm/constants.py | 13 | CODE | |
| LOW | src/whichllm/constants.py | 13 | CODE | |
| LOW | src/whichllm/constants.py | 13 | CODE | |
| LOW | src/whichllm/constants.py | 13 | CODE | |
| LOW | src/whichllm/constants.py | 13 | CODE | |
| LOW | src/whichllm/constants.py | 25 | CODE | |
| LOW | src/whichllm/constants.py | 25 | CODE | |
| LOW | src/whichllm/constants.py | 25 | CODE | |
| LOW | src/whichllm/constants.py | 30 | CODE | |
| LOW | src/whichllm/constants.py | 30 | CODE | |
| LOW | src/whichllm/constants.py | 30 | CODE | |
| LOW | src/whichllm/cli_hardware.py | 3 | CODE | |
| LOW | src/whichllm/cli_shared.py | 3 | CODE | |
| LOW | src/whichllm/cli_options.py | 3 | CODE | |
| LOW | src/whichllm/cli.py | 13 | CODE | |
| LOW | src/whichllm/utils.py | 1 | CODE | |
| LOW | src/whichllm/cli_validation.py | 3 | CODE | |
| LOW | src/whichllm/cli_validation.py | 3 | CODE | |
| LOW | src/whichllm/cli_validation.py | 3 | CODE | |
| LOW | src/whichllm/cli_validation.py | 3 | CODE | |
| LOW | src/whichllm/cli_validation.py | 3 | CODE | |
| LOW | src/whichllm/cli_validation.py | 3 | CODE | |
| LOW | src/whichllm/cli_validation.py | 3 | CODE | |
| LOW | src/whichllm/cli_validation.py | 3 | CODE | |
| LOW | src/whichllm/cli_validation.py | 3 | CODE | |
| LOW | src/whichllm/cli_validation.py | 14 | CODE | |
| LOW | src/whichllm/cli_validation.py | 14 | CODE | |
| LOW | src/whichllm/cli_validation.py | 14 | CODE | |
| LOW | src/whichllm/cli_validation.py | 14 | CODE | |
| LOW | src/whichllm/cli_validation.py | 14 | CODE | |
| LOW | src/whichllm/cli_validation.py | 14 | CODE | |
| LOW | src/whichllm/cli_validation.py | 14 | CODE | |
| LOW | src/whichllm/cli_validation.py | 23 | CODE | |
| 156 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/whichllm/hardware/intel.py | 90 | except OSError: | CODE |
| HIGH | src/whichllm/hardware/intel.py | 97 | except OSError: | CODE |
| HIGH | src/whichllm/hardware/nvidia.py | 197 | except Exception: | CODE |
| HIGH | src/whichllm/hardware/cpu.py | 24 | except (FileNotFoundError, subprocess.TimeoutExpired): | CODE |
| HIGH | src/whichllm/hardware/cpu.py | 149 | except Exception: | CODE |
| HIGH | src/whichllm/hardware/cpu.py | 185 | except Exception: | CODE |
| HIGH | src/whichllm/hardware/cpu.py | 202 | except Exception: | CODE |
| HIGH | src/whichllm/hardware/cpu.py | 212 | except Exception: | CODE |
| HIGH | src/whichllm/hardware/gpu_simulator.py | 199 | except ImportError: | CODE |
| HIGH | src/whichllm/hardware/gpu_simulator.py | 172 | except KeyError: | CODE |
| HIGH | src/whichllm/hardware/gpu_simulator.py | 179 | except KeyError: | CODE |
| HIGH | src/whichllm/hardware/amd.py | 280 | except Exception: | CODE |
| HIGH | src/whichllm/hardware/amd.py | 161 | except OSError: | CODE |
| HIGH | src/whichllm/hardware/amd.py | 168 | except OSError: | CODE |
| HIGH | src/whichllm/hardware/amd.py | 302 | except (ValueError, TypeError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_asahi_detection.py | 151 | def _setup_asahi_sysfs(tmp_path: Path) -> None: | CODE |
| LOW | src/whichllm/cli_commands.py | 10 | __all__ = [ | CODE |
| LOW | src/whichllm/cli_models.py | 365 | __all__ = [ | CODE |
| LOW | src/whichllm/constants.py | 36 | __all__ = [ | CODE |
| LOW | src/whichllm/cli_shared.py | 44 | __all__ = ["_run_async", "_format_fetch_error", "_print_version", "console"] | CODE |
| LOW | src/whichllm/cli.py | 340 | __all__ = ["app", "main", "plan", "upgrade", "run", "snippet", "hardware"] | CODE |
| LOW | src/whichllm/cli_validation.py | 29 | __all__ = [ | CODE |
| LOW | src/whichllm/hardware/detector.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/hardware/gpu_db.py | 35 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/hardware/intel.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/hardware/nvidia.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/hardware/cpu.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/hardware/gpu_simulator.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/hardware/windows.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/hardware/apple.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/hardware/amd.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/output/display.py | 30 | __all__ = [ | CODE |
| LOW | src/whichllm/models/benchmark_cache.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/models/benchmark.py | 65 | __all__ = [ | CODE |
| LOW | src/whichllm/models/benchmark_fetch.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/models/cache.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/models/fetcher.py | 78 | __all__ = [ | CODE |
| LOW | src/whichllm/models/hf.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | …chllm/models/benchmark_sources/open_llm_leaderboard.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/models/benchmark_sources/aa_index.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/models/benchmark_sources/vision.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/models/benchmark_sources/__init__.py | 34 | __all__ = [ | CODE |
| LOW | src/whichllm/models/benchmark_sources/aider.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/whichllm/engine/ranking_filters.py | 216 | __all__ = [ | CODE |
| LOW | src/whichllm/engine/ranking_variants.py | 116 | __all__ = [ | CODE |
| LOW | src/whichllm/engine/ranking_sources.py | 55 | __all__ = [ | CODE |
| LOW | src/whichllm/engine/ranker.py | 48 | __all__ = [ | CODE |
| LOW | src/whichllm/engine/ranking_score.py | 254 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_aa_index.py | 35 | fragment inside ``self.__next_f.push([n, "..."])``.""" | STRING |
| HIGH⚡ | tests/test_aa_index.py | 47 | "<script>self.__next_f.push([0])</script>" | CODE |
| HIGH⚡ | tests/test_aa_index.py | 48 | f"<script>self.__next_f.push([1,{chunk}])</script>" | CODE |
| HIGH | src/whichllm/hardware/windows.py | 112 | "$dedicated = $null; " | CODE |
| HIGH | src/whichllm/models/benchmark_sources/aa_index.py | 246 | # App Router streaming format: model data arrives in ``self.__next_f.push([n, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/whichllm/cli_models.py | 41 | except Exception as e: | CODE |
| LOW | src/whichllm/cli_models.py | 323 | except Exception: | CODE |
| LOW | src/whichllm/cli_models.py | 332 | except Exception: | CODE |
| LOW | src/whichllm/hardware/gpu_db.py | 136 | except Exception as exc: # pragma: no cover - dbgpu is a hard dependency | CODE |
| LOW | src/whichllm/hardware/nvidia.py | 158 | except Exception: | CODE |
| LOW | src/whichllm/hardware/nvidia.py | 182 | except Exception as clock_err: | CODE |
| LOW | src/whichllm/hardware/nvidia.py | 197 | except Exception: | CODE |
| LOW | src/whichllm/hardware/cpu.py | 129 | except Exception as e: | CODE |
| LOW | src/whichllm/hardware/cpu.py | 149 | except Exception: | CODE |
| LOW | src/whichllm/hardware/cpu.py | 185 | except Exception: | CODE |
| LOW | src/whichllm/hardware/cpu.py | 202 | except Exception: | CODE |
| LOW | src/whichllm/hardware/cpu.py | 212 | except Exception: | CODE |
| MEDIUM | src/whichllm/hardware/cpu.py | 54 | def _cpu_name_from_wmic() -> str | None: | CODE |
| LOW | src/whichllm/hardware/amd.py | 280 | except Exception: | CODE |
| MEDIUM | src/whichllm/hardware/amd.py | 83 | def _detect_from_lspci() -> list[str]: | CODE |
| LOW | src/whichllm/commands/plan.py | 50 | except Exception as e: | CODE |
| LOW | src/whichllm/commands/plan.py | 63 | except Exception as e: | CODE |
| LOW | src/whichllm/commands/upgrade.py | 73 | except Exception as e: | CODE |
| LOW | src/whichllm/commands/upgrade.py | 85 | except Exception: | CODE |
| LOW⚡ | src/whichllm/commands/recommend.py | 127 | except Exception as e: | CODE |
| LOW⚡ | src/whichllm/commands/recommend.py | 141 | except Exception as e: | CODE |
| LOW | src/whichllm/commands/recommend.py | 219 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/whichllm/cli_hardware.py | 139 | CODE | |
| LOW | src/whichllm/hardware/gpu_db.py | 186 | CODE | |
| LOW | src/whichllm/hardware/nvidia.py | 136 | CODE | |
| LOW | src/whichllm/hardware/cpu.py | 14 | CODE | |
| LOW | src/whichllm/hardware/cpu.py | 100 | CODE | |
| LOW | src/whichllm/hardware/cpu.py | 134 | CODE | |
| LOW | src/whichllm/hardware/cpu.py | 171 | CODE | |
| LOW | src/whichllm/hardware/gpu_simulator.py | 208 | CODE | |
| LOW | src/whichllm/hardware/gpu_simulator.py | 256 | CODE | |
| LOW | src/whichllm/hardware/amd.py | 230 | CODE | |
| LOW | src/whichllm/output/ranking.py | 159 | CODE | |
| LOW | src/whichllm/models/benchmark_lineage.py | 26 | CODE | |
| LOW | src/whichllm/models/benchmark_lookup.py | 120 | CODE | |
| LOW | src/whichllm/models/grouper.py | 38 | CODE | |
| LOW | src/whichllm/commands/plan.py | 18 | CODE | |
| LOW | src/whichllm/commands/run.py | 27 | CODE | |
| LOW | src/whichllm/commands/recommend.py | 33 | CODE | |
| LOW | src/whichllm/engine/ranking_filters.py | 126 | CODE | |
| LOW | src/whichllm/engine/ranking.py | 29 | CODE | |
| LOW | src/whichllm/engine/performance.py | 140 | CODE | |
| LOW | src/whichllm/engine/ranking_score.py | 55 | CODE | |
| LOW | src/whichllm/engine/ranking_score.py | 98 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/whichllm/cli_hardware.py | 0 | cli validation, filtering, and hardware override helpers. | STRING |
| HIGH | src/whichllm/cli_options.py | 0 | cli validation, filtering, and hardware override helpers. | STRING |
| HIGH | src/whichllm/cli_metadata.py | 0 | cli validation, filtering, and hardware override helpers. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/whichllm/commands/recommend.py | 104 | # Step 1: Detect hardware | COMMENT |
| LOW⚡ | src/whichllm/commands/recommend.py | 113 | # Step 2: Fetch models | COMMENT |
| LOW⚡ | src/whichllm/commands/recommend.py | 133 | # Step 3: Fetch benchmark scores | COMMENT |
| LOW⚡ | src/whichllm/commands/recommend.py | 145 | # Step 4: Group and rank | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/whichllm/commands/recommend.py | 104 | # Step 1: Detect hardware | COMMENT |
| LOW⚡ | src/whichllm/commands/recommend.py | 113 | # Step 2: Fetch models | COMMENT |
| LOW⚡ | src/whichllm/commands/recommend.py | 133 | # Step 3: Fetch benchmark scores | COMMENT |
| LOW⚡ | src/whichllm/commands/recommend.py | 145 | # Step 4: Group and rank | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/whichllm/models/benchmark_sources/aa_index.py | 121 | # 2026-06-29 from artificialanalysis.ai against their reworked index, with the | COMMENT |
| LOW | src/whichllm/models/benchmark_sources/aa_index.py | 241 | COMMENT | |
| LOW | src/whichllm/data/gpu.py | 261 | "GTX 780": (3, 5), | COMMENT |
| LOW | src/whichllm/data/lineage.py | 1 | """Model lineage / generation half-order used to bonus or penalize family versions.""" | COMMENT |
| LOW | src/whichllm/engine/ranking.py | 261 | # CPU RAM from a 4GB GTX 1650) is not actually usable. Drop these | COMMENT |
| LOW | src/whichllm/engine/performance.py | 261 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/whichllm/hardware/gpu_simulator.py | 257 | Create a synthetic GPUInfo from a GPU name. Looks up specs from the dbgpu database (2000+ GPUs). Args: | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/whichllm/commands/recommend.py | 224 | # Display results | COMMENT |
| LOW | src/whichllm/engine/ranking.py | 226 | # Check if this is better than existing | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/whichllm/engine/ranking_score.py | 69 | # MoE offload is more nuanced: inactive experts and router/runtime | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/whichllm/cli.py | 40 | CODE | |
| LOW | src/whichllm/engine/ranking.py | 29 | CODE |