PL ▾

kompatybilna z OpenAI API bez cenzury LLMuncensoredapis.com

Strona głównaOdwoł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

  1. Istnieją dwa endpointy: POST /v1/chat/completions i GET /v1/models. Oba uwierzytelniają się kluczem Bearer.
  2. Odpowiedź ma znaną strukturę uzupełnienia czatu: id, choices[].message, finish_reason i usage.
  3. Strumieniowanie używa zdarzeń wysyłanych przez serwer; końcowa cząstka automatycznie zawiera usage, a strumień kończy się data: [DONE].
  4. 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żkaCel
POST/v1/chat/completionsGeneruj wiadomość asystenta, opcjonalnie w trybie strumieniowania
GET/v1/modelsWylistuj 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.

PoleTypUwagi
modelstringZawsze "uncensored".
messagesarrayObiekty uporządkowane z polami role (system, user, assistant, tool) i content.
max_tokensintegerLimit długości odpowiedzi. Domyślnie 2048, maksymalnie 32 000.
temperaturenumberLosowość. Niższa wartość daje bardziej deterministyczne wyniki.
top_pnumberPróg próbkowania nucleus.
stopstring or arraySekwencje kończące generowanie.
streambooleantrue włącza odpowiedzi w formacie server-sent events.
toolstablicaDefinicje 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ą. index to jej pozycja.
  • choices[].message: role to assistant; content to tekst, lub null, 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śćZnaczenieCo powinna zrobić Twoja aplikacja
stopModel osiągnął naturalne zakończenie lub natrafił na jedną z sekwencji stop.Użyj treści bez modyfikacji.
lengthOsiągnięto limit max_tokens (lub okno kontekstu) w trakcie generowania.Zwiększ max_tokens, skróć prompt lub poproś model o kontynuację.
tool_callsModel 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]
  1. Pierwszy chunk zwykle ustawia delta.role na assistant z pustą treścią.
  2. Chunki treści zawierają fragment w delta.content. Łącz je w kolejności przybywania.
  3. Zamykający chunk treści ma pustą delta i nie-null finish_reason.
  4. Ostatni chunk z pustą tablicą choices zawiera usage. Nie prosisz o niego jawnie; jest dodawany automatycznie.
  5. 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.

  1. 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.
  2. 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.
  3. 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ź.
  4. Sprawdzaj budżet przed wysłaniem. Oszacuj liczbę tokenów promptu, dodaj swoją wartość max_tokens i porównaj sumę z limitem 100 000. Odrzucenie lokalnie jest szybsze niż oczekiwanie na kod 400.
  5. Obsłuż koniec strumienia. Spodziewaj się chunka z pustą listą choices i obiektem usage, a następnie [DONE]. Zamknij połączenie po otrzymaniu znacznika.
  6. Rejestruj zużycie. Przechowuj total_tokens dla każdego zapytania, aby móc później zestawić własne rozliczenia z saldem przedpłaconym.
  7. 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.