DeepSeek V4 Pro (0813): передача thinking-контента и матрица из 3 API

Практическое руководство по DeepSeek V4 Pro (0813): переключатель thinking и уровни reasoning_effort, обязательная передача истории thinking, инструменты, кеширование и матрица из 3 API.

AIHubMix15 мин чтения
DeepSeek V4 Pro (0813): передача thinking-контента и матрица из 3 API

В этой статье описаны рекомендации по использованию и типичные ловушки для deepseek-v4-pro-0813. На AIHubMix модель доступна через Chat Completions API, Responses API и Claude-совместимый Messages API. См. также: официальная документация API DeepSeek.

Выводы с пометкой «Verified» и примеры ответов в каждом разделе получены из реальных вызовов, выполненных 2026-08-13 через API AIHubMix (Chat Completions / Responses / Messages). Пункты спецификации без пометки «Verified» взяты из официальной документации DeepSeek.

1. Позиционирование модели и основные характеристики

V4 Pro — старший уровень поколения DeepSeek V4 (лёгкая deepseek-v4-flash является её младшим аналогом). Линейка восходит к DeepSeek-V4 Preview, выпущенной 2026-04-24, а 0813 — метка версии модели, которую DeepSeek присвоил текущей сборке. Помимо основных характеристик, её выделяют четыре особенности:

  • Разреженная модель переднего края: 1,6T общих параметров / 49B активированных (архитектура MoE, или mixture-of-experts: при каждом проходе инференса задействуется только часть экспертных сетей. Общее число параметров определяет ёмкость знаний, а число активированных параметров — вычислительную стоимость одного вызова). В карточке модели указаны гибридное внимание CSA+HCA, mHC и оптимизатор Muon.
  • Открытые веса по лицензии MIT: deepseek-ai/DeepSeek-V4-Pro опубликована на HuggingFace под лицензией MIT (одна из самых либеральных открытых лицензий: допускаются коммерческое использование и распространение закрытых производных) и может быть развёрнута самостоятельно. Для модели такого размера лицензия MIT — редкость. Рекомендации по самостоятельному развёртыванию в карточке модели также предлагают окно контекста ≥384K токенов при работе в режиме Think Max (самом высоком уровне рассуждений). Это рекомендация по развёртыванию, а не характеристика размещённого API.
  • Поддержка нескольких протоколов — нативная, а не сторонний перевод: DeepSeek сам предлагает OpenAI Chat API, совместимую с Anthropic конечную точку (/anthropic, которая сопоставляет claude-opus* этой модели) и Responses API (DeepSeek заявляет о нативной поддержке этого формата с адаптациями для Codex). Также доступно завершение FIM (fill-in-the-middle) в бета-версии на отдельной конечной точке; оно не входит в три API AIHubMix.
  • Разрыв примерно в 120× между ценой при попадании в кеш и при промахе: опубликованная DeepSeek схема ценообразования такова: попадание в кеш — $0,003625/M, промах — $0,435/M (вывод — $0,87/M). Кеширование происходит автоматически, и задавать для него параметр не нужно. Для нагрузок, которые часто переиспользуют длинные префиксы (системные промпты, длинные документы), именно этот разрыв определяет итоговый счёт. Фактические розничные цены — те, что указаны на странице модели.
Параметр Значение
Название модели на AIHubMix deepseek-v4-pro-0813
Окно контекста 1M токенов (1 000 000)
Максимум вывода Официальная формулировка: MAX OUTPUT MAXIMUM: 384K (точное число токенов и значение по умолчанию не опубликованы)
Входные модальности Только текст. На странице совместимости с Responses прямо указано, что входные изображения и файлы не поддерживаются; на странице Messages блоки type="image" помечены как Not Supported; в Chat Completions поле content у пользовательского сообщения принимает только строку, без мультимодальных частей
Режим thinking Гибридный (с thinking и без него), thinking включён по умолчанию
Уровни thinking reasoning_effort принимает low / high / max, по умолчанию high; medium и xhigh для совместимости сопоставляются с high
Доступные API Chat Completions, Responses, Messages (Claude-совместимый)
Verified: превышение max_tokens отклоняется валидацией, а не молча обрезается. Запрос с max_tokens=9999999 возвращает HTTP 400, а в теле ошибки назван параметр и указан предел 393216.
# max_tokens=9999999 -> HTTP 400
"...max_tokens... 393216"
❗ Изображения не вызывают ошибку, но отбрасываются: официальная формулировка для Responses API звучит так: «Image and file inputs are not supported (input_image parts do not cause an error, but are replaced with a placeholder text)». То есть часть input_image не приводит к сбою запроса, а заменяется текстовой заглушкой. В Chat Completions поле content пользовательского сообщения принимает только строку, а блоки type="image" в Messages помечены как Not Supported. При построении мультимодальной маршрутизации никогда не принимайте отсутствие ошибки за доказательство того, что модель действительно увидела изображение.

