← Все статьи

DeepSeek V4-Pro + Codex: руководство по интеграции через Responses API для кодовых агентов

Как подключить DeepSeek V4-Pro и V4-Flash к Codex и другим кодовым агентам на базе Responses API. Настройка, совместимость, подводные камни и расчёт стоимости — чтобы вы могли решить, стоит ли добавлять DeepSeek в стек агентной разработки.

· TheRouter

DeepSeek API теперь нативно поддерживает формат Responses API. Это значит, что Codex — агентный кодовый ассистент OpenAI — может обращаться к DeepSeek V4-Pro и V4-Flash напрямую, без промежуточных адаптеров. Достаточно указать base URL https://api.deepseek.com, зарегистрировать модели, и агент начинает работать.

Мы протестировали эту связку, потому что агентные кодовые нагрузки затрагивают все ключевые параметры API-провайдера: надёжность вызова инструментов, задержку потоковой передачи, глубину рассуждений и стоимость за один ход. DeepSeek V4-Pro хорошо показывает себя по всем четырём пунктам, особенно по стоимости. В этом руководстве мы разбираем настройку, границы совместимости и подводные камни, которые стоит знать до запуска в продакшен.

OpenAI-совместимость означает, что провайдер предоставляет endpoint chat-completions, чей контракт запроса и ответа достаточно близок к API OpenAI, чтобы немодифицированный вызов OpenAI SDK работал после замены трёх значений: API key, base URL, название модели. Минимальная поверхность на практике —POST /v1/chat/completions с messages, model и потоковым ответом в форме OpenAI.

Начало работы за 3 минуты

Шаг 1. Получите API-ключ. Зарегистрируйтесь на platform.deepseek.com и создайте ключ на странице API Keys. Ключ показывается один раз — сохраните его.

Шаг 2. Зарегистрируйте DeepSeek в Codex. DeepSeek выпустил официальное руководство по интеграции с Codex с готовой конфигурацией моделей. Интеграционный скрипт регистрирует deepseek-v4-flash и deepseek-v4-pro как доступные модели в Codex, задаёт base URL на https://api.deepseek.com и настраивает Codex-специфичные параметры: apply_patch_tool_type, multi_agent_version и политику обрезки.

Если коротко: запустите скрипт от DeepSeek, задайте переменную окружения DEEPSEEK_API_KEY, и обе модели DeepSeek появятся в списке Codex.

Шаг 3. Проведите дымовой тест. Перед тем как дать агенту доступ на запись в репозиторий, убедитесь, что базовый запрос через Responses API проходит:

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_DEEPSEEK_KEY",
    base_url="https://api.deepseek.com",
)

response = client.responses.create(
    model="deepseek-v4-flash",
    instructions="You are a helpful coding assistant.",
    input="Write a Python function that reverses a linked list.",
)

print(response.output_text)

Если пришёл осмысленный ответ — вызов инструментов и потоковая передача тоже будут работать. Responses API на DeepSeek поддерживает тот же поток SSE-событий, что и реализация OpenAI.

Responses API на DeepSeek: что работает

Страница совместимости Responses API у DeepSeek составлена необычно прозрачно: чётко перечислено, что поддерживается, а что нет. Ниже — практическая сводка для сценариев с кодовыми агентами.

Полная поддержка

ФункцияПримечания
modeldeepseek-v4-flash, deepseek-v4-pro, deepseek-v4-flash-vision-exp
inputСтрока или структурированный список input items
instructionsВставляются первым system message
streamПолный поток SSE-событий с семантическими типами
tools (function)Стандартные function-calling инструменты
tool_choicenone, auto, required или конкретный инструмент
reasoningПараметр effort поддерживается (low / high / max)
temperature, top_pСтандартные диапазоны (не действуют в режиме размышления)
max_output_tokensДо 384K
top_logprobsДиапазон 0–20

Частичная поддержка

ФункцияСтатус
tools (web_search)Поддерживается, но code_interpreter и file_search игнорируются
text.formatПолная поддержка, но verbosity не действует
reasoning.summaryПринимается, но summary не генерируется
parallel_tool_callsИгнорируется; параллельный вызов инструментов всегда включён

Не поддерживается

ФункцияВлияние на Codex
previous_response_idAPI DeepSeek stateless — серверная история диалога отсутствует
conversationАналогично; мультитурновое состояние управляется на клиенте
backgroundФоновое выполнение не поддерживается
storeОтвет всегда содержит store: false
truncationЗапросы, превышающие контекстное окно, возвращают 400

Для Codex отсутствие previous_response_id не проблема — Codex управляет состоянием диалога на клиенте. Отсутствие background означает, что все ходы Codex выполняются синхронно, что и так является поведением по умолчанию.

Вызов инструментов для кодовых агентов

Кодовые агенты стоят или падают на надёжности вызова инструментов. DeepSeek V4-Pro и V4-Flash поддерживают полную схему function calling OpenAI через оба интерфейса — Chat Completions и Responses API. Вызов инструментов работает и в режиме размышления, и без него.

Типичный поток вызова инструментов кодового агента выглядит так:

tools = [
    {
        "type": "function",
        "function": {
            "name": "read_file",
            "description": "Read the contents of a file at the given path.",
            "parameters": {
                "type": "object",
                "properties": {
                    "path": {
                        "type": "string",
                        "description": "Absolute path to the file",
                    }
                },
                "required": ["path"],
            },
        },
    },
]

response = client.responses.create(
    model="deepseek-v4-pro",
    instructions="You are a coding agent with file system access.",
    input="Read the contents of /src/main.py and suggest improvements.",
    tools=tools,
)

DeepSeek также поддерживает strict режим (через base URL /beta для Chat Completions), гарантирующий точное соответствие JSON Schema в выводе инструментов. Для агентных потоков, где некорректный формат вызова вызывает каскадные ошибки, эту возможность стоит протестировать. Однако beta-endpoint и Responses API — отдельные пути.

Codex-специфичные типы инструментов

Codex использует проприетарный инструмент apply_patch для записи изменений в файлы. Интеграция DeepSeek настраивает его как "apply_patch_tool_type": "freeform" — модель генерирует содержимое патча в свободном текстовом формате. web_search_tool_type установлен в "text", что соответствует нативной поддержке web search у DeepSeek.

Режим размышления и глубина рассуждений

V4-Pro и V4-Flash по умолчанию работают в режиме размышления. Для задач, требующих глубоких рассуждений (рефакторинг сложной кодовой базы, отладка тонких условий гонки), режим размышления даёт заметно лучшие результаты. Для простых задач (переименование переменной, добавление docstring) он лишь увеличивает задержку без пропорциональной пользы.

Responses API на DeepSeek принимает параметр reasoning.effort с тремя уровнями:

УровеньПоведениеПодходит для
lowБыстро, лёгкое рассуждениеПростые правки, форматирование, шаблонный код
highПо умолчанию; более глубокая цепочка рассужденийБольшинство задач кодирования
maxМаксимальная глубина рассужденийАрхитектурные решения, сложная отладка

Codex отображает эти уровни на собственный селектор глубины рассуждений. Интеграция DeepSeek по умолчанию использует high, все три уровня доступны.

Важный нюанс: reasoning.summary принимается, но DeepSeek не генерирует summary рассуждений. Если ваш агентный пайплайн считывает summary для определения следующего шага, от DeepSeek вы его не получите.

Стоимость: математика расходов на кодовых агентов

Здесь DeepSeek выигрывает убедительнее всего. Кодовые агенты дорого обходятся из-за длинных цепочек вызовов инструментов, каждый с объёмным контекстом на входе. Вот как V4-Pro соотносится с моделями, которые Codex обычно использует:

МодельВход (промах кэша)Вход (попадание)ВыходКонтекст
DeepSeek V4-Pro (off-peak)$0.66 / 1M$0.022 / 1M$1.98 / 1M1M
DeepSeek V4-Pro (peak)$1.32 / 1M$0.044 / 1M$3.96 / 1M1M
DeepSeek V4-Flash (off-peak)$0.22 / 1M$0.007 / 1M$0.66 / 1M1M
DeepSeek V4-Flash (peak)$0.44 / 1M$0.014 / 1M$1.32 / 1M1M

Пиковые часы — 01:00–04:00 и 06:00–10:00 UTC, с понедельника по пятницу. Всё остальное время — off-peak со скидкой 50%.

Цена при попадании в кэш — ключевое число для кодовых агентов. Агентные потоки многократно отправляют один и тот же системный промпт, содержимое файлов и историю диалога. Автоматическое кэширование контекста у DeepSeek означает, что после первого хода значительная часть входных данных попадает в кэш. При $0.022 за миллион токенов (off-peak, V4-Pro, попадание в кэш) можно выполнить сотни ходов агента за стоимость одного некэшированного запроса у ряда конкурентов.

Для чувствительных к затратам нагрузок V4-Flash с off-peak кэшем ($0.007 / 1M input) стоит поразительно мало. Если ваш кодовый агент в основном работает с задачами, не требующими рассуждений уровня Pro, Flash — очевидный выбор по умолчанию.

Ограничения параллелизма

DeepSeek использует лимиты на параллельные соединения, а не RPM/TPM:

МодельЛимит параллельности
deepseek-v4-pro500
deepseek-v4-flash2 500
deepseek-v4-flash-vision-exp2 500

Запрос считается одним параллельным соединением от отправки до завершения ответа модели. Превышение лимита возвращает HTTP 429.

В командной среде, где кодовые агенты работают одновременно, лимит 500 соединений для V4-Pro может стать узким местом. Каждый разработчик с работающим Codex на V4-Pro потребляет одно соединение на активный ход. Если 50 разработчиков одновременно ведут мультитурновые кодовые сессии, вы можете приблизиться к лимиту. DeepSeek предлагает бесплатное расширение ёмкости через форму запроса.

Маршрутизация и fallback

