# OpenAI SDK через Konductor

OpenAI SDK для Python работает с Konductor без обёрток: достаточно указать `base_url` и ключ компании. Пример проверен на `openai==2.26.0`.

```python
import os

from openai import OpenAI

client = OpenAI(
    base_url="https://llm.kodzavod.ru/v1",
    api_key=os.environ["KONDUCTOR_KEY"],
)

completion = client.chat.completions.create(
    model=os.environ["KONDUCTOR_MODEL"],
    messages=[{"role": "user", "content": "Привет!"}],
    max_tokens=256,
)
print(completion.choices[0].message.content)
```

## Что здесь важно

- `base_url` — `https://llm.kodzavod.ru/v1`, с `/v1` на конце. SDK дописывает к нему только `/chat/completions`, так что без `/v1` запрос уйдёт на несуществующий путь и вернёт 404.
- `api_key` — ключ компании. SDK отправит его в заголовке `Authorization: Bearer`.
- `model` — идентификатор модели из каталога на странице [Цены](/konductor/pricing).
- `max_tokens` ограничивает ответ. Перед запросом Konductor резервирует деньги по цене входа и по `max_tokens` на выходе, поэтому слишком большое значение может дать 402. Без `max_tokens` резерв считается по потолку вывода модели.

## Переменные окружения

SDK читает `OPENAI_API_KEY` и `OPENAI_BASE_URL`. Если задашь их, аргументы `api_key` и `base_url` в коде не нужны:

```bash
export OPENAI_API_KEY="$KONDUCTOR_KEY"
export OPENAI_BASE_URL="https://llm.kodzavod.ru/v1"
```

## Потоковый ответ

Передай `stream=True`, и Konductor отдаст ответ по частям в формате `text/event-stream`. Последняя часть несёт `usage` с `cost_rub`.

## Если запрос не прошёл

Смотри страницу [Ошибки 402, 403 и 429](/konductor/docs/errors). Те же переменные `KONDUCTOR_KEY` и `KONDUCTOR_MODEL` описаны в [быстром старте](/konductor/docs/quickstart).
