Справочник API
unbleep говорит на OpenAI Chat Completions API. Если вы уже вызывали OpenAI, этот API вам знаком — направьте клиент на https://unbleep.ai/v1 и замените ключ.
Быстрый старт
Установите OpenAI SDK, задайте base URL и ключ и сделайте вызов.
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. У ключей есть префикс, чтобы утечка была очевидна сканерам секретов:
ub_live_…— продакшен, списывается с вашего предоплаченного кредита.ub_test_…— для локальной разработки. Тарифицируется точно так же, как live-ключ, по той же цене за токен и с того же предоплаченного кредита; единственное отличие — более низкий лимит запросов на ключ (см. Лимиты запросов). Тестовый ключ — это отдельные отзываемые учётные данные, а не бесплатный тариф.
Authorization: Bearer ub_live_9f2c…
Держите ключи на сервере. Никогда не встраивайте live-ключ в браузерный или мобильный код.
Модели
Передайте один из этих ID в model. Короткий алиас всегда указывает на последнюю сборку; датированные ID снапшотов тоже принимаются и сейчас разрешаются в ту же сборку. В какой бы форме вы ни отправили запрос, в ответе указывается короткий ID — запрос с unbleep-250811 возвращается как "model": "unbleep".
| Модель | Алиас указывает на | Контекст | Лучше всего для |
|---|---|---|---|
| unbleep | unbleep-250811 | 256K | Общее использование — по умолчанию |
| unbleep-high | unbleep-high-250811 | 1M | Самые большие задачи — длинные документы & целые кодовые базы |
| unbleep-mini | unbleep-mini-250811 | 32K | Дешёвые, быстрые, массовые вызовы |
Chat completions
POST /v1/chat/completions — основной эндпоинт. Тела запроса и ответа соответствуют схеме OpenAI.
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
}'
{
"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.
{
"index": 0,
"message": {
"role": "assistant",
"reasoning_content": "The question asks for one line, so…",
"content": "…"
},
"finish_reason": "stop"
}
Токены рассуждений оплачиваются. Трасса — это сгенерированный вывод, и она тарифицируется по обычной цене выходных токенов модели, читает ваш код это поле или нет. Долгое размышление над коротким вопросом — реальная строка в вашем счёте.
Отправьте "thinking": false, чтобы выключить рассуждения, — тогда бюджет completion уйдёт на ответ, а не на трассу:
{
"model": "unbleep",
"messages": […],
"thinking": false
}
Регулятор policy
Отличительная черта unbleep. Необязательный параметр policy задаёт, сколько контроля применяется к запросу. По умолчанию — off.
off— нефильтрованный базовый режим (по умолчанию). Никаких внедрённых отказов.research— отвечает точно так же, какoff. Значение записывается в строку использования для вашей собственной отчётности; дополнительная проверка не применяется.strict— сверяет текст сообщения с блок-листом сервиса и при совпадении возвращает ошибку policy. Блок-лист поддерживается оператором и один для всех, кто его включил; настраиваемого блок-листа на уровне аккаунта нет.
{
"model": "unbleep",
"messages": […],
"policy": "research"
}
Ошибки
Ошибки используют конверт OpenAI, так что существующая обработка ошибок работает без изменений.
{
"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. Отклонённый запрос не оплачивается. Стриминговый вызов удерживает свой слот до завершения потока, поэтому обычно именно длинные потоки упираются в потолок.
{
"error": {
"type": "rate_limit_error",
"code": "too_many_concurrent_requests",
"message": "Too many concurrent requests for this account (limit 8)."
}
}
Оба потолка фиксированы для стандартных аккаунтов — они не растут вместе с предоплаченным балансом. Нужен запас? Enterprise их поднимает.