Opus 4.6 is the model you reach for when the answer matters and the question is hard. It's slower than Sonnet, costs more per token, and you should be deliberate about every call you make to it. But when the task is genuinely complex. multi-step reasoning, deep code analysis, legal interpretation, research synthesis. the capability difference is large enough to be the entire reason your feature works.
This article is the operational playbook.
What "Complex Reasoning" Actually Means
The class of tasks where Opus pulls meaningfully ahead of Sonnet share a common shape:
- Multiple constraints to balance. Not "summarise this", but "summarise this for a CFO audience, in 200 words, emphasising risk to next quarter, while staying neutral on management decisions."
- Reasoning over many distinct inputs. Reading 14 documents and producing a synthesis that respects all 14, not just the first or the last.
- Recognising what's not in the input. Spotting that a contract doesn't mention indemnification, that a code change is missing test coverage, that a customer complaint is hiding a billing issue.
- Building intermediate representations. Decomposing a problem before solving it, rather than reaching for the answer in one pass.
These are the tasks where Sonnet plateaus and Opus continues to deliver.
The Prompting Pattern: Decompose, Then Synthesise
The single highest-leverage prompting technique for Opus is explicitly asking for a decomposition step before the answer. Opus uses the decomposition as a working space, and the final answer is meaningfully better.
const response = await client.messages.create({
model: "claude-opus-4-6",
max_tokens: 4096,
messages: [
{
role: "user",
content: `Review this PR for production readiness.
<pull_request>
${prDiff}
</pull_request>
<context>
This is a payment processing service. The team's standards include:
- All money values in minor units (cents/paisa)
- Idempotency keys on every write endpoint
- No catch-all exception handlers
- Tests must cover the happy path and at least 2 error paths
</context>
First, work through the diff systematically:
1. List every behavioural change you can identify.
2. For each change, note any concerns against the team standards.
3. List any concerns *not* covered by the standards but that you'd raise as a senior reviewer.
Then produce your final review:
- Block / Request changes / Approve recommendation, with one-sentence reason
- Top 3 concerns (if any)
- Top 3 strengths`,
},
],
});
The decomposition isn't theatre. it's giving the model a workspace. Without it, Opus produces a competent surface-level review. With it, you get the kind of review a senior engineer would produce after careful reading.
This pattern is even more powerful with extended thinking enabled (next section).
Extended Thinking: Letting the Model Work Through Hard Problems
Opus 4.6 supports an extended thinking mode where the model produces reasoning content before its final answer. For genuinely complex problems, turning this on dramatically improves quality.
const response = await client.messages.create({
model: "claude-opus-4-6",
max_tokens: 8192,
thinking: {
type: "enabled",
budget_tokens: 8000,
},
messages: [
{ role: "user", content: complexProblem },
],
});
const thinkingBlock = response.content.find((c) => c.type === "thinking");
const textBlock = response.content.find((c) => c.type === "text");
The thinking block is the model's reasoning. You typically don't show it to users. but it's invaluable for debugging quality issues ("why did the model reach this conclusion?") and for high-stakes outputs where you want an audit trail.
When to enable extended thinking:
- Math, logic, and proof-style reasoning. Big quality win.
- Multi-document synthesis. Helps the model hold distinct sources in mind.
- Code architectural decisions. "Should we refactor X or Y?" benefits from explicit reasoning.
When not to enable it:
- Simple extraction or classification. Pure overhead.
- Latency-critical paths. Thinking adds tokens; tokens add seconds.
Long Context: The 200K Window Done Right
Opus 4.6's 200K-token context window is large but not infinite. Three rules for long-context work:
1. Place the most important content at the very end of the prompt. Recall is best for the last ~10K tokens. If you're feeding 150K tokens of context and asking a focused question, put the question last.
2. Use XML-style structure to keep distinct sources distinguishable.
<documents>
<document index="1" title="Q3 Earnings Report">
...
</document>
<document index="2" title="Risk Memo from Legal">
...
</document>
</documents>
<task>
Summarise the top 3 risks the executive team should focus on, citing
which document each risk is sourced from.
</task>
The structure helps the model attribute claims to sources and dramatically reduces hallucinated cross-references.
3. Ask the model to cite the section it's drawing from. "For each claim in your answer, quote the specific sentence from the source documents that supports it." This single instruction surfaces hallucinations early. they show up as citations to passages that don't quite say what the model claimed.
Tool Use for Multi-Step Tasks
When the task requires fetching information, computing intermediate values, or coordinating with external systems, give Opus tools and let it orchestrate.
const tools = [
{
name: "search_legal_database",
description: "Search internal legal precedent database",
input_schema: { /* ... */ },
},
{
name: "compute_settlement_estimate",
description: "Calculate estimated settlement value given case parameters",
input_schema: { /* ... */ },
},
{
name: "draft_response",
description: "Draft a written response with structured sections",
input_schema: { /* ... */ },
},
];
// Multi-turn loop
let messages = [{ role: "user", content: caseDescription }];
while (true) {
const response = await client.messages.create({
model: "claude-opus-4-6",
max_tokens: 4096,
tools,
messages,
});
if (response.stop_reason === "end_turn") break;
const toolUses = response.content.filter((c) => c.type === "tool_use");
const toolResults = await Promise.all(toolUses.map(executeToolCall));
messages = [
...messages,
{ role: "assistant", content: response.content },
{ role: "user", content: toolResults },
];
}
For agentic workflows, Opus's planning ability is what makes the difference between an agent that completes tasks and one that loops in confusion. It correctly sequences calls, recognises when it has enough information to answer, and recovers from tool errors.
Cost Discipline at the Top Tier
Opus is expensive. Three patterns prevent cost surprise:
- Limit Opus calls to a triage-decided subset. A Sonnet classifier decides which inputs deserve Opus. Most production systems route 10-20% of calls to Opus.
- Cap
max_tokensaggressively. Opus loves to write essays; constrain it. - Cache the system prompt and stable context. Even Opus benefits. the cache read price is the same fraction (~10% of input cost) regardless of model tier, so caching a 5K system prompt on Opus saves more dollars than caching the same prompt on Sonnet.
Where Opus 4.6 Still Disappoints
It's not magic. The places where Opus 4.6 still produces unsatisfying output:
- Domain-specific terminology not well represented in training data. Niche industries, very recent events, internal jargon. Provide examples and definitions inline.
- Strict numeric reasoning at scale. Opus handles arithmetic and basic logic well, but for high-stakes numerical work, generate code and execute it rather than asking the model to compute in its head.
- Strict format adherence under pressure. When asked to produce JSON in a specific shape and reason through a complex problem, the format sometimes slips. Use tool use for guaranteed schema compliance.
When to Step Up to 4.7
If your context routinely exceeds 200K tokens, or your task involves recall from very large inputs, Opus 4.7's 1M-token window is the upgrade. For everything else within 4.6's wheelhouse, 4.6 holds its own and is the more cost-effective choice.
The next article in this series covers Opus 4.7 specifically. the 1M context patterns and what changes when you no longer have to chunk.