2. Как отключить thinking? Три API, три формы полей

V4 Pro использует thinking по умолчанию: если не передать никаких параметров, в ответе будет содержимое thinking. Отключение во всех трёх API требует разной формы поля.

Chat Completions

Используйте объект верхнего уровня thinking.

from openai import OpenAI

client = OpenAI(
    base_url="https://aihubmix.com/v1",
    api_key="<AIHUBMIX_API_KEY>",
)

completion = client.chat.completions.create(
    model="deepseek-v4-pro-0813",
    messages=[{"role": "user", "content": "What is 2 + 2?"}],
    extra_body={"thinking": {"type": "disabled"}},
)

# Thinking on  (default): message.reasoning_content present, reasoning_tokens = 43
# Thinking off (disabled): reasoning_content absent, reasoning_tokens absent
Verified: при thinking.type="disabled" одновременно пропадают message.reasoning_content и usage.completion_tokens_details.reasoning_tokens, что подтверждает срабатывание переключателя.

Responses

В Responses отдельного переключателя нет: чтобы отключить thinking, установите уровень none.

response = client.responses.create(
    model="deepseek-v4-pro-0813",
    input="What is 2 + 2?",
    reasoning={"effort": "none"},
)

# effort="none": usage.output_tokens_details.reasoning_tokens = 0
#                output[0] is the message item directly (no reasoning item)
# effort unset : output always starts with a reasoning item
Verified: reasoning.effort="none" заметно отличается от уровня по умолчанию (токены thinking становятся нулевыми, элемент вывода reasoning исчезает), что подтверждает срабатывание.

Messages

То же имя и та же форма, что в Chat Completions: объект верхнего уровня thinking.

from anthropic import Anthropic

client = Anthropic(
    api_key="<AIHUBMIX_API_KEY>",
    base_url="https://aihubmix.com",
)

response = client.messages.create(
    model="deepseek-v4-pro-0813",
    max_tokens=1024,
    messages=[{"role": "user", "content": "What is 2 + 2?"}],
    extra_body={"thinking": {"type": "disabled"}},
)

# Thinking on  (default): content = [thinking block, text block]
# Thinking off (disabled): content = [text block]
Verified: после отключения блок thinking полностью исчезает, остаётся только блок text.
Об уровнях thinking: при тестировании в Chat Completions запросы с low и max возвращали 200 (high — значение по умолчанию, оно применяется, если поле не передано). Однако количество токенов thinking для одного и того же вопроса не показывает монотонной разницы между уровнями (простой вопрос: low=43 / max=27; сложный вопрос: low=114 / max=92), а в ответе ничего не возвращается в качестве подтверждения. Уровни принимаются, но по ответу нельзя заметить никакого различающего сигнала. В Responses по ответу можно подтвердить только уровень none (thinking выключен).

3. Почему многоходовой диалог внезапно возвращает 400? Историю thinking нужно передавать обратно дословно

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

Все три API передают одно и то же thinking-содержимое под разными именами полей:

API Формат передачи Тело ошибки при отсутствии
Chat Completions Поле reasoning_content в сообщении assistant The `reasoning_content` in the thinking mode must be passed back to the API.
Responses Элемент вывода с type="reasoning" в массиве input The `reasoning_text` in the thinking mode must be passed back to the API.
Messages Блок thinking внутри блоков содержимого assistant The `content[].thinking` in the thinking mode must be passed back to the API.
Verified (условия срабатывания): эта проверка стабильно срабатывает на многоходовых запросах, которые содержат tools (модель делает вызов инструмента, затем результат инструмента отправляется обратно). На обычных многоходовых запросах без инструментов, когда модель отвечает напрямую, в этом раунде тестирования проверка не срабатывала, и запрос возвращал 200. Иначе говоря, оркестрация инструментов (агентные сценарии и вызовы функций) — то место, где вы с наибольшей вероятностью на это наткнётесь. Поэтому относитесь к thinking-содержимому как к части состояния диалога, которое нужно сохранять и воспроизводить.

