API BestPrivateAI — référence

Un endpoint compatible OpenAI, un modèle, une clé. Si votre code parle déjà à /v1/chat/completions, changez l'URL de base et la clé, et il nous parlera.

URL de base et authentification

Base URL:  https://api.bestprivateai.com/v1
Header:    Authorization: Bearer sk-…

Les clés sont créées sur la page des clés. Une clé n'est affichée qu'une fois, à la création ; nous stockons un hash et ses six derniers caractères. Envoyez-la uniquement en HTTPS et uniquement dans l'en-tête Authorization — jamais dans une URL.

Tout est en JSON (Content-Type: application/json). Les réponses utilisent le schéma d'OpenAI, si bien que les SDKs officiels openai et tout client compatible OpenAI fonctionnent sans modification.

Modèles

GET /v1/models

{ "object": "list",
  "data": [ { "id": "notrack-uncensored", "object": "model", "owned_by": "notrack" } ] }

Il n'y a qu'un modèle, notrack-uncensored : notre propre variante, servie sur notre propre matériel. Ce que vous passez comme model y est routé ; utilisez l'id public pour que vos journaux correspondent aux nôtres.

Chat completions

POST /v1/chat/completions

{
  "model": "notrack-uncensored",
  "messages": [
    { "role": "system",    "content": "You are Mira, a wry bartender in 1920s Berlin." },
    { "role": "user",      "content": "Evening. What's good tonight?" }
  ],
  "max_tokens": 400,
  "temperature": 0.9
}

Réponse — la forme standard, avec de vrais comptages de tokens dans usage (c'est ce sur quoi vous êtes facturé) :

{
  "id": "chatcmpl-…", "object": "chat.completion", "model": "notrack-uncensored",
  "choices": [ { "index": 0, "finish_reason": "stop",
                 "message": { "role": "assistant", "content": "…" } } ],
  "usage": { "prompt_tokens": 41, "completion_tokens": 118, "total_tokens": 159 }
}

Votre system prompt régit la conversation. Nous ajoutons exactement une ligne en préambule — l'identité du modèle (qu'il s'agit de notrack-uncensored, fait par BestPrivateAI) — et rien d'autre : aucune règle, aucun filtre de sujet. Votre message système la suit et décide de la persona, du style et de tout le reste. La seule exception se trouve dans Politique de contenu.

Streaming

Définissez "stream": true et lisez les server-sent events, exactement comme avec OpenAI. Le dernier fragment porte usage (nous l'incluons toujours, que vous demandiez stream_options ou non), puis data: [DONE].

data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Ev"}}]}
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"ening"}}]}
…
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[],"usage":{"prompt_tokens":41,"completion_tokens":118,"total_tokens":159}}
data: [DONE]

Paramètres

ChampNotes
messagesObligatoire. Rôles system, user, assistant. Texte uniquement pour l'instant — les parties image sont rejetées.
modelUtilisez notrack-uncensored.
streamtrue pour le SSE. stream_options.include_usage est toujours actif.
max_tokensPlafond sur la completion. Le prompt + la completion doivent tenir dans la fenêtre de 64,000 tokens.
temperature, top_p, stop, presence_penalty, frequency_penalty, seed, nTransmis au modèle comme chez OpenAI. Si vous n'envoyez pas de temperature, nous utilisons 0,85, comme pour notre chat. n > 1 multiplie le coût de sortie.
tools, tool_choicePris en charge : auto, none, required, ou une fonction nommée. La réponse porte tool_calls et finish_reason: "tool_calls" ; renvoyez le résultat sous forme de message role: "tool". Avec des tools présents, une réponse en streaming arrive comme un fragment par appel plutôt que token par token.
response_format{"type": "json_object"} est pris en charge (indiquez dans le prompt le JSON souhaité). json_schema et le champ historique functions ne le sont pas.

Limites et en-têtes de réponse

LimiteValeurEn cas de dépassement
Requêtes simultanées par clé8429 concurrency
Requêtes par minute par clé300429 rate_limit
Fenêtre de contexte (prompt + completion)64,000 tokens400 context_limit — réduisez l'historique et réessayez
Dépense quotidienne par clé (facultatif)définie par vous sur la page des clés402 key_daily_cap jusqu'à 00:00 UTC

Toute réponse réussie porte :

En-têteSignification
X-Request-IdCitez-le en écrivant au support ; c'est la seule chose que nous conservons d'une requête.
X-NoTrack-Balance-USDVotre crédit avant que cette requête soit facturée, en dollars.
X-RateLimit-Limit-RequestsRequêtes par minute autorisées pour cette clé.
X-RateLimit-Limit-ConcurrencyRequêtes parallèles autorisées pour cette clé.
X-NoTrack-Content-FlagUniquement en cas de refus de contenu : minor_in_sexual_context ou child_safety.

Erreurs

Les erreurs sont en JSON avec un type stable ; le message est destiné aux humains et peut changer.

