OpenAI reasoning.effort: ошибка «Unsupported value» (unsupported_value) — причины и решения
Вы установили уровень рассуждения (reasoning effort) — none, minimal, max — и API возвращает HTTP 400 с сообщением о том, что данное значение не поддерживается этой моделью, за которым следует список допустимых значений. Ниже объясняется, почему проверка reasoning effort выполняется для каждой модели, какие текущие модели поддерживают определенные уровни и как перестать «зашивать» (hard-coding) одно и то же значение для всех моделей.
Краткий ответ
Ошибка unsupported_value в параметре reasoning.effort (Responses API) или reasoning_effort (Chat Completions) означает, что модель поддерживает настройку уровня рассуждения, но не тот уровень, который вы указали. Поддержка различается в зависимости от модели: gpt-6.1-sol и gpt-6-astra отклоняют none; ни одна из актуальных страниц моделей GPT-6 или GPT-5.6 Sol не упоминает minimal. Используйте значение из списка «Supported values» в сообщении об ошибке — OpenAI рекомендует low в качестве замены как для none (на моделях, где оно не поддерживается), так и для minimal. Вместо глобальной настройки лучше хранить маппинг параметров для каждой модели.
Симптомы и значение ошибки
В Responses API отправка none модели, которая его не поддерживает, выглядит так:
{
"error": {
"message": "Unsupported value: 'none' is not supported with the 'gpt-6-astra' model. Supported values are: 'low', 'medium', 'high', 'xhigh', and 'max'.",
"type": "invalid_request_error",
"param": "reasoning.effort",
"code": "unsupported_value"
}
}То же сообщение появляется для gpt-6.1-sol:
Unsupported value: 'none' is not supported with the 'gpt-6.1-sol' model. Supported values are: 'low', 'medium', 'high', 'xhigh', and 'max'.Две особенности позволяют легко устранить эту ошибку:
- Сообщение указывает модель, которая отклонила значение. Это важно, если клиент незаметно для вас переключил модель.
- В нем перечислены допустимые значения. Вам не нужно гадать — любое значение из этого списка пройдет проверку.
Не путайте эту ошибку с похожей:
{
"error": {
"message": "Unsupported parameter: 'reasoning.effort' is not supported with this model.",
"type": "invalid_request_error",
"param": "reasoning.effort",
"code": "unsupported_parameter"
}
}Ошибка unsupported_parameter означает, что модель вообще не поддерживает reasoning effort — обычно это модель, не предназначенная для глубоких рассуждений. Решение заключается в том, чтобы полностью убрать объект reasoning. Информацию о других ошибках параметров (max_tokens, temperature) см. в разделе Unsupported parameter: max_tokens.
Почему это происходит
- Список значений является надмножеством. В справочнике API OpenAI указаны
none,minimal,low,medium,high,xhighиmaxкак дляreasoning.effort, так и дляreasoning_effort, с оговоркой, что не все модели поддерживают каждое значение. Авторитетный список для конкретной модели находится на странице этой модели. - Одна настройка, много моделей. Глобальная конфигурация (например,
reasoning_effort = "none"для скорости илиminimalиз старой конфигурации) отлично работает на одной модели, но отклоняется следующей. - Клиент сменил модель, но сохранил настройки. В репозитории Codex от OpenAI было несколько проблем, когда приложение переключало поток на
gpt-6-astra, сохраняя настройкуnone, после чего каждый следующий запрос завершался этой ошибкой. minimal— это «пережиток». Он фигурирует в списке значений API, но ни одна из актуальных страниц моделей, проверенных для этой статьи (gpt-6.1-sol,gpt-6-astra,gpt-6-sol,gpt-6-luna,gpt-5.6-sol), его не поддерживает.
Какие модели поддерживают какие значения
Согласно страницам моделей OpenAI на 13 ноября 2026 г.:
| Модель | none | minimal | low | medium | high | xhigh | max |
|---|---|---|---|---|---|---|---|
gpt-6.1-sol | — | — | ✓ | ✓ (по умолч.) | ✓ | ✓ | ✓ |
gpt-6-astra | — | — | ✓ | ✓ | ✓ | ✓ | ✓ |
gpt-6-sol | ✓ | — | ✓ | ✓ (по умолч.) | ✓ | ✓ | ✓ |
gpt-6-luna | ✓ | — | ✓ | ✓ (по умолч.) | ✓ | ✓ | ✓ |
gpt-5.6-sol | ✓ | — | ✓ | ✓ (по умолч.) | ✓ | ✓ | ✓ |
В обоих справочниках API указано, что medium является значением по умолчанию, если параметр опущен. Поддержка меняется по мере выпуска новых моделей, поэтому лучше перепроверять страницу модели или просто читать список «Supported values» в сообщении об ошибке, а не полагаться на эту таблицу как на константу.
Решение 1: Отправьте значение, которое принимает модель
Самый быстрый способ: используйте одно из значений из сообщения об ошибке. В Responses API:
curl https://byesu.com/v1/responses \
-H "Authorization: Bearer sk-YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-6-astra",
"input": "Find the off-by-one bug in: for i in range(1, len(xs)): print(xs[i])",
"reasoning": {"effort": "low"}
}'В Chat Completions эта же настройка передается как строка верхнего уровня:
curl https://byesu.com/v1/chat/completions \
-H "Authorization: Bearer sk-YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-6-astra",
"messages": [{"role": "user", "content": "Find the off-by-one bug in: for i in range(1, len(xs)): print(xs[i])"}],
"reasoning_effort": "low"
}'Руководство OpenAI по миграции на GPT-6 предлагает две конкретные замены: для gpt-6-astra и gpt-6.1-sol используйте low там, где вы использовали none; а если в запросе использовалось minimal, начните с low и сравните результаты.
Решение 2: Храните маппинг параметров для каждой модели
Если ваш код обращается к нескольким моделям, сделайте effort функцией от модели с резервным вариантом (fallback), который переключается на ближайший поддерживаемый уровень вместо ошибки:
from openai import OpenAI
client = OpenAI(api_key="sk-YOUR_TOKEN", base_url="https://byesu.com/v1")
LEVELS = ["none", "minimal", "low", "medium", "high", "xhigh", "max"]
SUPPORTED = {
"gpt-6.1-sol": {"low", "medium", "high", "xhigh", "max"},
"gpt-6-astra": {"low", "medium", "high", "xhigh", "max"},
"gpt-6-sol": {"none", "low", "medium", "high", "xhigh", "max"},
"gpt-6-luna": {"none", "low", "medium", "high", "xhigh", "max"},
"gpt-5.6-sol": {"none", "low", "medium", "high", "xhigh", "max"},
}
def effort_for(model: str, wanted: str) -> str | None:
allowed = SUPPORTED.get(model)
if allowed is None:
return None # неизвестная модель: пусть API использует значения по умолчанию
if wanted in allowed:
return wanted
i = LEVELS.index(wanted)
# Предпочитаем следующий уровень вверх (больше рассуждений), затем ищем вниз
for lvl in LEVELS[i + 1:] + LEVELS[:i][::-1]:
if lvl in allowed:
return lvl
return None
def ask(model: str, prompt: str, wanted: str = "none"):
kwargs = {"model": model, "input": prompt}
effort = effort_for(model, wanted)
if effort:
kwargs["reasoning"] = {"effort": effort}
return client.responses.create(**kwargs)
print(effort_for("gpt-6-astra", "none")) # -> low
print(effort_for("gpt-6-luna", "minimal")) # -> lowОкругление «вверх», а не «вниз» — это осознанный выбор: запрос, для которого требовалось минимум рассуждений, получит их чуть больше. Это немного увеличит задержку (latency), но редко ухудшает качество. Если задержка для вас критичнее, измените порядок поиска.
Решение 3: Повторите запрос один раз, используя список из ошибки
Если вы не можете поддерживать таблицу моделей (например, если вы используете прокси перед множеством моделей), распарсьте список «Supported values» и повторите запрос ровно один раз:
import re
import openai
def create_with_effort(**kwargs):
try:
return client.responses.create(**kwargs)
except openai.BadRequestError as e:
err = (e.body or {}).get("error", e.body) or {}
if err.get("code") != "unsupported_value" or err.get("param") != "reasoning.effort":
raise
allowed = re.findall(r"'([a-z]+)'", err.get("message", "").split("Supported values are:")[-1])
if not allowed:
raise
fallback = "low" if "low" in allowed else allowed[0]
kwargs["reasoning"] = {**kwargs.get("reasoning", {}), "effort": fallback}
return client.responses.create(**kwargs)Логируйте каждый случай срабатывания fallback. Автоматическое понижение с max до xhigh или повышение с none до low меняет время отклика и длину вывода, поэтому важно знать, когда это происходит.
Взаимодействие Effort с инструментами и параметрами выборки
Выбор effort — это не только вопрос валидации:
- Параметры сэмплирования. Руководство OpenAI по миграции рекомендует удалять
temperature,top_pиtop_logprobs, еслиeffortне равенnone. Если вы переключаетеgpt-6-lunaсnoneнаlow, уберите и эти поля — см. Unsupported parameter: max_tokens. - Вызов функций (Function calling) в Chat Completions. Согласно страницам моделей OpenAI,
gpt-6-solиgpt-6-lunaподдерживают вызов функций в Chat Completions только приreasoning_effort: "none", а дляgpt-6.1-sol/gpt-6-astraтребуется использование Responses API. Если вы использовалиnoneтолько для того, чтобы задействовать инструменты в Chat Completions, переход на Responses API будет более чистым решением. - Скорость и использование токенов. В справочнике API указано, что меньший
effortможет означать более быстрые ответы и меньшее количество токенов рассуждения. Токены рассуждения учитываются в лимитах вывода и контекстном окне, поэтому высокийeffortтакже может привести к ошибкам контекстного окна или достижению лимита вывода.
Codex и другие клиенты
Codex считывает настройку effort из параметра model_reasoning_effort в файле ~/.codex/config.toml. Если вы меняете модели, убедитесь, что значение effort валидно для новой модели — none работает на gpt-6-sol, но не на gpt-6-astra или gpt-6.1-sol. В руководстве по Codex CLI на byesu показана рабочая конфигурация. В любом клиенте с выпадающим списком настроек действует то же правило: выпадающий список может предлагать уровни, которые выбранная модель отклонит.
Если вы работаете с GPT через byesu
byesu — это шлюз AI API с эндпоинтом, совместимым с OpenAI, доступным по адресу https://byesu.com/v1. Он поддерживает как Chat Completions, так и Responses и работает по модели оплаты по факту использования без подписки.
- Работают оба формата параметров. Используйте
reasoning_effortв/v1/chat/completionsиreasoning.effortв/v1/responses; правила допустимости значений для каждой конкретной модели остаются в силе. - Сначала проверьте строку модели. Поскольку ошибка называет модель, сравните ее с идентификатором, который вы собирались использовать — копируйте ID из списка моделей в консоли или через запрос
GET /v1/models.
Чтобы начать работу, следуйте краткому руководству.
FAQ
Что означает ошибка «Unsupported value: 'none' is not supported with the model»?
Это ошибка 400 invalid_request_error с параметром reasoning.effort и кодом unsupported_value. Модель поддерживает настройку reasoning.effort, но не тот уровень, который вы отправили. В сообщении об ошибке перечислены поддерживаемые значения; выберите одно из них и повторите запрос.
Какие значения reasoning effort поддерживает OpenAI?
В справочнике API указаны none, minimal, low, medium, high, xhigh и max, при этом отмечено, что не каждая модель рассуждения поддерживает каждое значение. Поддержка зависит от модели: например, gpt-6.1-sol и gpt-6-astra принимают значения от low до max, но не none или minimal, в то время как gpt-6-sol, gpt-6-luna и gpt-5.6-sol поддерживают и none.
Что использовать вместо minimal?
Согласно руководству по миграции на GPT-6 от OpenAI, при переносе запроса, использовавшего minimal, следует начать с low, а затем сравнить результаты. Для моделей gpt-6.1-sol и gpt-6-astra используйте low везде, где вы ранее использовали none.
В чем разница между reasoning_effort и reasoning.effort?
Это одна и та же настройка в двух разных API. Chat Completions принимает строку reasoning_effort верхнего уровня; Responses API принимает объект reasoning с полем effort. Оба по умолчанию имеют значение medium, если параметр опущен, и оба проверяют значение на соответствие конкретной модели.
Почему вместо этого я получаю ошибку «Unsupported parameter: 'reasoning.effort'»?
Этот вариант с кодом unsupported_parameter означает, что модель вообще не принимает reasoning effort, как правило, потому что это не модель с поддержкой рассуждений. Для такой модели удалите весь объект reasoning, вместо того чтобы подбирать другое значение.
