Библиотека · Приёмы опытных

Extended Thinking — глубокие размышления

Инженер55 минОбновлено: октябрь 2026
46 из 105 в библиотеке

Модуль: 9. Продвинутые возможности | Время: ~25 мин теории + 30 мин практики


Суть урока

Шахматист перед сложным ходом думает 5 минут: перебирает варианты, просчитывает последствия, отбрасывает плохие пути. Extended Thinking (расширенное мышление — режим глубокого анализа Claude) — это то же самое для Claude: он «думает вслух» перед ответом, а не выдаёт первое что пришло. Для простых задач это лишнее. Для архитектурных решений и сложного анализа — принципиальная разница в качестве.

Термины урока: extended thinking (расширенное мышление — режим глубокого анализа Claude), API (эй-пи-ай — интерфейс программирования), token (токен — единица текста для AI), prompt (промпт — запрос к AI), prompt caching (кэширование промптов — сохранение промпта для повторного использования без повторной оплаты).


Ключевые концепции

  • Extended Thinking — режим API, в котором Claude генерирует внутренний монолог до финального ответа
  • Thinking tokens — токены внутреннего размышления, выделяются в отдельный блок thinking
  • budget_tokens — параметр, ограничивающий максимум токенов на размышление (ручной режим, только для старых моделей: на 4.6 он устарел, на 4.7 и новее вернёт ошибку 400)
  • Adaptive Thinking — автоматический режим ("type": "adaptive"): модель сама решает, думать ли и насколько глубоко. Глубину задаёт параметр effort в output_config. Основной способ для всех актуальных моделей (на октябрь 2026: Opus 5.5, Sonnet 5.5, Fable 5.1)
  • display — параметр отображения: "summarized" (саммари размышлений) или "omitted" (только подпись, без текста). На Opus 5.5, Sonnet 5.5 и Fable 5.1 по умолчанию "omitted"
  • Interleaved Thinking — размышления между каждым вызовом инструмента (tool call), а не только в начале
  • Thinking block — отдельный блок в ответе API с полями type: "thinking", thinking: "..." и signature: "..."
  • Стоимость — thinking tokens тарифицируются как output tokens (дороже input). Биллинг по полным thinking-токенам, даже если display = "summarized"

Теория

Как это работает изнутри

🎨 Образ: Без Extended Thinking Claude отвечает как игрок в «Своей игре»: нажал кнопку до конца вопроса — дал первый ответ. С Extended Thinking — как шахматист: смотрит на доску, просчитывает варианты, отбрасывает плохие ходы, потом двигает фигуру.

Без Extended Thinking Claude получает запрос и сразу генерирует ответ. Это быстро, но мышление «плоское» — модель не успевает проверить альтернативы.

С Extended Thinking запрос проходит через два этапа:

Код
Запрос → [Thinking phase: Claude перебирает варианты] → Финальный ответ

Thinking phase невидима по умолчанию — ты видишь только финальный ответ. Через API можно получить саммари внутреннего монолога (сырой ход мысли не отдаётся ни при каких настройках).

Что нового к октябрю 2026: у актуальных моделей (Opus 5.5, Sonnet 5.5, Fable 5.1) размышление уже включено по умолчанию, а стандартный способ его выключить (thinking: {"type": "disabled"}) вернёт ошибку 400. Поэтому задача разработчика сместилась: не «включить thinking», а «выбрать глубину» (effort) и решить, показывать ли текст размышлений. Старый ручной режим с budget_tokens нужен только для устаревших моделей.

Два режима: Manual vs Adaptive

В API есть два способа управлять размышлением:

1. Manual (ручной бюджет) — ты сам указываешь лимит токенов. Работает только на устаревших моделях:

python
thinking={"type": "enabled", "budget_tokens": 10000}

2. Adaptive (автоматический) — модель сама решает сколько думать, а глубину задаёшь параметром effort отдельно от thinking:

python
thinking={"type": "adaptive"},
output_config={"effort": "medium"}  # low / medium / high и выше, зависит от модели