Chat Completions

# Multi-turn: pass the previous assistant message back verbatim, including reasoning_content
messages = [
    {"role": "user", "content": "What is 1 + 1? Remember the result."},
    {
        "role": "assistant",
        "content": "2",
        "reasoning_content": "<reasoning_content from the previous response>",
    },
    {"role": "user", "content": "Add 1 to the result."},
]

# Dropping reasoning_content -> HTTP 400 invalid_request_error
Verified: исторое сообщение assistant без reasoning_content возвращает 400; когда поле добавлено обратно, тот же запрос возвращает 200 и диалог продолжается корректно.

Responses

# Multi-turn: input = previous input + response.output (reasoning item included) + new message
input = previous_input + response.output + [
    {"role": "user", "content": "Add 1 to the result."}
]

# Filtering out the type="reasoning" item -> HTTP 400
Verified: достаточно вставить response.output обратно в историю как есть. Фильтрация элементов вывода по type == "message" при сборке истории отбрасывает элемент reasoning и вызывает 400. Это самый частый способ на этом споткнуться.

Messages

# Multi-turn: pass response.content back verbatim as the assistant message
messages = [
    {"role": "user", "content": "What's the weather in Paris?"},
    {"role": "assistant", "content": response.content},   # thinking + tool_use blocks
    {"role": "user", "content": [tool_result_block]},
]

# Stripping the thinking block -> HTTP 400
Verified: удаление блока thinking из массива содержимого возвращает 400 (при этом error.type равен invalid_request_error).

4. Вызов инструментов

Каждый API описывает инструменты в собственной форме протокола, и эти формы не взаимозаменяемы.

Chat Completions

Вложенная форма (объект function, внутри которого name / parameters). Именованный tool_choice с указанием функции принудительно вызывает эту функцию.

completion = client.chat.completions.create(
    model="deepseek-v4-pro-0813",
    messages=[{"role": "user", "content": "What's the weather in Paris?"}],
    tools=[{
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get weather for a city",
            "parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
        },
    }],
    tool_choice={"type": "function", "function": {"name": "get_weather"}},
)

# Observed: finish_reason "tool_calls", tool_calls[0].function.arguments = {"city": "Paris"}
❗ Verified: tool_choice: "required" нельзя использовать, пока включён thinking. Такой запрос возвращает 400 с сообщением Thinking mode does not support this tool_choice. Если отключить thinking (thinking.type="disabled"), тот же запрос возвращает 200. Когда нужна семантика «обязательно вызвать инструмент», используйте именованный tool_choice с указанием функции (как выше, это работает при включённом thinking), либо сначала отключите thinking и только потом используйте required.

Responses

Плоская форма (type / name / parameters на одном уровне).

response = client.responses.create(
    model="deepseek-v4-pro-0813",
    input="What's the weather in Paris?",
    tools=[{
        "type": "function",
        "name": "get_weather",
        "description": "Get weather for a city",
        "parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
    }],
)

# Observed output items: ["reasoning", "function_call"]; arguments = {"city": "Paris"}
Verified: если скопировать вложенную форму из Chat Completions (function: {...}) в Responses, запрос возвращает 400. Используйте плоскую форму. Ограничение на tool_choice: "required" в режиме thinking такое же, как в Chat.

Messages

Нативная для Anthropic форма (input_schema), для принудительного вызова используется tool_choice: {"type": "any"}.

response = client.messages.create(
    model="deepseek-v4-pro-0813",
    max_tokens=1024,
    tools=[{
        "name": "get_weather",
        "description": "Get weather for a city",
        "input_schema": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
    }],
    tool_choice={"type": "any"},
    messages=[{"role": "user", "content": "What's the weather in Paris?"}],
)

