BestPrivateAI API — referência

Um endpoint compatível com OpenAI, um modelo, uma chave. Se seu código já conversa com /v1/chat/completions, troque a URL base e a chave e ele vai conversar com a gente.

URL base e autenticação

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

As chaves são criadas em a página de chaves. Uma chave é exibida uma única vez, na criação; guardamos um hash e os últimos seis caracteres. Envie-a somente via HTTPS e somente no cabeçalho Authorization — nunca em uma URL.

Tudo é JSON (Content-Type: application/json). As respostas usam o schema da OpenAI, então os SDKs oficiais da openai e qualquer cliente compatível com OpenAI funcionam sem alterações.

Modelos

GET /v1/models

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

Há um modelo, notrack-uncensored: nosso próprio ajuste de companheiro de conversa, servido em nosso próprio hardware. O que você passar em model é roteado para ele; use o id público para que seus logs correspondam aos nossos.

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
}

Resposta — o formato padrão, com contagens reais de tokens em usage (é isso que é cobrado):

{
  "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 }
}

Seu system prompt governa a conversa. Adicionamos exatamente uma linha no início — a identidade do modelo (que é o notrack-uncensored, feito pela BestPrivateAI) — e nada mais: nenhuma regra, nenhum filtro de tema. Sua mensagem de sistema vem depois e decide persona, estilo e todo o resto. A única exceção está em Política de conteúdo.

Streaming

Defina "stream": true e leia os server-sent events, exatamente como na OpenAI. O último bloco traz usage (nós sempre incluímos, quer você peça stream_options ou não), depois 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]

Parâmetros

CampoNotas
messagesObrigatório. Papéis system, user, assistant. Somente texto por enquanto — partes de imagem são rejeitadas.
modelUse notrack-uncensored.
streamtrue para SSE. stream_options.include_usage está sempre ativo.
max_tokensLimite da completion. Prompt + completion precisam caber na janela de 64,000 tokens.
temperature, top_p, stop, presence_penalty, frequency_penalty, seed, nPassado ao modelo como na OpenAI. Se você não enviar temperature, usamos 0.85, o mesmo do nosso chat. n > 1 multiplica o custo de output.
tools, tool_choiceSuportado: auto, none, required, ou uma função nomeada. A resposta traz tool_calls e finish_reason: "tool_calls"; envie o resultado de volta como uma mensagem role: "tool". Com ferramentas presentes, uma resposta em streaming chega como um bloco por chamada, em vez de token por token.
response_format{"type": "json_object"} é suportado (diga no prompt qual JSON você quer). json_schema e o campo legado functions não são.

Limites e cabeçalhos de resposta

LimiteValorAo exceder
Requisições simultâneas por chave8429 concurrency
Requisições por minuto por chave300429 rate_limit
Janela de contexto (prompt + completion)64,000 tokens400 context_limit — reduza o histórico e tente novamente
Gasto diário por chave (opcional)definido por você na página de chaves402 key_daily_cap até 00:00 UTC

Toda resposta bem-sucedida traz:

CabeçalhoSignificado
X-Request-IdCite-o ao escrever para o suporte; é a única coisa que guardamos sobre uma requisição.
X-NoTrack-Balance-USDSeu crédito antes de esta requisição ser cobrada, em dólares.
X-RateLimit-Limit-RequestsRequisições por minuto permitidas para esta chave.
X-RateLimit-Limit-ConcurrencyRequisições paralelas permitidas para esta chave.
X-NoTrack-Content-FlagSomente em recusa de conteúdo: minor_in_sexual_context ou child_safety.

Erros

Os erros são JSON com um type estável; o message é para humanos e pode mudar.