🎨 Образ: Manual — ты говоришь шахматисту «думай ровно 5 минут». Adaptive — говоришь «подумай средне» и он сам решает сколько ему нужно на конкретную позицию.

Какие модели что поддерживают

Модель (на октябрь 2026) Manual ("enabled") Adaptive ("adaptive") Примечание
Claude Fable 5.1, Opus 5.5, Sonnet 5.5 ❌ вернёт ошибку 400 ✅ только adaptive Размышление включено по умолчанию ("disabled" вернёт 400); display по умолчанию "omitted"
Claude Opus 4.8 и Opus 4.7 ❌ вернёт ошибку 400 ✅ только adaptive Без поля thinking размышления выключены, включи явно
Claude Opus 4.6, Sonnet 4.6 ⚠️ deprecated ✅ рекомендуется Manual ещё работает
Claude Opus 4.5, Sonnet 4.5, Haiku 4.5 ✅ единственный режим ❌ вернёт ошибку 400 Адаптивного режима нет

Более старые модели постепенно выводятся из API, актуальный список: Актуальное сейчас.

Тренд: Anthropic ушла к Adaptive. Для новых проектов используй "adaptive" и effort.

API-запрос с Extended Thinking (Manual, для устаревших моделей)

python
import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-haiku-4-5",  # ручной режим: только для старых моделей, у Haiku 4.5 он единственный
    max_tokens=16000,
    thinking={
        "type": "enabled",
        "budget_tokens": 10000  # до 10000 токенов на размышление
    },
    messages=[{
        "role": "user",
        "content": """Спроектируй архитектуру системы для следующего кейса:
        - SaaS-платформа для малого бизнеса
        - 1000 активных пользователей
        - Нужна мультиарендность (multi-tenancy)
        - Бюджет: $200/мес на инфраструктуру
        - Команда: 1 разработчик
        
        Оцени минимум 3 подхода с реальными компромиссами."""
    }]
)

# Разбираем блоки ответа
for block in response.content:
    if block.type == "thinking":
        print("=== ВНУТРЕННИЕ РАЗМЫШЛЕНИЯ ===")
        print(block.thinking)
        print()
    elif block.type == "text":
        print("=== ФИНАЛЬНЫЙ ОТВЕТ ===")
        print(block.text)

API-запрос с Adaptive Thinking (рекомендуется для новых моделей)

python
response = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=16000,
    thinking={
        "type": "adaptive",
        "display": "summarized"  # чтобы увидеть саммари размышлений
    },
    output_config={"effort": "high"},  # глубина работы: low, medium, high и выше (зависит от модели)
    messages=[{
        "role": "user",
        "content": "Спроектируй архитектуру SaaS-платформы с multi-tenancy..."
    }]
)

С Adaptive не нужно гадать с budget_tokens — модель сама определяет глубину размышлений, а ты двигаешь только effort. Помни: при низком effort модель может вообще пропустить размышления на простом запросе. Если SDK ругается на output_config, обнови библиотеку: pip install -U anthropic.

Что видно в thinking блоке

Пример реального внутреннего монолога (сокращённо):

Напиши в чат
Хм, нужно спроектировать архитектуру для SaaS с ограниченным бюджетом...

Вариант 1: Shared database schema
- Плюсы: простота, дёшево, одна база
- Минусы: сложно изолировать данные клиентов, риски при росте
- Для 1000 юзеров OK, но что если вырастет до 10000?

Вариант 2: Database per tenant
- Плюсы: полная изоляция, просто откатить одного клиента
- Минусы: $200/мес не хватит если 1000 клиентов = 1000 баз
- Исключаю для такого бюджета

Вариант 3: Schema per tenant (Postgres schemas)
- Компромисс: изоляция без взрывного роста баз
- Row Level Security добавит ещё один слой
- Cloudflare Workers + PlanetScale serverless = вписывается в $200/мес

Буду рекомендовать Вариант 3 как основной, с объяснением когда переходить на Вариант 2...

Это не показательная витрина — это реальный процесс перебора вариантов.