Запускать кодового агента на единственном провайдере рискованно. API DeepSeek сталкивался с замедлениями в пиковые периоды. Слой маршрутизации с автоматическим переключением на резервного провайдера защищает рабочий процесс разработчиков.

Схема простая, потому что DeepSeek использует тот же OpenAI-совместимый протокол. Конфигурация model fallback выглядит так:

# Пример конфигурации маршрутизации
primary:
  provider: deepseek
  model: deepseek-v4-pro
fallback:
  - provider: anthropic
    model: claude-sonnet-5
  - provider: openai
    model: gpt-5.5-pro

Когда DeepSeek возвращает 429 (превышение параллельности) или 5xx (серверная ошибка), слой маршрутизации повторяет запрос на следующем провайдере. Кодовый агент не видит сбоя, потому что формат запроса и ответа идентичен.

Это же позволяет выполнять cost-aware маршрутизацию. Простые задачи направляются на V4-Flash (самый дешёвый), сложные рассуждения — на V4-Pro, при недоступности DeepSeek — fallback на Claude или GPT. На странице провайдера DeepSeek на TheRouter — актуальный список моделей и статус маршрутизации.

Чек-лист дымового теста перед продакшеном

Прежде чем давать кодовому агенту на DeepSeek доступ на запись в продакшен-репозиторий, проверьте каждый пункт:

  1. Базовое дополнение. Отправьте простой промпт и убедитесь в адекватном ответе.
  2. Вызов инструментов. Определите тестовый инструмент, отправьте промпт, который должен его вызвать, и проверьте, что вызов содержит корректный JSON.
  3. Потоковая передача. Включите stream=True и убедитесь в получении непрерывных событий response.output_text.delta.
  4. Режим размышления. Отправьте сложный промпт с reasoning={"effort": "max"} и проверьте, что модель генерирует цепочку рассуждений.
  5. Длинный контекст. Отправьте запрос с большим файлом (50K+ токенов кода) и убедитесь в отсутствии обрезки или ошибки.
  6. Обработка ошибок. Намеренно превысьте лимит параллельности и убедитесь, что ваша fallback-логика ловит 429.
# Дымовой тест вызова инструментов
response = client.responses.create(
    model="deepseek-v4-pro",
    instructions="You are a coding agent.",
    input="What files are in the current directory?",
    tools=[{
        "type": "function",
        "function": {
            "name": "list_directory",
            "description": "List files in a directory.",
            "parameters": {
                "type": "object",
                "properties": {
                    "path": {"type": "string"}
                },
                "required": ["path"],
            },
        },
    }],
)

# Проверяем, что модель выполнила вызов инструмента
for item in response.output:
    if item.type == "function_call":
        print(f"Tool call: {item.name}({item.arguments})")

Распространённые ошибки и способы их устранения

ОшибкаПричинаРешение
400: input_image must have image_url or file_idНедостающее обязательное поле при вводе изображенияИспользуйте deepseek-v4-flash-vision-exp для изображений; указывайте image_url или file_id
400: context length exceededЗапрос превышает окно в 1M токеновСократите историю диалога; DeepSeek не поддерживает параметр truncation
429: rate limit exceededДостигнут лимит параллельностиРеализуйте retry с экспоненциальным back-off; настройте fallback-провайдера
reasoning.summary пустойDeepSeek принимает параметр, но не генерирует summaryНе полагайтесь на reasoning summary в управлении потоком; считывайте выход напрямую
previous_response_id не работаетAPI DeepSeek statelessУправляйте состоянием диалога на клиенте (Codex уже так делает)

Когда DeepSeek V4-Pro подходит для вашего кодового стека

Выбирайте V4-Pro, когда:

  • Стоимость — главный приоритет. Off-peak цены V4-Pro значительно ниже, чем у большинства frontier-моделей, а высокий процент попаданий в кэш на агентных нагрузках усиливает экономию.
  • Нужны глубокие рассуждения, но не абсолютный потолок. Режим размышления V4-Pro уверенно справляется со сложными рефакторингами, отладкой и архитектурными вопросами.
  • Ваша команда работает в off-peak часы. Если команда в Азиатско-Тихоокеанском регионе работает в стандартное время, вы естественным образом попадаете в окно off-peak (всё, кроме UTC 01:00–04:00 и 06:00–10:00).

Выбирайте V4-Flash, когда:

  • Пропускная способность важнее глубины. 2 500 параллельных соединений Flash и более низкая стоимость делают его лучшим выбором для частых, менее сложных задач.
  • Вы строите мультимодельный пайплайн. Простые задачи — на Flash, сложные — на Pro.

Рассмотрите другого провайдера, когда:

  • Нужно фоновое выполнение. DeepSeek не поддерживает параметр background.
  • Нужно серверное состояние диалога. Параметры previous_response_id и conversation не поддерживаются.
  • 500 параллельных соединений на Pro недостаточно. Запросите расширение ёмкости или используйте слой маршрутизации для распределения нагрузки между провайдерами.

Дополнительные материалы

Модели, упомянутые в статье

Помощь и контакты