Перейти к содержимому
Разработчикам

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"},
)
HTTP/1.1 200 OK
X-ApiHub-Seller: neuraldeep
X-ApiHub-Route: cheaper
X-RateLimit-Remaining: 59
API

Эндпоинты

Формат запросов и ответов совпадает с OpenAI, поэтому подходят официальные SDK.

POST/g/v1/chat/completionsЧат-модели в формате OpenAI Chat Completions. Модель — из тела, продавца выбирает шлюз.
POST/g/v1/embeddingsЭмбеддинги в формате OpenAI Embeddings.
POST/g/v1/{api}/{путь}Любой API из каталога у конкретного продавца: адрес и метод — на странице инструмента.

Заголовки ответа

Кто ответил и сколько осталось до лимита. Стоимость и токены каждого вызова — в кабинете, в разделе «Расход».

X-ApiHub-Seller
Продавец, который ответил
X-ApiHub-Route
Правило выбора: cheaper, cheaper:RU и т. п.
X-RateLimit-Remaining
Сколько запросов осталось в лимите ключа

Параметр sort

Правило выбора продавца, если модель продают несколько. Без параметра — optimal.

cheaper
Минимальная цена
faster
Минимальная задержка
reliable
Максимальная доля успешных ответов
optimal
Дешевле среди не худших по скорости и надёжности
country=RU
Только продавцы с обработкой в этой стране
/g/v1/chat/completions?sort=optimal&country=RU
Попытки

Продавец не ответил — запрос уходит следующему

На 5xx, 429 и обрыве связи шлюз берёт следующего продавца из списка — до трёх попыток. Неудачная попытка не оплачивается.

ЗапросPOST /g/v1/chat/completions?sort=cheaper

Модель — в теле, продавца выбирает шлюз.

Попытка 1503 · together

Продавец упал. Деньги не списываются.

Попытка 2200 · X-ApiHub-Seller: neuraldeep

Ответ следующего продавца, оплата по его цене.

Ошибки шлюза приходят телом {"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": "…"}}
buyer_fault400, 404, 413, 422Запрос не принят продавцом. Исправьте запрос: в message и param — причина продавца. Повтор не поможет.
rate_limited429Лимит. Подождите Retry-After и повторите; шлюз уже пробовал других продавцов.
seller_unavailable502Продавцы не ответили. Повторите через несколько секунд; деньги не списаны.
seller_timeout504Продавец не ответил за срок. Повторите; для долгих задач берите меньше max_tokens.
seller_out_of_funds503У продавца кончились деньги или квота. Повторите позже или выберите другую модель.
seller_auth502Сбой ключа площадки у продавца — наша авария. Повторите; если держится, напишите в поддержку с request_id.
credential_echo502Ответ продавца заблокирован: в нём были учётные данные. Покупателю секрет не ушёл.
secret_ceiling429Исчерпан потолок вызовов к этому API (код upstream_quota_exceeded).

Ответы /a/v1 проще: {"error": "текст", "code": "…"}, 401 — invalid_api_key, 404 — нет такого агента или запуска.

Получите ключ и отправьте первый запрос

Без подписки · пробный баланс на первые запросы