🎨 Образ: budget_tokens — как ограничение времени на совещание. 1000 токенов — быстрое брейнсторминг, 10 000 — полный стратегический анализ. Больше времени = глубже анализ, но и дороже. В adaptive-режиме роль этого ограничения играет effort.

Параметр budget_tokens (Manual режим)

budget_tokens Когда использовать Стоимость (пример расчёта)
1 024 (минимум) Умеренно сложные задачи ~$0.005 за запрос
5 000 Архитектурные решения, анализ ~$0.025 за запрос
10 000 Максимальная глубина, математика ~$0.05 за запрос
32 000 Крайне сложные задачи ~$0.16 за запрос

Расчёт: токены размышления × цена output-токена. В примере взята цена $5 за 1 млн output-токенов (на октябрь 2026 так стоит Haiku 4.5: у неё ручной режим ещё работает, а из API её могут вывести не раньше 15.10.2026); thinking tokens считаются как output. Цены у моделей разные: актуальные цены и версии: Актуальное сейчас. Реальный расход смотри в поле usage.output_tokens_details.thinking_tokens ответа.

Ограничения: budget_tokens — не меньше 1024 и меньше max_tokens (за исключением interleaved thinking — там может быть больше). Бюджет — ориентир, а не жёсткий потолок: модель может остановиться раньше; жёсткий потолок задаёт max_tokens. Бюджет больше 32 000 токенов документация советует запускать через Batch API: такие запросы идут долго и упираются в таймауты.

Параметр display — что видит пользователь

Контролирует, что возвращается в thinking-блоке ответа:

display Что возвращается Для чего
"summarized" Саммари размышлений (по умолчанию на Opus 4.6, Sonnet 4.6 и старее) Отладка промптов, понимание логики модели
"omitted" Пустое поле thinking, только signature (по умолчанию на Opus 5.5, Sonnet 5.5, Fable 5.1) Продакшен (быстрее time-to-first-token)

Имя поля одинаково в обоих режимах. Текст в блоке — всегда саммари, а не сырой ход мысли.

python
# Режим для продакшена — быстрее, без лишних данных
response = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=16000,
    thinking={
        "type": "adaptive",
        "display": "omitted"  # ← только подпись, без текста размышлений
    },
    messages=[{"role": "user", "content": "..."}]
)

Важно: при "omitted" ты всё равно платишь за все thinking-токены. Экономия не в деньгах, а во времени доставки ответа. Если передаёшь thinking-блоки обратно в multi-turn разговоре (при работе с инструментами это обязательно), передавай их без изменений: по полю signature сервер восстановит полный контекст размышлений.

Streaming thinking tokens

Для длинных размышлений имеет смысл стримить — так видно прогресс:

python
with client.messages.stream(
    model="claude-opus-5-5",
    max_tokens=16000,
    thinking={
        "type": "adaptive",
        "display": "summarized"
    },
    messages=[{"role": "user", "content": "...твой сложный запрос..."}]
) as stream:
    for event in stream:
        if event.type == 'content_block_start':
            if event.content_block.type == 'thinking':
                print("[Начинаю думать...]")
        elif event.type == 'content_block_delta':
            if event.delta.type == 'thinking_delta':
                print(event.delta.thinking, end='', flush=True)
            elif event.delta.type == 'text_delta':
                print(event.delta.text, end='', flush=True)
        elif event.type == 'content_block_stop':
            print("\n[Блок завершён]")

При стриминге приходят три типа delta-событий (при display: "omitted" thinking_delta приходит с пустой строкой, текста размышлений нет):

  • thinking_delta — текст размышлений (кусочками)
  • signature_delta — криптоподпись (для multi-turn)
  • text_delta — финальный ответ

Когда Extended Thinking нужен

Использовать:

  • Архитектурные решения (выбор технологий, структура системы)
  • Многоступенчатые математические задачи
  • Анализ сложных трейдоффов с несколькими переменными
  • Отладка сложных багов где причина неочевидна
  • Написание критически важных алгоритмов

Не использовать:

  • Написание простого текста или краткое резюме
  • Обычные API-вызовы и несложный код
  • Задачи где первый ответ и так корректен
  • Если нужна скорость и цена важна

