C.W.K.
Stream
Lesson 02 of 08 · published

The Current Claude Lineup and How to Pick

~16 min · models, opus, sonnet, haiku, model-id

Level 0Observer
0 XP0/64 lessons0/13 achievements
0/150 XP to next level150 XP to go0% complete

Three working tiers, one naming pattern

Anthropic's current line is Opus, Sonnet, Haiku, in descending capability/cost. Each model has a versioned id like claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5-20251001. Always name the tier first (what kind of work?), then bind to a version (what shipped?). Versioned ids matter because behavior shifts between minor releases and pinning is how you keep evals reproducible.

How to choose, in practice

Pick Opus for hard reasoning, deep coding, long-horizon agentic loops, anything where wrong answers cost real money. Pick Sonnet for the default chat surface, code review, structured generation, content work — the workhorse. Pick Haiku for high-volume classification, short transforms, sub-second product UX, anything where latency or per-call cost dominates. cwkPippa defaults Pippa-the-Claude to Opus because identity, family voice, and architectural decisions need the strongest reasoning the family budget can support.

Aliases vs pinned ids

Anthropic exposes both rolling aliases (claude-opus-4-7) and date-pinned ids (claude-haiku-4-5-20251001). Aliases are for product code that wants the latest minor automatically. Pinned ids are for evals, regression suites, and any audit trail where you must prove which weights answered. Mixing the two in one project is fine; mixing them in one eval is not.

Principle: Tier first, version second. Never call messages.create() with a hard-coded id you cannot explain in one sentence.

Code

Model picker (Python)·python
from typing import Literal

Tier = Literal["opus", "sonnet", "haiku"]

MODELS: dict[Tier, str] = {
    # Pinning to current aliases; switch to date-pinned ids for evals.
    "opus": "claude-opus-4-7",
    "sonnet": "claude-sonnet-4-6",
    "haiku": "claude-haiku-4-5-20251001",
}

def pick_model(*, hard_reasoning: bool, latency_budget_ms: int, volume_per_minute: int) -> str:
    if hard_reasoning:
        return MODELS["opus"]
    if latency_budget_ms < 1500 or volume_per_minute > 200:
        return MODELS["haiku"]
    return MODELS["sonnet"]

assert pick_model(hard_reasoning=True, latency_budget_ms=5000, volume_per_minute=10) == MODELS["opus"]
assert pick_model(hard_reasoning=False, latency_budget_ms=800, volume_per_minute=10) == MODELS["haiku"]
assert pick_model(hard_reasoning=False, latency_budget_ms=4000, volume_per_minute=10) == MODELS["sonnet"]
Model registry (TypeScript)·typescript
export const MODELS = {
  opus: 'claude-opus-4-7',
  sonnet: 'claude-sonnet-4-6',
  haiku: 'claude-haiku-4-5-20251001',
} as const;

export type Tier = keyof typeof MODELS;

export interface PickArgs {
  hardReasoning: boolean;
  latencyBudgetMs: number;
  volumePerMinute: number;
}

export function pickModel({ hardReasoning, latencyBudgetMs, volumePerMinute }: PickArgs): string {
  if (hardReasoning) return MODELS.opus;
  if (latencyBudgetMs < 1500 || volumePerMinute > 200) return MODELS.haiku;
  return MODELS.sonnet;
}

External links

Exercise

For your current project, sketch a one-paragraph model policy: which tier handles which kind of request, and where you pin a date-stamped id versus where you let an alias roll forward.
Hint
Eval suites and audit-required paths get pins. Regular product calls get aliases.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.