IT ▾
Ottieni la chiave API

Wu Xianzhi APIGuida alla migrazione

Guida alla migrazione da gateway API: passaggio da OpenAI e OpenRouter a un'API senza censura

Se usi OpenAI, OpenRouter o un aggregatore e vuoi passare a un'API senza censura che non blocca richieste legittime, modifica solo tre impostazioni: base_url, chiave e nome del modello. Spieghiamo le differenze, la tabella dei parametri, lo switch parallelo, la checklist e i comuni errori di migrazione.

Aggiornato il

Punti chiave

  1. I gateway rivendono i modelli originali con le stesse policy; solo i modelli dedicati risolvono i blocchi
  2. Modifica solo tre cose: base_url su https://api.wuxianzhiapi.com/v1,密钥,模型名 uncensored
  3. Nessun supporto per embeddings, immagini, audio e fine-tuning; usa i servizi originali
  4. Usa le variabili d'ambiente per il rollout graduale; un solo cambio variabile per il rollback

Qual è la differenza tra gateway API e modello dedicato senza censura

Chiariamo i concetti per non sbagliare direzione. Gli aggregatori vendono o aggregano quote di modelli grandi, offrendo un endpoint compatibile con OpenAI. Risolvono accesso e fatturazione, ma il modello resta quello originale con le sue policy: cambiare endpoint non cambia il filtro sui contenuti.

I modelli senza censura sono diversi. Non sono un reindirizzamento, ma un modello fornito separatamente che non blocca contenuti adulti, creatività e temi controversi. Wu Xianzhi API offre un solo modello, uncensored, compatibile con OpenAI. Supporta solo testo; i contenuti sessuali che coinvolgono minori vengono bloccati con 403.

Chiediti: il problema è instabilità/prezzi o blocchi delle richieste? Se è il secondo caso, il gateway non basta. Molti team usano entrambi: traffico generale sul vecchio endpoint, richieste speciali su questa API.

Da OpenAI o OpenRouter: le tre modifiche da fare

Che tu usi OpenAI ufficiale, OpenRouter o un gateway, se il codice usa un SDK compatibile con OpenAI, devi modificare solo tre cose: base_url in https://api.wuxianzhiapi.com/v1; api_key con la chiave ottenuta da /get-api-key/; model impostato su uncensored. Non ci sono altre opzioni, GET /v1/models mostra solo questo.

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)

Per Node.js, sostituisci new OpenAI({...}) impostando baseURL e apiKey. Se usi richieste HTTP dirette, punta a https://api.wuxianzhiapi.com/v1/chat/completions e mantieni Authorization: Bearer <chiave>. Vedi codice di esempio per Python, Node.js e cURL.

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}'

Tabella dei parametri: cosa funziona e cosa no

Questa tabella copre i campi più comuni. I campi core di chat e formato OpenAI funzionano. Le funzionalità legate ad altri modelli o modalità non sono disponibili.

Utilizzo originaleGestione qui
model (es. vari GPT)Cambia in uncensored
messages (system/user/assistant/tool)Formato identico, usa direttamente
max_tokensDefault 2048, max 32.000; oltre si ottiene errore 400
stream: trueSupportato, aggiunge un blocco di utilizzo alla fine
tools / tool_choiceSupportato, formato OpenAI
Lunghezza contestoTotale prompt e output: 100.000 token
Dimensione corpo richiestaMax 8 MB
Velocità300 richieste al minuto per chiave
Embeddings vettorialiNon supportato
Generazione/analisi immagini, audio, videoNon supportato, solo testo
Fine-tuningNon supportato
Passaggio tra più modelliÈ disponibile un solo modello, non esiste un elenco di modelli tra cui scegliere

Per i campi non elencati, non dare per scontato che funzionino come nel modello originale. Testali in ambiente di staging prima del lancio. Per i dettagli, consulta documentazione dell'interfaccia.

Cosa fare per le funzionalità mancanti: alternative per embeddings, immagini e audio

Se il tuo progetto utilizza sia il dialogo che la ricerca vettoriale, non pensare di migrare tutto in una volta. Qui offriamo solo il dialogo testuale, quindi il codice relativo agli embeddings, come la ricerca nel knowledge base o la deduplicazione semantica, deve continuare a utilizzare il tuo servizio vettoriale esistente oppure passare a una soluzione vettoriale gestita in autonomia. Sposta qui solo la parte di dialogo e lascia invariata quella di ricerca: è la soluzione più semplice che garantisce l'indipendenza delle due parti.

Lo stesso vale per immagini e audio. Ad esempio, se il tuo prodotto è di tipo "testo con immagini", la generazione del testo può passare qui, mentre le immagini continuano a utilizzare il tuo endpoint di origine; se hai bisogno di sintesi vocale, genera il testo e poi passalo al tuo servizio vocale esistente. Estrai la generazione del testo in una funzione separata: in questo modo, le modifiche saranno minime indipendentemente da come combinerai le altre funzionalità in futuro.

Un altro scenario è quando il tuo codice utilizza più modelli per compiti diversi, ad esempio un modello economico per la classificazione e uno più costoso per la creazione di contenuti. Qui c'è un solo modello, quindi dovrà occuparsi anche della classificazione. Fortunatamente, il prezzo è di $0,25 per milione di token, quindi il costo per compiti di classificazione che producono output brevi è molto basso; impostando max_tokens a un valore basso, il costo diventa trascurabile. Per i dettagli sui prezzi, consulta la pagina prezzi.

Esecuzione parallela: passaggio tra due endpoint tramite variabili d'ambiente

