Skip to content

Offer the lighter model for a small change, right where you press send - #11

Open
debtn wants to merge 1 commit into
mainfrom
claude/lighter-model-nudge
Open

Offer the lighter model for a small change, right where you press send#11
debtn wants to merge 1 commit into
mainfrom
claude/lighter-model-nudge

Conversation

@debtn

@debtn debtn commented Sep 3, 2026

Copy link
Copy Markdown

"I don't need Opus to change the name of the title, but I will forget to switch the model, especially for these small things."

Self-contained: one commit, three files (one new). Independent of #8 and #10.

The problem is forgetting, not choosing

The model menu is the last thing on a person's mind mid-thought, and it stays wherever the last big change left it. So the heavy model ran every tiny edit, quietly, for everyone who never thought to look at the picker. Any fix has to arrive at the moment of forgetting — right before send — or it's just one more thing to remember.

Ways to nudge, considered

Approach What it is Why / why not
Suggest at send (shipped) Read the draft; on a small change on a heavy model, offer the lighter one for this message, one tap Meets people exactly where they forget. Keeps the decision theirs. Cheap to be wrong.
Auto-route small edits Send anything that looks small to Sonnet automatically, with a note Zero effort — but silently misclassifying a real feature request costs a bad build, and the code carries a note that a Sonnet-for-edits default was tried and moved back. Worth revisiting with data from this nudge: tap rate tells you whether people agree with the judgment.
Show the footprint per reply A quiet "~0.4 Wh · Opus 5" under each reply, using the existing energy module Honest and educational, but a rear-view mirror — it tells you after, when the ask was to catch you before. Good companion later.
Pin per change, not per project Picking a model pins it for the whole project today, which is exactly how a big-change Opus pick becomes every small edit's model Real cause of the problem, but a semantics change to the picker; deferred.
Model picks its own tier A cheap pre-pass classifies the ask, then routes Extra latency and a call per message to save a call; over-engineered for now.

What shipped

When a draft on a heavy model reads like a small change, one quiet line appears above the composer:

🌿 Small change? Sonnet 5 can do this for about two-fifths of the cost.   [Use Sonnet 5 for this one]   Keep Opus 5

  • A nudge, not a switch. The heavy model stays the default unless they tap. The one-shot ride never pins or moves the picker; the very next message runs on whatever it would have.
  • Armed, it says exactly what will happen — "This message runs on Sonnet 5 — the next one goes back to Opus 5" — with an undo.
  • "Keep Opus 5" hushes it for the sitting. In memory on purpose: a preference that quietly persisted forever would be the nudge you can never get back.
  • Never fires on a plan, a first build, the home composer, or a model that's already light.
  • Fable → Sonnet reads "about a fifth of the cost"; the fraction is derived, not hand-written.

The judgment is deliberately conservative

"Small" means the preview's own mechanical messages (Copy change…, Swap this photo…), or a short single ask that talks like a tweak (rename, color, typo, bigger, spacing…) and never names anything with shape (a page, a feature, login, calendar, search, "everything", "also"). A miss in either direction is cheap — a false small is a chip you ignore; a false big is no chip — which is what lets the heuristic stay simple instead of clever.

The cost fraction uses first-party output prices (Fable $50 · Opus $25 · Sonnet $10 · Haiku $5 per MTok) — the same proxy the Steward view prices with — rounded to a fraction a person can hold, never a percentage with false precision. Sonnet 5 is the one-tier step for everything heavier; Haiku's shorter output cap and the SEARCH/REPLACE edit format make it a worse bet for real edits.

Files

  • src/components/Chat/lighter-model.ts — new: the small-change judgment, the lighter-model choice, the cost fraction, the session hush
  • src/components/Chat/MessageInput.tsx — the chip; onSend gains an optional per-send { model }
  • src/components/Chat/ChatPanel.tsx — honors the one-shot model on the send path (after the community default logic, never on fix sends); the build log's gen_start records what actually ran

Verification

Driven in Chromium against the dev server, with every model request captured off the wire — 21 checks, zero page errors:

14 drafts judged as intended (6 small, 8 not)
chip appears on a small draft, gone on a big one
armed send goes out as claude-sonnet-5; picker stays Opus, unpinned
the next send goes back to claude-opus-5
undo returns to the offer; keep hushes the sitting; the send stays on Opus
no chip in plan mode, on a first build, or already on Sonnet
on Fable the fraction reads "a fifth"

tsc -b and vite build clean. eslint sits at the same three pre-existing MessageInput problems as an untouched tree — none in the new code.

What I'd do next, if this lands well

  1. Log the tap. One friction/build-log event for shown / used / kept gives real data on whether the judgment matches people — and that data is what would justify (or rule out) auto-routing.
  2. Footprint under each reply using src/lib/energy.ts, as the companion rear-view mirror.
  3. Pin scope. Reconsider whether a picker choice should pin for the project or for the next big change.

One thing noticed in passing, not touched: the community monitor's price table prices /sonnet/ at $3/$15, which is Sonnet 4.6's rate — Sonnet 5 is $2/$10. Since the regex also matches Sonnet 5, the Steward view overstates Sonnet spend by half. Separate fix, owner's call.

🤖 Generated with Claude Code

https://claude.ai/code/session_01RFnFvBZPsVQjc5Xwj7H9nZ


Generated by Claude Code

Nobody needs Opus to rename a title. Nobody remembers to switch the model
before a two-word change either — the model menu is the last thing on a
person's mind mid-thought, and it stays wherever the last big change left
it. So the heavy model ran every tiny edit, quietly, for everyone who never
thought to look at the picker.

The composer now notices. When a draft on a heavy model reads like a small
change — a rename, a color, a typo, the preview's own "Copy change" and
photo-swap messages — a quiet line appears above the composer: "Small
change? Sonnet 5 can do this for about two-fifths of the cost", with one
tap to use it for this message and one to keep what they have. It shows at
the moment people forget: right before send, reading the draft as they
type. It never fires on a plan, a first build, the home composer, or a
model that is already light.

It is a nudge, not a switch. The heavy model stays the default unless they
tap; the one-shot ride never pins or moves the picker, and the very next
message runs on whatever it would have. "Keep Opus 5" hushes it for the
rest of the sitting — in memory on purpose, so a preference can never
quietly persist forever. Armed, the chip becomes a plain statement of what
is about to happen, with an undo.

The judgment is deliberately conservative: the preview's mechanical
messages, or a short single ask that talks like a tweak and never names
anything with shape (a page, a feature, a login, a calendar, "everything").
A miss in either direction is cheap — a false small is a chip you ignore, a
false big is no chip — which is what lets it stay simple. The cost fraction
comes from first-party output prices (the proxy the Steward view already
prices with), rounded to a fraction a person can hold, never a percentage
with false precision.

Driven in Chromium against the dev server with model requests captured off
the wire: fourteen drafts judged as intended; the chip appears on a small
draft, disappears on a big one, and the armed send goes out as
claude-sonnet-5 while the picker stays on Opus, unpinned; the next send
goes back to claude-opus-5; undo returns to the offer and keep hushes the
sitting; no chip in plan mode, on a first build, or already on Sonnet; on
Fable the fraction reads "a fifth". Zero page errors. tsc -b and vite
build clean; lint at the same three pre-existing MessageInput problems,
none in the new code.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RFnFvBZPsVQjc5Xwj7H9nZ
@vercel

vercel Bot commented Sep 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
relational-builder Ready Ready Preview Sep 3, 2026 8:35pm UTC

Request Review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants