OpenAI-совместимый шлюз ко всем моделям
Меняются только base_url и ключ. Приложение шлёт запрос на g.gnzs.pro в формате OpenAI, а вместо ключей поставщиков у вас один токен ApiHub.
from openai import OpenAI
client = OpenAI(
base_url="https://g.gnzs.pro/g/v1",
api_key=APIHUB_KEY,
)
r = client.chat.completions.create(
model="gpt-oss-120b",
messages=[{"role": "user", "content": "Привет"}],
extra_query={"sort": "cheaper"},
)Эндпоинты
Формат запросов и ответов совпадает с OpenAI, поэтому подходят официальные SDK.
Заголовки ответа
Кто ответил и сколько осталось до лимита. Стоимость и токены каждого вызова — в кабинете, в разделе «Расход».
- X-ApiHub-Seller
- Продавец, который ответил
- X-ApiHub-Route
- Правило выбора: cheaper, cheaper:RU и т. п.
- X-RateLimit-Remaining
- Сколько запросов осталось в лимите ключа
Параметр sort
Правило выбора продавца, если модель продают несколько. Без параметра — optimal.
- cheaper
- Минимальная цена
- faster
- Минимальная задержка
- reliable
- Максимальная доля успешных ответов
- optimal
- Дешевле среди не худших по скорости и надёжности
- country=RU
- Только продавцы с обработкой в этой стране
Продавец не ответил — запрос уходит следующему
На 5xx, 429 и обрыве связи шлюз берёт следующего продавца из списка — до трёх попыток. Неудачная попытка не оплачивается.
Модель — в теле, продавца выбирает шлюз.
Продавец упал. Деньги не списываются.
Ответ следующего продавца, оплата по его цене.
Ошибки шлюза приходят телом {"error": {"type": "…", "code": "…", "message": "…", "request_id": "…"}}: 402 — на балансе нет денег, 429 — превышен лимит. Все коды, потоки, агенты и SDK — в примерах интеграции.
Примеры интеграции
Шлюз /g/v1 совместим с OpenAI, агенты живут на /a/v1. Ключ — в заголовке Authorization: Bearer. Полный справочник — /docs/api, схема — /docs/api.json.
Официальный клиент OpenAI
Своя обёртка не нужна: меняются base_url и ключ. Подходит любая версия клиента, которая умеет base_url.
from openai import OpenAI
client = OpenAI(base_url="https://g.gnzs.pro/g/v1", api_key=APIHUB_KEY)
r = client.chat.completions.create(
model="gpt-oss-120b",
messages=[{"role": "user", "content": "Привет"}],
)
print(r.choices[0].message.content)Потоковый ответ и ошибки
stream: true отдаёт чанки OpenAI. Ошибка после первого чанка приходит кадром event: error с тем же телом. Тонкий SDK собирает обе формы ошибок в одну.
from apihub import Client, ApiError
c = Client(APIHUB_KEY)
try:
for chunk in c.chat_stream(model="gpt-oss-120b", messages=[{"role": "user", "content": "Привет"}]):
print(chunk["choices"][0]["delta"].get("content", ""), end="")
except ApiError as e:
print(e.status, e.type, e.code, e.request_id)Агент: POST /a/v1/chat
Модель плюс подключённые коннекторы (MCP) — агент сам вызывает их инструменты. Ключ тот же, с правом gateway:call. mode: stream — SSE, async — 202 с run_id.
from apihub import Client
c = Client(APIHUB_KEY)
for event, data in c.agent_chat_stream(
model="gpt-oss-120b",
connectors=["<id коннектора>"],
messages=[{"role": "user", "content": "Найди последние заказы"}],
):
print(event, data)Тонкие SDK
Для Python, JS/TS, PHP и Go — каталог sdk/ в репозитории площадки, лицензия MIT, без зависимостей. Дают единую ошибку (status, type, code, message, param, request_id) и вызов /a/v1/chat. В PyPI и npm пока не опубликованы: ставятся из репозитория.
Коды ошибок
Тело ошибки шлюза в форме OpenAI, одинаковое у любого продавца. Заголовок X-Request-Id приходит всегда — укажите его в обращении.
{"error": {"type": "seller_unavailable", "code": "seller_unavailable", "message": "…", "param": null, "request_id": "…"}}Ответы /a/v1 проще: {"error": "текст", "code": "…"}, 401 — invalid_api_key, 404 — нет такого агента или запуска.
Получите ключ и отправьте первый запрос
Без подписки · пробный баланс на первые запросы