# Observed: content contains a tool_use block, name = get_weather, input = {"city": "Paris"}
❗ Параллельные вызовы инструментов нельзя отключить, это заложено в самой конструкции DeepSeek: официальная страница совместимости с Anthropic в строке tool_choice указывает, что disable_parallel_tool_use is ignored. Страница Responses также содержит строку parallel_tool_calls | Ignored (parallel tool calling is always enabled). Тестирование это подтверждает: запрос о двух городах одновременно с disable_parallel_tool_use: true всё равно возвращает два блока tool_use. Если нужно последовательное выполнение, берите только первый вызов или организуйте очередь на стороне клиента.
Количество инструментов и стоимость контекста: отправка 200 определений функций в одном запросе по-прежнему возвращала 200 с нормальным ответом и не вызывала никакой проверки количества (наблюдалось на этом пути; большие количества не тестировались). Однако prompt_tokens для этого запроса достиг 6 105. Определения инструментов полностью попадают в контекст и оплачиваются. Если инструментов много, сокращайте набор инструментов для каждого сценария, а не объявляйте все безусловно.

5. Структурированный вывод

Chat Completions

response_format поддерживает режим JSON.

completion = client.chat.completions.create(
    model="deepseek-v4-pro-0813",
    messages=[{"role": "user", "content": "Return {\"a\": 1} as JSON."}],
    response_format={"type": "json_object"},
)

# Observed response content: {"a":1}
Проверено: вывод является корректным JSON.

Responses

Схема JSON объявляется через text.format, режим strict поддерживается.

response = client.responses.create(
    model="deepseek-v4-pro-0813",
    input="Return the number 1 under key a.",
    text={
        "format": {
            "type": "json_schema",
            "name": "extract",
            "strict": True,
            "schema": {"type": "object", "properties": {"a": {"type": "integer"}}, "required": ["a"]},
        }
    },
)

# Observed output text: {"a":1}
Проверено: вывод строго соответствует заданной схеме.

Messages

В протоколе Messages (Anthropic) нет аналога response_format / text.format. Обычный обходной путь — передать схему через инструмент: объявить инструмент, у которого input_schema является целевой схемой, задать tool_choice: {"type": "any"} и прочитать структурированный результат из input блока tool_use. В этом раунде тестирования данный шаблон специально не проверялся; когда нужны жесткие гарантии схемы, предпочитайте Chat Completions или Responses.

6. Как включить кэширование контекста? Никак, оно автоматическое

Кэширование контекста (идентичные префиксы переиспользуются, а закэшированная часть тарифицируется по более низкой ставке) включено по умолчанию и не требует параметров. Повторный запрос с тем же длинным префиксом сообщает о попадании в кэш в usage, под названием поля, которое отличается в зависимости от API. Подробности о кэшировании и актуальные цены см. на странице модели; о стратегии кэширования для разных моделей и методах повышения доли попаданий см. практику кэширования промптов.

Chat Completions

# usage of the second call with an identical long prefix
"prompt_tokens_details": {"cached_tokens": 640}   # first call: 0
Проверено: два последовательных вызова с одним и тем же длинным префиксом по одному каналу изменили cached_tokens с 0 до 640.

Responses

# usage of the second call with identical long instructions
"input_tokens_details": {"cached_tokens": 896}    # first call: 0

Messages

# usage of a call whose long system prefix was already warmed
"cache_read_input_tokens": 896
Проверено: префикс выше был «прогрет» запросом Responses с идентичным содержимым, и первый вызов Messages сразу попал в кэш на 896 токенов. Это согласуется с тем, что кэширование привязано к префиксу содержимого и общее для всех протокольных интерфейсов.

7. logprobs: в Chat два канала

logprobs (логарифмические вероятности — детальная информация о уверенности модели для каждого токена-кандидата) возвращается в разной структуре в двух API, и код парсинга должен обрабатывать их отдельно.

Chat Completions

completion = client.chat.completions.create(
    model="deepseek-v4-pro-0813",
    messages=[{"role": "user", "content": "Say hi."}],
    logprobs=True,
    top_logprobs=2,
)

