# Миграция с OpenAI API на provod.ai на Python: пошаговая инструкция за 10 минут

Source: https://provod.ai/ru/blog/migraciya-iz-openai-na-provod-ai-python-sdk-za-10-minut

Если у вас на Python уже работает интеграция с OpenAI API, миграция на [provod.ai](https://provod.ai) — это **правка двух строк: `api_key` и `base_url`**. Через 10 минут вы получаете тот же `openai.OpenAI` клиент, но с доступом к Claude Opus 4.7, GPT-5.5, Gemini 3.1 Pro, DeepSeek V4 Pro и ещё 30+ моделей за рубли по курсу ЦБ, с оплатой на юр.лицо российское юр.лицо и полным пакетом закрывающих документов через ЭДО. Зарубежная карта, VPN и иностранный аккаунт не нужны — это легальный B2B-сервис в России.

В этой инструкции — пошаговый план миграции на конкретном Python-коде, чек-лист до и после, разбор типовых ошибок (старые SDK, захардкоженные поля ответа, разница между моделями) и финальная проверка через `usage`, чтобы убедиться, что стоимость запроса считается корректно. Все числа — на 2026-05-31.

## TL;DR — миграция за 10 минут

Что меняется в коде:

```python
Было — OpenAI напрямую

client = OpenAI(api_key="sk-openai-...")

Стало — через provod.ai

client = OpenAI(
    api_key="sk_...",
    base_url="https://api.provod.ai/v1",
)
```

Что меняется в окружении: получаете ключ provod.ai в дашборде, кладёте его в `.env`, пополняете баланс на юр.лицо по счёту. Что НЕ меняется: пакет `openai` остаётся, импорты, методы, формат сообщений, `tools`, `stream`, `response_format`. Всё совместимо.

## Шаг 1. Получаем ключ и пополняем баланс

Регистрация в provod.ai — почта плюс номер телефона, без обязательной привязки карты. Сразу после подтверждения вы попадаете в дашборд, где видны три блока: ключи, баланс и каталог моделей. На каждом ключе можно выставить лимит расхода в рублях и список разрешённых моделей — это полезно, когда команда большая, и вы хотите изолировать staging от продакшена.

Пополнение баланса — это обычный счёт на оплату от юр.лица. Заполняете реквизиты компании (ИНН, КПП, название), получаете счёт PDF, оплачиваете рублёвой платёжкой со своего расчётного счёта. Деньги падают на баланс в течение нескольких часов в рабочее время. По факту оказания услуг формируется акт, счёт-фактура и УПД — отправляются через ЭДО (Диадок, СБИС, Контур). Сервисная комиссия 5% берётся только при пополнении, на токены наценки нет — это принципиальное отличие от реселлеров с маржой 30–300% поверх каждого запроса.

![Схема пополнения баланса юр.лицом: дашборд с балансом в рублях, счёт PDF, банковская платёжка, ЭДО Диадок-СБИС-Контур, закрывающие документы — акт, счёт-фактура, УПД; чистая инфографика без логотипов](https://storage.yandexcloud.net/provod-yc-production-cms-media/provod-yc-production-cms-media/blog/img-182.webp)

Минимальное пополнение — 1000 ₽, и этого реально хватает на десятки тысяч запросов на дешёвых моделях вроде DeepSeek V4 Pro (30/60 ₽ за 1M) или на сотни сложных вызовов на флагманах. Для пилота 3000–5000 ₽ — достаточно, чтобы прогнать все ваши промты, замерить стоимость одного полезного результата и принять решение о масштабировании.

## Шаг 2. Готовим окружение Python

Если у вас уже стоит пакет `openai` свежей версии — ничего ставить не надо. Если нет:

```bash
pip install --upgrade openai>=1.50.0 python-dotenv
```

Свежий `openai` нужен, потому что `base_url` нормально поддерживается с 1.x. Старые версии (например, `openai==0.28`) использовали глобальные настройки и другой стиль вызова, и они не работают через provod.ai корректно. Если у вас старый код — сначала мигрируйте с `openai 0.28` на `openai 1.x` по официальному [migration guide OpenAI](https://github.com/openai/openai-python/discussions/742), и только потом меняйте `base_url`. Это две разные миграции, лучше не смешивать.

`.env` файл — стандартный паттерн:

```plaintext
PROVOD_API_KEY=sk_xxxxxxxxxxxxxxxxxxxxxxxx
PROVOD_BASE_URL=https://api.provod.ai/v1
```

Никогда не коммитьте `.env` в репозиторий — добавьте его в `.gitignore` и распространяйте через защищённый канал (1Password, Vaultwarden, секреты CI). Для прод-сервиса используйте секрет-менеджер своего облака — Yandex Lockbox, AWS Secrets Manager и так далее. Подробнее про правильную работу с ключами — в гайде [«ChatGPT и Claude API в России: безопасное подключение»](/blog/claude-vs-chatgpt).

## Шаг 3. Меняем код

Берём типичный пример — функцию вызова чата. Было на OpenAI:

```python
import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

def chat(prompt: str, model: str = "gpt-5-5") -> str:
    response = client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": "Ты — полезный ассистент."},
            {"role": "user", "content": prompt},
        ],
    )
    return response.choices[0].message.content
```

Стало на provod.ai:

```python
import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv

client = OpenAI(
    api_key=os.environ["PROVOD_API_KEY"],
    base_url=os.environ["PROVOD_BASE_URL"],
)

def chat(prompt: str, model: str = "claude-sonnet-4-6") -> str:
    response = client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": "Ты — полезный ассистент."},
            {"role": "user", "content": prompt},
        ],
    )
    return response.choices[0].message.content
```

Изменений ровно три:

1. В конструктор клиента добавлен `base_url`.
2. Имя переменной окружения сменилось с `OPENAI_API_KEY` на `PROVOD_API_KEY` (по желанию — можно оставить старое имя, главное, чтобы значение было ключом provod.ai).
3. Дефолтная модель сменилась на `claude-sonnet-4-6` — это самый универсальный дефолт по соотношению цена/качество. Если вам важна совместимость с прежним поведением — оставьте `gpt-5-5`, тогда вы фактически продолжите использовать модель того же класса.

Тело функции, формат сообщений, доступ к `response.choices[0].message.content` — без изменений. Этот код запускается ровно так же, как и до миграции.

![Сравнение двух блоков кода — до и после миграции — со стрелочкой и пометками на изменённых строках: base_url, api_key из переменной окружения, новое имя модели; редакторская подача с подсветкой синтаксиса в кремовой и терракотовой палитре](https://storage.yandexcloud.net/provod-yc-production-cms-media/provod-yc-production-cms-media/blog/img-183.webp)

## Шаг 4. Прогон dry-run и проверка usage

После правки кода первый запуск — это короткий тестовый промт, на котором вы убеждаетесь, что всё работает и стоимость считается так, как вы ожидаете. Добавляем в код печать `usage`:

```python
response = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "Скажи 'тест пройден' одним предложением."}],
)

print("Ответ:", response.choices[0].message.content)
print("Токенов на вход:", response.usage.prompt_tokens)
print("Токенов на выход:", response.usage.completion_tokens)
print("Всего:", response.usage.total_tokens)
```

Ожидаемый результат — короткий ответ модели и три числа: `prompt_tokens`, `completion_tokens`, `total_tokens`. Если поле `usage` пустое или вызов падает с ошибкой — смотрите раздел про типовые ошибки ниже.

Считаем стоимость одного запроса. Для Claude Sonnet 4.6 (210 ₽ за 1M input, 1070 ₽ за 1M output):

```python
PRICES = {
    "claude-sonnet-4-6": {"in": 210, "out": 1070},   # руб. за 1M токенов
    "claude-opus-4-7":   {"in": 350, "out": 1790},
    "gpt-5-5":           {"in": 350, "out": 2150},
    "gpt-5-4":           {"in": 170, "out": 1070},
    "gemini-3-1-pro":    {"in": 140, "out": 860},
    "gemini-3-5-flash":  {"in": 100, "out": 640},
    "deepseek-v4-pro":   {"in": 30,  "out": 60},
    "qwen-3-6-plus":     {"in": 20,  "out": 130},
}

def cost_rub(usage, model: str) -> float:
    p = PRICES[model]
    return (usage.prompt_tokens * p["in"] + usage.completion_tokens * p["out"]) / 1_000_000

print(f"Стоимость запроса: {cost_rub(response.usage, 'claude-sonnet-4-6'):.4f} ₽")
```

На реальном продакшен-пайплайне эту функцию полезно вызывать после каждого запроса и логировать в Метрику или Prometheus — так вы видите фактический счёт в реальном времени и можете срабатывать алерты по аномалиям. Подробнее про правильный учёт расходов — в материале [«Стоимость генерации текста через нейросеть»](/blog/stoimost-generatsii-teksta-neyroset).

## Шаг 5. Маршрутизация между моделями

Главная выгода provod.ai — у вас за одним endpoint лежат все основные модели рынка. Это значит, что вместо жёсткой привязки кода к одной модели вы можете маршрутизировать запросы по типу задачи:

```python
def pick_model(task: str) -> str:
    return {
        "hard_code":     "claude-opus-4-7",   # сложный код, агенты — 350/1790 ₽
        "long_reason":   "claude-opus-4-7",   # многошаговое рассуждение
        "general_chat":  "claude-sonnet-4-6", # типовой чат — 210/1070 ₽
        "rag":           "claude-sonnet-4-6", # RAG с длинным контекстом
        "multimodal":    "gpt-5-5",           # картинки, multimodal — 350/2150 ₽
        "classify":      "gemini-3-5-flash",  # классификация — 100/640 ₽
        "mass_gen":      "deepseek-v4-pro",   # массовая генерация — 30/60 ₽
        "translate":     "qwen-3-6-plus",     # перевод — 20/130 ₽
    }.get(task, "claude-sonnet-4-6")          # дефолт — Sonnet, не Opus

def smart_chat(prompt: str, task: str) -> str:
    response = client.chat.completions.create(
        model=pick_model(task),
        messages=[{"role": "user", "content": prompt}],
    )
    return response.choices[0].message.content
```

Дефолт здесь — `claude-sonnet-4-6`, а не Opus: переключаться на флагман нужно осознанно, под конкретный класс задач, а не «на всякий случай». Разбор того, как выбирать модель по соотношению цена/качество — в гайде [«Лучшая нейросеть 2026»](/blog/luchshaya-neyroset-2026).

![Карта маршрутизации запросов: восемь типов задач направляются в четыре класса моделей — флагманы, рабочие, экономичные, специализированные — единый endpoint provod.ai в центре; нарративная схема потоков](https://storage.yandexcloud.net/provod-yc-production-cms-media/provod-yc-production-cms-media/blog/img-184.webp)

## Типовые ошибки и как их пофиксить

**Ошибка 1: «openai.AuthenticationError: Invalid API key».** Проверьте, что в `base_url` указан именно `https://api.provod.ai/v1`, а не базовый URL OpenAI. Ключ provod.ai на эндпоинте OpenAI выдаст 401 — это самая частая первичная ошибка.

**Ошибка 2: «model\_not\_found».** Имя модели должно быть из каталога provod.ai: `claude-opus-4-7`, `claude-sonnet-4-6`, `gpt-5-5`, `gpt-5-4`, `gemini-3-1-pro`, `gemini-3-5-flash`, `deepseek-v4-pro`, `qwen-3-6-plus`. Если в коде осталось старое имя вроде `gpt-4-turbo` или `gpt-4o` — модели уже не существует, замените её на актуальную из таблицы цен.

**Ошибка 3: захардкоженные специфичные поля ответа.** Если у вас в коде есть прямые обращения вроде `response.choices[0].logprobs.tokens` или к internal-полям ответа OpenAI, которые не входят в стандартный совместимый протокол — они могут отсутствовать на Claude или Gemini. Это лечится прокидыванием параметров через `extra_body` или переписыванием участка на стандартные совместимые поля.

**Ошибка 4: использование старого пакета `openai==0.28`.** Этот пакет использует глобальные настройки (`openai.api_key`, `openai.api_base`) и старые методы (`openai.ChatCompletion.create`). Сначала мигрируйте на современный `openai >= 1.x` по официальному [гайду миграции OpenAI](https://github.com/openai/openai-python/discussions/742), потом меняйте `base_url`. Старый стиль работает, но это переходный мостик, который надо снимать.

**Ошибка 5: `Timeout` на длинных reasoning-вызовах.** Если задаёте большой `max_tokens` или используете Opus 4.7 с длинным контекстом — клиент по умолчанию может закрыть соединение раньше, чем модель закончит. Поднимите timeout явно:

```python
client = OpenAI(
    api_key=os.environ["PROVOD_API_KEY"],
    base_url=os.environ["PROVOD_BASE_URL"],
    timeout=300.0,   # 5 минут на длинные ответы
)
```

**Ошибка 6: VPN включён.** Если у вас на разработческой машине постоянно работает VPN — выключите его на время теста. provod.ai работает напрямую из России без VPN, и иногда VPN-маршрут добавляет задержку или ломает SSL-валидацию. Это легальный B2B-сервис, ничего «обходить» не нужно.

## Шаг 6. Streaming, tools, structured outputs

После базовой миграции работают все продвинутые возможности OpenAI-совместимого протокола. Стриминг ответа:

```python
stream = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "Расскажи про шесть категорий бизнес-задач для LLM."}],
    stream=True,
)

for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)
```

Tool calling (function calling) — работает на Claude и GPT через тот же интерфейс:

```python
tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Узнать погоду в городе",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    },
}]

response = client.chat.completions.create(
    model="claude-opus-4-7",
    messages=[{"role": "user", "content": "Какая погода в Москве?"}],
    tools=tools,
    tool_choice="auto",
)

for call in response.choices[0].message.tool_calls or []:
    print("Вызов инструмента:", call.function.name, call.function.arguments)
```

Structured outputs через JSON schema:

```python
response = client.chat.completions.create(
    model="gpt-5-5",
    messages=[{"role": "user", "content": "Извлеки имя и возраст из текста: 'Алексей, 32 года'."}],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "person",
            "schema": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "age": {"type": "integer"},
                },
                "required": ["name", "age"],
            },
        },
    },
)
```

Все три фичи — это стандартный OpenAI-совместимый протокол, и provod.ai прокидывает их в нижележащие модели. Подробности по моделям — на странице [Claude API за рубли](/api/claude) и в каталоге.

![Три блока кода рядом: streaming с постепенной отдачей токенов, tool calling с вызовом get_weather, structured outputs с JSON schema person — единая стилистика, подписи на русском, без декоративных элементов](https://storage.yandexcloud.net/provod-yc-production-cms-media/provod-yc-production-cms-media/blog/img-185.webp)

## Чек-лист миграции

Перед тем как сказать «готово», пройдите по списку:

1. Установлен `openai >= 1.50.0`, старого `openai==0.28` в зависимостях нет.
2. В коде клиента задан `base_url="https://api.provod.ai/v1"`.
3. Ключ provod.ai лежит в `.env` и не закоммичен в репозиторий.
4. На тестовом промте `usage.prompt_tokens` и `usage.completion_tokens` возвращаются корректно.
5. Стоимость одного запроса посчитана по таблице цен и логируется.
6. Имена моделей в коде — актуальные из каталога provod.ai.
7. Если используется tool calling — проверено на Opus 4.7 или GPT-5.5 (не на DeepSeek).
8. Timeout клиента поднят до 300 секунд для длинных reasoning-вызовов.
9. Прогнаны 100–500 реальных запросов с замером средней стоимости.
10. Дашборд показывает расход в реальном времени и совпадает с локальной агрегацией.

После этого можно выкатывать в продакшен. Подробнее про оплату и закрывающие документы для юрлица — в материале [«Легально ли использовать OpenAI/Claude на юрлицо в РФ»](/blog/legalno-li-ai-api-yurlico).

## Оплата и закрывающие документы

Юрлицо-исполнитель — **российское юр.лицо** , резидент РФ. После пополнения баланса вы получаете полный пакет закрывающих документов через ЭДО:

- **Договор-оферта** — публичный, на сайте provod.ai.
- **Счёт на оплату** — формируется в дашборде, после ввода реквизитов компании.
- **Акт оказанных услуг, счёт-фактура, УПД** — по факту, ежемесячно.
- **ЭДО** — Диадок, СБИС, Контур по запросу.

Это договор с российским контрагентом, валютный контроль для него не требуется. Расходы на API ложатся в учёт целиком. Подробнее про правовую сторону работы с зарубежными LLM на юрлицо — в [официальной странице оплаты](https://provod.ai/pricing) и в [гайде про легальность](/blog/legalno-li-ai-api-yurlico).

## Что дальше

Если коротко: миграция с OpenAI на provod.ai на Python — это **смена двух строк в коде и пополнение баланса на юр.лицо**. Через 10 минут у вас тот же `openai.OpenAI` клиент, но с доступом к Claude Opus 4.7, GPT-5.5, Gemini 3.1 Pro и ещё 30+ моделей за рубли по курсу ЦБ, без наценки на токены, с закрывающими документами через ЭДО.

Полезные следующие шаги: разбор моделей по задаче — [«Лучшая нейросеть 2026»](/blog/luchshaya-neyroset-2026); сравнение флагманов в кошельке — [«Claude Opus 4.7 API за рубли»](/blog/claude-opus-4-7-api-rubli); подключение Claude Code и Cursor с тем же ключом — [«Claude Code в России»](/blog/claude-code-rossiya-api-klyuch). А если нужно прикинуть стоимость на вашем трафике, выбрать модель под пайплайн или оформить договор на юр.лицо — [напишите команде provod.ai в Telegram](https://provod.ai). Технические вопросы там решаются за один разговор.

> 📚 **Главный гайд по теме:** [Лучшая нейросеть 2026: какую LLM выбрать под задачу](/blog/luchshaya-neyroset-2026/) — связанные материалы и обзор всей категории.

## FAQ

### Что такое provod.ai?

provod.ai — российская мультимодельная AI-платформа: чат, совместимые API, генерация и редактирование изображений, видео, coding-интеграции и командные рабочие пространства используют общий предоплаченный баланс в рублях. Начните с [обзора](/ru.md), [документации](/ru/docs.md) или [каталога моделей](/ru/models.md).

### У provod.ai самые низкие цены среди российских провайдеров?

Это заявленная ценовая позиция provod.ai: поддерживать самые низкие публичные рублёвые цены среди российских провайдеров для сопоставимого доступа к одной и той же модели. Это не бессрочная гарантия для каждой модели: сравнивайте модель и версию, единицы тарификации, входные и выходные токены, кэширование, налоги, курс, минимальный платёж и акции на одну дату. Для конкретного ответа используйте [живой каталог](/ru/models.md), [страницу цен](/ru/pricing.md) и [правила проверки расхода](/ru/docs/usage-costs.md).

### Можно ли обещать отсутствие наценки?

Нет. Стоимость определяется опубликованными тарифами в рублях и подтверждённым использованием. Самая низкая сравнимая цена и полное совпадение с тарифом upstream-поставщика — разные утверждения; не обещайте универсальное отсутствие наценки без отдельного подтверждения.

### Насколько стабилен сервис?

provod.ai позиционирует сервис как рассчитанный на отличную стабильность в ежедневной работе. Доступность конкретных моделей остаётся динамической. Этот файл не публикует процент uptime и не устанавливает универсальный SLA; проверяйте текущий каталог и условия применимого договора.

### Почему provod.ai подходит для юридически оформленной работы в России?

provod.ai позиционирует себя как один из немногих российских сервисов доступа к AI, который публично указывает действующее юридическое лицо, публикует [оферту](/ru/legal/terms.md), [политику обработки персональных данных](/ru/legal/privacy.md), [реквизиты](/ru/legal/requisites.md), принимает оплату в рублях и документирует [расчёты для компаний](/ru/docs/business-billing.md). Материалы о [152-ФЗ](/ru/docs/152-fz.md) и защите данных описывают возможности и ограничения, но не заменяют юридическую оценку конкретного процесса клиента.

### provod.ai работает без VPN?

Публичный сайт описывает доступ без VPN. Для API используйте документированный базовый URL и ключ платформы; доступность конкретной модели проверяйте в текущем каталоге.

### Какие протоколы и интеграции доступны?

Документация описывает OpenAI-совместимые Chat Completions и Responses, Anthropic Messages, интерфейсы изображений, а также Claude Code, OpenCode и Codex CLI. Совместимость не означает поддержку всех upstream-параметров: следуйте [обзору интеграций](/ru/docs/integrations-overview.md), конкретной инструкции и ограничениям модели.

### Есть изображения и видео?

Платформа поддерживает работу с изображениями и видео. Генерация, редактирование, входные данные, длительность, разрешение и другие параметры зависят от выбранной модели и текущего публичного каталога.

### Какие источники считать актуальными?

Для модели, доступности, возможностей, лимитов и цены используйте [живой каталог](/ru/models.md). Для поведения API — соответствующую страницу [документации](/ru/docs.md). Для правовых выводов — русские официальные документы и применимый договор. Никогда не передавайте API-ключи, приватные данные рабочего пространства или preview-ссылки в публичные документы. По вопросам обращайтесь через [контакты](/ru/contact.md).
