# Как подключить Kimi K3.1 Pro через API: ключи, цены и настройка в OpenAI-совместимых клиентах

> AI Release · @ai_release1 · https://ai-release.org/guides/kak-podklyuchit-kimi-k3-1-pro-cherez-api-klyuchi-tseny.html

## TL;DR

- Время выполнения: 15–20 минут
- Уровень сложности: Basic
- Понадобится: `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-токенов>`: подставьте значения из документации провайдера, прежде чем считать бюджет.

## Требования и подготовка
![Иллюстрация к разделу «Требования и подготовка»](https://ai-release.org/guides/img/kak-podklyuchit-kimi-k3-1-pro-cherez-api-klyuchi-tseny-ru-1.jpg?v=1792831821)


- ОС: Linux, macOS или Windows 10/11 (в Windows команды ниже даны и для PowerShell).
- `curl` — проверка: `curl --version` (первая строка вида `curl 8.x.x`).
- Python 3.9+ — проверка: `python3 --version`. Пакет ставится командой `pip install --upgrade openai`.
- API-ключ провайдера Kimi. Ключ — это строка-пароль, которая подставляется в заголовок `Authorization`; она даёт доступ к платным запросам, поэтому хранится только в переменных окружения.
- Положительный баланс на аккаунте: без него запрос вернёт ошибку квоты (см. раздел проблем).
- Свободное место: не требуется, модель работает по сети.
- Из документации провайдера заранее выпишите три значения: базовый URL API (обычно оканчивается на `/v1`), ID модели и цену за 1M входных/выходных токенов. Токен — единица измерения текста для модели, примерно 0,75 слова.

## Шаг 1. Ключ, базовый URL и ID модели в переменных окружения

**Что сделать:** создайте ключ в личном кабинете провайдера и сохраните три значения в переменные окружения, чтобы не переписывать их в каждом запросе.

**Зачем:** один и тот же набор переменных используют и `curl`, и Python-скрипт, и конфиг клиента — при смене ключа правится одна строка.

```bash
export KIMI_API_KEY="<ваш-ключ>"
export KIMI_BASE_URL="https://<api-хоста-провайдера>/v1"
export KIMI_MODEL="<id-модели-из-документации>"
```

В PowerShell те же значения задаются так (для текущей сессии и постоянно):

```powershell
$env:KIMI_API_KEY = "<ваш-ключ>"
setx KIMI_API_KEY "<ваш-ключ>"
setx KIMI_BASE_URL "https://<api-хоста-провайдера>/v1"
```

Чтобы переменные жили после перезапуска терминала, добавьте `export`-строки в `~/.bashrc` или `~/.zshrc` и выполните `source ~/.bashrc`.

**Как проверить:** выведите длину ключа и адреса — так видно, что переменная не пустая и в неё не попали кавычки.

```bash
printf 'key_len=%s\nbase=%s\nmodel=%s\n' "${#KIMI_API_KEY}" "$KIMI_BASE_URL" "$KIMI_MODEL"
```

Ожидаемый вывод (число будет своим):

```text
key_len=48
base=https://<api-хоста-провайдера>/v1
model=<id-модели-из-документации>
```

Если `key_len=0` — переменная не установлена в этом окне терминала; если длина равна длине строки с кавычками, ключ скопирован вместе с ними.

**Пример:** запрос списка доступных моделей — он же подтверждает, что ключ и базовый URL верны, и показывает точный ID модели.

```bash
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`
- [ ] ID модели скопирован из ответа `/models` или из документации
- [ ] на аккаунте есть баланс
- [ ] ключ не лежит в git-репозитории (добавьте `.env` в `.gitignore`)

## Шаг 2. Первый запрос и настройка OpenAI-совместимых клиентов
![Иллюстрация к разделу «Шаг 2. Первый запрос и настройка OpenAI-совместимых клиентов»](https://ai-release.org/guides/img/kak-podklyuchit-kimi-k3-1-pro-cherez-api-klyuchi-tseny-ru-2.jpg?v=1792831828)


**Что сделать:** отправьте минимальный запрос к `/chat/completions`, затем перенесите те же три значения в клиент.

**Зачем:** формат запроса и ответа совпадает с OpenAI API, поэтому один и тот же код работает и с `curl`, и с официальным SDK, и с любым клиентом, где есть поля «Base URL» и «API Key».

```bash
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:

```python
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)
```

Успешный запуск печатает текст ответа и два числа, например:

```text
работает
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, если клиент читает файл настроек:

```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](https://ai-release.org/guides/kak-obedinit-neskolko-ii-provayderov-v-odin-api-nastroy.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide), а вариант запуска такой модели внутри Claude Code — в материале [Как подключить локальную модель к Claude Code](https://ai-release.org/guides/kak-podklyuchit-lokalnuyu-model-k-claude-code-llama-ser.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).

**Как проверить:** сохраните скрипт в `check_kimi.py` и запустите.

```bash
python3 check_kimi.py
```

Признак успеха: напечатан текст ответа и два неотрицательных числа в `usage`. Если клиент отдаёт пустой ответ — сравните его Base URL с рабочим `$KIMI_BASE_URL`: лишний или недостающий `/v1` в конце адреса — самая частая причина 404.

## Шаг 3. Проверка работы и финальный результат
![Иллюстрация к разделу «Шаг 3. Проверка работы и финальный результат»](https://ai-release.org/guides/img/kak-podklyuchit-kimi-k3-1-pro-cherez-api-klyuchi-tseny-ru-3.jpg?v=1792831833)


**Что сделать:** прогоните три проверки — короткий ответ, длинный вход и повторный запрос — и зафиксируйте расход по `usage`.

**Зачем:** короткий запрос проверяет авторизацию, длинный — реальный лимит контекста (сколько токенов модель принимает за один раз), повторный — стабильность и корректность тарификации.

```python
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"}}`.
- Причина: неверный ID модели либо Base URL без `/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` и сверьте тарифы в кабинете перед нагрузочными тестами.

## FAQ

**Какой именно 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` с явной загрузкой.
