Default build-session model to Opus 5 - #95
Conversation
Claude Opus 5 shipped and is Anthropic's recommended model for agentic coding, which is exactly what a build session is — so it gives the best build quality for SUS's non-technical users (and better first-shot success can reduce total iterations). Switch the default from the sonnet alias to opus across every place the default is resolved: buildPod.claudeModel (chart), the SUS_CLAUDE_MODEL env fallback in pods.py, and the CLAUDE_MODEL fallback in build-pod/entrypoint.sh. Uses the `opus` alias (not the pinned claude-opus-5) so it auto-tracks future Opus releases, matching the existing sonnet/haiku alias convention. Tradeoff documented in values.yaml and the README: Opus 5 costs ~2.5x more per token than Sonnet 5 ($5/$25 vs $2/$10 intro) and is a bit slower; operators who prefer lower cost / faster responses set buildPod.claudeModel=sonnet. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Claude finished @dev-dull's task in 3m 38s —— View job Review: default build-session model → Opus 5
The change is mechanically correct and complete. I verified the claim that "the default is Opus regardless of entry point" actually holds — a case-insensitive sweep for Verification performed
Findings1. Silent ~2.5× cost increase on 2. Hardcoded Notes
I could not verify the specific Nothing here blocks merge — both points are about operator-visibility rather than correctness. |
| # coding, i.e. the best build quality. It costs ~2.5x more per token than | ||
| # "sonnet" and is a bit slower; set claudeModel: sonnet to trade some build | ||
| # quality for lower cost and faster responses. | ||
| claudeModel: opus |
There was a problem hiding this comment.
Changing a default means every operator who runs helm upgrade without reading the diff gets a ~2.5× per-session cost increase with no signal. That's the one thing I'd want mitigated before merge.
SUS spins up a pod per session running claude --dangerously-skip-permissions for an interactive, long-lived session (ttyd stays connected, auto-commits every 5 min), and there's no token cap or per-session spend limit anywhere in the repo — so the downside per session is unbounded, while the "better first-shot success reduces total spend" argument is plausible but unmeasured. That asymmetry is a fine call to make deliberately; it just shouldn't be invisible.
templates/NOTES.txt already exists and already uses this exact pattern for auth (surfacing active config plus WARNING: lines). Surfacing the resolved model there costs two lines and makes the change visible at install/upgrade time:
Build sessions use Claude model: {{ .Values.buildPod.claudeModel }}
(set buildPod.claudeModel=sonnet for lower cost / faster responses)
Worth a note in the release notes too, since the cost delta lands on existing installs rather than new ones.
|
|
||
| See [`charts/sus/values.yaml`](charts/sus/values.yaml) for all Helm values. | ||
|
|
||
| **Build-session model:** the default is `opus` (Claude Opus 5) — Anthropic's recommended model for agentic coding, so the best build quality. It costs roughly **2.5× more per token** than `sonnet` and responds a bit slower. If you'd rather trade some build quality for lower cost and faster responses, set `--set buildPod.claudeModel=sonnet` (Claude Sonnet 5). Aliases track the latest model in each family; pass a full ID like `claude-opus-5` to pin a version. |
There was a problem hiding this comment.
The ~2.5× multiplier is now hardcoded in two places (here and charts/sus/values.yaml:42), and the PR description sources it from introductory pricing — which by definition changes. Derived numbers like this rot silently, and a stale cost ratio in the README is the kind of thing an operator makes a budget decision on.
Consider keeping the qualitative tradeoff (Opus costs more and is a bit slower) and linking to Anthropic's pricing page for the actual numbers, rather than restating a specific ratio in two files.
Note: I wasn't able to independently verify the $5/$25 vs $2/$10 figures in this environment (no network access granted for the pricing docs), so I'm flagging the durability of the claim rather than disputing its accuracy. The model IDs and aliases do check out — opus and claude-opus-5 are both valid, and using the alias to auto-track future releases is the right call for the stated goal.
Existing operators upgrading pick up the Opus 5 default (~2.5x per-token cost vs sonnet) with no signal. NOTES.txt already uses this pattern for auth; add a line showing the active model and the cost tradeoff when it's opus, with the sonnet escape hatch. Addresses PR #95 review finding 1. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Claude finished @dev-dull's task in 3m 45s —— View job Re-review: default build-session model → Opus 5
The new commit ( What changed since last review
Verification performed
I could not run Pricing — the PR's numbers check out, with an expiry dateLast round I couldn't reach the pricing docs. This run I could, and the figures in the PR body are correct: Opus 5 is $5/$25 per MTok, Sonnet 5 is $2/$10 — exactly 2.5×. The catch: Sonnet 5's $2/$10 is introductory pricing through Aug 31, 2026, rising to $3/$15 on Sept 1. Opus 5 is unchanged. So Findings (both non-blocking)
Notes
|
|
|
||
| See [`charts/sus/values.yaml`](charts/sus/values.yaml) for all Helm values. | ||
|
|
||
| **Build-session model:** the default is `opus` (Claude Opus 5) — Anthropic's recommended model for agentic coding, so the best build quality. It costs roughly **2.5× more per token** than `sonnet` and responds a bit slower. If you'd rather trade some build quality for lower cost and faster responses, set `--set buildPod.claudeModel=sonnet` (Claude Sonnet 5). Aliases track the latest model in each family; pass a full ID like `claude-opus-5` to pin a version. |
There was a problem hiding this comment.
I was able to reach Anthropic's pricing docs on this run, so I can put a number on the durability concern from the last round rather than just flagging it.
The ~2.5× figure is correct today and expires on a known date:
| input | output | |
|---|---|---|
| Claude Opus 5 | $5 / MTok | $25 / MTok |
| Claude Sonnet 5 — through Aug 31, 2026 | $2 / MTok | $10 / MTok |
| Claude Sonnet 5 — from Sep 1, 2026 | $3 / MTok | $15 / MTok |
So 2.5× holds for about another month, then becomes ~1.67× — the Sonnet 5 introductory window ends Sept 1, and Opus 5 pricing is unchanged. That number is now stated in three places (here, charts/sus/values.yaml:41, and charts/sus/templates/NOTES.txt:17), and the NOTES one is printed to operators on every install and upgrade, so a stale ratio there will be actively misleading rather than just wrong-in-a-doc.
Suggest dropping the specific multiplier and linking instead, so there's nothing to update on Sept 1:
| **Build-session model:** the default is `opus` (Claude Opus 5) — Anthropic's recommended model for agentic coding, so the best build quality. It costs roughly **2.5× more per token** than `sonnet` and responds a bit slower. If you'd rather trade some build quality for lower cost and faster responses, set `--set buildPod.claudeModel=sonnet` (Claude Sonnet 5). Aliases track the latest model in each family; pass a full ID like `claude-opus-5` to pin a version. | |
| **Build-session model:** the default is `opus` (Claude Opus 5) — Anthropic's recommended model for agentic coding, so the best build quality. It costs meaningfully more per token than `sonnet` and responds a bit slower; see [Anthropic's pricing](https://claude.com/pricing#api) for current rates. If you'd rather trade some build quality for lower cost and faster responses, set `--set buildPod.claudeModel=sonnet` (Claude Sonnet 5). Aliases track the latest model in each family; pass a full ID like `claude-opus-5` to pin a version. |
If you'd rather keep the concrete number (it is more persuasive than "meaningfully more"), that's a fine call — but then it's worth a note that it needs revisiting after Aug 31, 2026.
| Build sessions use the "{{ .Values.buildPod.claudeModel }}" Claude model. | ||
| {{- if eq .Values.buildPod.claudeModel "opus" }} | ||
| This is Claude Opus 5 — best build quality, but ~2.5x the per-token cost of | ||
| "sonnet" and a bit slower. Set --set buildPod.claudeModel=sonnet to lower cost. | ||
| {{- end }} |
There was a problem hiding this comment.
This addresses the visibility gap from the last round — NOTES is printed on helm upgrade as well as install, so upgrading operators now see the change. Good.
One gap in the guard: eq ... "opus" matches only the bare alias. Both this file and README.md:135 tell operators to pass a full ID like claude-opus-5 to pin a version — and I confirmed that path renders fine (--set buildPod.claudeModel=claude-opus-5 → SUS_CLAUDE_MODEL: "claude-opus-5"), but it silently skips the cost note. So the operator who was deliberate enough to pin Opus is the one who doesn't get told what Opus costs. Same for claude-opus-5[1m].
A substring check covers both spellings. The default "" keeps it safe if claudeModel is nil (a values override with a bare claudeModel: key yields nil, and contains on nil errors — eq tolerates it, so this is only needed once you switch to contains):
| Build sessions use the "{{ .Values.buildPod.claudeModel }}" Claude model. | |
| {{- if eq .Values.buildPod.claudeModel "opus" }} | |
| This is Claude Opus 5 — best build quality, but ~2.5x the per-token cost of | |
| "sonnet" and a bit slower. Set --set buildPod.claudeModel=sonnet to lower cost. | |
| {{- end }} | |
| Build sessions use the "{{ .Values.buildPod.claudeModel }}" Claude model. | |
| {{- if contains "opus" (default "" .Values.buildPod.claudeModel) }} | |
| This is Claude Opus — best build quality, but several times the per-token cost | |
| of "sonnet" and a bit slower. Set buildPod.claudeModel=sonnet to lower cost. | |
| {{- end }} |
Two smaller things folded into that suggestion:
- "Set --set buildPod.claudeModel=sonnet" reads as a stutter, and
--setis wrong for the operators who use a values file. BarebuildPod.claudeModel=sonnetworks for both audiences. - "This is Claude Opus 5" is asserted unconditionally, but the whole point of the alias is that it tracks future releases — the day Opus 6 ships under the
opusalias this line is wrong with no code change. Dropping the version number keeps it true. (Same reason I'd drop the2.5xhere — see the README comment; the Sonnet 5 introductory rate ends Aug 31, 2026, after which the real ratio is ~1.67×.)
Changes the default Claude model for build sessions from the
sonnetalias toopus(Claude Opus 5, which just shipped).Why
Claude Opus 5 is Anthropic's recommended model for agentic coding — which is precisely what a SUS build session is. For non-technical users, higher build quality and first-shot success means less frustrating back-and-forth (which can also reduce total token spend).
Tradeoff (documented)
Opus 5 costs ~2.5× more per token than Sonnet 5 ($5/$25 vs $2/$10 introductory) and responds a bit slower. Operators who prefer lower cost / faster responses can set
--set buildPod.claudeModel=sonnet. This is called out in bothvalues.yamland the README.What changed
Updated the default in every place it's resolved so "the default is Opus" holds regardless of entry point:
charts/sus/values.yaml→buildPod.claudeModel: opus(+ comment explaining the tradeoff)landing/app/pods.py→SUS_CLAUDE_MODELenv fallbackbuild-pod/entrypoint.sh→CLAUDE_MODELfallback + doc commentREADME.md→ config table row + a build-session-model noteUses the
opusalias (not the pinnedclaude-opus-5) so it auto-tracks future Opus releases, matching the existingsonnet/haikuconvention. A full ID likeclaude-opus-5can be set to pin a version.Verification
helm templaterendersSUS_CLAUDE_MODEL="opus";helm lintclean;pods.pycompiles. Model IDs/pricing verified against Anthropic's live model + pricing docs.🤖 Generated with Claude Code