Référence de l'API
unbleep parle l'API Chat Completions d'OpenAI. Si vous avez déjà appelé OpenAI, vous connaissez déjà cette API — pointez votre client vers https://unbleep.ai/v1 et changez la clé.
Démarrage rapide
Installez le SDK OpenAI, définissez l'URL de base et votre clé, puis faites un appel.
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)
Authentification
Chaque requête a besoin d'un jeton Bearer dans l'en-tête Authorization. Les clés portent un préfixe pour qu'une fuite saute aux yeux des scanners de secrets :
ub_live_…— production, facturée sur votre crédit prépayé.ub_test_…— pour le développement local. Facturée exactement comme une clé live, au même tarif par token, sur le même crédit prépayé ; la seule différence est une limite de débit par clé plus basse (voir Limites de débit). Une clé de test est un identifiant distinct et révocable — pas une offre gratuite.
Authorization: Bearer ub_live_9f2c…
Gardez les clés côté serveur. N'embarquez jamais une clé live dans du code navigateur ou mobile.
Modèles
Passez l'un de ces identifiants dans model. L'alias nu pointe toujours vers le dernier build ; les identifiants de snapshot datés sont acceptés aussi et résolvent actuellement vers ce même build. Quelle que soit la forme envoyée, la réponse indique l'identifiant nu — une requête pour unbleep-250811 revient avec "model": "unbleep".
| Modèle | L'alias pointe vers | Contexte | Idéal pour |
|---|---|---|---|
| unbleep | unbleep-250811 | 256K | Usage général — le modèle par défaut |
| unbleep-high | unbleep-high-250811 | 1M | Les plus gros travaux — longs documents & bases de code entières |
| unbleep-mini | unbleep-mini-250811 | 32K | Appels économiques, rapides, à fort volume |
Chat completions
POST /v1/chat/completions — l'endpoint principal. Les corps de requête et de réponse suivent le schéma 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 }
}
Streaming
Définissez "stream": true pour recevoir des Server-Sent Events. Chaque événement est un chat.completion.chunk avec un delta ; le flux se termine par un data: [DONE] littéral.
data: {"choices":[{"delta":{"content":"Ab"}}]}
data: {"choices":[{"delta":{"content":"literation"}}]}
data: {"choices":[{"delta":{},"finish_reason":"stop"}]}
data: [DONE]
Raisonnement
Les modèles de raisonnement réfléchissent avant de répondre. La trace revient dans reasoning_content, à côté du content habituel — sur message pour un appel normal, et sur delta en streaming. Le champ n'est présent que si le modèle a réellement produit une trace : traitez-le comme optionnel et lisez content pour la réponse elle-même.
{
"index": 0,
"message": {
"role": "assistant",
"reasoning_content": "The question asks for one line, so…",
"content": "…"
},
"finish_reason": "stop"
}
Les tokens de raisonnement sont facturés. La trace est une sortie générée et elle est facturée au tarif de sortie normal du modèle, que votre code lise le champ ou non. Une longue délibération sur une question courte est une vraie ligne sur votre facture.
Envoyez "thinking": false pour désactiver le raisonnement, afin que le budget de complétion aille à la réponse plutôt qu'à la trace :
{
"model": "unbleep",
"messages": […],
"thinking": false
}
Curseur de politique
Ce qui distingue unbleep. Le paramètre optionnel policy règle le niveau de gouvernance appliqué à une requête. Sa valeur par défaut est off.
off— référence non filtrée (par défaut). Aucun refus injecté.research— répond exactement commeoff. La valeur est enregistrée sur la ligne d'utilisation pour vos propres rapports ; elle n'applique aucun filtrage supplémentaire.strict— compare le texte des messages à la liste de blocage du service et renvoie une erreur de politique en cas de correspondance. La liste de blocage est maintenue par l'opérateur et s'applique à tous ceux qui l'activent ; il n'y a pas de liste de blocage par compte à configurer.
{
"model": "unbleep",
"messages": […],
"policy": "research"
}
Erreurs
Les erreurs utilisent l'enveloppe OpenAI, donc votre gestion d'erreurs existante fonctionne sans changement.
{
"error": {
"type": "invalid_request_error",
"code": "invalid_api_key",
"message": "Incorrect API key provided."
}
}
| Statut | Signification |
|---|---|
| 401 | Clé manquante ou invalide |
| 402 | Crédit épuisé — rechargez pour continuer |
| 422 | Bloqué par policy: strict |
| 429 | Limite de débit — attendez puis réessayez |
| 5xx | Erreur en amont — réessayez sans risque avec un backoff |
Limites de débit
Deux limites indépendantes s'appliquent, toutes deux par compte : un débit de requêtes et un plafond de concurrence.
Débit de requêtes
60 requêtes par minute et par compte, mesurées sur une fenêtre glissante de 60 secondes. La limite porte sur le compte, pas sur la clé — créer des clés supplémentaires n'achète pas de débit supplémentaire, et toutes vos clés puisent dans les mêmes 60. Une clé de test a un plafond par clé plus bas, de 15 requêtes par minute ; elle compte quand même dans la même fenêtre de compte.
Chaque réponse porte les en-têtes standard pour que vous puissiez cadencer vos requêtes sans deviner. Ils décrivent la fenêtre la plus proche de vous bloquer :
x-ratelimit-limit-requests: 60
x-ratelimit-remaining-requests: 58
x-ratelimit-reset-requests: 43
x-ratelimit-reset-requests est un entier nu — le nombre de secondes entières avant que la fenêtre libère une place, sans suffixe d'unité. Parsez-le comme un nombre, pas comme une chaîne de durée.
Concurrence
Au plus 8 requêtes en cours simultanément par compte. Une neuvième requête concurrente est rejetée immédiatement avec 429 et le code too_many_concurrent_requests ; la réponse porte retry-after: 1. Rien n'est facturé pour une requête rejetée. Un appel en streaming garde sa place jusqu'à la fin du flux, donc ce sont généralement les longs flux qui vous amènent au plafond.
{
"error": {
"type": "rate_limit_error",
"code": "too_many_concurrent_requests",
"message": "Too many concurrent requests for this account (limit 8)."
}
}
Les deux plafonds sont fixes pour les comptes standard — ils n'augmentent pas avec votre solde prépayé. Besoin de plus de marge ? L'offre Enterprise les relève.