Il rischio maggiore durante la migrazione è il "cambio totale". L'approccio più sicuro prevede di creare un leggero wrapper nel codice che, tramite una variabile d'ambiente, decida quale endpoint utilizzare. In questo modo puoi instradare solo una piccola parte del traffico o alcune funzionalità verso il nuovo endpoint e, in caso di problemi, basta modificare una variabile per tornare indietro. Poiché entrambi gli endpoint seguono il formato compatibile con OpenAI, il wrapper è molto semplice da implementare.

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à del passaggio può avvenire su tre livelli: per ambiente (passare prima in ambiente di test), per funzionalità (spostare solo le API di generazione), per utente (gradualità su un sottoinsieme di account). Indipendentemente dal livello scelto, ti consigliamo di mantenere nel log il campo provider, che sarà utile per il debug in caso di discrepanze. Ti consigliamo inoltre di archiviare le cronologie delle conversazioni come array standard di messaggi, in modo che la stessa sessione possa continuare senza interruzioni tra i due endpoint.

Checklist di migrazione

Prima del rilascio, esegui i seguenti passaggi in ordine per evitare di dimenticare nulla:

  1. Registrati su /get-api-key/, ottieni la chiave e verifica il funzionamento con il credito di prova gratuito di $0,50 (valido per 7 giorni), senza dover prima effettuare una ricarica.
  2. Utilizza curl /v1/models per verificare che la chiave sia valida e che la rete sia raggiungibile.
  3. Imposta base_url, api_key e model come variabili d'ambiente, in modo che la chiave non venga salvata nel repository del codice.
  4. Cerca nel codice i nomi dei modelli hardcodati, i valori di max_tokens e le chiamate agli embeddings.
  5. Verifica il codice di streaming per assicurarti che gestisca correttamente il blocco di utilizzo finale, dove choices è un array vuoto.
  6. Aggiungi un meccanismo di retry con backoff esponenziale per gli errori 429 e 503, e gestisci esplicitamente gli errori 402 e 403.
  7. Esegui una serie di test di regressione con i tuoi prompt reali, prestando particolare attenzione alle risposte che in precedenza venivano rifiutate.
  8. Avvia il rilascio graduale con una piccola percentuale di traffico, confronta l'utilizzo e la latenza e, se i risultati sono soddisfacenti, amplia gradualmente.
  9. Verifica che il tuo prodotto sia destinato a un pubblico adulto e che l'utilizzo sia conforme alla normativa: è un requisito fondamentale per l'utilizzo di questo endpoint.

I principali problemi durante la migrazione

Nome del modello non modificato.Se invii il nome del modello gpt o il percorso di un aggregatore, ottieni un errore. Cerca e sostituisci con uncensored.

Superamento del limite di max_tokens. Alcuni progetti impostano max_tokens a 32.000 o più per ottenere output più lunghi; qui il limite massimo per singola richiesta è 32.000 token, oltre il quale riceverai un errore 400. Inoltre, la somma del prompt e di max_tokens non può superare i 100.000 token: se invii richieste molto lunghe, riduci di conseguenza il limite massimo di output.

Blocchi di utilizzo nello streaming. Prima della chiusura dello stream, il server aggiunge automaticamente un blocco contenente usage, in cui choices è un array vuoto. Se il tuo codice di parsing legge direttamente chunk.choices[0], otterrai un errore nell'ultimo blocco. Alcuni vecchi codici inviano anche stream_options per richiedere i dati di utilizzo, ma qui non è necessario.

Confondere "senza censura" con "senza limiti". I contenuti adulti legali, la finzione e i temi controversi non verranno rifiutati, ma i contenuti sessualmente espliciti che coinvolgono minori verranno sempre bloccati, anche in contesti di finzione o roleplay, restituendo l'errore 403 content_blocked. È responsabilità del prodotto garantire che l'accesso sia riservato agli adulti.

Saldo e scadenza prova. Il credito di prova gratuito scade dopo 7 giorni. Quando il saldo è esaurito, ricevi un 402 con errore no_credit. Traduci questo errore in un messaggio chiaro per l'utente, non generico. Per i dettagli, consulta scenari applicativi.

Domande frequenti

Devo riscrivere i prompt dopo la migrazione?

Il formato non deve essere modificato: la struttura messages è identica. Tuttavia, puoi rimuovere le "prompt di jailbreak" usate in precedenza per aggirare i filtri; specificando chiaramente il ruolo e il compito, risparmierai token e otterrai risultati più stabili.

Posso mantenere entrambi gli endpoint (vecchio e nuovo) durante la migrazione?

Sì, ed è consigliabile farlo. Utilizza variabili d'ambiente per configurare base_url, api_key e model; instrada inizialmente solo alcune funzionalità o alcuni utenti verso il nuovo endpoint e, in caso di problemi, basta modificare una variabile per tornare indietro.

Cosa succede se sposto le chiamate agli embeddings dal vecchio endpoint?

Non esiste un endpoint per gli embeddings qui; la richiesta restituirà un errore 404. Continua a utilizzare il tuo servizio vettoriale esistente per la ricerca e sposta qui solo le richieste di dialogo.

Come posso verificare se la migrazione ha migliorato i risultati?

Esegui un test di regressione su un set di prompt reali che in precedenza venivano rifiutati o modificati. Registra il tasso di rifiuto, la lunghezza delle risposte e il numero di token riportati nel campo usage. I campioni devono provenire dai tuoi dati aziendali reali, non da set di test generici disponibili online.

Compila il modulo per ottenere la chiave

Crea un account, copia la chiave e modifica il Base URL. La configurazione è semplice.

Ottieni la chiave API