# Observed: choices[0].logprobs contains TWO arrays
#   logprobs.content[]            -> tokens of the final answer
#   logprobs.reasoning_content[]  -> tokens of the thinking text
❗ Проверено: Chat возвращает логарифмические вероятности и для content, и для reasoning_content. Код, который читает только logprobs.content в соответствии со стандартной структурой ответа OpenAI, не выдаст ошибку, но молча пропустит канал рассуждений; если ваш код предполагает наличие одного массива в logprobs, сначала добавьте проверку структуры.

Responses

response = client.responses.create(
    model="deepseek-v4-pro-0813",
    input="Say hi.",
    top_logprobs=3,
)

# Observed: logprobs only on the final message item
#   output[-1].content[0].logprobs[] with logprob + top_logprobs details
Проверено: Responses прикрепляет logprobs только к последнему текстовому элементу — никакой двухканальной структуры, как в Chat, нет.

Messages

В протоколе Messages (Anthropic) эквивалентного поля нет. Для детальной информации о вероятностях на уровне токенов используйте Chat Completions или Responses.

8. Какие API умеют искать в интернете?

Веб-поиск здесь реализован как серверный инструмент (извлечение выполняется на сервере; клиент сам запрос не отправляет), и в тестах он действительно выполняется как в Responses, так и в Messages API.

Responses

response = client.responses.create(
    model="deepseek-v4-pro-0813",
    input="What is the latest stable version of Python?",
    tools=[{"type": "web_search"}],
)

# Observed output item sequence:
# ["reasoning", "web_search_call", "reasoning", "message"]
Проверено: в последовательности выходных данных появляется элемент web_search_call, что означает, что сервер действительно выполнил извлечение.

Messages

response = client.messages.create(
    model="deepseek-v4-pro-0813",
    max_tokens=1024,
    tools=[{"type": "web_search_20250305", "name": "web_search"}],
    messages=[{"role": "user", "content": "What is the latest stable version of Python?"}],
)

# Observed content block sequence:
# ["thinking", "server_tool_use", "web_search_tool_result", "thinking", "text"]
# usage.server_tool_use.web_search_requests = 1
Проверено: usage.server_tool_use.web_search_requests равно 1 — запрос на извлечение действительно был выполнен и учтен в тарифе.

Chat Completions

Веб-поиск на Chat не запускается. В официальной справке DeepSeek по Chat API в схеме запроса нет ни одного поля для инструмента поиска (это отсутствие установлено путем последовательной проверки всех полей; DeepSeek не делал явных заявлений об отказе в поддержке). API с явным официальным подтверждением поддержки серверного поиска — Responses (web_search), а официальная страница совместимости с Messages также перечисляет блоки содержимого, связанные с поиском.

# Three control groups, same question requiring live information, all HTTP 200:
# A no search field       -> "cannot retrieve", annotations = null
# B web_search_options    -> "cannot retrieve", annotations = null, usage identical to A
# C enable_search         -> "cannot retrieve", annotations = null, usage identical to A
Проверено: отправка web_search_options или enable_search не вызывает ошибку, но и ничего не извлекает — в ответе нет annotations (списка ссылок на источники, который прикрепляется к ответу при выполнении веб-поиска), а usage полностью совпадает с контрольной группой поле в поле. Для доступа к вебу используйте Responses или Messages API.

9. Заметки об использовании: дизайн DeepSeek и отклонения на нашем пути

Все перечисленное ниже возвращает HTTP 200, но ведет себя контринтуитивно. Причины различаются, и различаются действия, которые нужно предпринять, поэтому они перечислены отдельно: первая группа — это то, как DeepSeek спроектировал модель, и смена провайдера это не изменит; вторая группа — текущее поведение на пути AIHubMix, над которым мы работаем.

9.1 По замыслу DeepSeek

