Как подключить ChatGPT, Claude и Gemini через один API: пошаговый гайд

Пошаговый гайд: подключаем ChatGPT, Claude 4.6 и Gemini через один API-роутер. Реальный код на Python и Node.js, настройка fallback и мониторинга. Без переписывания SDK под каждую модель.

Обложка: Как подключить ChatGPT, Claude и Gemini через один API: пошаговый гайд

Если вы уже работаете с LLM в проде, то наверняка сталкивались с этим: OpenAI лёг в три ночи, а у вас дедлайн. Или кончился бюджет на GPT, и надо срочно переключиться на Gemini. Или клиент хочет Claude, а весь CI/CD заточен под OpenAI SDK.

В итоге вы держите три разных API-ключа, три разных SDK, три разные схемы биллинга — и каждое переключение стоит нескольких часов рефакторинга.

В этой статье разберём, как решить это через один API-роутер: подключим GPT-5.4, Claude Sonnet 4.6 и Gemini 3.1 Pro через одну точку входа без переписывания кода под каждую модель. Статья для тех, кто уже работал с LLM API и хочет выстроить нормальную инфраструктуру.

Почему три отдельных API — это боль в проде

По факту всё просто: подключаешь OpenAI, пишешь код, всё работает. На практике, как только вы начинаете масштабироваться или хотите попробовать другую модель, появляются три проблемы.

Разные форматы запросов и ответов

У каждого провайдера — свой SDK и своя структура данных. Посмотрите, как выглядит один и тот же запрос для трёх разных API.

Python:

			# OpenAI / GPT-5.4
from openai import OpenAI
client = OpenAI(api_key="sk-...")
response = client.chat.completions.create(
  model="openai/gpt-5.4",
  messages=[{"role": "user", "content": "Привет!"}]
)
print(response.choices[0].message.content)

# Anthropic / Claude
import anthropic
client = anthropic.Anthropic(api_key="sk-ant-...")
response = client.messages.create(
  model="anthropic/claude-sonnet-4.6",
  max_tokens=1024,
  messages=[{"role": "user", "content": "Привет!"}]
)
print(response.content[0].text)  # ← уже другая структура

# Google / Gemini
import google.generativeai as genai
genai.configure(api_key="AIza...")
model = genai.GenerativeModel("gemini-1.5-pro")
response = model.generate_content("Привет!")
print(response.text)  # ← и снова другая

		

​​Три разных SDK, разные структуры ответа и способа обработки ошибок. Если вы хотите добавить в проект вторую модель — значит нужно переписывать логику вызовов и парсинг ответов с нуля.

Vendor lock-in и зависимость от аптайма одного провайдера

OpenAI, Anthropic и Google — три разные компании с тремя разными инфраструктурами. Если один провайдер падает, ваш продукт перестаёт отвечать. Запросы возвращают ошибку, токены не тратятся — но пользователи видят сломанный интерфейс. Без резервной модели вы просто ждёте, пока провайдер починится.

Кроме аптайма, у каждого провайдера своя операционная специфика — и она влияет на то, как вы строите интеграцию:

Мы знаем, что авторизация у всех разная — значит, для каждого провайдера нужен свой способ передачи ключа. Rate limit у Anthropic в 10 раз ниже, чем у OpenAI на том же тарифе — если вы пишете балансировщик нагрузки вручную, это нужно учитывать. Биллинг у Google завязан на Google Cloud — отдельный аккаунт, счета и бухгалтерия.

Именно это и решает роутер: один API-ключ, одна схема авторизации, один дашборд.

Что такое LLM API-роутер и как он работает

LLM API-роутер — это прокси-слой между вашим приложением и несколькими LLM-провайдерами. Вы отправляете один запрос в едином формате, роутер определяет, какую модель использовать, и возвращает ответ в стандартизированном виде.

Хороший роутер умеет:

  • Fallback: если основная модель недоступна или превышен rate limit — автоматически переключает на запасную
  • Load balancing: распределяет запросы между провайдерами по настраиваемым правилам
  • Логирование: сохраняет все запросы/ответы, latency, стоимость в одном месте
  • Кеширование: не тратит токены на идентичные запросы
  • Unified billing: видите общие расходы на LLM в одном дашборде

Роутер не нужен, если у вас один провайдер, небольшой объём запросов и нет требований к отказоустойчивости. Прямое подключение к API — проще и без лишних телодвижений.

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

Один из таких инструментов — RouterAI.ru, российский сервис, который поддерживает OpenAI-совместимый формат запросов. Это значит: меняете base_url в вашем существующем коде — и получаете доступ к ChatGPT, Claude и Gemini через один API-ключ.

Единый баланс и оплата в рублях

Отдельное преимущество для российских команд: RouterAI держит один баланс для всех моделей сразу. Пополнили один раз — запросы идут к любому провайдеру из этого баланса. Не нужно держать отдельные счета в OpenAI, Anthropic и Google Cloud и следить, чтобы на каждом хватало средств. Оплата в рублях — без конвертации и без привязки иностранной карты.

Подключение через один API: пошаговый гайд

Для примеров используем Python 3.10+ и Node.js 18+, проверяйте у себя, а если заметили ошибку — обязательно напишите в комментариях, чтобы предупредить других читателей.

Шаг 1. Регистрация и получение API-ключа

Переходите на routerai.ru, регистрируетесь, в личном кабинете создаёте API-ключ. Выглядит как стандартный токен в формате rtr-....

Сохраните ключ в переменную окружения — не храните его в коде:

export ROUTERAI_API_KEY="rtr-ваш-ключ"

Шаг 2. Базовый запрос — три модели, один формат

RouterAI поддерживает OpenAI-совместимый формат, поэтому нужно поменять только base_url и api_key — остальной код не трогаете.

Python:

			import os
from openai import OpenAI

client = OpenAI(
  api_key=os.environ.get("ROUTERAI_API_KEY"),
  base_url="https://routerai.ru/v1"
)

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

# Меняем только model= — всё остальное одинаково

print(ask_model("openai/gpt-5.4", "Что такое Docker?"))
print(ask_model("anthropic/claude-sonnet-4.6", "Что такое Docker?"))
print(ask_model("google/gemini-3.1-pro-preview", "Что такое Docker?"))

Node.js:

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.ROUTERAI_API_KEY,
  baseURL: "https://routerai.ru/v1",
});

async function askModel(model, prompt) {
  const response = await client.chat.completions.create({
    model,
    messages: [{ role: "user", content: prompt }],
  });
  return response.choices[0].message.content;
}

// Три модели — одна функция
const models = [
  "openai/gpt-5.4",
  "anthropic/claude-sonnet-4.6",
  "google/gemini-3.1-pro-preview",
];
for (const model of models) {
  console.log(`[${model}]:`, await askModel(model, "Что такое Docker?"));
}

		

Шаг 3. Таблица доступных моделей

Названия model-id, которые принимает RouterAI:

Актуальный список моделей — в документации RouterAI. Провайдеры обновляют lineup несколько раз в год.

Шаг 4. Настройка стриминга

Стриминг работает так же, как в нативном OpenAI SDK:

			def stream_response(model: str, prompt: str):
  stream = client.chat.completions.create(
    model=model,
    messages=[{"role": "user", "content": prompt}],
    stream=True
  )
  for chunk in stream:
    if chunk.choices[0].delta.content:
      print(chunk.choices[0].delta.content, end="", flush=True)
  print()  # перенос строки после стрима

stream_response("anthropic/claude-sonnet-4.6", "Объясни принцип работы TCP/IP")

		

Шаг 5. Системный промпт и параметры генерации

			response = client.chat.completions.create(
  model="openai/gpt-5.4",
  messages=[
    {
      "role": "system",
      "content": "Ты senior Python-разработчик. Отвечай кратко и с примерами кода."
    },
    {
      "role": "user",
      "content": "Как правильно обрабатывать исключения в async-функциях?"
    }
  ],
  temperature=0.3,   # ниже = детерминированнее
  max_tokens=800,
)

		

Реальный кейс: мультимодельный бот с fallback за 30 минут

Покажем реальный сценарий: бот, который сначала пробует GPT-5.4, при ошибке переключается на Claude Sonnet 4.6, логирует все запросы и считает стоимость.

			import os
import time
import logging
from openai import OpenAI, RateLimitError, APIStatusError

logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
logger = logging.getLogger(__name__)

client = OpenAI(
  api_key=os.environ.get("ROUTERAI_API_KEY"),
  base_url="https://routerai.ru/v1"
)

# Порядок приоритета моделей
MODEL_CHAIN = [
  "openai/gpt-5.4",
  "anthropic/claude-sonnet-4.6",
  "google/gemini-3.1-pro-preview",
]

