Миграция на DeepSeek V4.1 Flash 1017: ошибка 400 из-за reasoning_content, тихая подмена модели под тем же именем и тарификация в часы пик

AIHubMix9 мин чтения
Миграция на DeepSeek V4.1 Flash 1017: ошибка 400 из-за reasoning_content, тихая подмена модели под тем же именем и тарификация в часы пик

Обычно миграция начинается с изменения имени модели. DeepSeek V4.1 Flash 1017 пошёл другим путём: 17 октября 2026 года DeepSeek сохранил имя deepseek-flash, но изменил модель, которая за ним стоит. Всех, кто вызывал deepseek-flash, deepseek-v4-flash или deepseek-v4-flash-vision-exp через API DeepSeek, перевели на новую версию без единой правки в коде.

На AIHubMix у новой версии есть собственный ID, deepseek-v4.1-flash-1017, так что вы сами выбираете, когда перейти. В любом случае проверьте эти проблемы:

Проблема Как проявляется Где это заметно
reasoning_content не передаётся обратно Громко Ошибка 400 после первого вызова инструмента
Модель подменена под тем же именем Незаметно Длина ответов, форматы, оценки в тестах
Тарификация в часы пик Незаметно Счёт удваивается в часы пик в будни
Effort по умолчанию установлен в max Незаметно Агентские сессии идут в 1,6–1,8 раза дольше
Размышления учитываются в max_tokens Оба Обрезанные ответы
Тарификация Search и Fetch Незаметно С 31 октября, 16:00 UTC

AIHubMix 19 октября 2026 года (03:02 UTC) отправил короткий набор тестовых запросов к deepseek-v4.1-flash-1017. Результаты этого прогона отмечены ниже как таковые.

1. Ошибка 400, которая ломает циклы с инструментами

Что вы увидите. Второй запрос после вызова инструмента завершается с HTTP 400 и таким сообщением, как было указано в issue на GitHub для opencodex по V4.1 Flash 15 октября:

[invalid_request_error] The `reasoning_content` in the thinking mode must be passed back to the API.

Тот же текст встречается в более ранних отчётах по opencode, LangChain и claude-code-router для V4 Pro и V4 Flash.

Почему. В руководстве по режиму размышлений DeepSeek сказано, что если запрос содержит tools, то reasoning_content каждого предыдущего ответа ассистента нужно передавать обратно, «даже для ходов, в которых модель не вызывала инструмент». Если этого не сделать, «API вернёт ошибку 400». Без инструментов передавать это поле необязательно, и оно игнорируется. Клиенты обычно спотыкаются здесь потому, что их сериализатор сообщений сохраняет content и tool_calls, но отбрасывает дополнительное поле.

Запрос, который это вызывает. Второй ход цикла с инструментами, где из сообщения ассистента удалён reasoning_content:

curl -s https://aihubmix.com/v1/chat/completions \
  -H "Authorization: Bearer $AIHUBMIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-v4.1-flash-1017",
    "tools": [{"type": "function", "function": {"name": "get_weather",
      "parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]}}}],
    "messages": [
      {"role": "user", "content": "What is the temperature in Hangzhou? Use the tool."},
      {"role": "assistant", "content": null, "tool_calls": [{"id": "call_00_example", "type": "function",
        "function": {"name": "get_weather", "arguments": "{\"city\": \"Hangzhou\"}"}}]},
      {"role": "tool", "tool_call_id": "call_00_example", "content": "{\"celsius\": 18}"}
    ]
  }'

В API самого DeepSeek именно такой запрос возвращает ошибку 400, о которой сообщали публично. Через AIHubMix тот же запрос в тестовом прогоне 19 октября вернул HTTP 200 и обычный ответ. Это был один прогон, так что не рассчитывайте на такое поведение как на гарантию.

Как исправить. Сохраняйте это поле, каким бы маршрутом вы ни пользовались:

msg = resp.choices[0].message
messages.append(msg)  # carries content, reasoning_content, and tool_calls over
  • В собственном коде добавляйте в историю всё сообщение ассистента целиком, а не собранную вручную копию.
  • Во фреймворках обновляйтесь: opencode исправил передачу в последних версиях, а исправление opencodex влито 16 октября.
  • В крайнем случае для циклов с инструментами можно задать {"thinking": {"type": "disabled"}}. Ошибка уйдёт, но вы потеряете рассуждения, благодаря которым модель хорошо справляется с агентной работой.

2. То же имя, другая модель

В changelog DeepSeek за 17 октября сказано прямо: «Способ вызова API и тарификация не меняются — просто используйте deepseek-flash, чтобы получить доступ к последней модели». Для сентябрьской версии закреплённого имени нет, а оба старых имени Flash теперь тоже работают на 1017.

Ошибок не будет, но три вещи могут измениться:

  • Длина ответов. 1017 обучали выдавать более короткие ответы. Парсеры, вёрстка интерфейсов и промпты, рассчитанные на длинные объяснения сентябрьской модели, могут получать меньше текста, чем раньше.
  • Базовые оценки. Результаты и стоимость, которые вы записали для сентябрьской версии, больше не описывают то, что возвращает deepseek-flash.
  • Поведение. DeepSeek переобучил 1017 на сквозной работе над проектами. Агенты могут идти к одному и тому же результату разными путями.

Что делать. Записывайте модель и дату с каждым прогоном оценки и прямо сейчас перезапустите набор регрессионных тестов. Ответ сообщает, какая версия ответила: в тесте 19 октября каждый ответ через AIHubMix содержал "model": "deepseek-v4-1-flash-261017". Логируйте это поле, и незанонсированная подмена станет видна в день, когда произойдёт.

3. Правила тарификации, которые легко упустить

Пик и внепиковые часы. DeepSeek берёт полную цену с 01:00 до 04:00 и с 06:00 до 10:00 UTC в будни, а в остальные часы, все выходные и китайские государственные праздники — половину цены. AIHubMix использует те же окна и тарифицирует каждый запрос по времени отправки, так что длинный потоковый запрос, начатый вне пика, остаётся вне пика.

Позиция Пик Вне пика
Вход, промах кэша $0.3098 $0.155
Вход, попадание в кэш $0.0062 $0.0031
Выход $1.2392 $0.62

Прейскурантные цены AIHubMix за 1M токенов для deepseek-v4.1-flash-1017. Сверху действует ограниченная по времени скидка 30%.

Попадание в кэш дешевле промаха в 50 раз. Агенты при каждом вызове заново отправляют системный промпт, определения инструментов и историю. Держите этот префикс стабильным, а всё, что меняется от вызова к вызову, помещайте в конец, и большая часть каждого запроса будет тарифицироваться по ставке попадания в кэш.

Размышления тарифицируются как выход. Режим размышлений включён по умолчанию, а токены рассуждений учитываются и в счёте, и в max_tokens.

Search и Fetch. 17 октября DeepSeek открыл новые API Search и Fetch по $0,75 за 1000 успешных вызовов каждого. Серверные вызовы, сделанные через DeepSeek Harness, Claude Code или Codex на API DeepSeek, бесплатны до 31 октября 2026 года, 16:00 UTC. После этого агент, который ищет на каждом ходе, добавляет к оплате токенов стоимость за каждый вызов.

Итог. При заявленных допущениях (40 вызовов, 1,2M входных токенов с 90% попаданий в кэш, 60K выходных токенов) одна сессия агента стоит $0,118 в пик и $0,059 вне пика по прейскурантным ценам AIHubMix. Перенос пакетных запусков на внепиковое время даёт самую большую экономию.

4. Настройки, которые стоят дороже, чем приносят

Effort. API предлагает low, high (по умолчанию) и max. В статье DeepSeek о V4.1 Flash эти значения соответствуют внутренним уровням усилий 50, 75 и 100, и там сказано, что переход к max «удлиняет агентные траектории в 1,6–1,8 раза ради лишь незначительного улучшения». В официальном руководстве DeepSeek по настройке Claude Code до сих пор стоит CLAUDE_CODE_EFFORT_LEVEL=max. Для повседневной агентной работы лучшим значением по умолчанию будет high.

DeepSeek также сопоставляет другие названия уровней усилий с тремя своими: minimal становится low, а medium и xhigh становятся high. Инструмент, предлагающий пять уровней, на деле даёт два или три. В тестовом прогоне 19 октября AIHubMix принял low, high и max в Chat Completions.

max_tokens. В карточке модели для длинных агентных прогонов рекомендуется не меньше 256K, потому что размышления делят бюджет вывода. При малом лимите сложный шаг может потратить весь бюджет на размышления. Проверяйте finish_reason: "length".

Параметры семплирования. В режиме размышлений temperature, presence_penalty и frequency_penalty принимаются без ошибки и не действуют. Значение top_p ограничено диапазоном 0,95–1,0. Если конвейер опирался на низкую temperature для детерминированного вывода, теперь он её не получит.

5. Агенты с реальными правами

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

  • Проверяйте диффы и логи команд, а не пересказ модели.
  • Запускайте её в песочнице с allowlist команд и требуйте подтверждения для всего разрушительного (удаления, force push, миграции, исходящие сетевые вызовы).

Сам DeepSeek отмечает сильную сторону линейки Flash в задачах безопасности: сентябрьская версия набрала 88,1 в CyberGym по собственной таблице DeepSeek. Это полезно для защитной работы и ещё одна причина жёстко ограничивать её права.

6. Инструменты для разработки

AIHubMix предоставляет deepseek-v4.1-flash-1017 по всем трём протоколам, которые нужны инструментам для разработки. В тестовом прогоне 19 октября Chat Completions, Anthropic Messages (включая двухходовой вызов инструмента) и Responses API вернули 200.

Claude Code (Anthropic Messages). Направьте его на AIHubMix, как в руководстве по Claude Code, и укажите модель:

export ANTHROPIC_BASE_URL="https://aihubmix.com"
export ANTHROPIC_AUTH_TOKEN="$AIHUBMIX_API_KEY"
export ANTHROPIC_MODEL="deepseek-v4.1-flash-1017"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="deepseek-v4.1-flash-1017"
export CLAUDE_CODE_SUBAGENT_MODEL="deepseek-v4.1-flash-1017"
export CLAUDE_CODE_EFFORT_LEVEL="high"
  • Размышления: в тесте запрос Messages без настройки effort пришёл без блока thinking, а с output_config.effort вернул размышления. Задавайте уровень effort, чтобы 1017 рассуждала, и проверяйте логи запросов.
  • Контекст: руководство DeepSeek добавляет к имени модели суффикс [1m] для собственной конечной точки; через AIHubMix этот суффикс не проверялся.
  • Известная проблема: через некоторые роутеры Claude Code терял содержимое размышлений и получал описанную выше ошибку 400 (issue 1378 в claude-code-router). Двухходовой тест инструмента через эндпоинт Messages AIHubMix эту ошибку не воспроизвёл.

Codex (Responses API). Следуйте руководству по Codex CLI: провайдер aihubmix с base_url = "https://aihubmix.com/v1" и wire_api = "responses", а также model = "deepseek-v4.1-flash-1017". Чтобы выбирать её через /model, добавьте её в файл model_catalog_json с context_window, равным 1,000,000.

  • Effort: скрипт каталога из руководства предлагает low, medium и high. По сопоставлению DeepSeek medium и high оба попадают на high DeepSeek, так что реальных уровней два.
  • Известная проблема: новые версии Codex отбрасывают весь каталог, если отсутствует одно обязательное поле. Скрипт из руководства этого избегает.

DeepSeek Harness (Chat Completions). DeepSeek сообщает, что 1017 лучше всего работает с Harness 0.2.1-rc.1 или новее. Добавьте AIHubMix как провайдера, совместимого с OpenAI, следуя руководству по DeepSeek Harness, и добавьте deepseek-v4.1-flash-1017 как модель. Руководство написано для более ранней версии Harness, так что, если интерфейс изменился, проверьте названия полей.

Пятнадцатиминутный smoke-тест. Создайте крошечный репозиторий с одним падающим тестом:

mkdir flash-smoke && cd flash-smoke && git init -q
printf 'def mean(xs):\n    return sum(xs) / len(xs)\n' > stats.py
printf 'from stats import mean\n\ndef test_mean():\n    assert mean([1, 2, 3]) == 2\n\ndef test_empty():\n    assert mean([]) == 0\n' > test_stats.py

Запустите инструмент в этой папке и попросите: «Запусти pytest, исправь упавший тест, изменив только stats.py, и запусти pytest снова». Тест считается пройденным, если:

  • агент делает минимум два вызова инструментов (запуск тестов, правка файла) без ошибки 400;
  • в конце оба теста проходят.
  • в журнале запросов AIHubMix значится deepseek-v4.1-flash-1017, а стоимость сессии составляет максимум несколько центов.

Чеклист миграции

  • Выберите идентификатор модели: deepseek-v4.1-flash-1017 на AIHubMix.
  • В циклах с инструментами добавляйте в историю целые сообщения ассистента, чтобы reasoning_content возвращался в каждом ходе.
  • Повторно запустите набор регрессионных тестов и оценок; фиксируйте модель, дату и поле response model.
  • Проверьте парсеры и интерфейсы на более короткие ответы.
  • Установите effort по умолчанию на high; значение max оставьте для самых сложных задач.
  • Увеличьте max_tokens для ходов агентов и настройте оповещения при finish_reason length.
  • Уберите допущения о детерминированности на основе temperature в режиме thinking.
  • Планируйте пакетные и ночные запуски агентов на внепиковое время.
  • Сохраняйте стабильные префиксы промптов, чтобы получать попадания в кэш.
  • Закладывайте бюджет на вызовы Search и Fetch с 31 октября, если используете серверные инструменты DeepSeek.
  • Запускайте агентов в песочнице с реальными правами и проверяйте diff целиком, а не только сводки.
  • Выполните 15-минутный smoke-тест в каждом используемом инструменте для программирования.

Часто задаваемые вопросы

Нужно ли менять код для использования DeepSeek V4.1 Flash 1017?
В API DeepSeek — нет: deepseek-flash уже указывает на 1017. На AIHubMix измените имя модели на deepseek-v4.1-flash-1017.

Почему я получаю ошибку 400 про reasoning_content?
DeepSeek требует, чтобы reasoning_content каждого предыдущего хода ассистента отправлялся обратно, когда запрос содержит инструменты. Клиенты, которые отбрасывают это поле, падают на вызове после первого вызова инструмента.

Возникает ли ошибка reasoning_content 400 через AIHubMix?
В тестовом прогоне AIHubMix 19 октября 2026 года её не было: ход без reasoning_content вернул 200. Всё равно отправляйте это поле, поскольку это задокументированное правило DeepSeek.

Можно ли по-прежнему использовать сентябрьский V4.1 Flash в API DeepSeek?
Нет. DeepSeek перевела deepseek-flash и старые имена Flash на 1017 и не предлагает закреплённого имени для сентябрьской контрольной точки.

Когда DeepSeek V4.1 Flash дешевле?
Вне интервалов 01:00–04:00 и 06:00–10:00 UTC в будние дни. Все остальные часы, выходные и государственные праздники Китая стоят вдвое дешевле.

Какой уровень effort должны использовать агенты для программирования?
High, это значение по умолчанию. По данным собственной статьи DeepSeek, max увеличивает длительность работы агентов в 1,6–1,8 раза ради небольшого выигрыша.

Работает ли 1017 в Claude Code и Codex через AIHubMix?
Да. AIHubMix предоставляет её по протоколам Anthropic Messages и Responses, которые используют эти инструменты, и оба прошли базовый тест 19 октября 2026 года.

Читайте также: серия DeepSeek V4.1 Flash 1017

Источники