DeepSeek API или OpenAI API: сравнение для разработчика
DeepSeek API сделан совместимым с форматом OpenAI, поэтому переход между провайдерами чаще всего сводится к смене адреса и имени модели. Но есть детали, которые ломают наивную замену: имена моделей, правила кэша ввода, режим рассуждений и отдельный Anthropic-совместимый эндпоинт. Разберём их по порядку.
Что совпадает
Совместимость здесь не маркетинговая, а техническая — одинаковый контракт запроса и ответа:
- Формат Chat Completions. Тот же
POST /chat/completionsс массивомmessages, тем же набором ролей и той же структурой ответа: текст вchoices[0].message.content, причина остановки вfinish_reason, расход в объектеusage. - Официальный OpenAI SDK. Библиотека
openaiдля Python и JavaScript работает без правок: достаточно передать другойbase_urlи ключ. - Tool calls. Инструменты описываются тем же массивом
toolsсtype: "function", ответ приходит вmessage.tool_calls, результат возвращается сообщением с рольюtool. - JSON-режим. Параметр
response_format: {"type": "json_object"}и требование упомянуть JSON в промпте. - Стриминг.
stream: trueи SSE-чанки, плюсstream_options.include_usageдля получения расхода в последнем чанке. - Responses API. У DeepSeek есть собственный эндпоинт
POST /responses, то есть новый стиль взаимодействия тоже поддержан.
На практике это означает, что абстракция над клиентом, написанная под OpenAI, переносится целиком. Исключения собраны в таблице ниже.
Чем отличается
Имена моделей
Главное отличие, которое ломает код первым: строки model не совпадают. В DeepSeek API два актуальных имени — deepseek-flash (DeepSeek-V4.1-Flash) и deepseek-v4-pro (DeepSeek-V4-Pro-0813). Никакого маппинга «похожих» названий нет, поэтому имя модели нужно менять явно во всех местах конфигурации.
Цены за 1M токенов
Прайс считается за 1M токенов отдельно для ввода и вывода, но построен иначе: у DeepSeek внутри ввода разделены токены, попавшие в кэш ($0.003 за 1M у deepseek-flash), и токены без кэша ($0.15 за 1M), а также действуют часы пик с двойной ценой. Кроме того, есть отдельная цена за изображения — верхняя граница 1024 токена на изображение. Поэтому переносить чужую табличную цену на свой сценарий нельзя: считайте по фактическому usage.
Правило кэша ввода
В DeepSeek «Context Caching on Disk» включён по умолчанию для всех, управлять им не нужно, и хит возможен только при полном совпадении с сохранённым префиксом. Единицы кэша персистятся на границах запроса и при обнаружении общего префикса у нескольких запросов. Кэш влияет только на цену: попадание статусом видно в usage.prompt_cache_hit_tokens и prompt_cache_miss_tokens, а prompt_tokens_details.cached_tokens равен числу попавших в кэш токенов. Работает это best-effort: 100% попаданий никто не гарантирует, и сам вывод всё равно генерируется заново.
Режим рассуждений и поле reasoning_content
У DeepSeek рассуждения — не отдельное семейство моделей, а режим: он включён по умолчанию, управляется объектом {"thinking": {"type": "enabled" | "disabled"}} и параметром reasoning_effort (none, low, high, max). Цепочка рассуждений приходит в поле reasoning_content на одном уровне с content. В OpenAI SDK этого поля нет, поэтому читать его безопаснее через getattr(message, "reasoning_content", None).
Здесь же — самое неприятное отличие для тех, кто пользуется инструментами: если запрос содержит tools, reasoning_content обязательно нужно возвращать назад во всех последующих turn, иначе API вернёт 400. Без tools поле можно не передавать — оно игнорируется. И ещё: в режиме рассуждений не действуют temperature, presence_penalty и frequency_penalty, а tool_choice: "required" приводит к ошибке 400.
Anthropic-совместимый эндпоинт
Дополнительно у DeepSeek есть Anthropic-совместимый адрес https://api.deepseek.com/anthropic с сообщениями через POST /anthropic/v1/messages. Авторизация — Authorization: Bearer или x-api-key. Маппинг моделей такой: claude-opus* уходит в deepseek-v4-pro, а claude-haiku*, claude-sonnet* и любое неизвестное имя — в deepseek-flash. Это позволяет подключать инструменты, написанные под Anthropic SDK, без переписывания на OpenAI-формат.
Нужен API-ключ сегодня
Регистрация по email или Telegram занимает пару минут, оплата идёт в рублях, VPN не нужен. Один ключ работает и с DeepSeek, и с другими моделями.
Таблица соответствия: как было в OpenAI → как стало в DeepSeek
| Что | Как было в OpenAI | Как стало в DeepSeek |
|---|---|---|
| Имя модели | Строка вида gpt-... |
deepseek-flash или deepseek-v4-pro |
| Базовый адрес | https://api.openai.com/v1 |
https://api.deepseek.com |
| Ключ | Переменная с ключом OpenAI | Ключ из кабинета DeepSeek, sk-... |
| SDK | openai |
Тот же openai, меняется только base_url |
| Режим рассуждений | Отдельная модель или параметр reasoning | thinking + reasoning_effort; включён по умолчанию |
| Текст рассуждений | Не приходит отдельным полем | message.reasoning_content |
| Кэш ввода | Механизм кэша устроен иначе — сверяйте по документации OpenAI | Включён по умолчанию, попадание дешевле в десятки раз и видно в usage |
| Ответы в новом стиле | Responses API | POST https://api.deepseek.com/responses |
| Anthropic-формат | Не поддерживается | https://api.deepseek.com/anthropic |
| Строгие схемы инструментов | Параметр strict у функции |
strict доступен через https://api.deepseek.com/beta |
| Устаревшие параметры | frequency_penalty, presence_penalty |
Не поддерживаются: принимаются, но эффекта не дают |
Пример миграции на Python
Если код уже написан под OpenAI SDK, миграция — это замена двух строк: адреса и имени модели. Ключ меняется на ключ DeepSeek.
client = OpenAI(
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url="https://api.deepseek.com", # было: https://api.openai.com/v1
)
response = client.chat.completions.create(
model="deepseek-flash", # было: имя модели OpenAI
messages=[{"role": "user", "content": "Привет!"}],
)
Остальной код — обработка choices, стриминг, цикл вызова инструментов — остаётся прежним. Единственное, что стоит добавить, если вы используете инструменты: сохранять объект сообщения целиком в историю, чтобы reasoning_content возвращался в следующий запрос. Подробный разбор такого цикла есть на странице «Python и OpenAI SDK».
Старые имена deepseek-chat и deepseek-reasoner были отключены 24 июля 2026 года. Если код мигрирует из старой кодовой базы или из чужого примера, убедитесь, что там уже стоят deepseek-flash или deepseek-v4-pro, — иначе первый же запрос вернёт ошибку.
Если нужны оба провайдера
Держать два ключа и два адреса не обязательно. OpenAI-совместимый агрегатор, например AITUNNEL, даёт единый base_url https://api.aitunnel.ru/v1 и один ключ sk-aitunnel-... для DeepSeek и других популярных моделей: переключение между провайдерами сводится к смене строки model. Имена моделей у агрегатора свои — точный идентификатор смотрите в каталоге сервиса. Такой же подход работает и в обратную сторону: код остаётся OpenAI-совместимым, а меняется только адрес.
# Один ключ и один адрес для нескольких провайдеров
client = OpenAI(
api_key=os.environ["AITUNNEL_API_KEY"], # sk-aitunnel-...
base_url="https://api.aitunnel.ru/v1",
)
# Провайдер выбирается именем модели из каталога сервиса
answer = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[{"role": "user", "content": "Привет!"}],
)
Если проект написан под Anthropic SDK, у агрегатора адрес задаётся без /v1: ANTHROPIC_BASE_URL="https://api.aitunnel.ru" и ANTHROPIC_AUTH_TOKEN="sk-aitunnel-...". У официального DeepSeek аналогичную роль играет https://api.deepseek.com/anthropic. В обоих случаях код приложения не переписывается.
Критерии выбора
Однозначного ответа «что лучше» не существует: сравнивать нужно под конкретный проект. Вот критерии, по которым стоит принимать решение.
| Критерий | О чём спросить себя |
|---|---|
| Способ оплаты | Проходит ли оплата из вашей юрисдикции без посредников и как оформляются закрывающие документы |
| Итоговая стоимость | Какая доля входа попадает в кэш и в какие часы идёт основная нагрузка |
| Совместимость кода | Достаточно ли сменить base_url и model или потребуется переписывать слой вызовов |
| Нужные функции | Есть ли vision, JSON-режим, tool calls, Responses API и Anthropic-совместимый адрес |
| Лимиты | Хватает ли concurrency: 2500 для flash, 500 для v4-pro |
| Качество на ваших задачах | Какая доля ответов требует правки вручную на вашем наборе запросов |
| Требования к данным | Что происходит с текстами запросов и нужно ли маскировать персональные данные |
Практический порядок действий простой: соберите 20–30 реальных запросов, прогоните их через оба варианта, сравните долю приемлемых ответов и фактический usage. Цена и качество на вашем наборе данных скажут больше, чем сравнение прайс-листов.
Нужен API-ключ сегодня
Регистрация по email или Telegram занимает пару минут, оплата идёт в рублях, VPN не нужен. Один ключ работает и с DeepSeek, и с другими моделями.
Читайте также
- deepseek-flash или deepseek-v4-pro Какая из двух моделей DeepSeek подходит под вашу задачу и как не переплатить за токены.
-
Модели и параметры
Все параметры Chat Completions, включая
thinking,reasoning_effortи работу с инструментами. - Примеры на Python Рабочий код с OpenAI SDK: стриминг, JSON, инструменты, расчёт стоимости и повторы при ошибках.
- Быстрый старт Первый запрос к DeepSeek API и разбор полей ответа.