curl 7.75+, Python 3.9+ и пакет openai (>= 1.0), аккаунт у провайдера Kimi с API-ключом и положительным балансом, доступ к странице документации провайдера (ID модели, базовый URL, тарифы), любой OpenAI-совместимый клиент (n8n, Claude Code, Cursor, Chatbox).Точных цен и идентификатора модели Kimi K3.1 Pro в исходных материалах канала нет — в гайде они вынесены в плейсхолдеры <id-модели-из-документации> и <цена-за-1M-токенов>: подставьте значения из документации провайдера, прежде чем считать бюджет.

curl — проверка: curl --version (первая строка вида curl 8.x.x).python3 --version. Пакет ставится командой pip install --upgrade openai.Authorization; она даёт доступ к платным запросам, поэтому хранится только в переменных окружения./v1), ID модели и цену за 1M входных/выходных токенов. Токен — единица измерения текста для модели, примерно 0,75 слова.Что сделать: создайте ключ в личном кабинете провайдера и сохраните три значения в переменные окружения, чтобы не переписывать их в каждом запросе.
Зачем: один и тот же набор переменных используют и curl, и Python-скрипт, и конфиг клиента — при смене ключа правится одна строка.
export KIMI_API_KEY="<ваш-ключ>"
export KIMI_BASE_URL="https://<api-хоста-провайдера>/v1"
export KIMI_MODEL="<id-модели-из-документации>"
В PowerShell те же значения задаются так (для текущей сессии и постоянно):
$env:KIMI_API_KEY = "<ваш-ключ>"
setx KIMI_API_KEY "<ваш-ключ>"
setx KIMI_BASE_URL "https://<api-хоста-провайдера>/v1"
Чтобы переменные жили после перезапуска терминала, добавьте export-строки в ~/.bashrc или ~/.zshrc и выполните source ~/.bashrc.
Как проверить: выведите длину ключа и адреса — так видно, что переменная не пустая и в неё не попали кавычки.
printf 'key_len=%s\nbase=%s\nmodel=%s\n' "${#KIMI_API_KEY}" "$KIMI_BASE_URL" "$KIMI_MODEL"
Ожидаемый вывод (число будет своим):
key_len=48
base=https://<api-хоста-провайдера>/v1
model=<id-модели-из-документации>
Если key_len=0 — переменная не установлена в этом окне терминала; если длина равна длине строки с кавычками, ключ скопирован вместе с ними.
Пример: запрос списка доступных моделей — он же подтверждает, что ключ и базовый URL верны, и показывает точный ID модели.
curl -s "$KIMI_BASE_URL/models" -H "Authorization: Bearer $KIMI_API_KEY" | python3 -m json.tool
Успех — JSON с массивом data, где у каждой модели есть поля id и object. Скопируйте id нужной модели в KIMI_MODEL. Почему это работает: эндпоинт /models не расходует токены, поэтому его безопасно вызывать для диагностики.
Чек-лист перед следующим шагом:
KIMI_BASE_URL оканчивается на /v1/models или из документации.env в .gitignore)
Что сделать: отправьте минимальный запрос к /chat/completions, затем перенесите те же три значения в клиент.
Зачем: формат запроса и ответа совпадает с OpenAI API, поэтому один и тот же код работает и с curl, и с официальным SDK, и с любым клиентом, где есть поля «Base URL» и «API Key».
curl -s "$KIMI_BASE_URL/chat/completions" \
-H "Authorization: Bearer $KIMI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "'"$KIMI_MODEL"'",
"messages": [{"role": "user", "content": "Ответь одним словом: работает?"}],
"max_tokens": 32,
"temperature": 0
}'
max_tokens ограничивает длину ответа (32 токена — примерно одно-два предложения), temperature: 0 убирает случайность — так проще сравнивать ответы при проверке.
Тот же вызов через Python SDK:
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["KIMI_API_KEY"],
base_url=os.environ["KIMI_BASE_URL"],
)
resp = client.chat.completions.create(
model=os.environ["KIMI_MODEL"],
messages=[{"role": "user", "content": "Ответь одним словом: работает?"}],
max_tokens=32,
)
print(resp.choices[0].message.content)
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)
Успешный запуск печатает текст ответа и два числа, например:
работает
18 5
usage — это и есть счётчик расходов: стоимость запроса = prompt_tokens × <цена-за-1M-токенов> / 1 000 000 + completion_tokens × цена выходных токенов / 1 000 000.
Настройка в клиенте. В GUI-клиентах (n8n, Chatbox, Cursor, Claude Code) заполняются те же четыре поля:
| Поле в клиенте | Значение | Откуда взять |
|---|---|---|
| Provider / API type | OpenAI-compatible | настройки клиента |
| Base URL | `https://<api-хоста-провайдера>/v1` | документация провайдера |
| API Key | `<ваш-ключ>` | личный кабинет |
| Model | `<id-модели-из-документации>` | ответ `/models` |
| Max tokens / Context | лимит из документации | документация провайдера |
Конфиг в виде YAML, если клиент читает файл настроек:
provider: openai-compatible
base_url: https://<api-хоста-провайдера>/v1
api_key_env: KIMI_API_KEY
model: <id-модели-из-документации>
max_tokens: 1024
Пример: в интерфейсе n8n узел OpenAI создаётся с «Base URL» = ваш адрес, после чего узел возвращает ответ модели без дополнительного кода. Если нужно переключать несколько провайдеров за одним адресом, схема с роутером разобрана в гайде Как объединить несколько ИИ-провайдеров в один API, а вариант запуска такой модели внутри Claude Code — в материале Как подключить локальную модель к Claude Code.
Как проверить: сохраните скрипт в check_kimi.py и запустите.
python3 check_kimi.py
Признак успеха: напечатан текст ответа и два неотрицательных числа в usage. Если клиент отдаёт пустой ответ — сравните его Base URL с рабочим $KIMI_BASE_URL: лишний или недостающий /v1 в конце адреса — самая частая причина 404.