def ask_with_fallback(prompt: str, system: str = "") -> dict:
  """
  Отправляет запрос по цепочке моделей с fallback.
  Возвращает словарь с ответом, использованной моделью и latency.
  """
  messages = []
  if system:
    messages.append({"role": "system", "content": system})
  messages.append({"role": "user", "content": prompt})

  for model in MODEL_CHAIN:
    start_time = time.time()
  try:
    logger.info(f"Пробуем модель: {model}")
    response = client.chat.completions.create(
      model=model,
      messages=messages,
      max_tokens=1000,
      timeout=30,
    )
    latency_ms = round((time.time() - start_time) * 1000)
    result = {
      "content": response.choices[0].message.content,
      "model_used": model,
      "latency_ms": latency_ms,
      "input_tokens": response.usage.prompt_tokens,
      "output_tokens": response.usage.completion_tokens,
    }
    logger.info(f"Успех: {model}, latency={latency_ms}ms, "
              f"tokens={result['input_tokens']}+{result['output_tokens']}")
    return result

  except RateLimitError:
    logger.warning(f"Rate limit на {model}, переключаемся на следующую модель")
    continue
  except APIStatusError as e:
    logger.warning(f"Ошибка API на {model}: {e.status_code}, переключаемся")
    continue
  except Exception as e:
    logger.error(f"Неожиданная ошибка на {model}: {e}")
    continue

raise RuntimeError("Все модели в цепочке недоступны")

# Пример использования
if __name__ == "__main__":
  result = ask_with_fallback(
    prompt="Напиши функцию на Python для валидации email",
    system="Ты опытный Python-разработчик. Пиши чистый, типизированный код."
)
  print(f"\n=== Ответ от {result['model_used']} ===")
  print(result["content"])
  print(f"\nLatency: {result['latency_ms']}ms | "
      f"Токены: {result['input_tokens']} in / {result['output_tokens']} out")

		

Запускаете скрипт — он пробует GPT-5.4. Если там rate limit или ошибка — автоматически берёт Claude Sonnet 4.6. Если и там проблема — Gemini 3.1 Pro. Всё логируется с временными метками.

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

Подводные камни при работе с роутером

Прежде чем переводить прод на роутер, стоит знать о нескольких нюансах.

Разные контекстные окна — нельзя просто взять и переключить

GPT-5.4, Claude Sonnet 4.6 и Gemini 3.1 Pro — все трое держат по 1M токенов, но DeepSeek V3.2 ограничен 164K, а Grok 4 — 256K. Если fallback-цепочка включает эти модели, длинный контекст просто обрежется или вернётся ошибка. Проверяйте длину промпта перед переключением.

			def estimate_tokens(text: str) -> int:
  # Грубая оценка: ~4 символа на токен для латиницы, ~2 для кириллицы
  return len(text) // 3

MAX_TOKENS = {
  "openai/gpt-5.4": 1_000_000,
  "anthropic/claude-sonnet-4.6": 1_000_000,
  "google/gemini-3.1-pro-preview": 1_000_000,
}

		

Разное поведение моделей на одинаковые промпты

Claude Sonnet 4.6 строже следует системному промпту, GPT-5.4 гибче интерпретирует инструкции, Gemini 3.1 Pro хорошо работает с мультимодальными задачами и таблицами. Если у вас сложный системный промпт — при переключении модели ответ может заметно отличаться по стилю и формату. Это нормально, но стоит учитывать при тестировании.

Роутер добавляет накладные расходы

Любой прокси-слой — это дополнительный расход. На практике это 20–80ms в зависимости от географии. Если ваш продукт чувствителен к latency (например, голосовой интерфейс), протестируйте задержки на реальной нагрузке до деплоя.

Ценообразование: роутер не всегда дороже

Роутер добавляет наценку к базовой стоимости токенов — это факт. Но итоговая цена зависит от модели. На китайских моделях вроде DeepSeek V3.2 RouterAI предлагает цены крупных клиентов со скидками — и выходит дешевле, чем если подключаться к тем же моделям напрямую по стандартному тарифу. На флагманских моделях OpenAI и Anthropic разница будет в пользу прямого подключения при больших объёмах. Считайте по конкретным моделям и своему объёму запросов — универсального ответа нет.

Роутер умножает rate limits, а не делит их

Это одно из главных преимуществ, которое неочевидно с первого взгляда. RouterAI подключается к каждому провайдеру через несколько точек одновременно — и тот же Claude Sonnet 4.6 может уйти в Anthropic напрямую, через Google Cloud или через Amazon Bedrock. Суммарный rate limit получается значительно выше, чем при прямом подключении на стандартном тарифе.

В итоге

Мы подключили GPT-5.4, Claude Sonnet 4.6 и Gemini 3.1 Pro через единый API в OpenAI-совместимом формате. Ключевой момент: смена base_url и api_key в существующем коде — и вы получаете доступ к трём провайдерам без переписывания SDK.

Роутер оправдан, когда:

  • нужна отказоустойчивость и автоматический fallback
  • вы сравниваете качество разных моделей на реальных задачах
  • хотите управлять расходами из одного места

Попробовать RouterAI.ru можно бесплатно — на сайте есть тестовый тариф. Документация с актуальным списком моделей и примерами интеграций — на routerai.ru.