Skip to main content

Catch the LLM/AI calls you didn't need. A fast, deterministic linter that flags LLM API calls where plain code is simpler, cheaper, and more reliable.

Project description

overllm

Catch the LLM/AI calls you didn't need.

overllm is a small, fast linter with one job: find the places in your code where you call an AI model to do something plain code does better. You called GPT to parse a date. You called a model to extract JSON that json.loads already handles. You are paying latency, money, and nondeterminism for a regex.

It reads your code with Python's own ast module. No model runs, no network, no API key. Same code in, same result out. Fast enough for a pre-commit hook.

Everyone else lints the code the AI wrote. overllm catches where you are paying an AI to do what a library already does.

Install

pip install overllm

Use it

overllm .            # scan the current project
overllm src/         # scan a folder
overllm app.py       # scan one file

Example output:

app.py:42:5 llm-mechanical  LLM call asks the model to sort
    resp = client.chat.completions.create(model="gpt-4o", messages=[...])
    -> use sorted()

app.py:88:1 llm-in-loop  LLM call inside a loop: one API round-trip per iteration
    completion(model="gpt-4o", messages=[{"role": "user", "content": f"tag {x}"}])
    -> batch the inputs into a single call, cache repeated results, or use a function

2 needless LLM calls in 1 file.

overllm exits non-zero when it finds something, so it gates a commit or a CI check. Pass --exit-zero to report without failing.

Rules

Every rule fires only on a concrete code pattern, and every finding names the deterministic replacement. It stays silent when it is not sure.

Rule Fires when Suggests
static-prompt The user prompt is a compile-time constant, no variables. The input is fixed, so the call buys nothing. precompute or cache the result
llm-extraction The prompt asks the model to extract an email, URL, date, or number. a regex, datetime, or urllib.parse
llm-mechanical The prompt asks for a mechanical transform: sort, reverse, count, sum, deduplicate, change case, base64, arithmetic on literals. the one-line stdlib equivalent
llm-in-loop An LLM call runs once per loop iteration (real N calls, not streaming). batch, cache, or move it out of the loop
prompt-injection Untrusted input (a web request, CLI arg, or input()) flows straight into the prompt. keep it in a separate user message, validate it, constrain the model

It detects calls to the OpenAI, Anthropic, Google, Mistral, Cohere, Groq, LangChain, LiteLLM, and Ollama SDKs, and raw HTTP requests to those hosts.

Silence a false positive

resp = client.chat.completions.create(...)  # overllm: ignore
resp = client.chat.completions.create(...)  # overllm: ignore=llm-in-loop

Put # overllm: ignore-file at the top of a file to skip the whole file.

Configure

In pyproject.toml (Python 3.11+):

[tool.overllm]
ignore = ["llm-in-loop"]
exclude = ["examples/", "migrations/"]

Or on the command line: --select, --ignore, --exclude via config, --config PATH.

Pre-commit hook

In .pre-commit-config.yaml:

repos:
  - repo: https://github.com/theadamdanielsson/overllm
    rev: v0.1.1
    hooks:
      - id: overllm

GitHub Action

overllm ships an Action that scans a pull request and leaves one grounded comment. It stays silent when there is nothing to say.

name: overllm
on:
  pull_request:

permissions:
  contents: read
  pull-requests: write

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: theadamdanielsson/overllm@v1
        with:
          paths: "."

Other output formats

overllm --format json .      # machine-readable
overllm --format sarif .     # upload to GitHub code scanning
overllm --format markdown .  # the PR-comment body

Why not just use an AI code reviewer?

AI reviewers and AI-slop linters look at the code the model produced: comments, dead code, structure. None of them ask the question overllm asks, which is whether you needed the model at all. It is a different axis, and it is one plain static analysis can answer with high precision and zero cost.

License

MIT © Adam Danielsson

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

overllm-0.1.1.tar.gz (21.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

overllm-0.1.1-py3-none-any.whl (18.8 kB view details)

Uploaded Python 3

File details

Details for the file overllm-0.1.1.tar.gz.

File metadata

  • Download URL: overllm-0.1.1.tar.gz
  • Upload date:
  • Size: 21.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for overllm-0.1.1.tar.gz
Algorithm Hash digest
SHA256 6c3d7a12f749192c84897409d52b1433767e310e51d21b556ddabda829f68b06
MD5 1f5b05b8193a49b3f76b6f7fa748ca9e
BLAKE2b-256 a4c38d13e5e70b8ac5b37b9ef9ca32c59bce45bd1f1dade535df25d99825f296

See more details on using hashes here.

Provenance

The following attestation bundles were made for overllm-0.1.1.tar.gz:

Publisher: publish.yml on theadamdanielsson/overllm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file overllm-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: overllm-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 18.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for overllm-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 023af0cd03b49bfd9139523a7fe55e0ef1edc39bc6139d0f85e0c63ae21c18ae
MD5 c59cd3c7957f1820430464490ddb9bdd
BLAKE2b-256 27f5cc6bbc49e25ac0218d452df2438f4ce4f747b810299f1f406da575cd339c

See more details on using hashes here.

Provenance

The following attestation bundles were made for overllm-0.1.1-py3-none-any.whl:

Publisher: publish.yml on theadamdanielsson/overllm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page