32
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude CodeのEffort、実は4段階ある ― "max" の使い方とソースコード調査

32
Last updated at Posted at 2026-03-09

はじめに

こんにちは。スタディング開発担当の山本です。最近の悩みはAIによるコードレビューの壁打ちが終わらないことです。

さて、Claude Code(Anthropic公式CLI)には、モデルの推論深度を制御する effortLevel という設定があります。Claude Codeのドキュメントには low / medium / high の3段階と記載されていますが、Claude APIリファレンスには4段階目の "max" が正式に記載されています

ところがClaude CodeのUIやドキュメントからは "max" にアクセスできません。この乖離が気になり、ソースコード(v2.1.66)を読み解いて内部挙動を調査しました。

なお、この記事自体も Claude Code(Opus 4.6、effortLevel: "max")を使ってソースコード調査・ドキュメント検証・記事の構成と執筆を行っています。調査対象のツールで調査記事を書くという、少し再帰的な作業です。

Effortパラメータとは

モデルの思考の深さとトークン消費量のトレードオフを制御するパラメータです。Claude APIのEffortドキュメントでは以下の4段階が定義されています。

レベル 説明
low 最も効率的。速度・コスト重視
medium バランス型
high デフォルト。高い推論能力
max 最大の推論深度。Opus 4.6 専用

ドキュメント間の乖離

調査のきっかけは、Claude APIとClaude Codeで "max" の扱いが異なることでした。

"max" の記載状況

ドキュメント "max" の記載
Claude API - Effort ✅ 記載あり。Opus 4.6 専用と明記
Claude API - Messages output_config.effort"max" を含む4値を記載
Claude Code - Model configuration low / medium / high の3値のみ
Claude Code - Settings low / medium / high の3値のみ
Claude Code /model ピッカー low / medium / high の3値のみ

APIリファレンスでは正式な機能なのに、Claude Code側のドキュメントやUIには出てこない状態です。

Claude APIのEffortドキュメント — 4段階(low / medium / high / max)が定義されている

出典: Claude API Docs - Effort(Anthropic)

Claude CodeのModel configuration — 3段階(low / medium / high)のみ記載

出典: Claude Code Docs - Model configuration(Anthropic)

Effort対応モデルの記載も食い違っている

"max" だけでなく、Effortパラメータ自体の対応モデルについても3者間で記載が異なります

情報源 Effort対応モデル
Claude API ドキュメント Opus 4.6, Sonnet 4.6, Opus 4.5
Claude Code ドキュメント (Settings, Model config) Opus 4.6 のみ
Claude Code ソースコード(NK6() 関数) Opus 4.6, Sonnet 4.6

Claude Codeのドキュメントは「Effort is currently supported on Opus 4.6」「Currently supported with Opus 4.6 only」と記載していますが、自身のソースコードは Sonnet 4.6 にもEffortを送信します。さらにAPIドキュメントは Opus 4.5 も対応と明記しているのに、Claude Codeはブロックしています。

なお、Claude Codeドキュメントは同じページ内でも矛盾があります。Effortセクションでは「Opus 4.6 のみ」としつつ、Adaptive thinkingセクションでは「Opus 4.6 and Sonnet 4.6」と言及しています。

ソースコードで確認した事実

Claude Codeのソースコード(v2.1.66、cli.js)を調査しました。minify済みですが、変数名を追うことで挙動を把握できます。

1. 有効な値の定義 — "max" は含まれている

// cli.js 内部(minify済みの変数名はそのまま記載)
xX6 = ["low", "medium", "high", "max"]

内部的には "max" を正式な4番目のレベルとして定義しています。

2. バリデーション — "max" は通過する

function LF5(A) {
  return xX6.includes(A)  // "max" は通過する
}

function VK6(A) {
  if (A === void 0 || A === null || A === "") return;
  let q = typeof A === "number" ? A : parseInt(String(A), 10);
  if (!isNaN(q) && yF5(q)) return q;
  if (typeof A === "string" && LF5(A)) return A;  // "max" はここで通過
  return;
}

3. APIへの送信 — そのまま渡される

設定値は output_config.effort としてClaude APIにそのまま渡されます。

function Mjz(A, q, K, Y, z) {
  if (!NK6(z) || "effort" in q) return;     // モデルが非対応なら何もしない
  if (A === void 0) Y.push("effort-2025-11-24");
  else if (typeof A === "string") {
    q.effort = A;                            // "max" をそのままセット
    Y.push("effort-2025-11-24");             // beta header追加
  }
}