🎨 Образ: Шахматный режим «bullet» против «классики». В bullet играешь за 1 минуту — быстро, поверхностно. В классике думаешь по 20 минут за ход. Extended Thinking — это классика. Для рапида не нужна.

Interleaved Thinking — размышления между tool calls

🎨 Образ: Interleaved Thinking — как повар который пробует блюдо после каждого шага. Добавил соль — попробовал — решил что дальше. Добавил специи — попробовал снова. Не готовит всё вслепую до конца.

Когда Claude использует инструменты (tools), он может думать после каждого вызова инструмента, а не только в самом начале. Это называется Interleaved Thinking.

Код
Запрос → [Thinking] → tool_use: get_weather("Москва")
       → tool_result: "−5°C"
       → [Thinking: "Ок, в Москве холодно, нужно учесть..."]  ← думает МЕЖДУ вызовами
       → tool_use: get_weather("Сочи")
       → tool_result: "+18°C"
       → [Thinking: "Сочи теплее, сравню..."]
       → Финальный ответ

Поддержка моделей (на октябрь 2026):

  • Opus 5.5, Sonnet 5.5, Fable 5.1, а также Opus 4.8 и 4.7 — interleaved автоматически в adaptive-режиме, заголовок не нужен
  • Opus 4.6 — только в adaptive-режиме (в manual его нет)
  • Sonnet 4.6 — в adaptive-режиме автоматически; в manual ещё работает через beta-заголовок interleaved-thinking-2025-05-14, но он deprecated
  • Opus 4.5, Sonnet 4.5 и другие Claude 4 — через beta-заголовок interleaved-thinking-2025-05-14
  • Haiku 4.5 — не поддерживает

Важно при работе с tools: при отправке tool_result обратно всегда передавай все thinking-блоки из предыдущего ответа assistant — не модифицируй и не убирай их.

Пример: с thinking vs без

🎨 Образ: Без Extended Thinking — совет от прохожего на улице: «бери PostgreSQL, все берут». С Extended Thinking — консультация архитектора который час изучал твои нагрузки, бюджет и команду.

Без Extended Thinking — запрос: «Выбери БД для моего SaaS»

Ответ придёт за 2-3 секунды. Скорее всего порекомендует PostgreSQL или MongoDB с шаблонными аргументами.

С Extended Thinking (adaptive, effort high; в старом ручном режиме — budget_tokens: 8000):

Claude потратит на анализ заметно больше времени (порядка десятков секунд, зависит от модели и нагрузки). В thinking блоке будет видно: он рассмотрит твои конкретные параметры, сравнит стоимость разных облачных БД при нагрузке 1000 пользователей, учтёт что у тебя один разработчик, взвесит PlanetScale vs Supabase vs Neon по реальным критериям.

Качество ответа заметно выше — не потому что модель «умнее», а потому что она успела думать.

Ограничения Extended Thinking

Не все функции API совместимы с Extended Thinking:

Функция Совместимость Примечание
tool_choice: "auto" ✅ Работает
tool_choice: "none" ✅ Работает
tool_choice: "any" ❌ в manual; в adaptive работает, кроме Opus 5.5, Sonnet 5.5 и Fable 5.1 На этих трёх моделях принудительный вызов инструмента всегда даёт ошибку 400
tool_choice: {"type": "tool", "name": "..."} ❌ в manual; в adaptive работает, кроме Opus 5.5, Sonnet 5.5 и Fable 5.1 Так же, как выше
max_tokens: 0 (прогрев кэша) ❌ Несовместимо
Prompt Caching (system prompt) ⚠️ При смене режима thinking, budget_tokens или effort кэш system prompt и tools тоже может сброситься: считай, что кэш начинается заново
Prompt Caching (messages) ⚠️ Сбрасывается при любой смене режима thinking, budget_tokens или effort

Multi-turn: передавай thinking-блоки

🎨 Образ: Thinking-блоки в multi-turn — как передавать записную книжку шахматиста следующему ходу. Без записей он забыл бы какие варианты уже отбросил и почему. С записями — продолжает с того места где остановился.