Что сделать: прогоните три проверки — короткий ответ, длинный вход и повторный запрос — и зафиксируйте расход по usage.
Зачем: короткий запрос проверяет авторизацию, длинный — реальный лимит контекста (сколько токенов модель принимает за один раз), повторный — стабильность и корректность тарификации.
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["KIMI_API_KEY"], base_url=os.environ["KIMI_BASE_URL"])
long_text = "Проверка контекста. " * 200
resp = client.chat.completions.create(
model=os.environ["KIMI_MODEL"],
messages=[{"role": "user", "content": long_text + " Сколько слов в предыдущем предложении?"}],
max_tokens=64,
)
print(resp.choices[0].message.content)
print("prompt_tokens:", resp.usage.prompt_tokens)
Как проверить: prompt_tokens должен быть заметно больше, чем в Шаге 2, а ответ — осмысленным. Если приходит ошибка про длину контекста, уменьшите long_text вдвое: значит, вы упёрлись в лимит модели, а не в ошибку ключа. Итоговый расход сверьте в разделе «Биллинг» личного кабинета — задержка отображения зависит от провайдера, сверьтесь с документацией.
Финальный результат: в терминале воспроизводится ответ модели, в клиенте с теми же тремя настройками — тоже, суммы в биллинге совпадают с расчётом по usage.
Проблема. Запрос возвращает 401 сразу после копирования ключа
{"error":{"message":"Invalid API key provided","type":"invalid_request_error","code":"invalid_api_key"}} (формулировка у провайдера может отличаться).printf '%q\n' "$KIMI_API_KEY" — лишние \n и кавычки будут видны. Перевыпустите ключ в кабинете и задайте заново: export KIMI_API_KEY="<ваш-ключ>". Если ключ хранится в .env, убедитесь, что клиент действительно читает этот файл.Проблема. Ошибка 404 на /chat/completions
{"error":{"message":"The model '<id>' does not exist or you do not have access to it.","type":"invalid_request_error","code":"model_not_found"}}./v1 (клиент дописывает свой путь и получает /chat/completions без версии).curl -s "$KIMI_BASE_URL/models" -H "Authorization: Bearer $KIMI_API_KEY" и скопируйте id из ответа дословно — регистр и дефисы важны. Base URL приведите к виду https://<api-хоста-провайдера>/v1.Проблема. Ответ приходит, но запросы падают при массовой отправке
{"error":{"message":"Rate limit reached for requests","type":"requests","code":"rate_limit_exceeded"}} или HTTP 429.time.sleep(1)) и повтор с нарастающей задержкой; конкретные лимиты вашего тарифа сверьте с документацией. Ошибку про кредиты (insufficient_quota) лечит пополнение баланса, а не повтор.Три значения — базовый URL, ключ и ID модели — превращают Kimi K3.1 Pro в обычного OpenAI-совместимого провайдера, поэтому настройка сводится к переменным окружения и одному тестовому запросу. Дальше перенесите эти же поля в свой клиент, добавьте учёт usage и сверьте тарифы в кабинете перед нагрузочными тестами.
Какой именно ID модели указывать для Kimi K3.1 Pro?
Точный идентификатор берите из ответа GET /v1/models или из документации провайдера: в наших материалах он не публиковался, а придуманный ID даёт ошибку model_not_found.
Сколько стоит один запрос?
Считайте по формуле: prompt_tokens × цена входных токенов + completion_tokens × цена выходных, делённые на 1 000 000. Цены за 1M токенов в исходных материалах канала не приводились — сверьтесь с документацией и личным кабинетом.
Можно ли использовать ключ в n8n, Cursor или Claude Code?
Да, если в клиенте есть поля «Base URL» и «API Key»: укажите адрес с /v1, ключ и ID модели. Клиенты без поддержки кастомного Base URL работать с этим эндпоинтом не будут.
Почему в curl всё работает, а в Python — 401?
Скрипт запускается из другого окна или из IDE, где переменные окружения не заданы. Проверьте os.environ.get("KIMI_API_KEY") внутри скрипта; если вернулось None, задайте переменную в этом окружении или используйте файл .env с явной загрузкой.