Repository Analysis

Andyyyy64/whichllm

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.

28.7 Moderate AI signal View on GitHub

Analysis Overview

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).

28.7
Adjusted Score
28.7
Raw Score
100%
Time Factor
2026-07-08
Last Push
5.8K
Stars
Python
Language
21.2K
Lines of Code
118
Files
558
Pattern Hits
2026-07-14
Scan Date
0.05
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

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.

Severity Breakdown

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.

CRITICAL 0HIGH 6MEDIUM 3LOW 549

Directory Score Breakdown

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.

Pattern Findings

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.

Hyper-Verbose Identifiers324 hits · 338 pts
SeverityFileLineSnippetContext
LOWtests/test_utils.py10def test_cache_dir_defaults_to_dot_cache(monkeypatch):CODE
LOWtests/test_utils.py16def test_cache_dir_respects_xdg_cache_home(monkeypatch):CODE
LOWtests/test_utils.py22def test_cache_dir_falls_back_on_empty_xdg(monkeypatch):CODE
LOWtests/test_utils.py28def test_cache_dir_ignores_relative_xdg(monkeypatch):CODE
LOWtests/test_utils.py52def test_parse_fractional_suffix():CODE
LOWtests/test_utils.py57def test_parse_whitespace_is_stripped():CODE
LOWtests/test_utils.py61def test_parse_rejects_invalid_string():CODE
LOWtests/test_utils.py71def test_parse_rejects_negative():CODE
LOWtests/test_utils.py76def test_click_type_passes_int_through():CODE
LOWtests/test_utils.py80def test_click_type_parses_shorthand():CODE
LOWtests/test_output_formatting.py25def test_format_speed_colors_by_runtime_speed_not_confidence():CODE
LOWtests/test_gtx1650_variants.py32def test_variant_table_present_and_reexported():CODE
LOWtests/test_gtx1650_variants.py54def test_unknown_clock_falls_back_to_curated_default():CODE
LOWtests/test_gtx1650_variants.py68def test_non_variant_card_ignores_memory_clock():CODE
LOWtests/test_gtx1650_variants.py147def test_smi_na_clock_falls_back_to_curated(monkeypatch):CODE
LOWtests/test_gtx1650_variants.py166def test_smi_both_queries_fail_returns_empty(monkeypatch):CODE
LOWtests/test_compatibility.py73def test_usable_vram_budget_can_turn_full_gpu_into_partial_offload():CODE
LOWtests/test_compatibility.py86def test_ram_budget_limits_partial_offload_pool():CODE
LOWtests/test_compatibility.py98def test_ram_budget_caps_shared_memory_gpu_fit_pool():CODE
LOWtests/test_compatibility.py126def test_shared_memory_manual_vram_override_caps_available_gpu_memory():CODE
LOWtests/test_compatibility.py153def test_shared_memory_amd_apu_uses_system_memory_pool():CODE
LOWtests/test_compatibility.py182def test_windows_shared_memory_amd_apu_does_not_emit_rocm_warning():CODE
LOWtests/test_compatibility.py211def test_shared_memory_igpu_is_not_summed_with_dedicated_gpu():CODE
LOWtests/test_compatibility.py244def test_homogeneous_multi_gpu_uses_conservative_fit_budget():CODE
LOWtests/test_compatibility.py282def test_heterogeneous_multi_gpu_warns_about_split_assumptions():CODE
LOWtests/test_compatibility.py318def test_multiple_shared_memory_gpus_are_not_summed():CODE
LOWtests/test_compatibility.py352def test_apple_silicon_does_not_double_count_unified_memory():CODE
LOWtests/test_compatibility.py385def test_apple_silicon_full_gpu_fit():CODE
LOWtests/test_compatibility.py413def test_apple_silicon_vendor_guard_handles_legacy_shared_memory_false():CODE
LOWtests/test_compatibility.py461def test_low_compute_capability():CODE
LOWtests/test_compatibility.py479def test_context_fits_true_when_model_supports():CODE
LOWtests/test_compatibility.py487def test_context_fits_false_when_model_too_small():CODE
LOWtests/test_compatibility.py496def test_context_fits_unknown_is_true():CODE
LOWtests/test_ranker.py38def test_ranker_picks_highest_scoring_variant():CODE
LOWtests/test_ranker.py74def test_quant_filter_applies_to_non_gguf_models():CODE
LOWtests/test_ranker.py131def test_darwin_backend_filters_out_non_gguf_models():CODE
LOWtests/test_ranker.py163def test_cpu_only_backend_filters_out_non_gguf_models():CODE
LOWtests/test_ranker.py211def test_rank_models_clamps_non_positive_top_n():CODE
LOWtests/test_ranker.py232def test_popularity_has_no_effect_with_direct_benchmark():CODE
LOWtests/test_ranker.py277def test_general_profile_excludes_specialized_models():CODE
LOWtests/test_ranker.py323def test_require_direct_top_prioritizes_direct_benchmark():CODE
LOWtests/test_ranker.py371def test_min_params_filter_excludes_small_models():CODE
LOWtests/test_ranker.py418def test_general_profile_prefers_full_gpu_when_direct_is_partial():CODE
LOWtests/test_ranker.py454def test_family_dedup_prefers_direct_when_enabled():CODE
LOWtests/test_ranker.py494def test_full_gpu_estimated_ranks_above_partial_direct():CODE
LOWtests/test_ranker.py535def test_strong_partial_offload_not_buried_below_weaker_full_gpu():CODE
LOWtests/test_ranker.py638def test_moe_partial_offload_penalty_uses_active_working_set():CODE
LOWtests/test_ranker.py658def test_evidence_strict_filters_out_estimated_models():CODE
LOWtests/test_ranker.py706def test_evidence_base_keeps_base_model_match_and_drops_line_interp():CODE
LOWtests/test_ranker.py758def test_unknown_speed_heavy_partial_offload_does_not_top_rank():CODE
LOWtests/test_ranker.py827def test_fit_filter_full_gpu_excludes_partial_offload_and_cpu_only():CODE
LOWtests/test_ranker.py887def test_fit_filter_full_gpu_returns_empty_when_no_full_gpu_candidate():CODE
LOWtests/test_ranker.py916def test_multi_gpu_speed_confidence_is_low():CODE
LOWtests/test_ranker.py980def test_benchmark_source_and_confidence_exposed_for_direct():CODE
LOWtests/test_ranker.py1010def test_benchmark_source_and_confidence_exposed_for_estimated():CODE
LOWtests/test_ranker.py1040def test_benchmark_source_and_confidence_exposed_for_self_reported():CODE
LOWtests/test_ranker.py1071def test_benchmark_source_and_confidence_exposed_for_none():CODE
LOWtests/test_ranker.py1101def test_ctx_penalty_demotes_non_fitting():CODE
LOWtests/test_p1_p3_regressions.py407def test_prequantized_repo_skips_synthesis():CODE
LOWtests/test_p1_p3_regressions.py427def test_newer_generation_beats_older_at_same_size():CODE
264 more matches not shown…
Unused Imports147 hits · 140 pts
SeverityFileLineSnippetContext
LOWtests/test_p1_p3_regressions.py18CODE
LOWtests/test_intel_gpu.py3CODE
LOWtests/test_cache_encoding.py3CODE
LOWtests/test_asahi_detection.py3CODE
LOWtests/test_aa_index.py9CODE
LOWtests/test_windows_gpu.py3CODE
LOWtests/test_r3_regressions.py18CODE
LOWtests/test_amd_detection.py3CODE
LOWtests/test_windows_cpu_detection.py3CODE
LOWscripts/import_livebench_csv.py11CODE
LOWsrc/whichllm/constants.py8CODE
LOWsrc/whichllm/constants.py8CODE
LOWsrc/whichllm/constants.py8CODE
LOWsrc/whichllm/constants.py13CODE
LOWsrc/whichllm/constants.py13CODE
LOWsrc/whichllm/constants.py13CODE
LOWsrc/whichllm/constants.py13CODE
LOWsrc/whichllm/constants.py13CODE
LOWsrc/whichllm/constants.py13CODE
LOWsrc/whichllm/constants.py13CODE
LOWsrc/whichllm/constants.py13CODE
LOWsrc/whichllm/constants.py13CODE
LOWsrc/whichllm/constants.py24CODE
LOWsrc/whichllm/constants.py24CODE
LOWsrc/whichllm/constants.py24CODE
LOWsrc/whichllm/constants.py29CODE
LOWsrc/whichllm/constants.py29CODE
LOWsrc/whichllm/constants.py29CODE
LOWsrc/whichllm/cli.py3CODE
LOWsrc/whichllm/utils.py1CODE
LOWsrc/whichllm/hardware/detector.py3CODE
LOWsrc/whichllm/hardware/gpu_db.py27CODE
LOWsrc/whichllm/hardware/intel.py3CODE
LOWsrc/whichllm/hardware/nvidia.py3CODE
LOWsrc/whichllm/hardware/memory.py3CODE
LOWsrc/whichllm/hardware/cpu.py3CODE
LOWsrc/whichllm/hardware/gpu_simulator.py7CODE
LOWsrc/whichllm/hardware/types.py1CODE
LOWsrc/whichllm/hardware/windows.py3CODE
LOWsrc/whichllm/hardware/apple.py3CODE
LOWsrc/whichllm/hardware/amd.py3CODE
LOWsrc/whichllm/output/plan.py3CODE
LOWsrc/whichllm/output/formatting.py3CODE
LOWsrc/whichllm/output/display.py19CODE
LOWsrc/whichllm/output/display.py20CODE
LOWsrc/whichllm/output/display.py20CODE
LOWsrc/whichllm/output/display.py20CODE
LOWsrc/whichllm/output/display.py25CODE
LOWsrc/whichllm/output/display.py26CODE
LOWsrc/whichllm/output/display.py27CODE
LOWsrc/whichllm/output/display.py27CODE
LOWsrc/whichllm/output/display.py28CODE
LOWsrc/whichllm/output/upgrade.py3CODE
LOWsrc/whichllm/output/json_output.py3CODE
LOWsrc/whichllm/output/markdown.py3CODE
LOWsrc/whichllm/output/ranking.py3CODE
LOWsrc/whichllm/models/benchmark_lineage.py3CODE
LOWsrc/whichllm/models/gguf.py3CODE
LOWsrc/whichllm/models/sliding_window.py3CODE
LOWsrc/whichllm/models/benchmark_cache.py3CODE
87 more matches not shown…
Cross-Language Confusion5 hits · 30 pts
SeverityFileLineSnippetContext
HIGHtests/test_aa_index.py32 fragment inside ``self.__next_f.push([n, "..."])``."""STRING
HIGHtests/test_aa_index.py44 "<script>self.__next_f.push([0])</script>"CODE
HIGHtests/test_aa_index.py45 f"<script>self.__next_f.push([1,{chunk}])</script>"CODE
HIGHsrc/whichllm/hardware/windows.py112 "$dedicated = $null; "CODE
HIGHsrc/whichllm/models/benchmark_sources/aa_index.py215# App Router streaming format: model data arrives in ``self.__next_f.push([n,COMMENT
Modern Structural Boilerplate22 hits · 22 pts
SeverityFileLineSnippetContext
LOWtests/test_asahi_detection.py151def _setup_asahi_sysfs(tmp_path: Path) -> None:CODE
LOWsrc/whichllm/constants.py35__all__ = [CODE
LOWsrc/whichllm/hardware/detector.py17logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/hardware/gpu_db.py35logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/hardware/intel.py17logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/hardware/nvidia.py13logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/hardware/cpu.py11logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/hardware/gpu_simulator.py26logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/hardware/windows.py14logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/hardware/apple.py14logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/hardware/amd.py15logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/output/display.py30__all__ = [CODE
LOWsrc/whichllm/models/benchmark_cache.py11logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/models/benchmark.py65__all__ = [CODE
LOWsrc/whichllm/models/benchmark_fetch.py14logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/models/cache.py11logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/models/fetcher.py78__all__ = [CODE
LOWsrc/whichllm/models/hf.py15logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/models/benchmark_sources/aa_index.py27logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/models/benchmark_sources/vision.py25logger = logging.getLogger(__name__)CODE
LOWsrc/whichllm/models/benchmark_sources/__init__.py34__all__ = [CODE
LOWsrc/whichllm/models/benchmark_sources/aider.py22logger = logging.getLogger(__name__)CODE
Excessive Try-Catch Wrapping19 hits · 22 pts
SeverityFileLineSnippetContext
LOWsrc/whichllm/cli.py635 except Exception as e:CODE
LOWsrc/whichllm/cli.py649 except Exception as e:CODE
LOWsrc/whichllm/cli.py715 except Exception as e:CODE
LOWsrc/whichllm/cli.py790 except Exception as e:CODE
LOWsrc/whichllm/cli.py876 except Exception as e:CODE
LOWsrc/whichllm/cli.py888 except Exception:CODE
LOWsrc/whichllm/cli.py965 except Exception as e:CODE
LOWsrc/whichllm/hardware/gpu_db.py129 except Exception as exc: # pragma: no cover - dbgpu is a hard dependencyCODE
LOWsrc/whichllm/hardware/nvidia.py152 except Exception:CODE
LOWsrc/whichllm/hardware/nvidia.py176 except Exception as clock_err:CODE
LOWsrc/whichllm/hardware/nvidia.py191 except Exception:CODE
LOWsrc/whichllm/hardware/cpu.py129 except Exception as e:CODE
LOWsrc/whichllm/hardware/cpu.py149 except Exception:CODE
LOWsrc/whichllm/hardware/cpu.py185 except Exception:CODE
LOWsrc/whichllm/hardware/cpu.py202 except Exception:CODE
LOWsrc/whichllm/hardware/cpu.py212 except Exception:CODE
MEDIUMsrc/whichllm/hardware/cpu.py54def _cpu_name_from_wmic() -> str | None:CODE
LOWsrc/whichllm/hardware/amd.py259 except Exception:CODE
MEDIUMsrc/whichllm/hardware/amd.py73def _detect_from_lspci() -> list[str]:CODE
Deep Nesting21 hits · 20 pts
SeverityFileLineSnippetContext
LOWsrc/whichllm/cli.py311CODE
LOWsrc/whichllm/cli.py457CODE
LOWsrc/whichllm/cli.py1239CODE
LOWsrc/whichllm/hardware/gpu_db.py179CODE
LOWsrc/whichllm/hardware/nvidia.py130CODE
LOWsrc/whichllm/hardware/cpu.py14CODE
LOWsrc/whichllm/hardware/cpu.py100CODE
LOWsrc/whichllm/hardware/cpu.py134CODE
LOWsrc/whichllm/hardware/cpu.py171CODE
LOWsrc/whichllm/hardware/gpu_simulator.py208CODE
LOWsrc/whichllm/hardware/gpu_simulator.py256CODE
LOWsrc/whichllm/hardware/amd.py209CODE
LOWsrc/whichllm/output/ranking.py158CODE
LOWsrc/whichllm/models/benchmark_lineage.py26CODE
LOWsrc/whichllm/models/benchmark_lookup.py120CODE
LOWsrc/whichllm/models/grouper.py62CODE
LOWsrc/whichllm/engine/ranker.py61CODE
LOWsrc/whichllm/engine/ranker.py372CODE
LOWsrc/whichllm/engine/ranker.py474CODE
LOWsrc/whichllm/engine/ranker.py641CODE
LOWsrc/whichllm/engine/performance.py140CODE
Verbosity Indicators4 hits · 9 pts
SeverityFileLineSnippetContext
LOWsrc/whichllm/cli.py612 # Step 1: Detect hardwareCOMMENT
LOWsrc/whichllm/cli.py621 # Step 2: Fetch modelsCOMMENT
LOWsrc/whichllm/cli.py641 # Step 3: Fetch benchmark scoresCOMMENT
LOWsrc/whichllm/cli.py653 # Step 4: Group and rankCOMMENT
Structural Annotation Overuse4 hits · 9 pts
SeverityFileLineSnippetContext
LOWsrc/whichllm/cli.py612 # Step 1: Detect hardwareCOMMENT
LOWsrc/whichllm/cli.py621 # Step 2: Fetch modelsCOMMENT
LOWsrc/whichllm/cli.py641 # Step 3: Fetch benchmark scoresCOMMENT
LOWsrc/whichllm/cli.py653 # Step 4: Group and rankCOMMENT
Over-Commented Block6 hits · 6 pts
SeverityFileLineSnippetContext
LOWsrc/whichllm/models/benchmark_sources/aa_index.py101COMMENT
LOWsrc/whichllm/data/gpu.py261COMMENT
LOWsrc/whichllm/data/lineage.py1"""Model lineage / generation half-order used to bonus or penalize family versions."""COMMENT
LOWsrc/whichllm/engine/ranker.py861 )COMMENT
LOWsrc/whichllm/engine/ranker.py881 # (``results[:-5]``) and silently return a truncated, unrequested subset,COMMENT
LOWsrc/whichllm/engine/performance.py261COMMENT
Docstring Block Structure1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHsrc/whichllm/hardware/gpu_simulator.py257Create a synthetic GPUInfo from a GPU name. Looks up specs from the dbgpu database (2000+ GPUs). Args: STRING
Redundant / Tautological Comments2 hits · 3 pts
SeverityFileLineSnippetContext
LOWsrc/whichllm/cli.py720 # Display resultsCOMMENT
LOWsrc/whichllm/engine/ranker.py838 # Check if this is better than existingCOMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMsrc/whichllm/engine/ranker.py75 # MoE offload is more nuanced: inactive experts and router/runtimeCOMMENT
AI Structural Patterns2 hits · 2 pts
SeverityFileLineSnippetContext
LOWsrc/whichllm/cli.py457CODE
LOWsrc/whichllm/engine/ranker.py641CODE