Reasoning tokens: сколько стоят рассуждения модели и как их ограничить

Короткий ответ, а в статистике тысячи выходных токенов — так выглядят рассуждения модели. Разбираем, откуда они берутся, во что обходятся и как ими управлять в OpenAI- и Anthropic-формате.

6 мин · · модели · экономия

Вы задали модели короткий вопрос, получили ответ в три строки, а в статистике — несколько тысяч выходных токенов. Чаще всего это reasoning tokens: модель «думала» перед ответом, и эти размышления тоже стоят денег. Ниже — что это за токены, как вендоры их тарифицируют, какими параметрами их ограничить и где следить за расходом.

Что такое токены рассуждения

Модели с рассуждениями (reasoning-модели) перед финальным ответом генерируют внутреннюю цепочку рассуждений: разбирают задачу, перебирают варианты, проверяют себя. Эта цепочка состоит из обычных токенов, но в ответе вы её, как правило, не видите полностью.

Что говорят официальные документации вендоров:

  • OpenAI: токены рассуждения занимают место в контекстном окне модели и тарифицируются как выходные токены. В зависимости от сложности задачи их может быть от нескольких сотен до десятков тысяч.
  • Anthropic: рассуждения Claude приходят блоками типа thinking. У новых моделей текст этих блоков по умолчанию не возвращается, но, как сказано в документации, рассуждение происходит и тарифицируется одинаково при любой настройке отображения.

Отсюда главный практический вывод: стоимость ответа зависит не только от длины видимого текста, но и от того, сколько модель думала.

Reasoning tokens: стоимость на примере

Формула та же, что для любого запроса, только выходных токенов больше, чем видно глазами:

стоимость = вход × цена_входа / 1 000 000 + (видимый_ответ + рассуждения) × цена_выхода / 1 000 000

Пример для claude-opus-5-5 (цены на 6 октября 2026: $0.4 за 1M входных и $2 за 1M выходных токенов). Запрос — 3 000 входных токенов, видимый ответ — 500 токенов, рассуждения — 4 000 токенов (условные цифры для примера):

  • Вход: 3 000 × $0.4 / 1M = $0.0012
  • Выход: (500 + 4 000) × $2 / 1M = 4 500 × $2 / 1M = $0.009
  • Итого: $0.0102

Без рассуждений тот же запрос стоил бы 3 000 × $0.4 / 1M + 500 × $2 / 1M = $0.0012 + $0.001 = $0.0022. На 10 000 таких запросов в месяц разница — $102 против $22. Поэтому у задач, где глубокие рассуждения не нужны, их стоит ограничивать.

Цена выхода у большинства моделей заметно выше цены входа, это обычная практика вендоров. Актуальный список и цены — GET https://api.zukko.pro/v1/models или страница «Модели» в кабинете.

Где увидеть токены рассуждения в ответе

В официальных форматах вендоров число токенов рассуждения отдаётся отдельным полем:

ФорматГде смотреть
OpenAI Chat Completionsusage.completion_tokens_details.reasoning_tokens (уже входят в completion_tokens)
OpenAI Responsesusage.output_tokens_details.reasoning_tokens
Anthropic Messagesрассуждения входят в usage.output_tokens

Какие детализирующие поля приходят для конкретной модели через шлюз, проверьте на тестовом запросе. Надёжный признак в любом случае — сравнить выходные токены из usage с длиной видимого ответа: если выход в разы больше текста, модель рассуждала.

Параметр reasoning_effort в OpenAI-формате

В Chat Completions глубину рассуждений задаёт параметр reasoning_effort. В официальном SDK OpenAI для него перечислены значения none, minimal, low, medium, high, xhigh и max, но, как подчёркивает OpenAI, не каждая модель поддерживает каждое значение. Чем ниже уровень, тем меньше токенов уходит на рассуждения и тем быстрее ответ.

bash
import os

from openai import OpenAI

client = OpenAI(
    base_url="https://api.zukko.pro/v1",
    api_key=os.environ["ZUKKO_API_KEY"],
)

response = client.chat.completions.create(
    model="gpt-6.1-sol",
    reasoning_effort="low",
    max_completion_tokens=4000,
    messages=[{"role": "user", "content": "Классифицируй отзыв: «Доставили быстро, но коробка помята»"}],
)
usage = response.usage
details = usage.completion_tokens_details
print(response.choices[0].message.content)
print("выход всего:", usage.completion_tokens)
print("из них рассуждения:", details.reasoning_tokens if details else "нет данных")

В справочнике Zukko reasoning_effort указан среди необязательных параметров chat/completions; как модель отреагирует на конкретное значение, определяет её провайдер.

