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 presents the forensic synthetic code analysis of Andyyyy64/whichllm, a Python project with 5,793 GitHub stars. SynthScan v2.0 examined 21,183 lines of code across 118 source files, recording 558 pattern matches distributed across 13 syntactic categories. The overall adjusted score of 28.7 places this repository in the Moderate AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 558 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| 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): | 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_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 |
| LOW | tests/test_ranker.py | 1040 | def test_benchmark_source_and_confidence_exposed_for_self_reported(): | CODE |
| LOW | tests/test_ranker.py | 1071 | def test_benchmark_source_and_confidence_exposed_for_none(): | CODE |
| LOW | tests/test_ranker.py | 1101 | def test_ctx_penalty_demotes_non_fitting(): | CODE |
| LOW | tests/test_p1_p3_regressions.py | 407 | def test_prequantized_repo_skips_synthesis(): | CODE |
| LOW | tests/test_p1_p3_regressions.py | 427 | def test_newer_generation_beats_older_at_same_size(): | CODE |
| 264 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_p1_p3_regressions.py | 18 | 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_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/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 | 24 | CODE | |
| LOW | src/whichllm/constants.py | 24 | CODE | |
| LOW | src/whichllm/constants.py | 24 | CODE | |
| LOW | src/whichllm/constants.py | 29 | CODE | |
| LOW | src/whichllm/constants.py | 29 | CODE | |
| LOW | src/whichllm/constants.py | 29 | CODE | |
| LOW | src/whichllm/cli.py | 3 | CODE | |
| LOW | src/whichllm/utils.py | 1 | CODE | |
| LOW | src/whichllm/hardware/detector.py | 3 | CODE | |
| LOW | src/whichllm/hardware/gpu_db.py | 27 | CODE | |
| LOW | src/whichllm/hardware/intel.py | 3 | CODE | |
| LOW | src/whichllm/hardware/nvidia.py | 3 | CODE | |
| LOW | src/whichllm/hardware/memory.py | 3 | CODE | |
| LOW | src/whichllm/hardware/cpu.py | 3 | CODE | |
| LOW | src/whichllm/hardware/gpu_simulator.py | 7 | CODE | |
| LOW | src/whichllm/hardware/types.py | 1 | CODE | |
| LOW | src/whichllm/hardware/windows.py | 3 | CODE | |
| LOW | src/whichllm/hardware/apple.py | 3 | CODE | |
| LOW | src/whichllm/hardware/amd.py | 3 | CODE | |
| LOW | src/whichllm/output/plan.py | 3 | CODE | |
| LOW | src/whichllm/output/formatting.py | 3 | CODE | |
| LOW | src/whichllm/output/display.py | 19 | CODE | |
| LOW | src/whichllm/output/display.py | 20 | CODE | |
| LOW | src/whichllm/output/display.py | 20 | CODE | |
| LOW | src/whichllm/output/display.py | 20 | CODE | |
| LOW | src/whichllm/output/display.py | 25 | CODE | |
| LOW | src/whichllm/output/display.py | 26 | CODE | |
| LOW | src/whichllm/output/display.py | 27 | CODE | |
| LOW | src/whichllm/output/display.py | 27 | CODE | |
| LOW | src/whichllm/output/display.py | 28 | CODE | |
| LOW | src/whichllm/output/upgrade.py | 3 | CODE | |
| LOW | src/whichllm/output/json_output.py | 3 | CODE | |
| LOW | src/whichllm/output/markdown.py | 3 | CODE | |
| LOW | src/whichllm/output/ranking.py | 3 | CODE | |
| LOW | src/whichllm/models/benchmark_lineage.py | 3 | CODE | |
| LOW | src/whichllm/models/gguf.py | 3 | CODE | |
| LOW | src/whichllm/models/sliding_window.py | 3 | CODE | |
| LOW | src/whichllm/models/benchmark_cache.py | 3 | CODE | |
| 87 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_aa_index.py | 32 | fragment inside ``self.__next_f.push([n, "..."])``.""" | STRING |
| HIGH⚡ | tests/test_aa_index.py | 44 | "<script>self.__next_f.push([0])</script>" | CODE |
| HIGH⚡ | tests/test_aa_index.py | 45 | 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 | 215 | # App Router streaming format: model data arrives in ``self.__next_f.push([n, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_asahi_detection.py | 151 | def _setup_asahi_sysfs(tmp_path: Path) -> None: | CODE |
| LOW | src/whichllm/constants.py | 35 | __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 | 15 | 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 | src/whichllm/models/benchmark_sources/aa_index.py | 27 | 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 |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/whichllm/cli.py | 635 | except Exception as e: | CODE |
| LOW⚡ | src/whichllm/cli.py | 649 | except Exception as e: | CODE |
| LOW | src/whichllm/cli.py | 715 | except Exception as e: | CODE |
| LOW | src/whichllm/cli.py | 790 | except Exception as e: | CODE |
| LOW | src/whichllm/cli.py | 876 | except Exception as e: | CODE |
| LOW | src/whichllm/cli.py | 888 | except Exception: | CODE |
| LOW | src/whichllm/cli.py | 965 | except Exception as e: | CODE |
| LOW | src/whichllm/hardware/gpu_db.py | 129 | except Exception as exc: # pragma: no cover - dbgpu is a hard dependency | CODE |
| LOW | src/whichllm/hardware/nvidia.py | 152 | except Exception: | CODE |
| LOW | src/whichllm/hardware/nvidia.py | 176 | except Exception as clock_err: | CODE |
| LOW | src/whichllm/hardware/nvidia.py | 191 | 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 | 259 | except Exception: | CODE |
| MEDIUM | src/whichllm/hardware/amd.py | 73 | def _detect_from_lspci() -> list[str]: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/whichllm/cli.py | 311 | CODE | |
| LOW | src/whichllm/cli.py | 457 | CODE | |
| LOW | src/whichllm/cli.py | 1239 | CODE | |
| LOW | src/whichllm/hardware/gpu_db.py | 179 | CODE | |
| LOW | src/whichllm/hardware/nvidia.py | 130 | 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 | 209 | CODE | |
| LOW | src/whichllm/output/ranking.py | 158 | 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 | 62 | CODE | |
| LOW | src/whichllm/engine/ranker.py | 61 | CODE | |
| LOW | src/whichllm/engine/ranker.py | 372 | CODE | |
| LOW | src/whichllm/engine/ranker.py | 474 | CODE | |
| LOW | src/whichllm/engine/ranker.py | 641 | CODE | |
| LOW | src/whichllm/engine/performance.py | 140 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/whichllm/cli.py | 612 | # Step 1: Detect hardware | COMMENT |
| LOW⚡ | src/whichllm/cli.py | 621 | # Step 2: Fetch models | COMMENT |
| LOW⚡ | src/whichllm/cli.py | 641 | # Step 3: Fetch benchmark scores | COMMENT |
| LOW⚡ | src/whichllm/cli.py | 653 | # Step 4: Group and rank | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/whichllm/cli.py | 612 | # Step 1: Detect hardware | COMMENT |
| LOW⚡ | src/whichllm/cli.py | 621 | # Step 2: Fetch models | COMMENT |
| LOW⚡ | src/whichllm/cli.py | 641 | # Step 3: Fetch benchmark scores | COMMENT |
| LOW⚡ | src/whichllm/cli.py | 653 | # Step 4: Group and rank | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/whichllm/models/benchmark_sources/aa_index.py | 101 | COMMENT | |
| LOW | src/whichllm/data/gpu.py | 261 | 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/ranker.py | 861 | ) | COMMENT |
| LOW | src/whichllm/engine/ranker.py | 881 | # (``results[:-5]``) and silently return a truncated, unrequested subset, | 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/cli.py | 720 | # Display results | COMMENT |
| LOW | src/whichllm/engine/ranker.py | 838 | # Check if this is better than existing | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/whichllm/engine/ranker.py | 75 | # MoE offload is more nuanced: inactive experts and router/runtime | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/whichllm/cli.py | 457 | CODE | |
| LOW | src/whichllm/engine/ranker.py | 641 | CODE |