クライアント側で "max" が Opus 4.6 専用かどうかのバリデーションは行われていません。 値が文字列であれば、モデルを問わずそのままAPIに送信されます。

なお、Claude APIドキュメントのEffortパラメータは「generally available on all supported models with no beta header required」と記載されていますが、Claude Code は依然として effort-2025-11-24 ベータヘッダーを付与しています。API側はベータヘッダーの有無に関わらず動作するため実害はありません。

4. /model ピッカー — "max" は選択肢にない

function P9q(A, q) {
  let K = ["low", "medium", "high"];  // "max" がない
  // ← → キーで low ↔ medium ↔ high を循環
}

UI の /model ピッカーでは low / medium / high の3つだけが循環するため、"max" は選択できません。

/model ピッカーの UI — low / medium / high の3段階のみ表示される

出典: Claude Code CLI(v2.1.66)/model ピッカー画面(筆者取得スクリーンショット)

5. --effort max には制限がある — settings.json はバイパスする

CLI の --effort 引数には "max" に対する追加のバリデーションがあります。

// cli.js:12797
if ($.effort === "max" && (!s || Y7())) {
  let F8 = !s
    ? 'Effort level "max" is not available in interactive mode.'
    : 'Effort level "max" is not available for Claude.ai subscribers.';
  process.stderr.write(/* エラーメッセージ */);
  process.exit(1);
}

各変数の意味:

  • s = !isInteractive — 非対話モード(--print)なら true
  • Y7() — Claude.ai サブスクライバーなら true

つまり --effort max には以下の制限があります。

方法 対話モード 非対話 + API Key 非対話 + Claude.ai
--effort max ❌ エラー ✅ 通る ❌ エラー
settings.json の "effortLevel": "max" 制限なし
環境変数 CLAUDE_CODE_EFFORT_LEVEL=max 制限なし

対話モードで claude --effort max を実行すると、以下のエラーで拒否されます。

Error: Effort level "max" is not available in interactive mode. Please use "low", "medium", or "high".

settings.json や環境変数から設定された "max" は、--effort 引数のバリデーションを経由しないため、対話モードでも Claude.ai サブスクライバーでも制限なく通ります。 これは意図的な設計か見落としかは不明ですが、実質的に settings.json が --effort の制限をバイパスする形になっています。

モデル別の対応状況

API ドキュメント上の対応モデル

Effort ドキュメントより:

The effort parameter is supported by Claude Opus 4.6, Claude Sonnet 4.6, and Claude Opus 4.5.

"max" については:

Only available on Opus 4.6; requests using max on other models return an error.

Claude Codeの内部判定

Claude Code側では NK6() 関数でEffortパラメータの送信可否を判定しています。

function NK6(A) {
  let q = A.toLowerCase();
  if (q.includes("opus-4-6") || q.includes("sonnet-4-6")) return true;
  if (q.includes("haiku") || q.includes("sonnet") || q.includes("opus")) return false;
  return true;
}

ここで注目すべきは、APIでは Opus 4.5 もEffortに対応しているのに、Claude Codeは Opus 4.5 へのEffort送信をブロックしていることです。

対応状況まとめ

effortLevel Opus 4.6 Sonnet 4.6 Opus 4.5
low / medium / high ✅ API対応 / ❌ Claude Code がブロック
max ⚠️ 後述 ❌ API ドキュメント上エラー

※ Sonnet 4.5 / Haiku 4.5 はEffortパラメータ自体が非対応

Sonnet 4.6 + "max" の実際の挙動

APIドキュメントでは「Opus 4.6 以外で max を使うとエラーになる」と明記されています。

Requests using max on other models return an error.

しかし、Claude CodeのNK6()は Sonnet 4.6 を true(effort 対応)と判定し、"max" の値もバリデーションなしでそのまま送信します。

実際に以下の手順で Sonnet 4.6 + "max" の組み合わせを試したところ、エラーにはならず正常にレスポンスが返りました。

  1. settings.json"effortLevel": "max" を設定した状態で Opus 4.6 セッションを開始
  2. セッション中に /model ピッカーで Sonnet 4.6 に切り替え
  3. そのままプロンプトを実行 → 正常にレスポンスが返った

これは実運用で十分起こり得るシナリオです。Opus 4.6 用に "max" を設定したまま、コスト節約のため /model で Sonnet へ切り替える — この時、ピッカーの ← → キーでは "max" が選択肢に存在しないため、ユーザーが Effort を上げようとしても "high" までしか上げられず、"max" へ戻す手段はありません。settings.json の "max" はセッション中ずっと維持され、モデルを切り替えても引き継がれます。

