RU ▾
Получить API-ключ

Готовая замена API без цензуры, без привязки к поставщику.

за 1M входных токенов
$0.15
Выходные токены / 1M
$0.50
контекстное окно
100,000
пробный баланс
$0.50
запросов в минуту
300
https://api.openaigatewayapi.com/v1

API OpenAI для разработчиков: используйте совместимый эндпоинт

Если ваш код уже использует протокол OpenAI, вы можете запустить его на этом размещённом эндпоинте, изменив два значения: базовый URL и ключ. На этой странице показаны точные шаги с готовым кодом для вставки.

Обновлено

Два серверных блока, соединённых светящимся кабелем, показывающие переключение приложения между эндпоинтами путём изменения одной настройки

Ключевые моменты

  1. Установите базовый URL на https://api.openaigatewayapi.com/v1 и модель на uncensored; ничего другого в вашем коде клиента OpenAI менять не нужно.
  2. Chat completion, потоковая передача, вызов функций и JSON-режим работают через обычные вызовы SDK.
  3. Лимиты составляют 8 параллельных запросов и 300 запросов в минуту для полного ключа, поэтому предусмотрите повторную попытку при 429.
  4. Пробный баланс за $0,50 в один клик не требует привязки карты, поэтому вы можете протестировать интеграцию перед оплатой.

Краткая версия

Большинство руководств по API OpenAI для разработчиков предполагают одного поставщика и один счёт. Однако сетевой формат — это просто JSON поверх HTTPS, и множество клиентского кода, фреймворков и инструментов может общаться с любым сервером, который его реализует. Этот сайт размещает один из таких серверов. Вы сохраняете свой SDK, меняете базовый URL, подставляете ключ с этого сайта и указываете модель uncensored.

Это весь процесс миграции для типичного приложения. Вот чек-лист, а остальная часть страницы раскрывает каждый шаг.

  1. Создайте аккаунт и получите пробный баланс на странице API-ключа.
  2. Установите базовый URL на https://api.openaigatewayapi.com/v1.
  3. Отправляйте ключ как Authorization: Bearer <key>. SDK делают это за вас, когда вы передаёте api_key.
  4. Используйте uncensored в качестве идентификатора модели в каждом запросе.
  5. Обработайте HTTP 429 с короткой повторной попыткой, как показано ближе к концу.

Существует два эндпоинта: POST /v1/chat/completions и GET /v1/models. Сервис работает только с текстом. Нет генерации изображений или аудио, нет эмбеддингов и дообучения, поэтому если ваше приложение вызывает эти функции, им потребуется другой провайдер.

Проверьте соединение с помощью curl

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

export API_KEY="paste-your-key-here"

curl https://api.openaigatewayapi.com/v1/models \
  -H "Authorization: Bearer $API_KEY" | grep -o uncensored

Grep выводит идентификатор модели uncensored, если список его содержит; уберите grep, чтобы увидеть полный список JSON. Если вы получаете 401, ключ неверный или отсутствует префикс Bearer. Теперь отправьте реальный запрос:

curl https://api.openaigatewayapi.com/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [
      {"role": "system", "content": "You are a concise technical assistant."},
      {"role": "user", "content": "Explain idempotency keys in two sentences."}
    ],
    "temperature": 0.4
  }'

Ответ содержит стандартные объекты choices и usage. Он также включает заголовки, которые стоит логировать: X-Request-Id для вопросов поддержки, X-Balance-USD для вашего оставшегося баланса, и два заголовка X-RateLimit-Limit-*, показывающие лимиты запросов и параллельных запросов.

Python с официальным пакетом openai

В Python вы меняете только конструктор клиента. Всё остальное — это код, который у вас уже есть.

from openai import OpenAI

client = OpenAI(
    base_url="https://api.openaigatewayapi.com/v1",
    api_key="paste-your-key-here",
)

resp = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "You write short, accurate release notes."},
        {"role": "user", "content": "Summarise: added retry logic, fixed timeout bug."},
    ],
    temperature=0.5,
    max_tokens=200,
)

print(resp.choices[0].message.content)
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)

В реальном коде считывайте ключ из переменной окружения. В примере он захардкожен только для краткости. max_tokens здесь необязателен; если его не указать, генерация может использовать всё оставшееся место в контекстном окне на 100 000 токенов (промпт и генерация вместе). Установка этого параметра — дешёвый способ ограничить расходы при неконтролируемой генерации.

Потоковая передача

Потоковая передача использует Server-Sent Events и тот же флаг stream=True, который вы знаете. Данные об использовании поступают в конце потока, поэтому последний чанк может иметь пустой список choices.

from openai import OpenAI

client = OpenAI(base_url="https://api.openaigatewayapi.com/v1", api_key="paste-your-key-here")

