Быстрый старт: первый запрос к DeepSeek API
Минимум действий, чтобы увидеть ответ модели: получить ключ, отправить один POST-запрос и понять, что вернулось в JSON. Всё, что нужно, — терминал с curl и ключ.
API-ключ, доступ в интернет и любая среда с HTTP-клиентом. Адрес — https://api.deepseek.com, основной метод — POST /chat/completions. Название модели: deepseek-flash или deepseek-v4-pro.
-
Получите API-ключ
Ключ создаётся в личном кабинете провайдера и выглядит как длинная строка. Не вставляйте его в код: положите в переменную окружения, чтобы ключ не попал в репозиторий и логи.
bash export DEEPSEEK_API_KEY="sk-ваш-ключ"В Windows PowerShell то же самое делается командой
$env:DEEPSEEK_API_KEY = "sk-ваш-ключ"в текущей сессии. Проверить, что доступ работает и ключ принят, можно запросом списка моделей:GET https://api.deepseek.com/models. -
Отправьте первый запрос
Ниже официальный пример из документации DeepSeek. Модель —
deepseek-flash, режим рассуждений включён явно, потоковая выдача выключена.bash curl https://api.deepseek.com/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${DEEPSEEK_API_KEY}" \ -d '{ "model": "deepseek-flash", "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Hello!"} ], "thinking": {"type": "enabled"}, "reasoning_effort": "high", "stream": false }'Если ответ пришёл, значит ключ верный, баланс положительный и модель доступна. Дальше можно уменьшать объём запроса: без явного
thinkingрежим рассуждений всё равно включён по умолчанию, аreasoning_effort: "high"— тоже значение по умолчанию. -
Разберите ответ
Ответ — обычный JSON. Текст модели лежит в
choices[0].message.content, цепочка рассуждений — вreasoning_contentрядом с ним, расход токенов — в объектеusage.json { "model": "deepseek-flash", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "Привет! Я языковая модель DeepSeek.", "reasoning_content": "Запрос на приветствие, отвечу коротко." }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 25, "completion_tokens": 92, "total_tokens": 117, "prompt_cache_hit_tokens": 0, "prompt_cache_miss_tokens": 25, "prompt_tokens_details": {"cached_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 48} } }
Тот же запрос на Python
Официальный способ — библиотека openai версии 1.x: она работает с DeepSeek как с обычным OpenAI-совместимым сервером. Достаточно указать base_url и имя модели.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url="https://api.deepseek.com",
)
response = client.chat.completions.create(
model="deepseek-flash",
messages=[
{"role": "system", "content": "Ты — полезный ассистент."},
{"role": "user", "content": "Привет! Представься в двух предложениях."},
],
stream=False,
)
message = response.choices[0].message
print("Ответ:", message.content)
print("Рассуждения:", getattr(message, "reasoning_content", None))
print("Токены:", response.usage.total_tokens)
Режим рассуждений включён по умолчанию и заметно увеличивает расход токенов. Если рассуждения не нужны, они отключаются через extra_body — параметр thinking не входит в стандартную схему OpenAI SDK.
response = client.chat.completions.create(
model="deepseek-flash",
messages=[{"role": "user", "content": "Сколько будет 17 * 24?"}],
extra_body={"thinking": {"type": "disabled"}},
)
print(response.choices[0].message.content)
Нужен API-ключ сегодня
Регистрация по email или Telegram занимает пару минут, оплата идёт в рублях, VPN не нужен. Один ключ работает и с DeepSeek, и с другими моделями.
Многоходовой диалог
Состояние диалога хранит клиент: каждое новое сообщение добавляется в массив messages. Официальный паттерн — вернуть в историю объект сообщения ассистента целиком, а не только текст.
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["DEEPSEEK_API_KEY"], base_url="https://api.deepseek.com")
messages = [{"role": "user", "content": "What's the highest mountain in the world?"}]
response = client.chat.completions.create(model="deepseek-flash", messages=messages)
messages.append(response.choices[0].message)
При передаче массива tools поле reasoning_content обязательно возвращать назад во всех последующих запросах диалога, иначе сервер отвечает HTTP 400. Без tools это поле передавать не нужно — оно игнорируется.
Что означает каждое поле ответа
| Поле | Что содержит |
|---|---|
choices[0].message.content |
Готовый текст ответа. Именно это показывают пользователю. |
choices[0].message.reasoning_content |
Цепочка рассуждений модели. Приходит на одном уровне с content, когда thinking включён. |
choices[0].finish_reason |
Причина остановки: stop, length, content_filter, tool_calls, insufficient_system_resource или aborted. |
usage.prompt_tokens |
Все входные токены. Равны сумме prompt_cache_hit_tokens и prompt_cache_miss_tokens. |
usage.completion_tokens |
Все выходные токены, включая рассуждения из completion_tokens_details.reasoning_tokens. |
usage.prompt_cache_hit_tokens |
Токены входа, попавшие в контекстный кэш. Тарифицируются в десятки раз дешевле — см. разбор цен. |
usage.total_tokens |
Сумма входа и выхода — удобно для подсчёта стоимости запроса. |
Подсчитать деньги по этим полям просто: токены × цена / 1 000 000 отдельно для входа и выхода. Готовые примеры — на странице «Цены и расчёт».
Первые ошибки: 401, 402, 422
Три кода, которые чаще всего встречаются на старте. Полный список — в разделе «Ошибки и лимиты».
| Код | Значение | Что делать |
|---|---|---|
| 401 | Authentication Fails | Неверный API-ключ. Проверьте, что переменная окружения подставилась в заголовок, нет лишних пробелов и кавычек, что ключ не отозван. |
| 402 | Insufficient Balance | Закончился баланс. Проверьте состояние через GET /user/balance и пополните счёт. |
| 422 | Invalid Parameters | Параметры запроса не приняты. Сверьте типы и допустимые значения со справочником параметров. Ошибки в структуре тела запроса — например, stream_options.include_usage без stream: true — приходят отдельным кодом 400. |
Структура тела ошибки в официальной документации не описана: разбирать ответ безопаснее по HTTP-коду, а не по конкретному полю JSON. Заголовка Retry-After и формальной политики backoff тоже нет — пауза перед повтором при 500 и 503 остаётся рекомендацией практики, а не требованием API.
Нужен API-ключ сегодня
Регистрация по email или Telegram занимает пару минут, оплата идёт в рублях, VPN не нужен. Один ключ работает и с DeepSeek, и с другими моделями.
Читайте также
- Модели и параметры Какие модели принимает API, сколько токенов в контексте и какие параметры поддерживаются.
-
Режим рассуждений
Как управлять thinking и
reasoning_effortи почему при включённых рассуждениях не работают некоторые параметры. - Стриминг и токены Как получать ответ по частям и как считать токены до отправки запроса.
- Примеры на cURL Проверка ключа, потоковая выдача и список моделей в командной строке.