Поведение Официальная формулировка Что делать
Responses не сохраняет состояние сессии и метаданные Официальная страница совместимости с Responses построчно указывает store | Not supported. The response always carries store: false, metadata | Not supported и safety_identifier | Not supported (из этих четырех полей поддерживается только user). Тестирование совпадает: запрос возвращает 200, но metadata равно null, safety_identifier отсутствует, а store всегда равно false Храните данные для сопоставления запросов на клиенте; не полагайтесь на серверное хранение
Параметры сэмплирования не действуют в режиме мышления DeepSeek прямо заявляет, что temperature и top_p в режиме мышления молча игнорируются. В тестах оба возвращают 200, ничего не отражают в ответе и не меняют его структуру Не полагайтесь на параметры сэмплирования для стабильности вывода в режиме мышления; когда нужен детерминизм, используйте структурированный вывод
Продолжение префикса / FIM доступно только на официальной бета-конечной точке Официальное описание prefix гласит: «(Beta) … Для использования этой функции необходимо установить base_url="https://api.deepseek.com/beta"», а завершение FIM также является бета-функцией. Проверено на продакшене AIHubMix: отправка prefix: true на стандартную конечную точку возвращает 200, но префикс молча отбрасывается, что согласуется по направлению с официальной формулировкой Для контроля формата вывода используйте структурированный вывод (раздел 5) или обрезку через stop
Параллельные вызовы инструментов нельзя отключить См. раздел 4: DeepSeek указывает на страницах Responses и Anthropic, что переключатель игнорируется и параллельные вызовы всегда включены Если нужно последовательное выполнение, ставьте вызовы в очередь на стороне клиента

9.2 Текущее поведение на пути AIHubMix

Поведение Что показывает тестирование Что делать
Нестандартный type в объектах ошибок Responses Поле error.type в ответах 4xx имеет значение Aihubmix_api_error, тогда как ошибка того же класса в Messages возвращает стандартное invalid_request_error Ветвите логику по HTTP-коду статуса, а не по строке error.type
Токены мышления учитываются как 0 в Messages Ответ содержит блок thinking, но usage.output_tokens_details.thinking_tokens всегда равно 0, что противоречит фактически сгенерированному содержимому мышления; согласно контракту Anthropic, с которым мы интегрируемся, это поле обязательно и должно быть ≤ output_tokens Для учета стоимости мышления используйте completion_tokens_details.reasoning_tokens в Chat или output_tokens_details.reasoning_tokens в Responses
Messages возвращает model как deepseek-v4-pro Запрос отправляет deepseek-v4-pro-0813, а ответ возвращает deepseek-v4-pro. Причина в наименовании: единственное официальное имя модели DeepSeek в API — deepseek-v4-pro, а 0813 — это метка версии Не используйте поле model в ответе как единственную основу для проверок маршрутизации моделей или учета использования

9.3 Не определено DeepSeek, поэтому однозначного вердикта нет

Отправка значения вне перечисления для reasoning_effort (например, bogus_xyz) возвращает 200 с нормальным ответом, без ошибки и без видимого эффекта. Сам факт достаточно ясен: на этом пути enum для reasoning_effort сейчас не проверяется. Неясно другое — должно ли это быть так: DeepSeek публикует допустимый enum, но никогда не указывает, должен ли недопустимый уровень отклоняться, поэтому нет эталона для оценки. Значит, это не считается ни официальным поведением, ни дефектом нашего пути. Безопасный подход на стороне клиента: проверяйте уровень сами и не рассчитывайте, что API поймает ошибку.

10. Матрица поддержки возможностей по API

В ячейках ниже указано написание параметра или поля для каждого API. За исключением случаев, отмеченных как явная формулировка DeepSeek, все выводы получены из реальных вызовов, выполненных 2026-08-13 к продакшен-API AIHubMix.

