Гайд · TNWS AI

Как подключить OpenAI SDK к OpenRouter API и проверить реальную модель

6 мин

Практический запуск OpenRouter через OpenAI SDK: base_url, ключ из переменной окружения, тестовый запрос и проверка model, usage и ошибок.

Что именно проверено

Материал отвечает на русскоязычный запрос «как подключить OpenAI SDK к OpenRouter». Факты и имена параметров сверены 12 сентября 2026 года с официальной документацией OpenRouter. Здесь нет обещания, что любой model slug и любой upstream-провайдер будут доступны всегда: каталог и поддерживаемые параметры меняются, поэтому финальная проверка выполняется на конкретном endpoint непосредственно перед вводом в эксплуатацию.

Применимость

Python с актуальным пакетом openai и endpoint OpenRouter /api/v1/chat/completions. Пример использует официальный latest-алиас ~openai/gpt-sol-latest; перед продакшеном его следует заменить на зафиксированный slug, если важна воспроизводимость.

Этот сценарий полезен разработчику backend, владельцу чат-бота или команде автоматизации, которой нужен наблюдаемый результат. Ключевой принцип: проверять не только текст модели, но и метаданные маршрутизации, структуру ответа, учет токенов и негативный путь. HTTP 200 означает, что транспорт сработал; он не доказывает, что модель соблюла бизнес-формат.

Подтвержденные факты

  • OpenRouter совместим с форматом Chat Completions OpenAI SDK.
  • В SDK задается base_url https://openrouter.ai/api/v1, а не полный путь /chat/completions.
  • Поля HTTP-Referer и X-OpenRouter-Title необязательны и используются для атрибуции приложения.
  • Фактически выбранная модель возвращается в поле model ответа.

Параметры OpenRouter задаются на двух разных уровнях. model, messages, response_format относятся к запросу генерации. Объект provider управляет выбором upstream-endpoint. Плагины маршрутизаторов передаются в plugins. Не переносите поле из одного уровня в другой: JSON останется синтаксически корректным, но настройка может не дать ожидаемого эффекта.

Пошаговая настройка

  1. Сформулируйте проверяемый результат. Для запроса «как подключить OpenAI SDK к OpenRouter» не принимайте субъективное «вроде работает»: заранее запишите ожидаемый формат и признаки ошибки.
  2. Создайте отдельный API-ключ для тестового приложения и передавайте его через переменную окружения OPENROUTER_API_KEY. Не вставляйте секрет в клиентский JavaScript, мобильный APK, скриншот или репозиторий.
  3. Соберите минимальный запрос из примера ниже. Он изолирует именно механизм статьи; дополнительные фреймворки, ретраи и бизнес-логику добавляйте после первого успешного ответа.
  4. Отправьте запрос на https://openrouter.ai/api/v1/chat/completions. При ошибке сначала сохраните HTTP-код, тело ответа и request id, а уже затем решайте, допустим ли повтор.
  5. Сравните результат с контрольным ожиданием: В content находится 42 без пояснений, поле model не пустое, а usage содержит ненулевое число входных и выходных токенов.
  6. Прогоните положительный и отрицательный тест. Отрицательный тест должен доказать, что приложение не принимает невалидный формат, запрещенную модель или ослабленную политику после fallback.
  7. Только после этого добавьте таймаут, ограниченный retry с jitter, метрики и безопасное логирование. Повторяйте лишь идемпотентные операции или используйте собственный ключ идемпотентности.

Минимальный рабочий пример

from openai import OpenAI
import os

client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=os.environ["OPENROUTER_API_KEY"],
)
response = client.chat.completions.create(
    model="~openai/gpt-sol-latest",
    messages=[{"role": "user", "content": "Верни только число: 17 + 25"}],
    temperature=0,
)
print(response.model)
print(response.choices[0].message.content)
print(response.usage)

Значения в угловых скобках — не реальные идентификаторы. Их нужно заменить slug из актуальной страницы модели OpenRouter. Такой шаблон безопаснее статьи с быстро устаревающим списком моделей или провайдеров. Токен доступа в пример намеренно не включен.

Готовый тестовый промпт

