Wu Xianzhi APIPanduan Migrasi
Panduan Migrasi API Gateway: Beralih dari OpenAI dan OpenRouter ke API Tanpa Sensor
Jika proyek Anda saat ini menggunakan OpenAI, OpenRouter, atau gateway API tertentu dan ingin beralih ke API tanpa sensor yang tidak menolak permintaan sah, sebenarnya Anda hanya perlu mengubah tiga konfigurasi: base_url, kunci API, dan nama model. Artikel ini terlebih dahulu menjelaskan perbedaan antara gateway dan model tanpa sensor khusus, lalu memberikan tabel pembandingan parameter, cara menjalankan antarmuka lama dan baru secara paralel menggunakan variabel lingkungan, checklist switching pra-peluncuran, serta beberapa jebakan paling umum saat migrasi.
Diperbarui pada
Poin Utama
- Penjualan ulang gateway tetap menggunakan model pabrikan dengan strategi konten yang sama; hanya model tanpa sensor khusus yang dapat menyelesaikan masalah penolakan
- Migrasi hanya mengubah tiga hal: base_url menjadi https://api.wuxianzhiapi.com/v1,密钥,模型名 uncensored
- Tidak mendukung embeddings, gambar, audio, dan fine-tuning; kemampuan ini tetap menggunakan layanan asli.
- Gunakan variabel lingkungan untuk switching bertahap, jika terjadi masalah cukup ubah satu variabel untuk kembali
Apa Perbedaan Antara Gateway API dan Model Tanpa Sensor Khusus
Mari kita perjelas konsepnya terlebih dahulu agar Anda tidak salah arah saat migrasi. Gateway API umum pada dasarnya menjual kembali atau mengagregasi kuota panggilan model dari perusahaan besar, menyediakan alamat kompatibel OpenAI di sisi luar agar Anda dapat beralih model menggunakan SDK yang sama. Ini menyelesaikan masalah "akses dan pembayaran", seperti pintu masuk terpadu dan tagihan terpadu, tetapi model itu sendiri tetap sama; strategi konten pabrikan tidak berubah: topik yang seharusnya ditolak tetap ditolak, mengubah alamat gateway tidak mengubah hal ini.
Model tanpa sensor khusus adalah hal lain. Ini bukan meneruskan model orang lain, melainkan model yang disediakan secara terpisah, di mana konten dewasa yang sah, karya fiksi, dan topik kontroversial tidak akan ditolak. Wu Xianzhi API hanya menyediakan satu model, nama modelnya adalah uncensored, antarmukanya kompatibel dengan format OpenAI sehingga biaya migrasi rendah, tetapi memiliki batas yang jelas: hanya menangani teks, tidak mendukung gambar, audio, vektor, dan fine-tuning; konten seksual melibatkan anak di bawah umur akan diblokir dan mengembalikan 403, apakah fiksi atau tidak.
Sebelum migrasi, tanyakan pada diri Anda: apakah masalah Anda adalah "endpoint tidak stabil, harga mahal", atau "model selalu menolak permintaan sah Anda"? Jika yang kedua, mengganti agregator tidak banyak artinya; beralih ke API tanpa sensor khusus lebih tepat. Banyak tim menjalankan keduanya: tugas umum tetap melalui endpoint asli, permintaan yang memerlukan output tanpa sensor dialihkan secara terpisah ke sini, cara kerjanya akan dibahas nanti.
Migrasi dari OpenAI atau OpenRouter, Tiga Hal yang Perlu Diubah
Apapun endpoint agregasi yang Anda gunakan sebelumnya seperti OpenAI resmi, OpenRouter, atau server proxy, selama kode menggunakan SDK yang kompatibel dengan OpenAI, yang perlu diubah hanya tiga hal: base_url diubah menjadi https://api.wuxianzhiapi.com/v1; api_key diganti dengan kunci yang diperoleh dari /get-api-key/; model ditulis seragam sebagai uncensored. Tidak ada model lain yang tersedia, dan hanya model ini yang ada di GET /v1/models.
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 sama: ganti new OpenAI({...}) dengan baseURL dan apiKey baru. Jika pakai HTTP langsung, ubah URL ke https://api.wuxianzhiapi.com/v1/chat/completions dan header Authorization: Bearer <kunci>. Lihat contoh kode untuk Python, Node.js, 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}'
Pembandingan Parameter: Mana yang Bisa Digunakan dan Mana yang Tidak Berlaku
Tabel di bawah ini meninjau bidang yang paling sering dihadapi saat migrasi. Prinsipnya: bidang inti terkait percakapan dan format OpenAI dapat digunakan seperti biasa; fitur terkait "model lain, modalitas lain" tidak ada di sini.
| Penggunaan Asli | Cara Mengolahnya di Sini |
|---|---|
model (seperti berbagai model gpt) | Harus diubah menjadi uncensored |
messages (system / user / assistant / tool) | Format konsisten, gunakan langsung |
max_tokens | Default 2048, maksimum 32.000; melebihi akan mengembalikan 400 |
stream: true | Didukung, blok penggunaan ditambahkan secara otomatis di akhir |
tools / tool_choice | Didukung, format OpenAI |
| Panjang konteks | Jumlah gabungan prompt dan output 100.000 token |
| Ukuran badan permintaan | Tidak melebihi 8 MB |
| Laju | 300 permintaan per menit per kunci API |
| Vektor embeddings | Tidak didukung |
| Pembuatan gambar / pengenalan gambar, suara, video | Tidak didukung, hanya menangani teks |
| Fine-tuning | Tidak didukung |
| Beralih antar beberapa model | Hanya ada satu model, tidak ada daftar yang dapat dipilih |
Jangan mengasumsikan bahwa semua bidang opsional yang tidak tercantum dalam tabel akan berfungsi sesuai cara aslinya. Cara yang lebih aman adalah menjalankan pengujian di lingkungan pengembangan secara terpisah untuk memastikan perilakunya sesuai harapan sebelum diluncurkan. Dukungan spesifik mengacu pada dokumentasi API.
Bagaimana jika kemampuan vektor, gambar, dan suara tidak tersedia?
Jika proyek Anda sebelumnya menggunakan gabungan antara percakapan dan pencarian vektor, jangan mencoba memindahkan semuanya sekaligus. Karena kami hanya menyediakan percakapan teks, kode terkait embeddings seperti pencarian basis pengetahuan atau deduplikasi semantik harus tetap menggunakan layanan vektor lama Anda atau beralih ke solusi vektor yang Anda deploy sendiri. Pindahkan bagian percakapan ke sini, sedangkan bagian pencarian tetap di tempatnya agar keduanya tidak saling mengganggu. Ini adalah cara pemisahan yang paling efisien.
Hal yang sama berlaku untuk gambar dan suara. Misalnya, jika produk Anda berbentuk "teks dengan gambar", generasi teks dapat menggunakan layanan ini, sedangkan gambar tetap menggunakan antarmuka gambar lama Anda. Jika memerlukan pembacaan suara, kirimkan teks yang dihasilkan ke layanan suara yang sudah Anda miliki. Dengan memisahkan langkah "generasi teks" menjadi fungsi tersendiri, dampak perubahan akan sangat kecil saat Anda menggabungkan kemampuan lainnya di masa depan.
Ada situasi lain di mana kode Anda menggunakan beberapa model untuk tugas berbeda, seperti model murah untuk klasifikasi dan model mahal untuk pembuatan konten. Di sini hanya ada satu model, sehingga tugas klasifikasi juga harus dilakukan olehnya. Untungnya, harga per input adalah $0,25 per 1 juta token, sehingga biaya untuk tugas dengan output pendek seperti klasifikasi sangat rendah. Dengan mengatur max_tokens menjadi kecil, biaya hampir dapat diabaikan. Lihat halaman harga untuk detail.
Jalankan secara paralel: beralih antara dua antarmuka menggunakan variabel lingkungan
Hal yang paling ditakuti saat migrasi adalah perubahan seragam. Cara yang lebih stabil adalah membuat lapisan pembungkus tipis di dalam kode, menggunakan variabel lingkungan untuk menentukan antarmuka mana yang digunakan. Dengan cara ini, Anda dapat mengarahkan sebagian kecil lalu lintas atau fungsi tertentu ke antarmuka baru terlebih dahulu. Jika terjadi masalah, Anda cukup mengubah satu variabel untuk kembali ke konfigurasi lama. Karena kedua antarmuka menggunakan format yang kompatibel dengan OpenAI, pembungkusnya sangat mudah dibuat.
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)Granularitas pengalihan dapat dilakukan dalam tiga tingkat: berdasarkan lingkungan (mulai dari lingkungan pengujian), berdasarkan fungsi (hanya memindahkan antarmuka pembuatan konten), atau berdasarkan pengguna (mengalihkan sebagian kecil akun). Pada tingkat mana pun, disarankan untuk tetap menyertakan bidang provider dalam log agar Anda dapat melakukan perbandingan saat terjadi perbedaan. Disarankan juga untuk menyimpan riwayat percakapan sebagai array messages standar, sehingga percakapan yang sama dapat dilanjutkan secara mulus di antara kedua antarmuka.
Daftar migrasi
Lakukan pemeriksaan berurutan sesuai panduan berikut sebelum peluncuran untuk memastikan tidak ada langkah yang terlewat:
- Daftar di /get-api-key/, dapatkan kunci Anda, dan verifikasi menggunakan saldo uji coba senilai $0,50 (berlaku selama 7 hari) tanpa perlu melakukan pengisian saldo terlebih dahulu.
- Gunakan
curl /v1/modelsuntuk memverifikasi bahwa kunci valid dan jaringan dapat diakses. - Ubah bidang
base_url,api_key, danmodelagar didorong oleh variabel lingkungan, sehingga kunci tidak masuk ke repositori kode. - Lakukan pencarian global pada kode untuk nama model yang ditulis secara statis, nilai
max_tokens, dan panggilan embeddings. - Periksa kode pemrosesan streaming untuk memastikan kompatibilitas dengan blok penggunaan terakhir yang memiliki
choiceskosong. - Tambahkan mekanisme retry dengan backoff eksponensial untuk kode status 429 dan 503, serta tambahkan cabang penanganan pesan error yang jelas untuk kode 402 dan 403.
- Jalankan serangkaian sampel regresi menggunakan prompt asli Anda, dengan fokus khusus pada bagian yang sebelumnya ditolak agar memastikan outputnya normal.
- Mulailah dengan mengalihkan sebagian kecil lalu lintas, bandingkan penggunaan dan latensi, lalu tingkatkan jika semuanya berjalan lancar.
- Pastikan produk Anda ditujukan untuk pengguna dewasa dan penggunaannya legal, karena ini adalah prasyarat penggunaan antarmuka ini.
Beberapa jebakan umum saat migrasi
Lupa mengubah nama model. Jika jalur model lama dari kode lama atau model dari platform agregasi dikirim apa adanya, respons error akan muncul. Lakukan pencarian global pada nama model dan pastikan model yang dikirimkan adalah uncensored.
Pelanggaran batas max_tokens. Beberapa proyek mengatur max_tokens hingga 32.000 atau lebih agar model menghasilkan teks yang lebih panjang. Di sini, batas maksimum per permintaan adalah 32.000; jika melebihi batas, server akan mengembalikan error 400. Selain itu, jumlah token untuk prompt ditambah max_tokens tidak boleh melebihi 100.000 token. Untuk permintaan dengan input yang panjang, Anda perlu menurunkan batas output.
Blok penggunaan pada streaming. Server akan secara otomatis menambahkan blok yang berisi usage di akhir stream, dengan choices berupa array kosong. Jika kode parsing Anda langsung mengambil nilai melalui chunk.choices[0], error akan terjadi pada langkah terakhir. Beberapa kode lama juga secara manual mengirimkan stream_options untuk meminta data penggunaan, namun hal ini tidak diperlukan di sini.
Menganggap "tanpa sensor" berarti "tanpa batas". Konten dewasa yang legal, fiksi, dan topik kontroversial tidak akan ditolak, namun konten seksual yang melibatkan anak di bawah umur akan selalu diblokir, termasuk dalam konteks fiksi dan roleplay, dengan mengembalikan error 403 content_blocked. Produk Anda harus memastikan validasi usia pengguna dewasa.
Saldo habis dan masa berlaku kredit uji coba. Kredit uji coba akan kedaluwarsa setelah 7 hari. Setelah saldo habis, Anda akan menerima error 402 dengan kode error no_credit. Terjemahkan error ini menjadi pesan yang mudah dipahami pengguna di dalam aplikasi Anda, bukan sekadar pesan "error layanan". Anda dapat merujuk pada artikel skenario penggunaan untuk desain skenario yang lebih spesifik.
Pertanyaan Umum
Apakah prompt lama perlu ditulis ulang setelah migrasi?
Format tidak perlu diubah karena struktur messages tetap sama persis. Namun, Anda dapat menghapus "jebakan" yang sebelumnya ditulis untuk mengelabui sistem penolakan. Cukup tuliskan peran dan tugas secara jelas agar penggunaan token lebih efisien dan hasilnya lebih stabil.
Apakah saya bisa mempertahankan antarmuka lama dan baru secara bersamaan selama migrasi?
Ya, dan hal ini sangat disarankan. Gunakan variabel lingkungan untuk menentukan base_url, kunci, dan nama model. Arahkan sebagian fungsi atau sebagian pengguna ke antarmuka baru terlebih dahulu. Jika terjadi masalah, Anda cukup mengubah satu variabel untuk kembali ke konfigurasi lama.
Apa yang terjadi jika panggilan embeddings dari antarmuka lama dipindahkan ke sini?
Kami tidak memiliki antarmuka embeddings, sehingga permintaan akan mengembalikan error 404. Untuk bagian pencarian vektor, silakan terus gunakan layanan lama Anda dan hanya alihkan permintaan percakapan ke sini.
Bagaimana cara mengetahui apakah hasil migrasi lebih baik?
Gunakan serangkaian prompt asli yang sebelumnya ditolak atau diubah sebagai sampel regresi. Catat tingkat penolakan, panjang respons, dan jumlah token pada usage. Sampel harus berasal dari bisnis Anda sendiri, bukan dari kumpulan pengujian umum di internet.
Isi formulir untuk mendapatkan kunci API
Buat akun, salin kunci, dan ubah Base URL. Konfigurasinya sangat sederhana.
Dapatkan Kunci API