В многоходовых разговорах передавай все thinking-блоки из предыдущих ответов assistant без изменений: внутри цикла с инструментами это обязательно, в обычном диалоге рекомендуется. Иначе модель может потерять контекст своих размышлений:

python
# Ход 1
response1 = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=16000,
    thinking={"type": "adaptive"},
    messages=[{"role": "user", "content": "Первый вопрос?"}],
)

# Ход 2 — передай response1.content целиком (с thinking-блоками) и без изменений
response2 = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=16000,
    thinking={"type": "adaptive"},
    messages=[
        {"role": "user", "content": "Первый вопрос?"},
        {"role": "assistant", "content": response1.content},  # ← ВСЕ блоки
        {"role": "user", "content": "Уточняющий вопрос?"},
    ],
)

Практика

Задание: Архитектурное решение с Extended Thinking

  1. Выбери реальную архитектурную задачу из своего проекта (или возьми учебную: «Как хранить пользовательские данные для SaaS с 500 клиентами?»)

  2. Сначала запроси ответ без Extended Thinking и сохрани его:

    python
    response_basic = client.messages.create(
        model="claude-haiku-4-5",  # для сравнения: модель без размышлений по умолчанию
        max_tokens=2000,
        messages=[{"role": "user", "content": ТВОЙ_ЗАПРОС}]
    )
  3. Затем тот же запрос с Extended Thinking (Manual: у Haiku 4.5 это единственный режим размышлений):

    python
    response_thinking = client.messages.create(
        model="claude-haiku-4-5",
        max_tokens=8000,
        thinking={"type": "enabled", "budget_tokens": 6000},
        messages=[{"role": "user", "content": ТВОЙ_ЗАПРОС}]
    )
  4. И тот же запрос с Adaptive Thinking (актуальная модель, например Opus 5.5):

    python
    response_adaptive = client.messages.create(
        model="claude-opus-5-5",
        max_tokens=8000,
        thinking={"type": "adaptive", "display": "summarized"},
        output_config={"effort": "high"},
        messages=[{"role": "user", "content": ТВОЙ_ЗАПРОС}]
    )
  5. Распечатай все финальные ответы и thinking блоки

  6. Сравни: где deeper анализ? Что упустил «быстрый» ответ?

  7. Оцени стоимость всех вариантов через response.usage

Цель: почувствовать разницу качества и понять для каких задач оправдана доплата.


Инструменты и ресурсы

  • Anthropic API docs — Extended Thinking и Thinking
  • Python SDK — pip install -U anthropic (бери свежую версию: параметры output_config и display появились недавно)
  • В Claude Code: уровень усилий задаётся командой /effort (или флагом --effort), размышления показывает Ctrl+O (подробный режим), слово ultrathink в запросе просит поглубже подумать на один ход; в Claude Code на Opus 5.5, Sonnet 5.5 и Fable 5.1 переключатель размышлений выключить нельзя. Подробнее: документация по моделям
  • Модели: Opus 5.5, Sonnet 5.5, Fable 5.1 — только adaptive; Opus 4.6 и Sonnet 4.6 — adaptive (manual устарел); Opus 4.5, Sonnet 4.5, Haiku 4.5 — только manual
  • Цены: Актуальное сейчас, claude.com/pricing

Ключевые выводы

Extended Thinking — не магия, а время на перебор вариантов. Качество растёт, стоимость тоже. Thinking tokens тарифицируются как output: чтобы не переплачивать, снижай effort (в ручном режиме — budget_tokens), а жёсткий потолок задавай через max_tokens. Для всех актуальных моделей используй Adaptive Thinking ("type": "adaptive") и effort в output_config: модель сама решает сколько думать. Ручной budget_tokens на новых моделях даёт ошибку 400. Параметр display: "omitted" ускоряет ответ в продакшене, но не экономит деньги — биллинг по полным thinking-токенам. Используй для архитектурных решений и сложного анализа. Для простых задач — лишний overhead.


Что дальше

→ Computer Use: управление экраном

Отметка хранится только в этом браузере и никуда не отправляется. Мой прогресс