stream = client.chat.completions.create(
    model="uncensored",
    messages=[{"role": "user", "content": "List five edge cases for a date parser."}],
    stream=True,
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
    if getattr(chunk, "usage", None):
        print("\ntokens:", chunk.usage.total_tokens)

Одна деталь важна для планирования мощности. Запрос с потоковой передачей удерживает слот параллелизма до завершения потока, а не до получения первого токена. Если клиент прерывает поток без его закрытия, этот слот остаётся занятым дольше, чем вы ожидаете.

Пример на Node.js

SDK Node принимает те же две настройки под другими именами.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.openaigatewayapi.com/v1",
  apiKey: process.env.GATEWAY_KEY,
});

const completion = await client.chat.completions.create({
  model: "uncensored",
  messages: [
    { role: "user", content: "Write a regex that matches ISO 8601 dates, and explain it." },
  ],
  temperature: 0.3,
});

console.log(completion.choices[0].message.content);

Если вы используете фреймворк с собственной интеграцией OpenAI, ищите поле с именем base URL, API base или endpoint в его настройках. Вставка того же URL туда обычно всё решает. Фронтенды для чатов, фреймворки агентов и плагины редакторов в основном следуют этому шаблону. Параметры сэмплирования, такие как temperature, top_p, stop, seed и штрафы за частоту и присутствие, передаются модели.

Вызов инструментов и JSON-режим

Две функции определяют, подходит ли модель для реального приложения: вызов ваших функций и возврат данных, которые можно распарсить. Обе поддерживаются.

Вызов функций

Вы объявляете инструменты через tools, при необходимости принудительно выбираете вариант через tool_choice и отправляете результаты обратно как сообщения с role: "tool". Потоковые ответы доставляют tool_calls частями, как и в стандартном формате.

import json
from openai import OpenAI

client = OpenAI(base_url="https://api.openaigatewayapi.com/v1", api_key="paste-your-key-here")

tools = [{
    "type": "function",
    "function": {
        "name": "get_order_status",
        "description": "Look up the status of an order by its ID.",
        "parameters": {
            "type": "object",
            "properties": {"order_id": {"type": "string"}},
            "required": ["order_id"],
        },
    },
}]

messages = [{"role": "user", "content": "Where is order A-1042?"}]
first = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
msg = first.choices[0].message

if msg.tool_calls:
    call = msg.tool_calls[0]
    args = json.loads(call.function.arguments)
    result = {"order_id": args["order_id"], "status": "shipped"}  # your real lookup here
    messages.append(msg)
    messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})
    final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
    print(final.choices[0].message.content)

Всегда проверяйте аргументы перед их использованием. Модель генерирует JSON, соответствующий вашей схеме, в большинстве случаев, но не всегда, поэтому относитесь к call.function.arguments как к любому другому недоверенному вводу.

JSON-режим

Для задач извлечения и классификации запрашивайте JSON-объект и также укажите это в промпте. Упоминание JSON в инструкциях даёт лучшие результаты, чем полагаться только на флаг.

from openai import OpenAI
import json

client = OpenAI(base_url="https://api.openaigatewayapi.com/v1", api_key="paste-your-key-here")

resp = client.chat.completions.create(
    model="uncensored",
    response_format={"type": "json_object"},
    messages=[
        {"role": "system", "content": "Reply with JSON only: {\"sentiment\": string, \"topics\": [string]}."},
        {"role": "user", "content": "The docs are clear but the rate limits caught me off guard."},
    ],
)
data = json.loads(resp.choices[0].message.content)
print(data)

Лимиты, ошибки и повторные попытки

Полный ключ позволяет 8 параллельных запросов и 300 запросов в минуту. Пробный ключ позволяет 2 параллельных запроса и 60 в минуту. Максимальный размер тела запроса — 8 МБ. Превышение лимита возвращает HTTP 429, а код ошибки сообщает, какой именно лимит был превышен.

Код ошибкиЧто значитЧто делать
rate_limitedСлишком много запросов в минутуЗамедлите клиента или распределите работу по минуте
concurrencyСлишком много запросов одновременноУменьшите количество рабочих процессов до 8 или меньше, или до 2 для пробного ключа
429 с Retry-After: 5Временная перегрузкаПодождите указанное количество секунд и попробуйте снова

SDK уже повторяют попытки при некоторых ошибках. Добавьте свою обработку 429, чтобы всплеск не обрушил пакетную задачу:

import time
from openai import OpenAI, RateLimitError

client = OpenAI(
    base_url="https://api.openaigatewayapi.com/v1",
    api_key="paste-your-key-here",
    max_retries=0,
)

def ask(prompt, attempts=5):
    for i in range(attempts):
        try:
            r = client.chat.completions.create(
                model="uncensored",
                messages=[{"role": "user", "content": prompt}],
            )
            return r.choices[0].message.content
        except RateLimitError as e:
            wait = float(e.response.headers.get("retry-after", 2 ** i))
            time.sleep(wait)
    raise RuntimeError("still rate limited after retries")

