Подборки

Агрегаторы API нейросетей: условия подключения и расчёт бюджета

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, если пользователь не включает соответствующий режим сбора. Это не описывает практики конечного поставщика. Для чувствительных данных проверяйте условия выбранного поставщика отдельно.