OpenRouter, AIHubMix, ProxyAPI и Zenith дают программный доступ к моделям через API, но различаются адресами, протоколами, ключами и биллингом. Ниже сопоставлены документированные условия подключения и рассчитана стоимость заданной нагрузки; качество ответов не сравнивается.
Прямой API удобно сопоставлять только с конкретным разработчиком. В документации Anthropic ключи Claude API создаются в Claude Console, REST API доступен по адресу https://api.anthropic.com, а Messages использует POST /v1/messages. В таблице приведены эти условия рядом с агрегаторами. Тарифная строка Claude Sonnet 5.5 взята из датированной таблицы Anthropic: $2 за 1 млн входных и $10 за 1 млн выходных токенов (28.10.2026). Отдельный расчёт нагрузки ниже выполнен только по трём строкам каталога Zenith: это не рейтинг качества или подтверждение backend.
Что вы покупаете: интерфейс или программный доступ
Агрегатор предоставляет программный доступ к собственным маршрутам: приложение отправляет запросы с его ключом, а расходы начисляются по условиям сервиса. Это не подписка на чат и не пополнение аккаунта разработчика модели. Канал выдачи ключа, например Telegram-бот, сам по себе не определяет способ оплаты.
Агрегаторы и прямой API: что различается
| Вариант | Адрес, ключ и формат | Биллинг или датированная ставка | Подтверждённая особенность | Когда рассматривать |
|---|---|---|---|---|
| Прямой Claude API | Ключ создаётся в Claude Console; REST API: https://api.anthropic.com; Messages: POST /v1/messages. Документация Anthropic. |
В таблице Anthropic, полученной 28.10.2026, Claude Sonnet 5.5: $2 за 1 млн входных и $10 за 1 млн выходных токенов. Прайс. | Это ключ и endpoint самого разработчика, а не маршрут агрегатора. | Если нужны условия и интерфейс Anthropic без промежуточного API. |
| OpenRouter | https://openrouter.ai/api/v1/chat/completions; HTTP Chat Completions, Bearer-ключ OpenRouter. |
Кредиты; Standard — комиссия 5,5% при покупке кредитов, не на каждый запрос. Прайс. | FAQ описывает fallback к следующему провайдеру при ошибке; поведение маршрутизации настраивается и не гарантирует успех. | Если приложению нужен единый документированный маршрут. |
| AIHubMix | https://aihubmix.com/v1/chat/completions; подтверждённый здесь маршрут OpenAI-compatible. |
Пополнение через Stripe, минимум $15 целыми долларами. Условия. | Quickstart указывает резервный домен https://api.inferera.com с теми же параметрами. Ключи можно ограничивать по моделям, лимиту и сроку. |
Если подходят протокол и настройки ключей. |
| ProxyAPI | OpenAI SDK: база https://api.proxyapi.ru/v1. ID моделей имеют формат «вендор/название». |
Списание по токенам за фактическое использование без абонентской платы; цены фиксированы в рублях с НДС. В карточке, полученной 28.10.2026 в 16:38 UTC, для anthropic/claude-haiku-4-5 указаны 295 ₽ за 1 млн входных и 1 474 ₽ за 1 млн выходных токенов; это архивный снимок, не текущая цена. | Опубликованная база и формат идентификатора относятся к ProxyAPI. | Если приложение использует этот OpenAI-совместимый SDK. |
| Zenith (API-сервис со ссылкой на бот для получения ключа) | OpenAI-compatible: https://api.zenithmarket.dev/v1; Messages: база без /v1; Gemini native: https://api.zenithmarket.dev, маршрут добавляет /v1beta. Справочник. |
Ниже — отдельный снимок трёх строк каталога, полученный одним редакционным GET-запросом 28.10.2026; не текущая или типичная цена. | GET /v1/models возвращает каталог ID; наличие записи — метаданные, не проверка inference или backend. |
Если подходят документированный протокол и условия сервиса. |
Ниже приведён отдельный расчёт только по трём ставкам Zenith. Комиссия OpenRouter Standard начисляется при покупке кредитов, а не отдельному inference-запросу. Лишь в условном примере, если комиссия 5,5% рассчитывается от суммы покупки $80, получается $80×1,055=$84,40. Это не наблюдённый платёж: фактическая сумма зависит от отображаемой суммы покупки и условий плана. См. также расчёт стоимости API по токенам.
Почему совместимость с OpenAI не равна совместимости приложения
Совместимость с OpenAI обычно относится к определённому формату, например chat/completions, а не ко всем API. Responses, Anthropic Messages, Gemini native, realtime и embeddings могут требовать других схем. Смена базового адреса не преобразует запрос: клиент или адаптер должен поддерживать нужный протокол и операцию.
ID модели — часть запроса. OpenRouter использует slug своего каталога; ProxyAPI документирует формат с вендором, например anthropic/..., а для некоторых путей Google вендор указывать не нужно. Несуществующий ID может привести к ошибке.
Учитывайте, добавляет ли SDK фрагмент пути: если он сам добавляет /v1, задайте базу без этого фрагмента, иначе может получиться /v1/v1. Полный адрес OpenRouter в таблице уже содержит путь Chat Completions.
Расчёт трёх строк каталога Zenith на 28 октября
В GET /v1/models Zenith редакция получила HTTP 200 28 октября 2026 года в 19:44 UTC. Один редакционный запрос вернул ставки input/output в microUSD за миллион токенов: gpt-6-luna — 16000/80000, claude-sonnet-5-5 — 670000/3350000, deepseek-v4-pro — 135000/400000. Это датированный снимок каталога, не текущая или будущая цена; наличие записи не подтверждает inference или backend. Сценарий — извлечь из договора стороны, предмет, сроки и штрафы, пропущенное отметить null. Для расчёта заданы 4000 входных и 800 выходных токенов; это допущение, не измеренный расход.
| Позиция | Вход, USD за 1 млн | Выход, USD за 1 млн | 1 запрос | 10 000 запросов | 12 500 запросов, +25% |
|---|---|---|---|---|---|
| gpt-6-luna | 0,016 | 0,08 | 0,000128 USD | 1,28 USD | 1,60 USD |
| claude-sonnet-5-5 | 0,67 | 3,35 | 0,00536 USD | 53,60 USD | 67,00 USD |
| deepseek-v4-pro | 0,135 | 0,4 | 0,00086 USD | 8,60 USD | 10,75 USD |
Формула: 4000/1000000 × цена входа + 800/1000000 × цена выхода. Для gpt-6-luna: 0,004×0,016 + 0,0008×0,08 = 0,000128 USD за запрос. При неизменном расходе 25% дополнительных оплачиваемых запросов умножают сумму на 1,25: 10 000 превращаются в 12 500.
Расчёт предполагает заданные объёмы без кэша, комиссий и внешних инструментов. Это арифметика трёх строк Zenith, а не сравнение цен агрегаторов или качества.
Первый запрос к OpenRouter
Сохраните код как openrouter_first.py и запустите python openrouter_first.py. Скрипт без ключа получает каталог, ожидает объект с массивом data, показывает первые десять ID и запрашивает полный ID. Ключ нужен только перед POST; запрос может расходовать баланс. Это документальный пример, редакция его не запускала. Каталог и поддержка параметров не гарантируют работу выбранного маршрута; тариф и лимиты учитывайте до отправки.
import getpass
import json
import os
import urllib.error
import urllib.request
catalog_request = urllib.request.Request(
"https://openrouter.ai/api/v1/models",
headers={"Accept": "application/json", "User-Agent": "Comrad404SourceReview/1.0"})
try:
with urllib.request.urlopen(catalog_request, timeout=30) as response:
catalog = json.load(response)
except (urllib.error.HTTPError, urllib.error.URLError, json.JSONDecodeError) as error:
raise SystemExit(f"Ошибка чтения каталога: {error}")
rows = catalog.get("data") if isinstance(catalog, dict) else None
if not isinstance(rows, list):
raise SystemExit("Ответ каталога не содержит ожидаемый массив data")
for row in rows[:10]:
if isinstance(row, dict):
print(row.get("id"))
model = input("Полный model ID из каталога OpenRouter: ").strip()
row = next((r for r in rows if isinstance(r, dict) and r.get("id") == model), None)
if row is None:
raise SystemExit("Нет такого ID в полученном каталоге")
parameters = row.get("supported_parameters")
if not isinstance(parameters, list) or "max_tokens" not in parameters:
raise SystemExit("Каталог не заявляет max_tokens; POST не отправлен")
key = os.environ.get("OPENROUTER_API_KEY") or getpass.getpass("OpenRouter API key: ")
if not key:
raise SystemExit("Ключ не введён")
headers = {"Authorization": "Bearer " + key, "Content-Type": "application/json"}
request = urllib.request.Request(
"https://openrouter.ai/api/v1/chat/completions",
data=json.dumps({"model": model, "messages": [{"role": "user", "content": "Ответь ровно: ok"}], "max_tokens": 128}).encode("utf-8"), headers=headers, method="POST")
try:
with urllib.request.urlopen(request, timeout=60) as response:
result = json.load(response)
except urllib.error.HTTPError as error:
raw = error.read().decode("utf-8", errors="replace").replace(key, "[REDACTED]")
print("HTTP", error.code, raw[:1200])
raise SystemExit(1)
except urllib.error.URLError as error:
raise SystemExit(f"Ошибка соединения: {error}")
choices = result.get("choices") if isinstance(result, dict) else None
if not isinstance(choices, list) or not choices or not isinstance(choices[0], dict):
raise SystemExit("Ответ не содержит ожидаемый массив choices")
message = choices[0].get("message")
text = message.get("content") if isinstance(message, dict) else None
print(text)
print("text_check:", isinstance(text, str) and text.strip() == "ok")
print("usage:", result.get("usage"))
При успешном вызове ожидаются текст ok в choices[0].message.content и text_check: True. Проверьте HTTP-ответ, finish_reason (например, length может означать обрезку) и usage, если поле присутствует. Такая проверка не тестирует tools, изображения или streaming.
Ошибки ProxyAPI: действие по коду
В таблице ProxyAPI: 404 — модель или файл не найдены; 429 — превышен лимит частоты; 502 — конечный сервис недоступен или не ответил; 504 — истекло время ожидания. Для 402 читайте текст ошибки: код может означать недостаток баланса, превышение бюджета ключа или месячного бюджета.
Тайм-аут не сообщает, обработан ли запрос и было ли списание. Если исход неизвестен, сохраните время и ответ ошибки, проверьте доступную историю сервиса и не запускайте серию повторов: каждая обработанная попытка может стоить денег.
Сравните варианты на задачах приложения
Методика будущего теста, не результат редакционного прогона: составьте десять типичных задач — например, пять вопросов по документам, два извлечения полей, исправление ошибки, классификация и короткий ответ — и зафиксируйте входы. Для каждого маршрута укажите ID, дату, системную инструкцию, параметры, формат и лимит ответа. Одинаковый ID не доказывает одинаковый backend. Записывайте опубликованный источник модели, если он есть, не выдавая его за подтверждённое происхождение. Если backend или версия не установлены, выводы относятся только к конкретному маршруту и дате: различия нельзя приписать модели или провайдеру и использовать для общего рейтинга агрегаторов. Сделайте три повтора каждой задачи, записывая время, usage, расход, статус и пригодность ответа.
До теста задайте критерии: например, ответ только по документу, обязательные поля JSON и предел длины. Стоимость принятого ответа считайте как все расходы, включая оплачиваемые неудачные попытки / число принятых ответов. Десять задач — отправная точка, не гарантия поведения на всей нагрузке.
Какие условия сопоставить перед своим тестом
OpenRouter описывает настраиваемый fallback при ошибке провайдера. ProxyAPI публикует OpenAI-совместимую базу; AIHubMix — такой маршрут, резервный домен и настройки ключей. Если рассматриваете прямой API разработчика, отдельно сопоставьте его ключ, endpoint, протокол и биллинг. Документация Zenith содержит ссылку на Telegram-бота для получения ключа, а запросы приложения идут к API; его ключи запрещено пересылать сторонним доменам.
Согласно политике OpenRouter, по умолчанию сервис не хранит prompts/responses, если пользователь не включает соответствующий режим сбора. Это не описывает практики конечного поставщика. Для чувствительных данных проверяйте условия выбранного поставщика отдельно.



