Strona główna/Odwołanie do API
Odwołanie do Uncensored API, wyjaśnione pole po polu
Ta strona dokumentuje każde pole, które wyślesz do lub otrzymasz z Uncensored API: ciało żądania endpointu chat completions, obiekt odpowiedzi, wartości finish_reason, obiekt usage, chunki strumieniowania i listę modeli. Każda sekcja zawiera krótką specyfikację wraz z przykładowym kodem, który możesz wkleić do terminala i uruchomić.
Zaktualizowano
Kluczowe punkty
- Istnieją dwa endpointy: POST /v1/chat/completions i GET /v1/models. Oba uwierzytelniają się kluczem Bearer.
- Odpowiedź ma znaną strukturę uzupełnienia czatu: id, choices[].message, finish_reason i usage.
- Strumieniowanie używa zdarzeń wysyłanych przez serwer; końcowa cząstka automatycznie zawiera usage, a strumień kończy się data: [DONE].
- Ograniczenia kształtujące zapytanie: okno kontekstu 100 000 tokenów, domyślna i maksymalna wartość max_tokens to odpowiednio 2048 i 32 000, ciało żądania do 8 MB.
Konwencje i transport
Base URL to https://api.uncensoredapis.com/v1. Wszystkie ciała żądań są w formacie JSON i kodowaniu UTF-8. Każde zapytanie zawiera nagłówek Authorization: Bearer <key>; brakujący lub błędny klucz zwraca 401. Istnieją tylko dwie trasy, a każda inna ścieżka zwraca 404.
| Metoda | Ścieżka | Cel |
|---|---|---|
| POST | /v1/chat/completions | Generuj wiadomość asystenta, opcjonalnie w trybie strumieniowania |
| GET | /v1/models | Wylistuj identyfikatory modeli, które możesz żądać |
API obsługuje tylko tekst. Nie ma tras do embeddingów, obrazów, audio ani wideo, ani do fine-tuningu, i istnieje dokładnie jeden model, adresowany jako uncensored. Ponieważ format przesyłu danych jest kompatybilny z konwencją chat completions, oficjalne SDK Python i Node.js działają po nadpisaniu base_url. Dokumentacja docs obejmuje konfigurację pierwszego uruchomienia; ta strona jest przewodnikiem na poziomie pól.
Pola ciała żądania
Tabela wymienia pola, które rozumie endpoint. Pola próbkowania są przekazywane do generowania bez zmian, więc wartości, które wybierzesz, zachowują się tak, jak w dowolnym API w stylu chat completions.
| Pole | Typ | Uwagi |
|---|---|---|
model | string | Zawsze "uncensored". |
messages | array | Obiekty uporządkowane z polami role (system, user, assistant, tool) i content. |
max_tokens | integer | Limit długości odpowiedzi. Domyślnie 2048, maksymalnie 32 000. |
temperature | number | Losowość. Niższa wartość daje bardziej deterministyczne wyniki. |
top_p | number | Próg próbkowania nucleus. |
stop | string or array | Sekwencje kończące generowanie. |
stream | boolean | true włącza odpowiedzi w formacie server-sent events. |
tools | tablica | Definicje funkcji w standardowym formacie JSON-schema. |
Oto kompletne zapytanie z adnotacjami. Wiadomość systemowa ustawia zachowanie, wiadomość użytkownika zawiera zadanie, a stop kończy generowanie przy pierwszej pustej linii.
curl https://api.uncensoredapis.com/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [
{"role": "system", "content": "You are a terse release-notes writer."},
{"role": "user", "content": "Summarize: fixed login bug, added dark mode."}
],
"max_tokens": 120,
"temperature": 0.4,
"stop": ["\n\n"]
}'Istnieją dwa kluczowe ograniczenia budżetowe. Po pierwsze, prompt plus uzupełnienie muszą zmieścić się w 100 000 tokenów, więc zapytanie, którego tokeny prompta plus max_tokens przekraczają tę wartość, zostanie odrzucone błędem 400. Po drugie, serializowane ciało żądania nie może przekraczać 8 MB. Jeśli wysyłasz długie historie, skróć stare wiadomości po swojej stronie, zanim zbliżą się do któregokolwiek z limitów.
Obiekt odpowiedzi
Zwykłe zapytanie (bez strumieniowania) zwraca jeden obiekt JSON. Odczytuj go od góry do dołu w następujący sposób.
{
"id": "chatcmpl-example123",
"object": "chat.completion",
"created": 1767225600,
"model": "uncensored",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "v1.4: Login bug fixed. Dark mode added."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 38,
"completion_tokens": 14,
"total_tokens": 52
}
}- id: unikalny identyfikator uzupełnienia. Zaloguj go obok własnego identyfikatora zapytania, gdy potrzebujesz skorelować zdarzenia.
- object: stała wartość
chat.completion. - created: znacznik czasu Unix w sekundach.
- model: powtarza wartość
uncensored. - choices: tablica. Otrzymujesz jedną pozycję, więc
choices[0]jest odpowiedzią.indexto jej pozycja. - choices[].message:
roletoassistant;contentto tekst, lubnull, gdy model zwrócił wywołania funkcji. - choices[].finish_reason: przyczyna zakończenia generowania; zobacz następny rozdział.
- usage: rozliczenie tokenów, opisane poniżej.
Wartości finish_reason
Sprawdzaj finish_reason zanim zaufasz treści. Skrócona odpowiedź i kompletna odpowiedź wyglądają identycznie, dopóki nie sprawdzisz tego pola.
| Wartość | Znaczenie | Co powinna zrobić Twoja aplikacja |
|---|---|---|
stop | Model osiągnął naturalne zakończenie lub natrafił na jedną z sekwencji stop. | Użyj treści bez modyfikacji. |
length | Osiągnięto limit max_tokens (lub okno kontekstu) w trakcie generowania. | Zwiększ max_tokens, skróć prompt lub poproś model o kontynuację. |
tool_calls | Model chce wykonać jedną lub więcej funkcji. | Wykonaj je i wyślij wyniki z powrotem jako komunikaty tool. |
Gdy wartość to tool_calls, wiadomość wygląda następująco, z argumentami dostarczonymi jako JSON string, który musisz sparsować samodzielnie:
{
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [{
"id": "call_abc1",
"type": "function",
"function": {"name": "get_order", "arguments": "{\"order_id\": 8841}"}
}]
},
"finish_reason": "tool_calls"
}]
}Zawsze opakuj json.loads lub JSON.parse na arguments w obsłudze błędów, ponieważ wygenerowany JSON może czasami być niepoprawny.
Obiekt usage i jego koszt
usage raportuje prompt_tokens, completion_tokens i total_tokens. To są liczby, na podstawie których naliczany jest Twój przedpłacony kredyt: wejście po $0,25 za milion tokenów i wyjście po $1,00 za milion. Przedpłacony kredyt jest odliczany przy każdym zapytaniu, bez subskrypcji.
Przykład obliczeniowy przy założeniach: załóżmy, że zapytanie zużywa 2000 tokenów prompta i 500 tokenów uzupełnienia. Koszt wejścia to 2000 / 1 000 000 x $0,25 = $0,0005. Koszt wyjścia to 500 / 1 000 000 x $1,00 = $0,0005. Zapytanie łącznie kosztuje $0,0010. Te liczby tokenów to założenia do obliczeń, a nie pomiar rzeczywistego obciążenia. Strona pricing page zawiera stawki w jednym miejscu.
Ponieważ tokeny wyjścia kosztują cztery razy więcej niż tokeny wejścia, ścisłe max_tokens to Twoja najbardziej bezpośrednia kontrola kosztów.
Format chunków strumieniowania
Ustaw "stream": true, a odpowiedź stanie się text/event-stream. Każde zdarzenie to linia zaczynająca się od data: , za którą następuje JSON, oddzielona pustą linią. Typ obiektu zmienia się na chat.completion.chunk, a message jest zastępowane przez delta.
data: {"id":"chatcmpl-example123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl-example123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"v1.4: "},"finish_reason":null}]}
data: {"id":"chatcmpl-example123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Login bug fixed."},"finish_reason":null}]}
data: {"id":"chatcmpl-example123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: {"id":"chatcmpl-example123","object":"chat.completion.chunk","choices":[],"usage":{"prompt_tokens":38,"completion_tokens":14,"total_tokens":52}}
data: [DONE]- Pierwszy chunk zwykle ustawia
delta.rolenaassistantz pustą treścią. - Chunki treści zawierają fragment w
delta.content. Łącz je w kolejności przybywania. - Zamykający chunk treści ma pustą
deltai nie-nullfinish_reason. - Ostatni chunk z pustą tablicą
choiceszawierausage. Nie prosisz o niego jawnie; jest dodawany automatycznie. - Tekst dosłowny
data: [DONE]kończy strumień.
Zabezpiecz się przed pustą tablicą choices: odwołanie do choices[0] w chunku usage spowoduje błąd w prostych pętlach. Przykład w SDK obsługuje ten przypadek.
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.uncensoredapis.com/v1", api_key=os.environ["API_KEY"])
reason, usage = None, None
for chunk in client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Name three uses of a rubber duck in debugging."}],
stream=True,
):
if chunk.choices:
piece = chunk.choices[0].delta.content
if piece:
print(piece, end="", flush=True)
if chunk.choices[0].finish_reason:
reason = chunk.choices[0].finish_reason
if getattr(chunk, "usage", None):
usage = chunk.usage
print("\nfinish:", reason, "| tokens:", usage.total_tokens if usage else "n/a")W przypadku strumieniowania wywołań narzędzi, delta.tool_calls przychodzi w fragmentach; akumuluj ciąg arguments dla każdego indeksu wywołania i sparsuj go raz, gdy finish_reason wyniesie tool_calls.
Endpoint modeli
GET /v1/models wymaga tylko nagłówka Bearer i zwraca obiekt listy. Ponieważ dostępny jest jeden model, data zawiera jeden element, uncensored. Klienci, którzy wypełniają listę wyboru modelu na podstawie tego endpointu, zobaczą więc tylko jeden wybór.
curl https://api.uncensoredapis.com/v1/models -H "Authorization: Bearer $API_KEY"
{
"object": "list",
"data": [
{"id": "uncensored", "object": "model"}
]
}To również najtańszy sposób na weryfikację klucza: 200 oznacza, że klucz jest ważny, 401 oznacza, że jest błędny lub został wygenerowany ponownie. Wywołanie tej trasy nie generuje tokenów. Obsługę statusów i reguły ponawiania znajdziesz w errors and rate limits playbook.
Lista kontrolna dla autorów klientów
Jeśli tworzysz bibliotekę klienta lub opakowujesz endpoint w bramie, zweryfikuj każde z poniższych zachowań względem powyższej specyfikacji przed udostępnieniem.
- Czystość nagłówków. Przesyłaj klucz tylko w nagłówku Authorization, nigdy w parametrach query string i nigdy nie loguj wartości nagłówka.
- Parse defensively. Traktuj nieznane dodatkowe pola w odpowiedziach jako ignorowalne. Ustal parser na polach udokumentowanych tutaj, a nie na dokładnej kolejności kluczy JSON.
- Sprawdzaj finish_reason w każdej odpowiedzi. Wyświetl widoczny wskaźnik, gdy wartość wynosi
length, ponieważ użytkownicy w przeciwnym razie odczytają ucięty tekst jako pełną odpowiedź. - Sprawdzaj budżet przed wysłaniem. Oszacuj liczbę tokenów promptu, dodaj swoją wartość
max_tokensi porównaj sumę z limitem 100 000. Odrzucenie lokalnie jest szybsze niż oczekiwanie na kod 400. - Obsłuż koniec strumienia. Spodziewaj się chunka z pustą listą
choicesi obiektemusage, a następnie[DONE]. Zamknij połączenie po otrzymaniu znacznika. - Rejestruj zużycie. Przechowuj
total_tokensdla każdego zapytania, aby móc później zestawić własne rozliczenia z saldem przedpłaconym. - Szanuj limit. Konto pozwala na 300 zapytań na minutę na klucz, więc brama obsługująca wielu użytkowników powinna mieć własną kolejkę.
Żaden z tych kroków nie zależy od SDK dostawcy. Wystarczy zwykły klient HTTP, który ustawia nagłówek Bearer i dekoduje JSON, a przykłady SDK na tej stronie to ułatwienia, a nie wymagania. Połącz tę listę kontrolną z tabelą błędów w playbook, a pokryjesz cały cykl życia zapytania: zbuduj, wyślij, strumieniuj, sparsuj, rozlicz i odzyskaj.
Pytania i odpowiedzi
Czy mogę uzyskać więcej niż jeden wybór na zapytanie?
Spodziewaj się jednego elementu w choices i odczytuj choices[0]. Jeśli chcesz uzyskać alternatywy, wyślij osobne zapytania.
Dlaczego message.content ma wartość null?
Model zwrócił tool_calls zamiast tekstu. Sprawdź finish_reason, uruchom funkcje i wyślij wyniki z powrotem.
Co się stanie, jeśli prompt plus max_tokens przekroczy 100 000?
Zapytanie zostało odrzucone błędem 400 Bad Request. Skróć prompt lub zmniejsz max_tokens.
Czy strumieniowanie zmienia cenę?
Nie. Rozliczenie opiera się na tych samych liczbach tokenów promptu i uzupełnienia, a końcowy chunk usage raportuje te wartości.
Twój klucz jest o jeden formularz stąd
Utwórz konto, skopiuj klucz, zmień base URL. To cała konfiguracja.