Обратите внимание на max_completion_tokens: по документации OpenAI это потолок для видимого ответа и рассуждений вместе. Если поставить его слишком низко, модель может израсходовать лимит на рассуждения и вернуть пустой ответ — а входные и потраченные на рассуждения токены всё равно оплачиваются. OpenAI советует оставлять запас при первых экспериментах.

В Responses API тот же смысл у объекта reasoning:

bash
response = client.responses.create(
    model="gpt-6.1-sol",
    reasoning={"effort": "low"},
    input="Сформулируй тему письма клиенту о переносе встречи",
)
print(response.output_text)
print(response.usage)

Параметр thinking в Anthropic-формате

У Claude настройки рассуждений устроены иначе, и за последний год они поменялись. По текущей документации Anthropic:

  • На новых моделях рассуждения адаптивные: thinking: {"type": "adaptive"} — модель сама решает, думать ли и сколько.
  • Глубину задаёт параметр effort внутри output_config: low, medium, high, xhigh, max. Это рекомендуемый рычаг для контроля расхода.
  • Старый вариант thinking: {"type": "enabled", "budget_tokens": N} устарел: на моделях семейства 4.6 он ещё работает, а более новые модели отклоняют его с ошибкой 400.
  • У Claude Opus 5.5 рассуждения отключить нельзя, а effort по умолчанию — medium; снизить расход можно только уровнем low.
bash
import os

import anthropic

client = anthropic.Anthropic(
    base_url="https://api.zukko.pro",
    api_key=os.environ["ZUKKO_API_KEY"],
)

response = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=16000,
    thinking={"type": "adaptive"},
    output_config={"effort": "low"},
    messages=[{"role": "user", "content": "Предложи три варианта названия для сервиса доставки цветов"}],
)
for block in response.content:
    if block.type == "text":
        print(block.text)
print("выходных токенов:", response.usage.output_tokens)

Если ваша версия SDK не знает output_config, обновите пакет anthropic. Сделайте несколько тестовых запросов с разными effort и сравните output_tokens: так вы проверите и то, что параметр принимается через шлюз, и реальный эффект на расход. Когда рассуждения действительно нужны, разобрано в статье про extended thinking.

Как следить за расходом

  1. Кабинет. В разделе «Использование» видна история расходов. Если после включения новой модели или параметра расход вырос, начните поиск отсюда.
  2. API. Баланс и историю списаний можно забирать программно — см. справочник по /v1/usage. Удобно для ежедневного отчёта в чат команды.
  3. Логирование usage. Пишите в лог по каждому запросу модель, входные и выходные токены, а где доступно — токены рассуждения. Через неделю будет видно, какие задачи «думают» дороже всего.
  4. Отдельные ключи. Для сервиса с тяжёлыми рассуждениями заведите отдельный ключ с дневным лимитом в долларах: превышение не затронет остальные сервисы. Как это настроить — в статье о лимитах расхода для агентов.
  5. Потолок на ответ. max_tokens или max_completion_tokens ограничивает худший случай, но оставляйте запас, чтобы рассуждения не съели весь лимит.

Как подобрать уровень рассуждений

Классификация, извлечение полей, короткие ответы в чате обычно не требуют глубоких рассуждений — начните с низкого уровня. Многошаговые задачи с кодом, расчётами и планированием могут выиграть от высокого. Проверьте на своих данных: возьмите 20 типичных задач, прогоните на двух уровнях, сравните качество и выходные токены. Считайте стоимость решённой задачи, а не запроса: дешёвый ответ, который приходится переспрашивать, в итоге дороже.

Ключ для экспериментов создаётся на странице API-ключи — задайте ему небольшой дневной лимит и сравнивайте уровни спокойно.

Частые вопросы

Почему completion_tokens намного больше, чем текст ответа?

В них входят токены рассуждения. Посмотрите поле completion_tokens_details.reasoning_tokens, если оно есть в ответе, или снизьте reasoning_effort и сравните.

По какой цене оплачиваются рассуждения?

У OpenAI и Anthropic токены рассуждения тарифицируются как выходные. Фактическое списание по своим запросам смотрите в разделе «Использование» кабинета.

Можно ли полностью отключить рассуждения?

Зависит от модели. В OpenAI-формате у части моделей есть значение reasoning_effort="none". У Claude Sonnet 5 по документации Anthropic допускается thinking: {"type": "disabled"}, а у Claude Opus 5.5 рассуждения отключить нельзя — остаётся effort: "low".

Можно ли прочитать сами рассуждения?

Полную цепочку вендоры не отдают. Anthropic и OpenAI умеют возвращать краткое изложение рассуждений по отдельному параметру, но поддержку этого через шлюз для конкретной модели проверьте тестовым запросом.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.