Downshift

Which LLM calls are you overpaying for?

Downshift finds every LLM call site in a Python repo, writes evals for each one, tests cheaper models against the one you use today, and shows the cost impact of every pull request.

Downshift is the toolkit, IBM Bob is the brain.

Get startedGitHub ↗pip install downshift

Projected monthly cost · supportdesk

Before$3,137.26
After Downshift$2,572.61
Savings$564.65/mo · 18.0%

Dollar figures are projections: measured token counts x illustrative per-model prices x an assumed call volume, all set in downshift.yaml. They are not a real bill.

3 of 8
Call sites downgraded
each kept at least 95% of baseline quality
68.9%
Mean eval pass rate
68.3% before, +0.6 pts
181
Eval cases
graded by openai/gpt-oss-120b
8 of 8
Models resolved with Bob
static analysis alone: 6 of 7

01 · Results · supportdesk

Three of eight call sites can run on a smaller model

Call siteDecisionModelPass rateSavings/mo
extract_order_info
supportdesk/extract.py
downgradeqwen2.5:7b → qwen2.5:3b95.2% → 100.0%$282.04
lang_of
supportdesk/misc_utils.py
downgradeqwen2.5:7b → qwen2.5:1.5b90.9% → 90.9%$163.88
detect_sentiment
supportdesk/triage.py
downgradeqwen2.5:7b → qwen2.5:3b90.9% → 90.9%$118.73
draft_reply
supportdesk/agent_assist.py
keepqwen2.5:7b13.6%$0.00
summarize_for_agent
supportdesk/agent_assist.py
keepqwen2.5:7b59.1%$0.00
decide_refund
supportdesk/policy.py
keepqwen2.5:7b40.0%$0.00
classify_category
supportdesk/triage.py
keepqwen2.5:7b84.0%$0.00
tag_urgency
supportdesk/triage.py
keepqwen2.5:7b72.7%$0.00

02 · Static analysis vs Bob

Config-driven code blinds static analysis

The ast scanner found 7 call sites and resolved 6 of their models. It cannot see through shared helpers or config lookups.

The Bob auditor started from the scan, read only the unresolved and shared call sites, and returned 8 logical call sites with every model resolved. It split the shared llm.py::ask helper into the two features that use it and found the hidden model in lang_of.

See the full audit →

MetricastBobast after refactor
Call sites787
Models resolved680
Prompts resolved585
Enriched080
Found by Bob030
Split from helpers020

03 · CI guardrail

Every PR gets a cost diff

+$6,204.00/mo
Projected monthly increase
+84.5%
Percent increase
$7,339.50 to $13,543.50
Monthly cost, before and after

A demo PR added one new LLM call with a hard-coded 7B model and max_tokens 1024, run on every ticket. The Downshift Action commented the projected monthly increase and failed the check. Bob then reviewed the PR: route the call through models.yaml, cut max_tokens, and evaluate the 3B model first.

Set up the GitHub Action →