В этой статье описаны рекомендации по использованию и типичные ловушки для 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.



