Wu Xianzhi APIMigrationsleitfaden
Migrationsleitfaden für API-Proxy: Wechsel von OpenAI, OpenRouter zu unzensierter API
Wenn dein Projekt aktuell OpenAI, OpenRouter oder einen API-Proxy nutzt und auf eine unzensierte API ohne Ablehnung legitimer Anfragen wechseln möchte, reicht es, drei Konfigurationen zu ändern: base_url, API-Schlüssel und Modellname. Dieser Leitfaden erklärt den Unterschied zwischen Proxy-Weiterverkauf und spezialisierten Modellen, liefert einen Parameter-Vergleich, Code für den parallelen Betrieb über Umgebungsvariablen, eine Go-Live-Checkliste und zeigt häufige Fallstricke auf.
Aktualisiert am
Wichtige Punkte
- Proxy-Weiterverkauf nutzt weiterhin die Modelle des Herstellers mit deren Inhaltsrichtlinien; nur spezialisierte unzensierte Modelle lösen Ablehnungsprobleme.
- Die Migration ändert nur drei Stellen: Setze base_url auf https://api.wuxianzhiapi.com/v1,密钥,模型名 uncensored
- Keine embeddings, Bilder, Audio oder Fine-Tuning; diese Funktionen weiterhin über den alten Dienst nutzen.
- Graue Umschaltung über Umgebungsvariablen; bei Problemen reicht ein Variablen-Wechsel zum Zurücksetzen.
Unterschied zwischen API-Proxy und spezialisiertem unzensiertem Modell
Klär die Begriffe zuerst, sonst wählst du bei der Migration leicht die falsche Richtung. API-Gateway-Anbieter verkaufen im Wesentlichen die Aufruf-Kontingente großer Modellanbieter oder bündeln sie und bieten eine OpenAI-kompatible URL an, damit du mit demselben SDK verschiedene Modelle wechseln kannst. Sie lösen das Problem des Zugriffs und der Bezahlung, etwa einen einheitlichen Einstiegspunkt und eine einheitliche Abrechnung, aber das Modell selbst bleibt das ursprüngliche: Die Inhaltsrichtlinien des Herstellers bleiben unverändert. Themen, die abgelehnt werden, werden auch weiterhin abgelehnt – ein Wechsel der Gateway-URL ändert daran nichts.
Ein dediziertes unzensiertes Modell ist eine andere Baustelle. Es ist kein Weiterleiten eines fremden Modells, sondern ein eigenständig bereitgestelltes Modell, das legale erwachsene Inhalte, fiktive Kreationen und kontroverse Themen nicht ablehnt. Wu Xianzhi API bietet nur ein Modell an, der Modellname ist uncensored. Die Schnittstelle ist OpenAI-kompatibel, daher sind die Migrationskosten gering, aber es gibt klare Grenzen: Es unterstützt nur Text, keine Bilder, Audio, Vektoren oder Fine-Tuning. Sexuelle Inhalte, an denen Minderjährige beteiligt sind, werden unabhängig davon, ob sie fiktiv sind, blockiert und mit 403 zurückgegeben.
Frag dich vor der Migration: Ist das Problem „instabile Schnittstelle, hoher Preis“ oder „Modell lehnt legitime Anfragen ab“? Bei Letzterem hilft ein Proxy wenig; eine spezialisierte unzensierte API ist die Lösung. Viele Teams betreiben beides parallel: Standardaufgaben über die alte Schnittstelle, unzensierte Ausgaben über diese API. Wie du das umsetzt, siehst du weiter unten.
Migration von OpenAI oder OpenRouter: Die drei zu ändernden Stellen
Egal, ob du die offizielle OpenAI-Schnittstelle, einen Aggregator wie OpenRouter oder einen API-Provider nutzt: Solange dein Code ein OpenAI-kompatibles SDK verwendet, musst du drei Dinge ändern: Setze base_url auf https://api.wuxianzhiapi.com/v1. Ersetze api_key durch den Schlüssel, den du auf /get-api-key/ erhältst. Setze model einheitlich auf uncensored. Es gibt keine anderen Modelle. GET /v1/models zeigt nur dieses eine.
import os
from openai import OpenAI
messages = [{"role": "user", "content": "你好"}]
# 迁移前(示意):
# client = OpenAI(api_key=os.environ["OLD_API_KEY"], base_url="旧地址")
# resp = client.chat.completions.create(model="旧模型名", messages=messages)
# 迁移后:只动 base_url、api_key、model 这三处
client = OpenAI(
base_url="https://api.wuxianzhiapi.com/v1",
api_key=os.environ["WUXIANZHI_API_KEY"],
)
resp = client.chat.completions.create(model="uncensored", messages=messages, max_tokens=100)
print(resp.choices[0].message.content)Node.js funktioniert ähnlich: Ersetze in new OpenAI({...}) die Werte für baseURL und apiKey. Bei direkten HTTP-Anfragen ändere die URL zu https://api.wuxianzhiapi.com/v1/chat/completions und behalte den Header Authorization: Bearer <API-Schlüssel> bei. Siehe auch Codebeispiele.
curl https://api.wuxianzhiapi.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $WUXIANZHI_API_KEY" \
-d '{"model":"uncensored","messages":[{"role":"user","content":"你好"}],"max_tokens":50}'
Parameter-Vergleich: Was funktioniert, was nicht
Die folgende Tabelle geht die Felder durch, die bei der Migration am häufigsten vorkommen. Die Regel lautet: Alle dialogbezogenen Kernfelder im OpenAI-Format können wie gewohnt verwendet werden; Funktionen, die sich auf „andere Modelle oder andere Modalitäten“ beziehen, gibt es hier nicht.
| Bisherige Nutzung | Behandlung hier |
|---|---|
model (z. B. verschiedene GPT-Modelle) | Muss auf uncensored geändert werden |
messages (system / user / assistant / tool) | Format identisch, direkt verwendbar |
max_tokens | Standardmäßig 2048, maximal 32,000; bei Überschreitung tritt 400 auf |
stream: true | Unterstützt; am Ende wird ein Nutzungsblok angehängt |
tools / tool_choice | Unterstützt, OpenAI-Format |
| Kontextfenster | Gesamtsumme aus Prompt und Ausgabe: 100,000 Token |
| Anfragekörpergröße | Nicht mehr als 8 MB |
| Ratenlimit | 300 Anfragen pro Minute und Schlüssel |
| Vektor-Embeddings | Nicht unterstützt |
| Bildgenerierung/-erkennung, Audio, Video | Nicht unterstützt; nur Textverarbeitung |
| Fine-Tuning | Nicht unterstützt |
| Modellwechsel | Es gibt nur ein Modell, keine Liste zum Umschalten |
Nimm nicht an, dass andere optionale Felder, die nicht in der Tabelle aufgeführt sind, auf die gleiche Weise wie beim Hersteller funktionieren. Der sichere Ansatz ist, sie im Testumfeld separat zu testen und erst dann live zu schalten, wenn das Verhalten den Erwartungen entspricht. Die genaue Unterstützung findest du in den API-Dokumentationen.
Was tun bei fehlenden Funktionen: Alternativen für Vektoren, Bilder und Audio
Wenn dein Projekt sowohl Dialog als auch Vektorsuche nutzt, solltest du nicht alles auf einmal umstellen. Hier bieten wir nur Textdialoge an. Code für Embeddings (z. B. Wissensdatenbank-Suche, semantische Deduplizierung) bleibt bei deinem ursprünglichen Vektordienst oder du setzt eine eigene Vektorsolution ein. Der Dialogteil wird hierher verschoben, der Suchteil bleibt unverändert. Diese Trennung ist die einfachste Lösung.
Gleiche Logik gilt für Bilder und Audio. Wenn dein Produkt Text mit Bildern kombiniert, kann die Textgenerierung über diesen Dienst laufen, während die Bildgenerierung über die ursprüngliche Bild-API weiterläuft. Für Sprachausgabe generiere den Text und übergebe ihn an deinen bestehenden Audio-Dienst. Wenn du die Textgenerierung in eine separate Funktion auslagerst, sind spätere Änderungen gering.
Es gibt noch einen weiteren Fall: Wenn dein Code mehrere Modelle für verschiedene Aufgaben nutzt, z. B. ein günstiges Modell zur Klassifizierung und ein teures zur Kreation. Hier gibt es nur ein Modell, also muss auch die Klassifizierung von diesem übernommen werden. Da der Input-Preis nur $0,25 pro Million Token beträgt, sind die Kosten für Klassifizierungsaufgaben (kurze Ausgaben) sehr gering. Setze max_tokens klein, dann sind die Kosten vernachlässigbar. Details zur Preisgestaltung findest du auf der Preisseite.
Parallele Ausführung: Umschalten zwischen zwei Endpunkten über Umgebungsvariablen
Der größte Fehler bei Migrationen ist der „Big Bang“. Eine stabilere Lösung ist eine dünne Abstraktionsschicht im Code, die über eine Umgebungsvariable steuert, welcher Endpunkt genutzt wird. So kannst du zunächst nur einen kleinen Teil des Traffics oder eine Funktion auf den neuen Endpunkt legen. Bei Problemen reicht ein Variablenwechsel zum Zurückkehren. Da beide Endpunkte OpenAI-kompatibel sind, ist die Abstraktion einfach.
import os
from openai import OpenAI
PROVIDERS = {
"old": {
"base_url": os.environ.get("OLD_BASE_URL", ""),
"api_key": os.environ.get("OLD_API_KEY", ""),
"model": os.environ.get("OLD_MODEL", ""),
},
"wuxianzhi": {
"base_url": "https://api.wuxianzhiapi.com/v1",
"api_key": os.environ.get("WUXIANZHI_API_KEY", ""),
"model": "uncensored",
},
}
def get_client(name=None):
name = name or os.environ.get("LLM_PROVIDER", "old")
cfg = PROVIDERS[name]
return OpenAI(base_url=cfg["base_url"], api_key=cfg["api_key"]), cfg["model"]
def chat(messages, provider=None, **kwargs):
client, model = get_client(provider)
return client.chat.completions.create(model=model, messages=messages, **kwargs)
# 通用任务走旧接口,需要无审查输出的请求显式指定新接口
resp = chat([{"role": "user", "content": "写一个黑色幽默的短故事"}],
provider="wuxianzhi", max_tokens=800)
print(resp.choices[0].message.content)Die Granularität des Wechsels kann in drei Ebenen erfolgen: nach Umgebung (zuerst in der Testumgebung wechseln), nach Funktion (nur die Kreationsschnittstellen umstellen) oder nach Benutzer (einen Teil der Konten umstellen). Egal auf welcher Ebene empfehlen wir, das Feld provider in den Logs beizubehalten, damit du bei Abweichungen vergleichen kannst. Auch den Chatverlauf empfehlen wir, als standardmäßiges messages-Array zu speichern, damit dieselbe Konversation nahtlos an beiden Enden fortgesetzt werden kann.
Migrations-Checkliste
Gehe vor dem Go-Live die folgenden Punkte durch, um nichts zu übersehen:
- Registriere dich auf /get-api-key/, erhalte deinen Schlüssel und überprüfe ihn mit dem $0,50-Testguthaben (gültig für 7 Tage). Eine vorherige Aufladung ist nicht erforderlich.
- Verwende
curl /v1/models, um zu bestätigen, dass der Schlüssel gültig ist und das Netzwerk erreichbar ist. - Ändere die drei Werte
base_url,api_keyundmodelso, dass sie über Umgebungsvariablen gesteuert werden. Der Schlüssel sollte nicht im Code-Repository gespeichert werden. - Durchsuche den Code nach fest codierten Modellnamen,
max_tokens-Werten und Embedding-Aufrufen. - Prüfe den Streaming-Code auf Kompatibilität mit dem letzten Block, bei dem
choicesleer ist. - Füge exponentielle Backoff-Wiederholungsversuche für 429 und 503 hinzu. Füge klare Fehlerzweige für 402 und 403 hinzu.
- Führe eine Regression mit echten Prompts durch. Achte besonders darauf, ob Antworten, die zuvor abgelehnt wurden, jetzt korrekt ausgegeben werden.
- Starte mit einem kleinen Anteil des Traffics. Vergleiche Verbrauch und Latenz. Erweitere den Umfang erst, wenn alles stabil läuft.
- Stelle sicher, dass das Produkt an erwachsene Nutzer gerichtet ist und der Verwendungszweck legal ist. Dies ist Voraussetzung für die Nutzung des Endpunkts.
Häufige Fallstricke bei der Migration
Modellname vergessen zu ändern. Wenn du die gpt-Modelle aus dem alten Code oder die Modellpfade eines Gateway-Anbieters unverändert sendest, erhältst du Fehlerantworten. Suche global nach dem Modellnamen und stelle sicher, dass am Ende uncensored gesendet wird.
max_tokens überschritten. Einige Projekte setzen max_tokens auf 32000 oder höher, um längere Ausgaben zu erzwingen. Hier ist das Maximum pro Anfrage 32,000; darüber hinaus wird ein 400-Fehler zurückgegeben. Zusätzlich darf die Summe aus Prompt und max_tokens 100,000 Token nicht überschreiten. Bei langen Eingaben musst du die Ausgabelimits entsprechend anpassen.
Nutzungsdaten-Block im Streaming. Bevor der Stream endet, hängt der Server automatisch einen Block mit usage an. Die choices sind ein leeres Array. Wenn dein Parsing-Code direkt chunk.choices[0] ausliest, wirst du im letzten Schritt einen Fehler erhalten. In manchen alten Codes wird auch manuell stream_options gesendet, um die Nutzung abzurufen – das ist hier nicht nötig.
„Unzensiert“ mit „Grenzenlos“ verwechseln. Legale erwachsene Inhalte, Fiktion und kontroverse Themen werden nicht abgelehnt, aber sexuelle Inhalte, an denen Minderjährige beteiligt sind, werden immer blockiert – sowohl in der Fiktion als auch im Rollenspiel – mit dem Fehler 403 content_blocked. Das Produkt muss selbst sicherstellen, dass nur erwachsene Benutzer Zugang erhalten.
Guthaben und Testguthaben-Verfall. Das Testguthaben verfällt nach 7 Tagen. Wenn das Guthaben aufgebraucht ist, erhältst du den Fehler 402 mit dem Code no_credit. Übersetze diesen Fehler in deiner Anwendung in eine für den Benutzer verständliche Meldung, statt nur allgemein „Dienstfehler“ anzuzeigen. Für die Gestaltung spezifischer Szenarien kannst du den Artikel Anwendungsszenarien als Referenz nehmen.
Häufig gestellte Fragen
Muss ich nach der Migration meine Prompts neu schreiben?
Das Format muss nicht geändert werden, die messages-Struktur ist vollständig identisch. Aber die „Jailbreak“-Vorläufer, die ursprünglich geschrieben wurden, um Ablehnungen zu umgehen, können gelöscht werden. Schreibe die Rolle und die Aufgabe direkt und klar aus – das spart Token und ist stabiler.
Kann ich während der Migration beide Endpunkte parallel betreiben?
Ja, das empfehlen wir. Nutze Umgebungsvariablen für base_url, Schlüssel und Modellname. Leite zuerst einige Funktionen oder Nutzergruppen um. Bei Problemen reicht es, eine Variable zu ändern, um zurückzurollen.
Was passiert mit Embedding-Aufrufen aus dem alten Endpunkt?
Es gibt hier keine Embedding-Schnittstelle; die Anfrage gibt 404 zurück. Nutze für die Vektorsuche weiterhin den ursprünglichen Dienst und schalte nur die Chat-Anfragen um.
Wie überprüfe ich, ob die Migration die Ergebnisse verbessert hat?
Führe Regressionstests mit echten Prompts durch, die zuvor abgelehnt oder verändert wurden. Dokumentiere die Ablehnungsrate, die Antwortlänge und die Token-Anzahl im usage-Feld. Verwende Samples aus deiner eigenen Geschäftsanwendung, nicht allgemeine Testsets aus dem Internet.
Fülle einfach das Formular aus, um deinen Schlüssel zu erhalten
Erstelle ein Konto, kopiere den Schlüssel und passe die Base URL an. Die Konfiguration ist so einfach.
API-Schlüssel erhalten