Vorher und Nachher
Hier ist ein typischer OpenAI-Client in Python:
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
r = client.chat.completions.create(
model="your-current-model",
messages=[{"role": "user", "content": "Draft a tense dialogue between two rivals."}],
)
Und derselbe Client, der auf die unzensierte Alternative zeigt:
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.chatgptunfiltered.com/v1",
api_key=os.environ["UNFILTERED_API_KEY"],
)
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Draft a tense dialogue between two rivals."}],
)
Zwei Zeilen im Konstruktor wurden geändert, und der Modell-String in der Anfrage wurde geändert. Das Nachrichtenformat, das Antwortobjekt und die Art, wie du r.choices[0].message.content liest, bleiben unverändert. Die Alternative ist ein anderes Modell, betrieben von einem unabhängigen Anbieter. Es ist kein ChatGPT und keine offizielle API von OpenAI oder sonst jemandem.
Nur mit Umgebungsvariablen wechseln
Neuere Versionen der offiziellen Python- und Node-SDKs lesen OPENAI_BASE_URL und OPENAI_API_KEY, wenn du einen Client ohne Argumente erstellst. Das bedeutet, der Anwendungscode bleibt unverändert:
export OPENAI_BASE_URL="https://api.chatgptunfiltered.com/v1"
export OPENAI_API_KEY="YOUR_KEY"
python app.py
Du musst weiterhin sicherstellen, dass der Code model="uncensored" übergibt. Wenn der Modellname an vielen Stellen fest codiert ist, zieh ihn zuerst in einen Konfigurationswert um. Dieser kleine Refactoring-Schritt macht jeden zukünftigen Wechsel in beide Richtungen genauso kostengünstig.
Die gleiche Idee funktioniert in Node:
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.chatgptunfiltered.com/v1",
apiKey: process.env.UNFILTERED_API_KEY,
});
const r = await client.chat.completions.create({
model: "uncensored",
messages: [{ role: "user", content: "Give me five villain names." }],
});
console.log(r.choices[0].message.content);Frameworks und das Responses-Format
Bibliotheken, die den OpenAI-Client umschließen, bieten meist eine Einstellung für die Base URL. In LangChains OpenAI-Chat-Wrapper sieht das so aus:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.chatgptunfiltered.com/v1",
api_key="YOUR_KEY",
)
print(llm.invoke("Name three moods for a chase scene.").content)
Wenn du das neuere Responses-Format verwendest, werden sowohl POST /v1/responses als auch POST /v1/chat/completions unterstützt. GET /v1/models listet das Modell auf, was eine schnelle Überprüfung ist, dass dein Schlüssel und deine URL korrekt sind.
Zu erwartende Unterschiede
| Bereich | Was dir auffallen wird |
|---|---|
| Bereitschaft zu antworten | Es antwortet ohne Inhaltsabweisungen für die rechtmäßige Nutzung durch Erwachsene. Prompts, die ein Modell mit Filtern ablehnt, erhalten normalerweise eine Antwort. |
| Formulierung und Stil | Anders Modell, andere Stimme. Tonfall, Länge und Formatierungsgewohnheiten werden nicht mit deinem vorherigen Modell übereinstimmen. |
| Modellauswahl | Ein Modell, ID uncensored. Keine Auswahl zwischen verschiedenen Stufen. |
| Umfang | Nur Text: keine Bild-, Audio- oder Videoerzeugung, keine Embeddings, kein Fine-Tuning. |
| Kontext | 100.000 Token, Prompt plus Completion. max_tokens ist optional. |
| Limits | Vollständiger Schlüssel: 8 parallel, 300 pro Minute. Test-Schlüssel: 2 parallel, 60 pro Minute. Body bis zu 8 MB. |
| Fehler | HTTP 429 mit Code rate_limited oder concurrency; temporäre Überlastung gibt 429 mit Retry-After: 5 zurück. |
Streaming, Tool Calling und JSON-Modus werden unterstützt, ebenso Temperatur, top_p, Stop, Seed und Penalties. Response-Header enthalten X-Request-Id, X-Balance-USD, X-RateLimit-Limit-Requests und X-RateLimit-Limit-Concurrency. Details findest du in der Dokumentation.
Zwei weitere Unterschiede sind erwähnenswert. Erstens kann ein anderes Modell Token anders zählen, sodass die Zählungen für denselben Text von den Werten deines alten Anbieters abweichen können; nutze die Nutzungszahlen in den Antworten, nicht deine eigenen Schätzungen. Zweitens sind Funktionen, die auf den gehosteten Tools eines Anbieters basieren, wie integrierte Websuche oder Dateispeicher auf der Anbieterseite, nicht Teil dieses Dienstes. Function Calling: Du definierst Funktionen, und dein Code führt sie aus.
Ein Paritäts-Skript für deine eigenen Prompts
Statt eine Handvoll Ausgaben mit dem Auge zu prüfen, führe deinen Prompt-Satz in einer Schleife durch den neuen Endpunkt und speichere alles, was du zur Überprüfung brauchst.
import csv, json
with open("prompts.json", encoding="utf-8") as f:
prompts = json.load(f) # a list of strings
with open("results.csv", "w", newline="", encoding="utf-8") as out:
w = csv.writer(out)
w.writerow(["prompt", "reply", "in_tokens", "out_tokens"])
for p in prompts:
r = client.chat.completions.create(
model="uncensored",
temperature=0.7,
messages=[{"role": "user", "content": p}],
)
w.writerow([p, r.choices[0].message.content, r.usage.prompt_tokens, r.usage.completion_tokens])
Öffne die CSV und überprüfe eine Spalte nach der anderen. Die Token-Spalten geben dir eine Kostenprognose für denselben Traffic: Multipliziere die Summen mit $0,15 und $0,50 pro 1M. Ein Test-Schlüssel erlaubt 60 Anfragen pro Minute und 2 gleichzeitig, sodass ein Satz von einigen hundert Prompts in Minuten abgeschlossen ist, wenn du die Schleife sequenziell hältst.
Eine kurze Migrations-Checkliste
- Hole einen Schlüssel. Auf der API-Schlüssel-Seite registriere dich mit Google oder E-Mail und sichere dir das Testguthaben von $0,50. Es gilt 7 Tage und benötigt keine Karte.
- Verschiebe Modellname und URL in die Konfiguration. Ein Ort, gelesen aus der Umgebung.
- Wiedergabe deiner Test-Prompts. Nutze 20 bis 50 echte Beispiele, darunter die, die dein vorheriges Modell abgelehnt hat, und lies die Ergebnisse.
- Passe den System-Prompt an. Entferne Text, der nur dazu diente, ein gefiltertes Modell zur Antwort zu bewegen. Behalte das, was Rolle, Zielgruppe und Format beschreibt.
- Füge einen 429-Handler hinzu. Warte 5 Sekunden und versuche es erneut. Begrenze die Parallelität, um sie an deinen Schlüssel anzupassen.
- Nutzung prüfen. Beobachte
X-Balance-USDin den Antworten, während du echten Traffic abwickelst.
Ein Retry-Helper, der Schritt 5 abdeckt:
import time
from openai import RateLimitError
def create_with_retry(**kwargs):
for _ in range(4):
try:
return client.chat.completions.create(**kwargs)
except RateLimitError:
time.sleep(5)
raise RuntimeError("rate limited after 4 tries")
Bewahre die gespeicherten Ausgaben des alten Modells für ein paar Wochen auf. Wenn ein Benutzer sich beschwert, dass nach dem Wechsel etwas seltsam wirkt, kannst du gegen das vergleichen, was das alte Modell gesagt hätte, und sehen, ob der Unterschied am Prompt, am Modell oder am Input liegt.
Risikoarm ausrollen
Schalte nicht alles auf einmal um. Packe die Anbieterwahl hinter eine Konfiguration, sodass du einen Prozentsatz des Traffics verschieben und in Sekunden zurückrollen kannst.
import os, random
from openai import OpenAI
old = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
new = OpenAI(base_url="https://api.chatgptunfiltered.com/v1", api_key=os.environ["UNFILTERED_API_KEY"])
SHARE = float(os.environ.get("NEW_SHARE", "0.05"))
def pick():
if random.random() < SHARE:
return new, "uncensored"
return old, os.environ["OLD_MODEL"]
Starte bei 5 %, beobachte deine Fehlerquote, 429-Zählungen und Benutzerfeedback für ein paar Tage und erhöhe es dann. Setze NEW_SHARE auf 0, um zurückzurollen. Die Auswahl nach Benutzer oder Feature ist besser als die nach Anfrage, wenn Unterhaltungen auf einem Modell bleiben müssen, da ein Modellwechsel mitten im Chat die Stimme verändert.
Was es kostet, und wann du bleiben solltest
Die Preise betragen $0,15 pro 1M Input-Token und $0,50 pro 1M Output-Token, bezahlt vom Prepaid-Guthaben. Eine Anfrage mit 1.500 Token Input und 400 Output kostet 1.500 x $0,15 / 1M = $0,000225, plus 400 x $0,50 / 1M = $0,0002, also $0,000425 oder $0,425 pro 1.000 Anfragen. Für andere Anbieter prüfe deren aktuelle Preislisten; die Preise ändern sich und ein Vergleich aus dem Gedächtnis veraltet schnell. Aufladungen sind in ganzen Beträgen von $20 bis $500, bezahlt in Krypto, mit Boni ab $50. Details auf Preise.
Bei deinem aktuellen Anbieter zu bleiben ist der richtige Schritt, wenn du Bilder oder Embeddings brauchst, wenn dein Publikum strenge Moderation benötigt oder wenn ein herstellerspezifisches Modell eine harte Anforderung ist. Für den Hintergrund, was diese Klasse von Modellen ist, lies Verständnis unzensierter ChatGPT-Modelle. Die harte Grenze ändert sich nie: keine sexuellen Inhalte mit Minderjährigen.
Es ist auch in Ordnung, beide Anbieter parallel zu betreiben. Viele Teams leiten normale Anfragen an ein Modell und die Anfragen, die weiterhin auf Ablehnungen stoßen, an ein anderes. Da beide dasselbe Format sprechen, ist dieses Routing nur wenige Codezeilen und eine Regel dafür, wann welches Modell verwendet wird.
