Назад в блог

Начало работыИнструкция

Первый запрос к CheapTokens через HTTPie: ключ в env, = и :=

Одна читаемая команда http: чат-запрос с ключом из переменной окружения и понятное объяснение, где в ответе текст и расход токенов.

Автор: CheapTokens TeamОпубликовано 4 мин чтения

Терминал с командой http, переменной с ключом и полями JSON
Содержание
  1. Что на самом деле делают = и :=
  2. Где в ответе текст
  3. Другая модель: меняем одно поле
  4. Сколько стоит один тестовый запрос
  5. Если не работает

Нужно проверить, что ключ работает и id модели верный, причём одной строкой. Команда http из HTTPie делает это с куда меньшим числом кавычек, чем curl: вы вводите поля, а JSON она собирает сама. Вот весь запрос, а ниже разберём каждую часть.

bash
export CHEAPTOKENS_API_KEY="paste-your-key-here"

http --body -A bearer -a "$CHEAPTOKENS_API_KEY" \
  POST https://api.cheaptokens.dev/v1/chat/completions \
  model=deepseek-ai/DeepSeek-V4-Flash-0731 \
  max_tokens:=200 \
  'messages:=[{"role":"user","content":"In one sentence, what is a token?"}]'

API совместим с OpenAI, поэтому базовый адрес — https://api.cheaptokens.dev/v1, а чат-запросы идут на /chat/completions под ним. Id модели берите полный: deepseek-ai/DeepSeek-V4-Flash-0731 (короткое имя из таблиц цен API не принимает). Если ключ вы раньше нигде не хранили, сначала прочитайте, как безопасно хранить API-ключ: строка с export попадёт в историю оболочки, так что постоянное место для ключа — файл профиля или менеджер секретов.

Запрос в терминале: bearer-ключ из переменной, model строкой, max_tokens числом, messages сырым массивом
Тот же запрос так, как он выглядит в терминале

Что на самом деле делают = и :=#

Это единственное, что в HTTPie нужно выучить. В документации HTTPie по JSON (версия 3.2.4 от 1 ноября 2024, прочитана 9 ноября 2026) сказано: = задаёт строковое поле, а := — сырое JSON-значение: число, булево, массив или объект. Поля, заданные так, уходят JSON-телом по умолчанию, так что заголовок Content-Type добавлять не нужно.

В нашем запросе получается три разных формы:

  • model=deepseek-ai/DeepSeek-V4-Flash-0731 — строка, поэтому =.
  • max_tokens:=200 — число, поэтому :=. С = уйдёт строка "200".
  • messages:=[…] — массив объектов, снова :=, а значение берём в одинарные кавычки, чтобы оболочка не трогала двойные внутри.

Ещё в документации сказано, что тело из stdin нельзя совмещать с полями в командной строке, так что выберите один способ. Для первой проверки поля короче и их проще править.

Быстрая проверка

Что отправит max_tokens=200 (с обычным =)?

Показать ответ

Ответ: Строку "200"

= всегда делает строку. Для числа нужно :=, то есть max_tokens:=200.

Где в ответе текст#

Ответ приходит в формате chat completions от OpenAI. Искать нужно три вещи, и лежат они в разных местах:

json
{
  "choices": [
    {
      "message": { "role": "assistant", "content": "…текст ответа…" },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": …, "completion_tokens": …, "total_tokens": … }
}

Текст ответа — choices[0].message.content. finish_reason лежит рядом, в том же элементе choices, а usage — на верхнем уровне. usage показывает, сколько токенов вы отправили (prompt_tokens) и сколько написала модель (completion_tokens) — по ним удобно прикинуть стоимость запроса.

Где смотреть в ответе: choices, message.content, finish_reason и usage
Три поля, которые стоит прочитать в каждом ответе

Если нужен только текст, пропустите тело через jq:

bash
http --body -A bearer -a "$CHEAPTOKENS_API_KEY" \
  POST https://api.cheaptokens.dev/v1/chat/completions \
  model=deepseek-ai/DeepSeek-V4-Flash-0731 \
  max_tokens:=200 \
  'messages:=[{"role":"user","content":"In one sentence, what is a token?"}]' \
  | jq -r '.choices[0].message.content'
Попробуйте самиПопробуйте: сделайте лимит слишком маленьким и прочитайте finish_reasonПоказать ответ

Замените max_tokens:=200 на max_tokens:=5 и запустите снова. Ответ оборвётся, а finish_reason будет length, а не stop: модель остановил лимит, а не конец мысли. Что с этим делать, разобрано в статье почему ответ обрывается.

Другая модель: меняем одно поле#

Модель — это одна строка, так что попробовать другую можно правкой одного слова. Оба id ниже доступны в CheapTokens с одним балансом: у DeepSeek-V4-Flash контекст 380K и до 32 768 токенов в ответе, у GLM-5.3-Flash — контекст 390K и до 8 192.

Один запрос, две модели

DeepSeek-V4-Flash

bash
http --body -A bearer -a "$CHEAPTOKENS_API_KEY" \
  POST https://api.cheaptokens.dev/v1/chat/completions \
  model=deepseek-ai/DeepSeek-V4-Flash-0731 \
  max_tokens:=200 \
  'messages:=[{"role":"user","content":"Name three uses of a token limit."}]'

GLM-5.3-Flash

bash
http --body -A bearer -a "$CHEAPTOKENS_API_KEY" \
  POST https://api.cheaptokens.dev/v1/chat/completions \
  model=zai-org/GLM-5.3-Flash \
  max_tokens:=200 \
  'messages:=[{"role":"user","content":"Name three uses of a token limit."}]'

Не уверены в id? Получите список моделей через GET /v1/models и скопируйте точную строку.

Сколько стоит один тестовый запрос#

Короткий вопрос вроде нашего — маленький запрос по токенам. Допустим, вопрос занимает около 100 токенов, а ответ — около 150: такой запрос обойдётся в $0.000017. А тысяча таких запросов выглядит так, с учётом входа и выхода вместе:

Модель За запрос 1 000 запросов OpenRouter, 1 000 запросов
GLM-5.3-Flash $0.000008 $0.008 $0.0158
DeepSeek-V4-Flash $0.000017 $0.0165 $0.028
MiniMax-M2.7 $0.000028 $0.0275 $0.33

100 входных и 150 выходных токенов на запрос. Цены за 1M токенов актуальны и меняются вместе с нашими тарифами; столбец OpenRouter показывает справочные цены для той же нагрузки.

В сумме, с учётом входа и выхода, DeepSeek-V4-Flash получается дешевле OpenRouter, при этом цена одна и та же в любое время суток, без пиковых часов. Актуальные тарифы по всем моделям — на странице цен.

Если не работает#

  • Вы написали messages=[…] с обычным =. Массив уходит строкой, а не списком сообщений. Нужен := и одинарные кавычки вокруг всего значения.
  • JSON внутри := невалиден. У каждого ключа и строки должны быть двойные кавычки, а внешние — одинарные. Если правите текст сообщения, следите, чтобы кавычки были парными.
  • Ключ пустой. echo ${#CHEAPTOKENS_API_KEY} печатает длину, не показывая сам ключ; 0 значит, что переменная в этом терминале не задана.
  • В поле model короткое имя. Нужен полный deepseek-ai/DeepSeek-V4-Flash-0731. Про ответы 401 и 404 — в статье неверный ключ, base URL или id модели.
  • Вы взяли --session. В документации HTTPie по аутентификации сказано, что файлы сессий хранят учётные данные открытым текстом, поэтому держите ключ в окружении и не добавляйте --session к этой команде.

Если флаг ведёт себя не так, как описано выше, проверьте версию: http --version. Предпочитаете Python? Тот же запрос без SDK разобран в статье первый запрос на Python через requests. Полное описание API — в документации CheapTokens.