{ "error": { "type": "no_credit", "message": "no credit left on this account — top up at bestprivateai.com/api-keys" } }
HTTPtypeQue faire
400bodyJSON invalide ou messages absent.
400context_limitPrompt trop long pour la fenêtre de 64,000 tokens. Supprimez les échanges les plus anciens.
400content_policy + X-NoTrack-Content-Flag: minor_in_sexual_contextLa scène se lit comme sexuelle et un personnage se lit comme mineur. Rendez les personnages sans ambiguïté adultes et renvoyez ; non facturé.
401auth, invalid_key, key_revoked, key_expiredCorrigez ou remplacez la clé.
402no_creditLe solde est à zéro. Recharger ; les requêtes reprennent immédiatement.
402key_daily_capCette clé a atteint le plafond quotidien que vous avez fixé. Augmentez-le ou attendez 00:00 UTC.
403content_policy + X-NoTrack-Content-Flag: child_safetyRefusé et non facturé. Voir Politique de contenu.
429rate_limit, concurrencyRalentissez et réessayez ; respectez les deux en-têtes X-RateLimit-*.
502upstreamLe modèle n'a pas répondu. Réessayez avec un backoff ; non facturé.
503billing, safetyUne de nos dépendances est en panne. Réessayez dans quelques secondes ; non facturé.

Facturation

Crédit prépayé, facturé par token à partir du usage réel de chaque réponse : $0.25 par 1M de tokens en entrée, $1.00 par 1M de tokens en sortie. L'entrée, c'est tout ce que vous envoyez (system prompt, historique, le nouveau message) ; la sortie, c'est ce que le modèle écrit.

Persona — modèle nu ou personnage de BestPrivateAI

Chaque clé a un style, choisi sur la page des clés et modifiable à tout moment :

Une requête peut outrepasser le réglage de la clé, soit avec un champ, soit avec un suffixe de modèle (pour les clients qui ne peuvent définir qu'un nom de modèle) :

{ "model": "notrack-uncensored", "notrack": { "persona": "notrack" }, "messages": [ … ] }

{ "model": "notrack-uncensored:notrack", "messages": [ … ] }      // same thing, by model name
{ "model": "notrack-uncensored:bare",    "messages": [ … ] }      // force the bare model on a persona key

Noms de persona : notrack (le personnage simple), concise, detailed, creative (les mêmes variantes que propose le chat), bare. L'en-tête de réponse X-NoTrack-Persona indique celle qui a été appliquée.

Politique de contenu

Nous n'ajoutons aucun system prompt et n'appliquons aucun filtre de sujet. Fiction adulte, thèmes sombres, langage cru, violence dans la fiction — le modèle répond tel qu'il est écrit. Une règle est appliquée dans le code et ne peut pas être désactivée : tout contenu sexuel impliquant un mineur est refusé.

Des 403 répétés sur une clé entraînent la fermeture de la clé, puis du compte. Le texte complet se trouve dans la politique d'utilisation acceptable.

Confidentialité

Les prompts et les completions ne sont écrits sur aucun disque — ni par la passerelle, ni par les serveurs du modèle. Ce que nous conservons par requête, c'est l'id de la requête, l'id de la clé, les comptages de tokens et le prix, car c'est ce qui compose la facture. Les refus de sécurité sont journalisés par catégorie, sans le texte. Aucun fournisseur de modèle tiers ne voit jamais votre trafic : le modèle s'exécute sur du matériel que nous louons et contrôlons.

Clients et SDKs

Le site BestPrivateAI et l'application BestPrivateAI sont notre propre chat — ils n'ont pas de champ pour une clé API et n'en auront jamais. Une clé est destinée à des programmes externes : collez-la dans l'un des clients ci-dessous, ou dans votre propre code.

Python

from openai import OpenAI
client = OpenAI(base_url="https://api.bestprivateai.com/v1", api_key="sk-…")
stream = client.chat.completions.create(model="notrack-uncensored",
    messages=[{"role": "user", "content": "Hello"}], stream=True)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

Node.js

import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://api.bestprivateai.com/v1", apiKey: process.env.API_KEY });
const r = await client.chat.completions.create({ model: "notrack-uncensored",
  messages: [{ role: "user", content: "Hello" }] });
console.log(r.choices[0].message.content);

SillyTavern

API Connections → API : Chat Completion → Source : Custom (OpenAI-compatible) → Custom Endpoint https://api.bestprivateai.com/v1 → Custom API Key → Connect → Model notrack-uncensored. Streaming activé. Gardez la taille du contexte à 64,000 tokens ou moins.

Chatbox

Settings → Model Provider → Add → Add Custom Provider, mode OpenAI API Compatible → collez l'URL de base et la clé, puis ajoutez notrack-uncensored comme modèle.

NextChat

Settings → activez Custom Endpoint (compatible OpenAI) → URL de base et clé, puis saisissez le nom du modèle dans le champ modèle.

Cherry Studio

Settings → Model Providers → Add Provider → tapez OpenAI → URL de base et clé, puis « Add model » → notrack-uncensored.

LobeChat

Settings → AI Service Provider → OpenAI → activez custom API endpoint, collez l'URL de base et la clé, et ajoutez le modèle à la liste des modèles.

Tout autre client

LangChain, LlamaIndex, Open WebUI, Continue, les réglages de proxy de JanitorAI, curl — tout client avec une option « compatible OpenAI » ou « URL de base personnalisée ».

Le texte des menus ci-dessus change selon les versions de l'application — si un libellé ne correspond pas exactement, cherchez le réglage qui mentionne « custom », « OpenAI-compatible » ou « base URL ».

Si un client ne se connecte pas

Clés

Des questions, ou un id de requête à examiner : support · bestprivateai.com/support.