Отказавшие или отклонённые запросы не оплачиваются, поэтому цикл повторных попыток не удваивает ваш счёт. Семафор, размер которого соответствует лимиту параллельных запросов, — самый чистый способ оставаться в пределах лимита в асинхронном коде.

Перенос существующего приложения

Если у вас есть работающее приложение, не захардкодьте новые значения. Поместите базовый URL, ключ и имя модели в переменные окружения, чтобы можно было переключаться между средами без деплоя. Это также позволяет запускать один и тот же набор тестов против двух бэкендов и сравнивать вывод бок о бок.

import os
from openai import OpenAI

client = OpenAI(
    base_url=os.environ.get("LLM_BASE_URL", "https://api.openaigatewayapi.com/v1"),
    api_key=os.environ["LLM_API_KEY"],
)
MODEL = os.environ.get("LLM_MODEL", "uncensored")

def complete(messages, **kw):
    return client.chat.completions.create(model=MODEL, messages=messages, **kw)

Затем пройдите короткий процесс миграции:

  1. Запустите существующий набор промптов на новом эндпоинте и просмотрите выводы самостоятельно. Автоматические проверки ловят нарушения формата, но не тональность.
  2. Проверьте, что любой код, разбирающий JSON, всё ещё проходит при установленной response_format, и сохраните резервный вариант, который удаляет лишний текст вокруг объекта.
  3. Измеряйте реальное количество токенов из usage, так как другая модель токенизирует текст иначе, и ваши старые оценки могут быть неточными.
  4. Установите размер пула рабочих процессов на 8 или меньше, чтобы лимит параллельных запросов никогда не был первой причиной сбоев под нагрузкой.
  5. Запустите для небольшой доли трафика, наблюдайте за частотой ответов 429 и логами ошибок, затем расширяйте охват.

Команды часто забывают про системный промпт в этом процессе. Промпты, написанные для того, чтобы склонить модель, склонную к отказам, к поведению, обычно содержат смягчающие фразы, которые здесь не нужны и могут загромождать вывод. Перечитайте свои и удалите то, что больше ничего не делает.

Что нужно знать перед переключением

Совместимость охватывает формат запроса и ответа. Это не делает этот сервис официальным API любого создателя моделей. Сервис запускает одну модель с открытыми весами, размещённую независимым провайдером и настроенную на ответы без отказов по контенту для законного использования взрослыми. Это не маршрутизатор между вендорами, поэтому вы не найдёте там меню других моделей. Сексуальный контент с участием несовершеннолетних запрещён, и это ограничение нельзя изменить.

Учитывайте три практических отличия от крупной многомодельной платформы:

  • Одна модель. Её ID — uncensored. Если ваш код переключает модели по задачам, сведите это к одному значению.
  • Только текст. Удалите любые вызовы изображений, аудио или эмбеддингов из пути, ведущего на этот эндпоинт.
  • Поведение промптов отличается. Другая модель по-разному понимает инструкции, поэтому после переключения запустите промпты и тесты заново. Уточните системные промпты, если вывод отклоняется.

Промпты не используются для обучения. Полный список параметров см. в документации API. Если вы оцениваете расходы, на странице тарифов указаны ставки за токен: $0,15 за 1 млн входных токенов и $0,50 за 1 млн выходных токенов, списание с предоплаченного баланса без подписки. Пополнение от $20 до $500, баланс не сгорает. Если вы рассматриваете прокси-слой перед несколькими сервисами, страница о LLM-шлюзах объясняет, когда этот дополнительный компонент оправдан.

Вопросы и ответы

Нужен ли мне новый SDK для использования этого эндпоинта?

Нет. Официальные SDK OpenAI для Python и Node работают, если вы установите базовый URL на https://api.openaigatewayapi.com/v1 и используете ключ с этого сайта. Любой другой клиент, позволяющий задать пользовательский эндпоинт, работает так же.

Какой ID модели отправить?

Используйте uncensored в поле модели каждого запроса chat completion. Вы можете подтвердить это, отправив GET-запрос к /v1/models.

Могу ли я протестировать это без оплаты?

Да. После регистрации вы можете получить $0,50 пробного баланса одним нажатием на странице API-ключа. Для этого не нужна карта, срок действия — 7 дней, лимит — один на человека.

Поддерживает ли он эмбеддинги или генерацию изображений?

Нет. API поддерживает только текст и предлагает завершения чата и список моделей. Для эмбеддингов или изображений вам нужен отдельный провайдер.

Используются ли мои промпты для обучения?

Нет, промпты не используются для обучения.

До вашего ключа — одна форма

Создайте аккаунт, скопируйте ключ, измените базовый URL. Это вся настройка.

Получить API-ключhttps://api.openaigatewayapi.com/v1