BestPrivateAI API — dokumentacja referencyjna
Jeden endpoint kompatybilny z OpenAI, jeden model, jeden klucz. Jeśli Twój kod już korzysta z /v1/chat/completions, zmień bazowy URL i klucz — i będzie korzystał z nas.
Bazowy URL i autoryzacja
Base URL: https://api.bestprivateai.com/v1
Header: Authorization: Bearer sk-…
Klucze tworzy się na stronie kluczy. Klucz jest wyświetlany tylko raz, w momencie utworzenia; przechowujemy jego hash i ostatnie sześć znaków. Wysyłaj go tylko przez HTTPS i tylko w nagłówku Authorization — nigdy w URL.
Wszystko jest w formacie JSON (Content-Type: application/json). Odpowiedzi mają schemat OpenAI, więc oficjalne SDK openai i każdy klient kompatybilny z OpenAI działają bez zmian.
Modele
GET /v1/models
{ "object": "list",
"data": [ { "id": "notrack-uncensored", "object": "model", "owned_by": "notrack" } ] }
Jest jeden model, notrack-uncensored: nasza własna wersja towarzysza czatu, hostowana na naszym własnym sprzęcie. Wszystko, co przekażesz jako model, jest do niego kierowane; używaj publicznego id, żeby Twoje logi zgadzały się z naszymi.
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
}
Odpowiedź — standardowy format, z rzeczywistą liczbą tokenów w usage (to jest podstawa rozliczenia):
{
"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 }
}
Twój system prompt zarządza rozmową. Dodajemy z góry wyłącznie jedną linię — identyfikację modelu (że jest to notrack-uncensored, stworzony przez BestPrivateAI) — i nic więcej: żadnych reguł, żadnego filtra tematów. Twój komunikat systemowy następuje po niej i decyduje o personie, stylu i wszystkim innym. Jedynym wyjątkiem jest Polityka treści.
Streaming
Ustaw "stream": true i odczytuj zdarzenia server-sent, tak jak w OpenAI. Ostatni fragment zawiera usage (dołączamy go zawsze, niezależnie od tego, czy prosisz o stream_options), a potem 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]
Parametry
| Pole | Uwagi |
|---|---|
messages | Wymagane. Role system, user, assistant. Obecnie tylko tekst — części obrazu są odrzucane. |
model | Użyj notrack-uncensored. |
stream | true dla SSE. stream_options.include_usage jest zawsze włączone. |
max_tokens | Limit dla completion. Prompt + completion muszą zmieścić się w oknie 64,000 tokenów. |
temperature, top_p, stop, presence_penalty, frequency_penalty, seed, n | Przekazywane do modelu jak w OpenAI. Jeśli nie wyślesz temperature, używamy 0.85, tak jak nasz czat. n > 1 zwiększa koszt output. |
tools, tool_choice | Obsługiwane: auto, none, required lub nazwana funkcja. Odpowiedź zawiera tool_calls i finish_reason: "tool_calls"; wynik odeślij jako komunikat role: "tool". Gdy obecne są narzędzia, odpowiedź strumieniowana przychodzi jako jeden fragment na wywołanie, a nie token po tokenie. |
response_format | {"type": "json_object"} jest obsługiwane (podaj w prompcie, jakiego JSON-a chcesz). json_schema oraz przestarzałe pole functions nie są. |
Limity i nagłówki odpowiedzi
| Limit | Wartość | Po przekroczeniu |
|---|---|---|
| Równoczesne zapytania na klucz | 8 | 429 concurrency |
| Zapytania na minutę na klucz | 300 | 429 rate_limit |
| Okno kontekstu (prompt + completion) | 64,000 tokenów | 400 context_limit — przytnij historię i spróbuj ponownie |
| Dzienny limit wydatków na klucz (opcjonalny) | ustawiany przez Ciebie na stronie kluczy | 402 key_daily_cap do 00:00 UTC |
Każda pomyślna odpowiedź zawiera:
| Nagłówek | Znaczenie |
|---|---|
X-Request-Id | Podaj go, pisząc do wsparcia; to jedyna informacja o zapytaniu, którą przechowujemy. |
X-NoTrack-Balance-USD | Twój kredyt przed obciążeniem tego zapytania, w dolarach. |
X-RateLimit-Limit-Requests | Liczba zapytań na minutę dozwolona dla tego klucza. |
X-RateLimit-Limit-Concurrency | Liczba równoczesnych zapytań dozwolona dla tego klucza. |
X-NoTrack-Content-Flag | Tylko przy odmowie treści: minor_in_sexual_context lub child_safety. |
Błędy
Błędy są w formacie JSON ze stabilnym type; message jest dla ludzi i może się zmieniać.
{ "error": { "type": "no_credit", "message": "no credit left on this account — top up at bestprivateai.com/api-keys" } }
| HTTP | type | Co zrobić |
|---|---|---|
| 400 | body | Nieprawidłowy JSON lub brak messages. |
| 400 | context_limit | Prompt zbyt długi dla okna 64,000 tokenów. Usuń starsze tury. |
| 400 | content_policy + X-NoTrack-Content-Flag: minor_in_sexual_context | Scena odczytywana jest jako seksualna, a postać jako niepełnoletnia. Uczyń postacie jednoznacznie dorosłymi i wyślij ponownie; nie rozliczane. |
| 401 | auth, invalid_key, key_revoked, key_expired | Napraw lub zamień klucz. |
| 402 | no_credit | Saldo wynosi zero. Doładuj; zapytania wracają do działania natychmiast. |
| 402 | key_daily_cap | Ten klucz osiągnął ustawiony przez Ciebie dzienny limit. Zwiększ go lub zaczekaj do 00:00 UTC. |
| 403 | content_policy + X-NoTrack-Content-Flag: child_safety | Odmówiono i nie rozliczono. Zobacz Polityka treści. |
| 429 | rate_limit, concurrency | Zwolnij i spróbuj ponownie; przestrzegaj dwóch nagłówków X-RateLimit-*. |
| 502 | upstream | Model nie odpowiedział. Spróbuj ponownie z narastającym odstępem; nie rozliczane. |
| 503 | billing, safety | Jedna z naszych zależności nie działa. Spróbuj ponownie za kilka sekund; nie rozliczane. |
Rozliczenia
Kredyt przedpłacony, rozliczany za token na podstawie rzeczywistego usage każdej odpowiedzi: $0.25 za 1M tokenów wejściowych, $1.00 za 1M tokenów wyjściowych. Input to wszystko, co wysyłasz (system prompt, historia, nowa wiadomość); output to to, co pisze model.
- Twój pierwszy klucz zawiera $0.50 darmowego kredytu, ważnego 7 dni — wystarczająco na integrację i testy. Do utworzenia klucza potrzebny jest potwierdzony e-mail (to na niego trafia powiadomienie „kredyt się kończy”). Płatny kredyt nigdy nie wygasa.
- Kredyt nie wygasa, nie ma subskrypcji i nic nie odnawia się samo. Doładuj kartą lub w USDT/USDC na stronie kluczy.
- Za odmówione zapytania (
4xx) lub nieudane (5xx) nie pobieramy opłat. Zapytanie rozliczane jest jednokrotnie, po odpowiedzi, na podstawie jegoX-Request-Id. - Saldo się kończy →
402 no_creditdo momentu doładowania. Ustaw dzienny limit na każdym kluczu, żeby wyciekły klucz nie mógł wyczerpać konta. - Kredyty można zwrócić, jeśli nie zostały wykorzystane w ciągu 24 godzin od zakupu, lub później zaliczyć na plan. Zobacz Kredyty i zwroty.
Persona — surowy model lub charakter BestPrivateAI
Każdy klucz ma styl, wybierany na stronie kluczy i przełączany w każdej chwili:
- Surowy (domyślny) — Twój system prompt jest całym promptem. Dodajemy jedną linię identyfikacji i nic więcej.
- Persona BestPrivateAI — charakter i styl czatu na bestprivateai.com: bezpośredni, nieocenzurowany, bez moralizowania, odpowiada w języku użytkownika. Ten sam model, ta sama cena, ta sama polityka treści; zmienia się tylko prompt przed Twoimi wiadomościami. Twój własny komunikat systemowy wciąż następuje po nim i może go modyfikować.
Zapytanie może zastąpić ustawienie klucza — polem lub przyrostkiem nazwy modelu (dla klientów, które mogą ustawiać tylko nazwę modelu):
{ "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
Nazwy person: notrack (zwykły charakter), concise, detailed, creative (te same warianty, które oferuje czat), bare. Nagłówek odpowiedzi X-NoTrack-Persona wskazuje, która została zastosowana.
Polityka treści
Nie dodajemy żadnego system promptu i nie stosujemy żadnego filtra tematów. Fikcja dla dorosłych, ciemne tematy, mocny język, przemoc w fikcji — model odpowiada tak, jak zostało napisane. Jedna zasada jest wymuszona w kodzie i nie da się jej wyłączyć: wszystko, co ma charakter seksualny z udziałem osoby niepełnoletniej, jest odmawiane.
403 child_safety— zapytanie dotyczyło treści seksualnych z udziałem dziecka. Odmówiono, nie rozliczono, zarejestrowano jako zdarzenie bezpieczeństwa.400 minor_in_sexual_context— scena ma charakter seksualny, a postać odczytywana jest jako osoba poniżej 18 lat (podany wiek, kontekst szkolny, ujęcie „dziewczynka/chłopiec”). To nie jest zakaz: uczyń wiek i kontekst jednoznacznie dorosłymi i wyślij ponownie.
Powtarzające się 403 na kluczu prowadzą do zamknięcia klucza, a następnie konta. Pełny tekst znajduje się w Polityce dopuszczalnego użycia.
Prywatność
Prompty i odpowiedzi nie są zapisywane na dysku — ani przez gateway, ani przez serwery modelu. To, co przechowujemy dla każdego zapytania, to id zapytania, id klucza, liczba tokenów i cena, bo to jest podstawa rozliczenia. Odmowy związane z bezpieczeństwem są rejestrowane według kategorii, bez treści. Żaden zewnętrzny dostawca modelu nigdy nie widzi Twojego ruchu: model działa na sprzęcie, który wynajmujemy i kontrolujemy.
Klienci i SDK
Strona BestPrivateAI i aplikacja BestPrivateAI to nasz własny czat — nie mają pola na klucz API i nigdy nie będą mieć. Klucz jest przeznaczony dla programów innych: wklej go do jednego z klientów poniżej albo do własnego kodu.
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 włączony. Utrzymuj rozmiar kontekstu na poziomie 64,000 tokenów lub niższym.
Chatbox
Ustawienia → Model Provider → Add → Add Custom Provider, mode OpenAI API Compatible → wklej bazowy URL i klucz, następnie dodaj notrack-uncensored jako model.
NextChat
Ustawienia → włącz Custom Endpoint (kompatybilny z OpenAI) → bazowy URL i klucz, następnie wpisz nazwę modelu w polu modelu.
Cherry Studio
Ustawienia → Model Providers → Add Provider → wpisz OpenAI → bazowy URL i klucz, następnie „Add model” → notrack-uncensored.
LobeChat
Ustawienia → AI Service Provider → OpenAI → włącz custom API endpoint, wklej bazowy URL i klucz, i dodaj model do listy modeli.
Coś innego
LangChain, LlamaIndex, Open WebUI, Continue, ustawienia proxy JanitorAI, curl — każdy klient z opcją „OpenAI-compatible” lub „custom base URL”.
Nazwy w menu powyżej różnią się między wersjami aplikacji — jeśli etykieta nie zgadza się dokładnie, poszukaj ustawienia wspominającego „custom”, „OpenAI-compatible” lub „base URL”.
Jeśli klient nie łączy się
- 401 / „invalid API key” — klucz nigdy nie dotarł. Sprawdź, czy klient wysyła
Authorization: Bearer sk-…z całym kluczem, łącznie z prefiksem. - 404 / nieznany endpoint — klienci różnią się w tym, czy sami dodają
/v1. Jeślihttps://api.bestprivateai.com/v1zwraca 404, spróbuj użyćhttps://api.bestprivateai.comjako bazowego URL (albo odwrotnie). - „The Responses API is not supported yet” — niektórzy nowsi klienci domyślnie używają Responses API OpenAI. Obsługujemy tylko Chat Completions; przełącz klienta na ten tryb.
- Pusta lista modeli — niektórzy klienci wypełniają ją tylko po poprawnej weryfikacji klucza. Wpisz
notrack-uncensoredręcznie. - Nic się nie dzieje w kliencie Ollama / llama.cpp — te używają własnego protokołu, niekompatybilnego z OpenAI. Użyj jednego z klientów wymienionych powyżej.
Klucze
- Do 20 aktywnych kluczy na konto. Daj każdej aplikacji własny klucz i własny dzienny limit.
- Opcjonalna data wygaśnięcia; unieważnienie klucza zatrzymuje go natychmiast i nie można tego odwrócić — wystaw nowy klucz.
- Strona kluczy pokazuje wydatki per klucz, ostatnie użycie i sumy z 30 dni dla konta.
Pytania lub id zapytania do sprawdzenia: wsparcie · bestprivateai.com/support.