{ "error": { "type": "no_credit", "message": "no credit left on this account — top up at bestprivateai.com/api-keys" } }
HTTPtypeO que fazer
400bodyJSON inválido ou sem messages.
400context_limitPrompt longo demais para a janela de 64,000 tokens. Remova turnos antigos.
400content_policy + X-NoTrack-Content-Flag: minor_in_sexual_contextA cena é lida como sexual e um personagem é lido como menor de idade. Torne os personagens inequivocamente adultos e reenvie; não cobrado.
401auth, invalid_key, key_revoked, key_expiredCorrija ou substitua a chave.
402no_creditSaldo zerado. Recarregue; as requisições voltam a funcionar imediatamente.
402key_daily_capEsta chave atingiu o teto diário que você definiu. Aumente-o ou espere até 00:00 UTC.
403content_policy + X-NoTrack-Content-Flag: child_safetyRecusado e não cobrado. Veja Política de conteúdo.
429rate_limit, concurrencyReduza o ritmo e tente novamente; respeite os dois cabeçalhos X-RateLimit-*.
502upstreamO modelo não respondeu. Tente novamente com backoff; não cobrado.
503billing, safetyUma dependência nossa está fora do ar. Tente novamente em alguns segundos; não cobrado.

Cobrança

Crédito pré-pago, cobrado por token a partir do usage real de cada resposta: $0.25 por 1M de tokens de entrada, $1.00 por 1M de tokens de saída. Input é tudo que você envia (system prompt, histórico, a nova mensagem); output é o que o modelo escreve.

Persona — modelo puro ou o personagem da BestPrivateAI

Cada chave tem um estilo, escolhido na página de chaves e alternável em qualquer momento:

Uma requisição pode sobrescrever a configuração da chave, seja com um campo ou com um sufixo no nome do modelo (para clientes que só conseguem definir um nome de modelo):

{ "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

Nomes de persona: notrack (o personagem simples), concise, detailed, creative (as mesmas variantes que o chat oferece), bare. O cabeçalho de resposta X-NoTrack-Persona indica qual foi aplicada.

Política de conteúdo

Não adicionamos nenhum system prompt e não executamos nenhum filtro de tema. Ficção adulta, temas obscuros, linguagem forte, violência na ficção — o modelo responde como está escrito. Uma regra é aplicada no código e não pode ser desativada: qualquer conteúdo sexual envolvendo um menor é recusado.

403s repetidos em uma chave levam ao encerramento da chave e depois da conta. O texto completo está na Política de Uso Aceitável.

Privacidade

Prompts e completions não são gravados em disco — nem pelo gateway, nem pelos servidores do modelo. O que guardamos por requisição é o id da requisição, o id da chave, as contagens de tokens e o preço, porque é isso que compõe a fatura. Recusas de segurança são registradas por categoria, sem o texto. Nenhum provedor de modelo terceirizado jamais vê seu tráfego: o modelo roda em hardware que alugamos e controlamos.

Clientes e SDKs

O site da BestPrivateAI e o app da BestPrivateAI são o nosso próprio chat — não têm campo para uma chave de API e nunca terão. Uma chave é para programas outros: cole-a em um dos clientes abaixo, ou no seu próprio código.

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 ativado. Mantenha o tamanho do contexto em 64,000 tokens ou menos.

Chatbox

Configurações → Model Provider → Add → Add Custom Provider, modo OpenAI API Compatible → cole a URL base e a chave, depois adicione notrack-uncensored como o modelo.

NextChat

Configurações → ative Custom Endpoint (compatível com OpenAI) → URL base e chave, depois digite o nome do modelo no campo de modelo.

Cherry Studio

Configurações → Model Providers → Add Provider → digite OpenAI → URL base e chave, depois "Add model" → notrack-uncensored.

LobeChat

Configurações → AI Service Provider → OpenAI → ative custom API endpoint, cole a URL base e a chave, e adicione o modelo à lista de modelos.

Qualquer outro

LangChain, LlamaIndex, Open WebUI, Continue, configurações de proxy do JanitorAI, curl — qualquer cliente com uma opção "OpenAI-compatible" ou "custom base URL".

Os termos de menu acima mudam entre versões do app — se um rótulo não corresponder exatamente, procure a configuração que menciona "custom", "OpenAI-compatible" ou "base URL".

Se um cliente não conectar

Chaves

Dúvidas ou um id de requisição para analisar: suporte · bestprivateai.com/support.