Wu Xianzhi APIPrzewodnik migracji
Przewodnik migracji z API proxy: zmiana z OpenAI, OpenRouter na API bez cenzury
Jeśli Twój projekt korzysta obecnie z OpenAI, OpenRouter lub pośrednika API i chcesz przejść na API bez cenzury, które nie odrzuca legalnych żądań, wystarczy zmienić trzy konfiguracje: base_url, klucz i nazwę modelu. Wyjaśniamy różnicę między proxy a dedykowanym modelem bez cenzury, podajemy tabelę parametrów, kod do równoległego działania starych i nowych endpointów, listę kontrolną przed uruchomieniem oraz najczęstsze błędy.
Zaktualizowano
Kluczowe wnioski
- Pośrednik odsprzedaje oryginalne modele producenta, więc polityka treści pozostaje bez zmian; tylko dedykowany model bez cenzury rozwiązuje problem odrzuceń.
- Migracja wymaga zmiany tylko trzech ustawień: base_url na https://api.wuxianzhiapi.com/v1,密钥,模型名 uncensored
- Brak wsparcia dla embeddings, obrazów, audio i fine-tuningu – użyj do nich dotychczasowej usługi
- Przełączaj stopniowo za pomocą zmiennych środowiskowych – w razie problemu cofnij się, zmieniając jedną zmienną
Jakie jest różnica między API proxy a dedykowanym modelem bez cenzury
Najpierw wyjaśnijmy pojęcia, aby nie wybrać złego kierunku migracji. Typowe API proxy to agregatory lub sprzedawcy kwot wywołań modeli od dużych dostawców. Oferują kompatybilny z OpenAI endpoint, dzięki czemu możesz używać tego samego SDK do przełączania między modelami. Rozwiązują problem dostępu i płatności (jednolite wejście, rozliczenia), ale model pozostaje ten sam. Oryginalna strategia cenzury się nie zmienia – tematy odrzucane przez producenta będą odrzucane również przez proxy.
Dedykowany model bez cenzury to zupełnie inna sprawa. Nie jest to tylko proxy, ale osobny model, który nie odrzuca legalnej treści dla dorosłych, twórczości fikcyjnej ani kontrowersyjnych tematów. Wu Xianzhi API oferuje tylko jeden model o nazwie uncensored. Interfejs jest kompatybilny z formatem OpenAI, co minimalizuje koszty migracji. Model ma jednak jasne ograniczenia: obsługuje tylko tekst, nie obsługuje obrazów, audio, wektorów ani fine-tuningu. Treści seksualne z udziałem niepełnoletnich są blokowane (nawet w fikcji) i zwracają błąd 403.
Przed migracją zadaj sobie pytanie: czy problemem jest niestabilność lub wysoki koszt interfejsu, czy może model zbyt często odrzuca Twoje legalne żądania? Jeśli to drugie, zmiana proxy niewiele da – lepszym rozwiązaniem jest przejście na dedykowane API bez cenzury. Wielu zespołów używa obu rozwiązań jednocześnie: zadania ogólne realizuje stara usługa, a żądania wymagające brakują cenzury są kierowane tutaj.
Co zmienić przy migracji z OpenAI lub OpenRouter
Niezależnie od tego, czy używasz oficjalnego OpenAI, OpenRouter, czy innego proxy, jeśli kod używa SDK kompatybilnego z OpenAI, musisz zmienić trzy rzeczy: base_url na https://api.wuxianzhiapi.com/v1; api_key na klucz z /get-api-key/; model na uncensored. Nie ma innych modeli, w GET /v1/models jest tylko ten.
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)W Node.js zrób to samo, zmieniając new OpenAI({...}): baseURL i apiKey. Jeśli używasz HTTP, zmień adres na https://api.wuxianzhiapi.com/v1/chat/completions, zachowaj nagłówek Authorization: Bearer <密钥>. Pełne przykłady Python, Node.js, cURL znajdziesz w kodzie.
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}'
Tabela parametrów: co działa, a czego brakuje
Poniższa tabela omawia najczęściej używane pola podczas migracji. Zasada jest prosta: pola dotyczące czatu i zgodne z formatem OpenAI działają bez zmian. Funkcje związane z innymi modelami lub modalnościami tutaj nie występują.
| Poprawne użycie | Jak to działa tutaj |
|---|---|
model (np. różne modele GPT) | Musisz zmienić na uncensored |
messages (system / user / assistant / tool) | Format jest identyczny – używaj bezpośrednio |
max_tokens | Domyślnie 2048, maksymalnie 32 000; powyżej tej wartości otrzymasz błąd 400 |
stream: true | Wsparcie dostępne – na końcu odpowiedzi dodawany jest blok statystyk użycia |
tools / tool_choice | Wsparcie dostępne, zgodne z formatem OpenAI |
| Długość kontekstu | Prompt plus output: 100 000 tokenów |
| Rozmiar ciała żądania | Nie więcej niż 8 MB |
| Limit zapytań | 300 zapytań na minutę na klucz |
| Wektory embeddingów | Nieobsługiwane |
| Generowanie obrazów / rozpoznawanie obrazów, audio, wideo | Nieobsługiwane – przetwarzany jest tylko tekst |
| Dopasowanie (fine-tuning) | Nieobsługiwane |
| Przełączanie między wieloma modelami | Dostępny jest tylko jeden model, brak listy do przełączania |
Nie zakładaj, że inne pola niewymienione w tabeli będą działać zgodnie z oczekiwaniami producenta. Bezpieczniej jest przetestować je osobno w środowisku testowym i upewnić się, że zachowują się zgodnie z oczekiwaniami przed wdrożeniem. Szczegóły wsparcia znajdziesz w dokumentacji endpointów.
Co zrobić, gdy brakuje możliwości: alternatywy dla wektorów, obrazów i audio
Jeśli Twój projekt łączył rozmowy z wyszukiwaniem wektorowym, nie przenoś wszystkiego naraz. Tutaj obsługiwany jest tylko tekst konwersacyjny, więc kod związany z embeddings (np. wyszukiwanie w bazie wiedzy, usuwanie duplikatów semantycznych) musi pozostać w oryginalnej usłudze wektorowej lub zostać zastąpiony własnym rozwiązaniem. Przeniesienie tylko części konwersacyjnej przy zachowaniu niezmienionej części wyszukiwania to najprostszy sposób rozdzielenia tych funkcji.
Analogicznie dotyczy to obrazów i audio. Jeśli Twój produkt to „tekst z ilustracjami”, generowanie tekstu może korzystać z naszego API, a generowanie ilustracji z oryginalnego interfejsu graficznego. W przypadku syntezy mowy, wygenerowany tekst przekaż do swojej istniejącej usługi TTS. Wyciągnij generowanie tekstu do osobnej funkcji — dzięki temu przyszłe łączenie innych możliwości będzie wymagało minimalnych zmian.
Jeśli Twój kod używa wielu modeli do różnych zadań (np. taniego do klasyfikacji, drogiego do generowania), teraz jeden model obsłuży wszystko. Na szczęście cena za token wynosi $0,25 za milion tokenów, więc koszt zadań z krótką odpowiedzią, takich jak klasyfikacja, jest niski. Ustaw małe max_tokens, aby zminimalizować koszty. Szczegóły cen znajdziesz na stronie z cenami.
Uruchamianie równoległe: przełączanie między dwoma interfejsami za pomocą zmiennych środowiskowych
Największym ryzykiem przy migracji jest podejście „jedno rozwiązanie dla wszystkich”. Bezpieczniej jest stworzyć cienką warstwę abstrakcji w kodzie i użyć zmiennych środowiskowych do wyboru endpointu. Dzięki temu możesz przetestować nowy interfejs na małym ruchu lub wybranej funkcji i w razie błędu cofnąć się, zmieniając tylko jedną zmienną. Ponieważ oba interfejsy są zgodne z formatem OpenAI, warstwa abstrakcji jest bardzo prosta.
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)Granularność przełączania może mieć trzy poziomy: według środowiska (najpierw przełącz środowisko testowe), według funkcji (przenieś tylko interfejsy do generowania treści) lub według użytkowników (przetestuj na wybranej grupie kont). Bez względu na poziom, zalecamy pozostawienie pola provider w logach, aby w razie różnic można było je przeanalizować. Zalecamy również przechowywanie historii konwersacji w standardowej tablicy messages, co pozwoli na płynne kontynuowanie tej samej rozmowy między różnymi interfejsami.
Lista kontrolna migracji
Przed wdrożeniem przejdź poniższą listę krok po kroku, aby nic nie przeoczyć:
- Zarejestruj się na /get-api-key/, aby uzyskać klucz i przetestować go za pomocą $0,50 kredytu próbnego (ważnego przez 7 dni). Nie musisz najpierw doładować konta.
- Użyj
curl /v1/models, aby potwierdzić ważność klucza i dostępność sieci. - Zmień
base_url,api_keyimodeltak, aby były sterowane zmiennymi środowiskowymi, a klucz API nie trafił do repozytorium kodu. - Przeszukaj kod pod kątem sztywno zdefiniowanych nazw modeli, wartości
max_tokensoraz wywołań embeddings. - Sprawdź kod strumieniowania, aby był kompatybilny z blokiem zużycia, w którym ostatni
choicesjest pusty. - Dodaj wycofywanie z eksponencjalnym opóźnieniem dla kodów 429 i 503 oraz wyraźne gałęzie komunikatów błędów dla 402 i 403.
- Przetestuj zestaw regresyjny na prawdziwych promptach, zwracając szczególną uwagę na to, czy odpowiedzi na wcześniej odrzucane zapytania są teraz poprawne.
- Rozpocznij od małego procentu ruchu, porównaj zużycie i opóźnienia, a dopiero potem zwiększaj skalę.
- Upewnij się, że produkt jest przeznaczony dla użytkowników pełnoletnich i że jego zastosowanie jest zgodne z prawem — to warunek konieczny do korzystania z tego endpointu.
Najczęstsze błędy podczas migracji
Zapomniana zmiana nazwy modelu.Jeśli w starym kodzie ścieżka modelu gpt lub agregatora została przesłana bez zmian, otrzymasz błąd. Przeszukaj kod pod kątem nazwy modelu i upewnij się, że wysyłasz uncensored.
Przekroczenie limitu max_tokens. Niektóre projekty ustawiają max_tokens na 32000 lub więcej, aby wymusić dłuższe odpowiedzi. Maksymalna wartość dla pojedynczego żądania to 32 000; przekroczenie tego limitu zwróci błąd 400. Pamiętaj, że suma promptu i max_tokens nie może przekroczyć 100 000 tokenów — przy długich promptach odpowiednio obniż limit wyjściowy.
Blok metryk w strumieniowaniu. Przed zakończeniem strumienia serwer automatycznie dodaje blok z usage, w którym choices jest pustą tablicą. Jeśli Twój kod parsujący odwołuje się bezpośrednio do chunk.choices[0], na ostatnim kroku wystąpi błąd. Niektóre stare kody ręcznie przesyłają stream_options, aby uzyskać metryki — tutaj nie jest to konieczne.
Mylenie „bez cenzury” z „bez granic”. Legalne treści dla dorosłych, fikcja i tematy kontrowersyjne nie będą odrzucane, ale treści o charakterze seksualnym z udziałem małoletnich będą zawsze blokowane (również w fikcji i grze rolnej), zwracając błąd 403 content_blocked. Produkt musi sam zadbać o weryfikację pełnoletniości użytkowników.
Saldo i wygaśnięcie kredytu próbnego. Kredyt próbny wygasa po 7 dniach, a po wyczerpaniu salda otrzymasz błąd 402 z kodem no_credit. Przekształć ten błąd w aplikacji w zrozumiały komunikat dla użytkownika, a nie w ogólny „błąd usługi”. Inspiracje do projektowania scenariuszy znajdziesz w artykule Zastosowania.
Najczęściej zadawane pytania
Czy po migracji muszę przepisać stare prompty?
Format nie ulega zmianie — struktura messages jest identyczna. Możesz jednak usunąć „przejścia w stylu jailbreak”, które służyły do omijania blokad, i jasno określić rolę oraz zadanie. Zaoszczędzisz w ten sposób tokeny i zwiększysz stabilność.
Czy podczas migracji mogę zachować jednocześnie stary i nowy interfejs?
Tak, a nawet zalecamy takie podejście. Użyj zmiennych środowiskowych do sterowania base_url, kluczem i nazwą modelu. Pozwól części funkcji lub użytkowników korzystać z nowego interfejsu; w razie problemu wystarczy zmienić jedną zmienną, aby cofnąć się do starego rozwiązania.
Co się stanie, jeśli przeniosę wywołania embeddings ze starego interfejsu?
Nie mamy endpointu embeddings, więc żądanie zwróci błąd 404. Zastosowania wyszukiwania wektorowego powinny pozostać przy oryginalnej usłudze, a tylko żądania konwersacyjne powinny być kierowane do nowego interfejsu.
Jak sprawdzić, czy migracja poprawiła jakość odpowiedzi?
Przetestuj regresyjnie zestaw prawdziwych promptów, które wcześniej były odrzucane lub modyfikowane. Zapisz wskaźniki odrzuceń, długość odpowiedzi oraz liczbę tokenów z metryk usage. Wybierz próbki z Twojej własnej działalności, a nie z ogólnodostępnych zestawów testowych.
Wypełnij formularz, aby uzyskać klucz API
Utwórz konto, skopiuj klucz i zmień Base URL. Konfiguracja jest bardzo prosta.
Pobierz klucz API