はじめに
この記事では、Anthropic Claude 3.7 Sonnetから導入された拡張思考モードをPython SDKで実装する際のコードについて紹介します。
Anthropoc Caludeとは
Anthropic Claudeは、Anthropic社が開発した高度なAI言語モデルです。
このモデルは、自然言語処理タスクにおいて高い性能を発揮し、特に会話型AIやテキスト生成、分析などの用途に適しています。
Anthropic Claudeは、AWSやGoogle Cloudなどのクラウドプラットフォームを通じて利用可能であり、さまざまな業界で活用されています。
Anthropic Claude 3.7 Sonnetとは
2025年2月にAnthropicから提供されたClaude Sonnetシリーズの最新モデルです。
3.7 Sonnetから新たに拡張思考モード(Extended Thinking mode)が導入されています。
拡張思考モードとは
Claude 3.7 Sonnetは2つのモードで動作します。
- 標準モード:以前のClaudeモデルと同様に、内部の推論を表示せずに直接応答を提供
 - 拡張思考モード:最終的な回答を提供する前にClaudeの推論プロセスを表示
 
拡張思考モードを使用した場合Reasoning model(推論モデル)として動作します。
Reasoning modelは、Chain of Thought(COT)という手法を活用することで、
問題解決や質問に対して、単に答えを返すのではなく、段階的に考えながら回答を導き出すAIモデルのことです。
モデルが推論の各ステップを明確に示すことができ、問題解決の過程を理解しやすくします。
拡張思考モード使用時の注意点
- リクエストヘッダにの
anthropic-betaフィールドにoutput-128k-2025-02-19を指定する必要がある 
リクエストヘッダに以下のように、output-128k-2025-02-19設定が必要です。
anthropic-beta: output-128k-2025-02-19
- リクエストボディにthinkingパラメータを使用して、推論に使用するトークン予算(
budget_tokens)を設定する 
拡張思考モード使用時は回答生成とは別に、CoTによる推論でトークンが使用されるため、推論用のトークン数の予算を設定する必要があります。
"thinking": {
    "type": "enabled",
    "budget_tokens": 32000
}
- 設定するトークン予算(
budget_tokens)はmax_tokens以下に設定する必要がある 
budget_tokensに設定している値がmax_tokens(出力時の最大トークン)を超過している場合は推論だけでトークン上限に達してしまうため、budget_tokensはmax_tokens以下に設定する必要があります。
入力プロンプトトークン + max_tokensがコンテキストウィンドウサイズを超えないようにする
Claude 3.7 Sonnet以前では、プロンプトトークンとmax_tokensの合計がモデルのコンテキストウィンドウを超えても、システムは自動的にmax_tokensを調整してコンテキスト制限内に収めていました。
しかし、Claude 3.7 Sonnetでは、入力プロンプトトークン + max_tokensがコンテキストウィンドウサイズを超える場合、システムはバリデーションエラーを返すようになっています。
temperatureは1に設定する必要がある
拡張思考モード使用時は、temperatuteは1に設定する必要があります。
1以外が設定されていると以下のエラーが発生します。
`temperature` may only be set to 1 when thinking is enabled. 
top_pは設定できない
拡張思考モード使用時は、top_pを使用することはできません。
`top_p` must be unset when thinking is enabled. 
SDKから拡張思考モードを使ってみる
Python SDKで実装する場合、以下のようなコードになります。
拡張思考モード使用時はclient.messagesではなく、client.beta.messagesを使用します。
また、client.beta.messagesはストリーミング非対応なので、ストリーミングは使用できません。
import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create(
    model="claude-3-7-sonnet-20250219",
    max_tokens=128000,
    thinking={
        "type": "enabled",
        "budget_tokens": 32000
    },
    messages=[{
        "role": "user",
        "content": "Generate a comprehensive analysis of..."
    }],
    betas=["output-128k-2025-02-19"]
)
print(response)
レスポンスは以下のように出力されます。
拡張思考モード使用時はBetaMessageのcontent配列配下に、BetaThinkingBlockとBetaTextBlockの2つのオブジェクトが存在し、BetaThinkingBlock.thinkingに思考プロセスの内容が、BetaTextBlock.textに回答生成した内容がそれぞれ、設定されます。
BetaMessage(
    id='msg_vrtx_hogehoge',
    content=[
        BetaThinkingBlock(
            signature='xxxxx',
            thinking="-----------------思考プロセス------------------------",
            type='thinking'
        ),
        BetaTextBlock(
            citations=None,
            text="--------------------回答内容-----------------------------",
            type='text'
        )
    ],
    model='claude-3-7-sonnet-20250219',
    role='assistant',
    stop_reason='end_turn',
    stop_sequence=None,
    type='message',
    usage=BetaUsage(
        cache_creation_input_tokens=0,
        cache_read_input_tokens=0,
        input_tokens=423,
        output_tokens=177
    )
)
おわりに
この記事では、Anthropic Claudeの拡張思考モードをPython SDKから使用する場合のコードについて紹介しました。