Задача: проверь конфигурацию «как подключить OpenAI SDK к OpenRouter».
Верни только результат в указанном формате, без вступления.
Если входных данных недостаточно, верни явную ошибку INPUT_MISSING и перечисли недостающие поля.
Не придумывай факты и не изменяй ограничения запроса.

Промпт нужен для проверки дисциплины ответа, но он не заменяет параметры API. Например, просьба «верни JSON» не дает тех же гарантий, что response_format; фраза «не сохраняй данные» не заменяет ZDR-фильтр; просьба «выбери быструю модель» не заменяет настройки маршрутизации. Управляющие ограничения следует задавать структурированными полями запроса, а затем повторно проверять в приложении.

Контрольный вход и ожидаемый результат

Контрольный вход уже встроен в пример. Не меняйте одновременно prompt, модель и маршрутизацию: иначе невозможно понять причину различий. Сначала выполните запрос пять раз с одной конфигурацией, сохраните HTTP-код, id, model, finish_reason, usage и длительность. Затем измените ровно один параметр и повторите серию.

Ожидаемый результат: В content находится 42 без пояснений, поле model не пустое, а usage содержит ненулевое число входных и выходных токенов.

Если текст формально правильный, но отсутствует model или usage, не подменяйте их нулями без отдельного статуса. Различайте «ноль», «поле не поддерживается» и «финальное событие не было прочитано». Для JSON-ответов применяйте декодер и схему. Для обычного текста проверяйте длину, обязательные маркеры и отсутствие служебных фрагментов.

Критерии приемки

  • HTTP-запрос завершился без исключения
  • choices содержит хотя бы один элемент
  • finish_reason не указывает на незавершенную выдачу
  • response.model сохранен в журнале вместе с request id
  • usage доступен для учета

Хороший продакшен-тест хранит эталонный вход и машинно проверяемое условие, а не полный эталонный текст. Генеративная модель может переформулировать корректный ответ. Проверяйте факты, набор полей, enum, диапазоны, ссылки на исходные документы и запрет на нежелательные действия. Отдельно измеряйте качество и инфраструктурные параметры: быстрый, дешевый, но неверный ответ не проходит приемку.

Типичные ошибки и что не делать

  • Передача полного URL /chat/completions в base_url приводит к удвоению пути.
  • Ключ, записанный прямо в исходнике, попадает в историю Git и логи.
  • Latest-алиас может перейти на новую версию модели, поэтому снимки регрессионных тестов могут измениться.

Также не делайте бесконечный retry на 4xx. Ошибки авторизации, неподдерживаемый параметр и пустой набор endpoint обычно требуют изменения конфигурации, а не повтора того же тела. Для 429 и временных 5xx используйте ограниченное число повторов с экспоненциальной задержкой и случайным разбросом. Не записывайте исходные персональные данные в логи ради отладки.

Проверка перед продакшеном

Создайте таблицу из 20–50 реальных, но обезличенных примеров: короткий запрос, длинный контекст, пустое поле, кириллица, числа, конфликтующие инструкции и заведомо неподдерживаемая комбинация. Для каждого примера укажите допустимый результат. Запускайте набор при смене model slug, provider preferences, SDK или системного промпта.

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

FAQ

Можно ли проверять настройку одним запросом?

Нет. Один ответ подтверждает только один маршрут в один момент. Нужна серия и хотя бы один отрицательный тест.

Нужно ли хранить API-ключ в браузере?

Нет. Запросы с постоянным ключом отправляют через backend, а секрет хранят в менеджере секретов или переменной окружения.

Почему HTTP 200 недостаточно?

Потому что ответ может иметь неверный формат, быть обрезанным или прийти от неожиданной модели либо endpoint.

Что сохранять для диагностики?

HTTP-код, request id, model, provider при доступности, finish_reason, usage, длительность и результат локальной валидации — без лишних персональных данных.

Официальный источник

Частые вопросы

Подходит ли один тестовый запрос для приемки?

Нет, нужна серия запросов и негативный сценарий.

Где хранить ключ OpenRouter?

На backend в менеджере секретов или переменной окружения.

Что проверить кроме текста ответа?

HTTP-код, model, finish_reason, usage и локальную валидацию.

Можно ли отключать ограничения после ошибки?

Нет, для обязательных требований нужен явный отказ, а не тихое ослабление.

Читайте также

Комментарии

Пока тихо. Скажите первое слово