Справочник API

unbleep говорит на OpenAI Chat Completions API. Если вы уже вызывали OpenAI, этот API вам знаком — направьте клиент на https://unbleep.ai/v1 и замените ключ.

Быстрый старт

Установите OpenAI SDK, задайте base URL и ключ и сделайте вызов.

python
from openai import OpenAI

client = OpenAI(
    base_url="https://unbleep.ai/v1",
    api_key="ub_live_9f2c…",
)

resp = client.chat.completions.create(
    model="unbleep",
    messages=[{"role": "user", "content": "Say hello."}],
)
print(resp.choices[0].message.content)

Аутентификация

Каждому запросу нужен Bearer-токен в заголовке Authorization. У ключей есть префикс, чтобы утечка была очевидна сканерам секретов:

заголовок
Authorization: Bearer ub_live_9f2c…

Держите ключи на сервере. Никогда не встраивайте live-ключ в браузерный или мобильный код.

Модели

Передайте один из этих ID в model. Короткий алиас всегда указывает на последнюю сборку; датированные ID снапшотов тоже принимаются и сейчас разрешаются в ту же сборку. В какой бы форме вы ни отправили запрос, в ответе указывается короткий ID — запрос с unbleep-250811 возвращается как "model": "unbleep".

МодельАлиас указывает наКонтекстЛучше всего для
unbleepunbleep-250811256KОбщее использование — по умолчанию
unbleep-highunbleep-high-2508111MСамые большие задачи — длинные документы & целые кодовые базы
unbleep-miniunbleep-mini-25081132KДешёвые, быстрые, массовые вызовы

Chat completions

POST /v1/chat/completions — основной эндпоинт. Тела запроса и ответа соответствуют схеме OpenAI.

curl · запрос
curl https://unbleep.ai/v1/chat/completions \
  -H "Authorization: Bearer ub_live_9f2c…" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "unbleep",
    "messages": [
      {"role": "system", "content": "You are terse."},
      {"role": "user", "content": "Explain abliteration in one line."}
    ],
    "temperature": 0.7,
    "max_tokens": 256
  }'
json · ответ
{
  "id": "chatcmpl_a1b2c3",
  "object": "chat.completion",
  "model": "unbleep",
  "choices": [{
    "index": 0,
    "message": { "role": "assistant", "content": "…" },
    "finish_reason": "stop"
  }],
  "usage": { "prompt_tokens": 24, "completion_tokens": 18, "total_tokens": 42 }
}

Стриминг

Задайте "stream": true, чтобы получать Server-Sent Events. Каждое событие — это chat.completion.chunk с полем delta; поток завершается литералом data: [DONE].

поток событий
data: {"choices":[{"delta":{"content":"Ab"}}]}
data: {"choices":[{"delta":{"content":"literation"}}]}
data: {"choices":[{"delta":{},"finish_reason":"stop"}]}
data: [DONE]

Рассуждения

Рассуждающие модели думают, прежде чем ответить. Трасса рассуждений возвращается в reasoning_content рядом с обычным content — в message для обычного вызова и в delta при стриминге. Поле присутствует, только если модель действительно сгенерировала трассу, поэтому считайте его необязательным и берите сам ответ из content.

json · фрагмент ответа
{
  "index": 0,
  "message": {
    "role": "assistant",
    "reasoning_content": "The question asks for one line, so…",
    "content": "…"
  },
  "finish_reason": "stop"
}

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

Отправьте "thinking": false, чтобы выключить рассуждения, — тогда бюджет completion уйдёт на ответ, а не на трассу:

json · фрагмент запроса
{
  "model": "unbleep",
  "messages": […],
  "thinking": false
}

Регулятор policy

Отличительная черта unbleep. Необязательный параметр policy задаёт, сколько контроля применяется к запросу. По умолчанию — off.

json · фрагмент запроса
{
  "model": "unbleep",
  "messages": […],
  "policy": "research"
}

Ошибки

Ошибки используют конверт OpenAI, так что существующая обработка ошибок работает без изменений.

json · 401
{
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_api_key",
    "message": "Incorrect API key provided."
  }
}
СтатусЗначение
401Ключ отсутствует или недействителен
402Кредит закончился — пополните баланс, чтобы продолжить
422Заблокировано policy: strict
429Превышен лимит — подождите и повторите
5xxОшибка upstream — можно повторить с backoff

Лимиты запросов

Действуют два независимых лимита, оба на аккаунт: частота запросов и потолок одновременных запросов.

Частота запросов

60 запросов в минуту на аккаунт, измеряется скользящим 60-секундным окном. Лимит привязан к аккаунту, а не к ключу: выпуск дополнительных ключей не даёт дополнительной пропускной способности, и все ваши ключи расходуют одни и те же 60. У тестового ключа свой более низкий потолок — 15 запросов в минуту на ключ; при этом он всё равно учитывается в общем окне аккаунта.

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

заголовки ответа
x-ratelimit-limit-requests: 60
x-ratelimit-remaining-requests: 58
x-ratelimit-reset-requests: 43

x-ratelimit-reset-requests — простое целое число: целые секунды до того, как в окне освободится слот, без суффикса единиц. Разбирайте его как число, а не как строку длительности.

Одновременные запросы

Не более 8 запросов в полёте одновременно на аккаунт. Девятый одновременный запрос немедленно отклоняется с 429 и кодом too_many_concurrent_requests; ответ содержит retry-after: 1. Отклонённый запрос не оплачивается. Стриминговый вызов удерживает свой слот до завершения потока, поэтому обычно именно длинные потоки упираются в потолок.

json · 429
{
  "error": {
    "type": "rate_limit_error",
    "code": "too_many_concurrent_requests",
    "message": "Too many concurrent requests for this account (limit 8)."
  }
}

Оба потолка фиксированы для стандартных аккаунтов — они не растут вместе с предоплаченным балансом. Нужен запас? Enterprise их поднимает.