Возможность Chat Completions Responses Messages
Базовый чат / системные инструкции ✅ messages ✅ input + instructions ✅ messages + system на верхнем уровне
Потоковая передача ✅ stream + stream_options ✅ stream (response.created … response.completed) ✅ stream (message_start … message_stop)
Предел вывода ✅ max_tokens (при превышении — 400, предел 393216) ✅ max_output_tokens ✅ max_tokens
Отключение мышления ✅ thinking: {"type": "disabled"} ✅ reasoning: {"effort": "none"} ✅ thinking: {"type": "disabled"}
Уровень мышления 🟡 reasoning_effort принимается, но без различимого сигнала ✅ reasoning.effort (подтверждается только none) 🟡 output_config.effort принимается, ничего не возвращается
Возврат содержимого мышления ✅ поле reasoning_content ✅ элемент вывода reasoning ✅ блок содержимого thinking
Обязательная передача истории мышления ✅ отсутствие reasoning_content → 400 ✅ отсутствие элемента reasoning → 400 ✅ отсутствие блока thinking → 400
Вызов инструментов ✅ вложенные tools + именованный tool_choice ✅ плоские tools ✅ input_schema + tool_choice: {"type":"any"}
Принудительный вызов с required ❗ 400 при включенном мышлении; сначала отключите мышление ❗ то же, что слева ✅ {"type": "any"}
Параллельные вызовы инструментов (нельзя отключить) ➖ такого поля в официальном Chat API нет ❗ DeepSeek указывает, что parallel_tool_calls игнорируется и параллельные вызовы всегда включены ❗ DeepSeek указывает, что disable_parallel_tool_use игнорируется; при тестировании по-прежнему возвращаются два блока tool_use
Структурированный вывод ✅ response_format (json_object) ✅ text.format (json_schema + strict) ➖ нет поля protocol; передавайте схему через инструмент
Автоматический учёт попаданий в кэш ✅ usage.prompt_tokens_details.cached_tokens ✅ usage.input_tokens_details.cached_tokens ✅ usage.cache_read_input_tokens
logprobs ❗ двойной канал: content + reasoning_content ✅ top_logprobs только для последнего текстового элемента ➖
Веб-поиск ➖ в официальном Chat API нет поля для поиска; его отправка не запускает поиск ✅ tools: [{"type": "web_search"}] ✅ web_search_20250305
Стоп-последовательности ✅ stop ➖ в протоколе нет поля стоп-последовательностей (длину ограничивает только max_output_tokens) ✅ stop_sequences (stop_reason: "stop_sequence")

Легенда: ✅ проверено, работает · 🟡 принимается, но эффект подтвердить нельзя · ❗ требует внимания (см. примечания выше) · ➖ такой концепции в этом API нет

FAQ

Какие API поддерживает deepseek-v4-pro-0813 на AIHubMix?
Chat Completions (/v1/chat/completions), Responses (/v1/responses) и совместимый с Claude API Messages (/v1/messages).

Почему многоходовой диалог внезапно возвращает 400?
Чаще всего причина в том, что история рассуждений не была передана обратно. В режиме thinking содержимое рассуждений предыдущего хода нужно передавать дословно: reasoning_content в сообщении ассистента для Chat, элемент вывода type="reasoning" для Responses и блок содержимого thinking для Messages. Особенно это проявляется в многоходовых диалогах с инструментами: многие фреймворки при сборке истории фильтруют элементы вывода по type == "message", и элемент рассуждений теряется.

Можно ли отключить thinking?
Да. Передайте thinking: {"type": "disabled"} в Chat или Messages и reasoning: {"effort": "none"} в Responses. После отключения пропадают и содержимое рассуждений, и токены рассуждений.

Отличаются ли три уровня reasoning_effort?
low, high и max принимаются все (по умолчанию high; medium и xhigh для совместимости сопоставляются с high). В тестах количество токенов рассуждений для одного и того же вопроса не показало монотонной зависимости от уровня, и ничего не возвращается обратно, поэтому разницу со стороны вызывающего кода подтвердить нельзя. Только уровень none в Responses (thinking выключен) даёт заметную наблюдаемую разницу.

Почему tool_choice: "required" возвращает 400?
Это значение не принимается, пока включён thinking (в теле ошибки: Thinking mode does not support this tool_choice). Чтобы принудительно вызвать конкретную функцию при включённом thinking, используйте tool_choice с именем функции ({"type": "function", "function": {"name": "..."}}) либо сначала отключите thinking и затем используйте required.

Как включить кэширование контекста?
Никак, оно работает автоматически. Размещайте стабильное, неизменное содержимое (системные промпты, фрагменты знаний, определения инструментов) в начале запроса, а количество попаданий в кэш отображается в usage: prompt_tokens_details.cached_tokens в Chat, input_tokens_details.cached_tokens в Responses и cache_read_input_tokens в Messages.


Цены и актуальный статус см. на странице модели deepseek-v4-pro-0813, а другие модели — в галерее моделей.

Связанные практические руководства: практическое руководство по Kimi K3 (новые параметры и матрица поддержки трёх API) и изменения кэширования промптов и биллинга GPT-5.6.

Один шлюз ко многим провайдерам ИИ. Создан для продакшена.

Перейти на AIHubMix