Wu Xianzhi APIGuide de migration
Guide de migration API : passez de OpenAI ou OpenRouter à une API sans censure
Si votre projet utilise actuellement OpenAI, OpenRouter ou un point de passage API et que vous souhaitez passer à une API sans censure qui ne rejette pas les demandes légitimes, il vous suffit de modifier trois paramètres de configuration : base_url, la clé API et le nom du modèle. Nous expliquons d'abord la différence entre les points de passage et les modèles sans censure dédiés, puis nous fournissons un tableau de correspondance des paramètres, un exemple d'exécution parallèle des anciennes et nouvelles API via des variables d'environnement, une liste de contrôle pour le passage en production, et les pièges les plus courants lors de la migration.
Mis à jour le
Points clés
- Les agrégateurs revendent les modèles d'origine avec leurs stratégies de contenu ; seuls les modèles dédiés sans censure résolvent les refus.
- La migration ne nécessite que trois modifications : définissez base_url sur https://api.wuxianzhiapi.com/v1,密钥,模型名 uncensored
- Pas d'embeddings, d'images, d'audio ou de fine-tuning ; utilisez vos services actuels pour ces capacités.
- Utilisez des variables d'environnement pour un basculement progressif ; un seul changement de variable suffit pour revenir en arrière en cas de problème.
Quelle est la différence entre un agrégateur API et un modèle dédié sans censure
Clarifions d'abord les concepts pour éviter de choisir la mauvaise direction. Un agrégateur API classique agrège ou revend des quotas d'appels vers des modèles de grands éditeurs. Il expose une adresse compatible OpenAI pour vous permettre de basculer entre différents modèles avec le même SDK. Il résout les problèmes d'accès et de facturation (point d'entrée unique, facturation centralisée), mais le modèle sous-jacent reste celui de l'éditeur d'origine. Sa stratégie de contenu s'applique toujours : les sujets refusés le seront toujours, changer d'agrégateur ne modifie rien.
Un modèle dédié sans censure est différent. Il ne s'agit pas d'un relais, mais d'un modèle unique fourni directement. Les contenus pour adultes légaux, la fiction et les sujets controversés ne sont pas refusés. Wu Xianzhi API propose un seul modèle : uncensored. L'interface est compatible OpenAI, ce qui rend la migration très simple. Cependant, il a des limites : texte uniquement, pas d'image, d'audio, de vectorisation ou de fine-tuning. La pédophilie est bloquée (403), même en fiction.
Avant de migrer, demandez-vous : votre problème est-il « instabilité ou coût élevé » ou « le modèle refuse systématiquement vos demandes légitimes » ? Si c'est le second cas, changer d'agrégateur ne sert à rien ; passez à une API sans censure dédiée. Beaucoup d'équipes combinent les deux : les tâches générales utilisent l'interface existante, tandis que les requêtes nécessitant une sortie sans censure sont routées vers ce service (voir comment faire plus bas).
Les trois modifications à effectuer lors d'une migration depuis OpenAI ou OpenRouter
Que vous utilisiez à l'origine l'API officielle d'OpenAI, un agrégateur comme OpenRouter ou un point de passage, tant que votre code utilise un SDK compatible OpenAI, les trois éléments à modifier sont : remplacez base_url par https://api.wuxianzhiapi.com/v1 ; remplacez api_key par la clé obtenue sur /get-api-key/ ; écrivez uniformément model comme uncensored. Aucun autre modèle n'est disponible ; GET /v1/models n'en liste qu'un seul.
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)Pour Node.js, remplacez new OpenAI({...}) avec baseURL et apiKey. Pour HTTP direct, pointez vers https://api.wuxianzhiapi.com/v1/chat/completions avec Authorization: Bearer <clé>. Voir exemple de code.
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}'
Table des paramètres : ce qui fonctionne et ce qui ne s'applique pas
Le tableau ci-dessous couvre les champs les plus courants lors d'une migration. La règle est simple : les champs centraux liés au chat et au format OpenAI fonctionnent normalement ; les fonctionnalités liées à d'autres modèles ou modalités ne sont pas disponibles ici.
| Utilisation précédente | Traitement ici |
|---|---|
model (ex. gpt) | Remplacer par uncensored |
messages (system / user / assistant / tool) | Format identique, utilisation directe |
max_tokens | Par défaut 2048, max 32 000 ; renvoie 400 au-delà |
stream: true | Pris en charge ; un bloc d'utilisation est ajouté à la fin |
tools / tool_choice | Pris en charge, format OpenAI |
| Longueur du contexte | 100 000 tokens au total (prompt + sortie) |
| Taille du corps de la requête | 8 MB maximum |
| Débit | 300 requêtes par minute par clé |
| Vecteurs embeddings | Non pris en charge |
| Génération / reconnaissance d'images, audio, vidéo | Non pris en charge, texte uniquement |
| Fine-tuning | Non pris en charge |
| Basculer entre plusieurs modèles | Un seul modèle, pas de liste de modèles disponibles pour la bascule |
Pour les autres champs optionnels non listés dans le tableau, ne supposez pas qu'ils s'appliqueront tous selon la méthode du fournisseur d'origine. La méthode sûre consiste à les tester séparément dans un environnement de préproduction et à confirmer que leur comportement correspond à vos attentes avant le déploiement. Consultez la documentation de l'endpoint pour connaître les fonctionnalités prises en charge.
Que faire en cas d'absence de fonctionnalités : alternatives pour les embeddings, l'image et l'audio
Si votre projet existant utilise à la fois le chat et la recherche vectorielle, ne tentez pas de tout migrer d'un coup. Nous proposons uniquement le chat textuel ; le code lié aux embeddings, comme la recherche dans la base de connaissances ou le déduplication sémantique, doit continuer à utiliser votre service vectoriel actuel ou une solution vectorielle déployée en interne. Migrez la partie conversation vers notre API et laissez la partie recherche en place : ces deux parties sont indépendantes, ce qui constitue la méthode de découplage la plus simple.
La même logique s'applique à l'image et à l'audio. Par exemple, si votre produit est de type « texte avec images », vous pouvez générer le texte via notre API et continuer à utiliser votre endpoint d'image actuel ; pour la synthèse vocale, envoyez le texte généré à votre service de synthèse vocale existant. En isolant la génération de texte dans une fonction dédiée, les modifications nécessaires pour assembler les autres fonctionnalités resteront minimes.
Un autre cas de figure est lorsque votre code utilise plusieurs modèles pour des tâches spécifiques, par exemple un modèle peu coûteux pour la classification et un modèle plus cher pour la création. Ici, un seul modèle est disponible, il devra donc également effectuer les tâches de classification. Heureusement, le prix à la demande est de $0,25 par million de tokens ; le coût des tâches de classification, qui génèrent peu de sortie, est très faible. Réduisez la valeur de max_tokens pour que le coût soit négligeable. Consultez la page des tarifs pour les détails sur les prix.
Exécution en parallèle : basculez entre deux endpoints à l'aide de variables d'environnement
Le risque principal lors d'une migration est le « tout ou rien ». Une méthode plus sûre consiste à créer une fine couche d'abstraction dans votre code, en utilisant une variable d'environnement pour déterminer quel endpoint utiliser. Cela vous permet de diriger un petit pourcentage de trafic ou une fonctionnalité spécifique vers le nouvel endpoint, et de revenir en arrière instantanément en modifiant une variable en cas de problème. Comme les deux endpoints sont compatibles OpenAI, cette abstraction est très simple à mettre en place.
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)La granularité de la bascule peut se faire à trois niveaux : par environnement (basculez d'abord en environnement de test), par fonctionnalité (migrez uniquement les endpoints de création), ou par utilisateur (basculez progressivement pour un groupe d'utilisateurs). Quel que soit le niveau choisi, il est recommandé de conserver le champ provider dans les journaux (logs) afin de pouvoir comparer et diagnostiquer les écarts. Il est également conseillé de stocker l'historique des conversations sous forme d'un tableau standard de messages, ce qui permettra de reprendre une même conversation de manière transparente entre les deux endpoints.
Liste de contrôle de la migration
Parcourez l'ordre ci-dessous avant la mise en production pour éviter les oublis :
- Inscrivez-vous sur /get-api-key/, obtenez votre clé et testez avec le crédit d'essai de 0,50 $ (valable 7 jours) sans avoir à recharger votre compte au préalable.
- Utilisez
curl /v1/modelspour confirmer que la clé est valide et que le réseau est accessible. - Modifiez
base_url,api_keyetmodelpour qu'ils soient pilotés par des variables d'environnement, afin que la clé ne soit pas commitée dans le dépôt de code. - Recherchez dans le code les noms de modèles codés en dur, les valeurs de
max_tokenset les appels aux embeddings. - Vérifiez le code de streaming pour qu'il soit compatible avec le dernier bloc de métadonnées (usage) où
choicesest un tableau vide. - Ajoutez une logique de retry avec backoff exponentiel pour les erreurs 429 et 503, et une gestion explicite des erreurs pour les 402 et 403.
- Exécutez une série de tests de régression avec vos vrais prompts, en accordant une attention particulière aux cas qui étaient précédemment refusés pour vérifier qu'ils s'affichent correctement.
- Déployez d'abord à faible échelle (canary), comparez la consommation et la latence, puis élargissez le déploiement si tout est fonctionnel.
- Confirmez que votre produit s'adresse à un public adulte et que son utilisation est légale, car c'est une condition préalable à l'utilisation de cet endpoint.
Les pièges les plus courants lors d'une migration
Oubli de modifier le nom du modèle. Si vous envoyez les anciens modèles gpt ou le chemin d'un modèle d'une plateforme agrégée sans modification, vous obtiendrez une réponse d'erreur. Effectuez une recherche globale des noms de modèles et assurez-vous que le modèle envoyé en production est bien uncensored.
Dépassement de max_tokens. Certains projets définissent max_tokens à 32 000 ou plus pour allonger les réponses du modèle ; ici, le maximum par appel est de 32 000, au-delà une erreur 400 est renvoyée. De plus, la somme du prompt et de max_tokens ne doit pas dépasser 100 000 tokens ; réduisez la limite de sortie si vous envoyez des requêtes longues.
Bloc d'utilisation en streaming. Avant la fin du flux, le serveur ajoute automatiquement un bloc contenant usage, dont choices est un tableau vide. Si votre code de lecture lit directement chunk.choices[0], il génère une erreur à la dernière étape. Certains anciens codes transmettent aussi manuellement stream_options pour récupérer l'utilisation ; ce n'est pas nécessaire ici.
Confondre « sans censure » avec « sans limites ». Le contenu adulte légal, la fiction et les sujets controversés ne sont pas bloqués, mais le contenu sexuel impliquant des mineurs est toujours intercepté, y compris dans la fiction et le jeu de rôle, avec une erreur 403 content_blocked. Le produit doit gérer lui-même la vérification de l'âge des utilisateurs.
Solde et essai expirés. Le crédit d'essai gratuit expire après 7 jours. Solde vide = 402 (code no_credit). Affichez un message clair. Voir les scénarios d'application.
Questions fréquentes
Faut-il réécrire les prompts après la migration ?
Le format n'a pas besoin d'être modifié, la structure des messages est strictement identique. Cependant, vous pouvez supprimer les « incantations » (jailbreaks) ajoutées précédemment pour contourner les filtres. Indiquez simplement clairement le rôle et la tâche : cela permet d'économiser des tokens et d'obtenir des résultats plus stables.
Peut-on conserver les anciens et les nouveaux endpoints simultanément pendant la migration ?
Oui, et c'est même recommandé. Utilisez des variables d'environnement pour définir le base_url, la clé API et le nom du modèle. Vous pouvez ainsi diriger une partie des fonctionnalités ou des utilisateurs vers le nouvel endpoint, et revenir en arrière instantanément en modifiant une variable en cas de problème.
Que se passe-t-il si je migre les appels aux embeddings de l'ancien endpoint ?
Nous ne proposons pas d'endpoint pour les embeddings ; une requête dans ce but renverra une erreur 404. Continuez à utiliser votre service vectoriel actuel pour la recherche vectorielle et migrez uniquement les requêtes de chat.
Comment évaluer si les performances se sont améliorées après la migration ?
Effectuez une comparaison de régression en utilisant un échantillon de vrais prompts qui étaient précédemment refusés ou modifiés. Notez le taux de refus, la longueur des réponses et le nombre de tokens indiqués dans usage. Les échantillons doivent provenir de vos propres données métier, et non d'ensembles de tests génériques disponibles en ligne.
Remplissez simplement le formulaire pour obtenir votre clé
Créez un compte, copiez votre clé et modifiez le Base URL. La configuration est aussi simple que cela.
Obtenir la clé API