PL ▾
Pobierz klucz API

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

  1. Pośrednik odsprzedaje oryginalne modele producenta, więc polityka treści pozostaje bez zmian; tylko dedykowany model bez cenzury rozwiązuje problem odrzuceń.
  2. Migracja wymaga zmiany tylko trzech ustawień: base_url na https://api.wuxianzhiapi.com/v1,密钥,模型名 uncensored
  3. Brak wsparcia dla embeddings, obrazów, audio i fine-tuningu – użyj do nich dotychczasowej usługi
  4. 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życieJak 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_tokensDomyślnie 2048, maksymalnie 32 000; powyżej tej wartości otrzymasz błąd 400
stream: trueWsparcie dostępne – na końcu odpowiedzi dodawany jest blok statystyk użycia
tools / tool_choiceWsparcie dostępne, zgodne z formatem OpenAI
Długość kontekstuPrompt plus output: 100 000 tokenów
Rozmiar ciała żądaniaNie więcej niż 8 MB
Limit zapytań300 zapytań na minutę na klucz
Wektory embeddingówNieobsługiwane
Generowanie obrazów / rozpoznawanie obrazów, audio, wideoNieobsługiwane – przetwarzany jest tylko tekst
Dopasowanie (fine-tuning)Nieobsługiwane
Przełączanie między wieloma modelamiDostę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ć:

  1. 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.
  2. Użyj curl /v1/models, aby potwierdzić ważność klucza i dostępność sieci.
  3. Zmień base_url, api_key i model tak, aby były sterowane zmiennymi środowiskowymi, a klucz API nie trafił do repozytorium kodu.
  4. Przeszukaj kod pod kątem sztywno zdefiniowanych nazw modeli, wartości max_tokens oraz wywołań embeddings.
  5. Sprawdź kod strumieniowania, aby był kompatybilny z blokiem zużycia, w którym ostatni choices jest pusty.
  6. 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.
  7. Przetestuj zestaw regresyjny na prawdziwych promptach, zwracając szczególną uwagę na to, czy odpowiedzi na wcześniej odrzucane zapytania są teraz poprawne.
  8. Rozpocznij od małego procentu ruchu, porównaj zużycie i opóźnienia, a dopiero potem zwiększaj skalę.
  9. 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