ドキュメント上は「エラーになる」とされていますが、Claude Codeのクライアント側にはモデル互換性のフォールバックロジックは一切なく"max" はそのままAPIに送信されています。エラーにならなかったのは Claude API側でサイレントにフォールバックしているためと考えられます。

モデル別の effortLevel 指定はできない

effortLevel は単一のグローバル値です。

function Kb6() {
  let A = U7();           // マージ済みの settings を取得
  return VK6(A.effortLevel);  // スカラー値として読み取り
}

以下のようなモデル別マッピングには対応していません。

{
  "effortLevel": {
    "opus": "max",
    "sonnet": "high"
  }
}

Opus 4.6 で "max"、Sonnet 4.6 で "high" のように使い分けたい場合は、/model ピッカーの ← → キーでセッション中に手動切替するか、シェルのエイリアスやラッパースクリプトで CLAUDE_CODE_EFFORT_LEVEL を切り替える必要があります。

設定方法

1. settings.json に直接記述

{
  "effortLevel": "max"
}

配置場所は3つあり、マージされます。

ファイル 用途
~/.claude/settings.json グローバル(個人設定)
.claude/settings.json プロジェクト(チーム共有)
.claude/settings.local.json プロジェクト(個人、gitignore推奨)

2. 環境変数

CLAUDE_CODE_EFFORT_LEVEL=max claude

3. /model ピッカー(← → キー)

/model コマンドでモデル選択画面を開き、← → キーで low / medium / high を切り替えられます。

ただし、前述の通り "max" はピッカーの選択肢に含まれていません。

4. --effort CLI 引数(制限あり)

claude --print --effort max "質問内容"

前述の通り、--effort max非対話モード(--print)かつ API Key ユーザーのみ利用可能です。対話モードや Claude.ai サブスクライバーではエラーになります。

優先順位

API送信時のEffort値は以下の順で解決されます。

// cli.js 内部の解決チェーン
Z6 = Wf7() ?? w.effortValue ?? bX6(w.model);
① 環境変数 CLAUDE_CODE_EFFORT_LEVEL                     ← 最優先
② ランタイム状態(settings.json 初期値 + /model ピッカー変更)
③ モデルデフォルト(有料プラン + Opus 4.6 → "medium")
④ いずれもなければ → API デフォルト = "high"

/model ピッカーの ← → キーで Effort を変更すると settings.json にも書き戻されるため、②はセッション中の変更と永続設定の両方を含みます。

まとめ

項目 内容
"max" は有効か ✅ Claude API で正式に定義されている
Claude API ドキュメント ✅ 記載あり(Opus 4.6 専用と明記)
Claude Code ドキュメント ❌ 記載なし
Claude Code ソースコード ✅ 有効な値として定義済み
Claude Code UI /model ピッカーでは選択不可
--effort max ⚠️ 非対話 + API Key のみ。対話モード・Claude.ai はエラー
settings.json / 環境変数 ✅ 制限なし(--effort のバリデーションをバイパス)
非対応モデルでの挙動 ドキュメント上はエラー、実測ではサーバー側フォールバック
モデル別指定 ❌ 非対応。単一のグローバル値のみ

"max" は Claude APIでは正式な機能ですが、Claude CodeのUIやドキュメントには反映されていません。利用するには settings.json に直接記述するか環境変数で指定する必要があります。

Opus 4.6 で最大限の推論深度が欲しい場合、"effortLevel": "max" を試してみてください。ただしモデル別の指定ができないため、Sonnet 等へ切り替える際はサーバー側のフォールバックに依存します。


調査は Claude Code v2.1.66(2026-03-04 ビルド)に基づいています。今後のバージョンで挙動が変わる可能性があります。

KIYOラーニング株式会社について

当社のビジョンは『世界一「学びやすく、分かりやすく、続けやすい」学習手段を提供する』ことです。革新的な教育サービスを作り成長させていく事で、オンライン教育分野でナンバーワンの存在となり、世界に展開していくことを目指しています。

プロダクト

  • スタディング:「学びやすく・わかりやすく・続けやすい」オンライン資格対策講座
  • スタディングキャリア:資格取得者の仕事探しやキャリア形成を支援する転職サービス
  • AirCourse:受け放題の動画研修がついたeラーニングシステム(LMS)

KIYOラーニング株式会社では一緒に働く仲間を募集しています

32
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?