---
title: SDK
description: Официальные SDK OpenAI и Anthropic, Python и Node: установка, клиент с base URL шлюза и ключом из окружения, один вызов. Ваш код остаётся вашим кодом.
keywords: sdk, openai, anthropic, python, node, base_url, langchain, llamaindex
group: integrations
---

## Быстро {#quick keywords="установка, клиент, base url, ключ"}

SDK менять не нужно. Ставится тот же официальный пакет, что и всегда; меняются два аргумента конструктора — base URL и ключ.

```bash title=Установка
# OpenAI-совместимый диалект
pip install openai
npm install openai

# Нативный диалект Anthropic
pip install anthropic
npm install @anthropic-ai/sdk
```

Ключ держите в переменной окружения. Ни один пример ниже не пишет секрет в исходник — все они читают `KUMO_API_KEY`, поэтому сначала экспортируйте её в той оболочке, из которой запускаете код.

```bash title=Ключ
export KUMO_API_KEY="kumo_sk_..."
```

Кошелёк новой организации пуст: первый вызов без пополнения ответит `402` ([оплата](/ru/billing)).

## OpenAI SDK {#openai-sdk keywords="openai, chat completions, python, node, base_url"}

Base URL — `https://api.kumorouter.com/v1`, вместе с `/v1`. SDK дописывает к нему путь операции сам.

:::code-group
```python title=Python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.kumorouter.com/v1",
    api_key=os.environ["KUMO_API_KEY"],
)

answer = client.chat.completions.create(
    model="<model>",
    max_tokens=128,
    messages=[{"role": "user", "content": "Объясни токены одной строкой."}],
)
print(answer.choices[0].message.content)
```
```javascript title=Node
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.kumorouter.com/v1",
  apiKey: process.env.KUMO_API_KEY,
});

const answer = await client.chat.completions.create({
  model: "<model>",
  max_tokens: 128,
  messages: [{ role: "user", content: "Объясни токены одной строкой." }],
});

const reply = answer.choices[0].message.content;
process.stdout.write((reply ?? "") + "\n");
```
:::

Потолок вывода обязателен: запрос без `max_tokens` (он же `max_completion_tokens`) отвергается, а не остаётся неограниченным.

## Anthropic SDK {#anthropic-sdk keywords="anthropic, messages, python, node, x-api-key"}

Base URL — `https://api.kumorouter.com`, **голый origin, без `/v1`**: SDK дописывает `/v1/messages` сам. Ключ едет в заголовке `x-api-key`, и SDK ставит его туда без вашего участия.

:::code-group
```python title=Python
import os
from anthropic import Anthropic

client = Anthropic(
    base_url="https://api.kumorouter.com",
    api_key=os.environ["KUMO_API_KEY"],
)

answer = client.messages.create(
    model="<model>",
    max_tokens=128,
    messages=[{"role": "user", "content": "Объясни токены одной строкой."}],
)
print(answer.content[0].text)
```
```javascript title=Node
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic({
  baseURL: "https://api.kumorouter.com",
  apiKey: process.env.KUMO_API_KEY,
});

const answer = await client.messages.create({
  model: "<model>",
  max_tokens: 128,
  messages: [{ role: "user", content: "Объясни токены одной строкой." }],
});

const reply = answer.content[0].text;
process.stdout.write((reply ?? "") + "\n");
```
:::

:::note
Не каждая модель отвечает на обоих диалектах. Какие протоколы поддерживает конкретная модель, написано на её карточке в каталоге — там же, где её возможности. Смотрите карточку до того, как выбирать SDK.
:::

> [Как пишется заголовок с ключом →](/ru/authentication) [Что умеет модель →](/ru/models)

## Поток {#streaming keywords="стриминг, поток, sse"}

Оба SDK умеют поток, и шлюз отвечает им в форме их собственного протокола: события в порядке прихода и завершающий кадр. Отличие от унарного вызова одно — сбой после начала потока обрывает его без завершающего кадра, и такой ответ считается неудачным вызовом, а не коротким.

> [Стриминг целиком →](/ru/streaming)

## Библиотеки поверх OpenAI {#compatible-libraries keywords="langchain, llamaindex, фреймворк, openai-совместимый"}

Фреймворки вроде LangChain или LlamaIndex обычно ходят к моделям через тот же клиент OpenAI. Если у библиотеки настраивается base URL клиента OpenAI — она работает со шлюзом так же, как прямой вызов: подставьте `https://api.kumorouter.com/v1` и ключ, остальное не трогайте.

Точное имя параметра у каждой библиотеки своё, и здесь оно не называется намеренно: параметры переименовывают между выпусками, а неверное имя выглядит как молчаливо проигнорированная настройка. Смотрите документацию своей библиотеки — искать нужно то место, где задаётся base URL клиента OpenAI.

Проверить, что настройка применилась, проще всего по журналу консоли: вызов есть — значит библиотека пошла через шлюз.

:::cards
- [Быстрый старт](/ru/quickstart) — первый вызов от ключа до ответа.
- [Все рецепты](/ru/integrations) — обзор и промпт для агента.
- [Справочник API](/ru/api-reference) — каждая операция, поле за полем.
:::
