Wu Xianzhi APIHướng dẫn di chuyển
Hướng dẫn di chuyển từ API trung gian: chuyển từ OpenAI, OpenRouter sang API không kiểm duyệt
Nếu dự án của bạn hiện đang dùng OpenAI, OpenRouter hoặc một API trung gian nào đó và muốn chuyển sang một API không kiểm duyệt không từ chối các yêu cầu hợp lệ, bạn chỉ cần thay đổi ba cấu hình: base_url, khóa API và tên mô hình. Bài viết này trước tiên làm rõ sự khác biệt giữa API trung gian và mô hình không kiểm duyệt chuyên dụng, sau đó đưa ra bảng đối chiếu tham số, cách viết chạy song song API cũ và mới bằng biến môi trường, danh sách kiểm tra trước khi ra mắt, cùng những lỗi thường gặp nhất khi di chuyển.
Cập nhật lúc
Điểm chính
- API trung gian vẫn bán lại mô hình của nhà cung cấp, chiến lược nội dung không thay đổi; chỉ mô hình không kiểm duyệt chuyên dụng mới giải quyết được vấn đề từ chối
- Di chuyển chỉ cần sửa 3 chỗ: base_url thành https://api.wuxianzhiapi.com/v1,密钥,模型名 uncensored
- Không hỗ trợ embeddings, hình ảnh, âm thanh và fine-tuning; các khả năng này hãy tiếp tục sử dụng dịch vụ cũ
- Sử dụng biến môi trường để chuyển đổi từng phần, nếu có sự cố chỉ cần thay đổi một biến là có thể hoàn tác
API trung gian và mô hình không kiểm duyệt chuyên dụng khác nhau như thế nào
Trước tiên hãy làm rõ khái niệm, nếu không bạn dễ chọn sai hướng khi di chuyển. Các API trung gian phổ biến về bản chất là bán lại hoặc tổng hợp hạn mức gọi các mô hình từ các công ty lớn, cung cấp một địa chỉ tương thích OpenAI để bạn có thể chuyển đổi giữa các mô hình khác nhau bằng cùng một SDK. Nó giải quyết vấn đề về "truy cập và thanh toán", chẳng hạn như điểm truy cập thống nhất và hóa đơn thống nhất, nhưng bản thân mô hình vẫn là mô hình gốc, chiến lược nội dung của nhà cung cấp không thay đổi: các chủ đề bị từ chối vẫn sẽ bị từ chối, việc thay đổi địa chỉ API trung gian không làm thay đổi điều này.
Mô hình không kiểm duyệt chuyên dụng là một chuyện khác. Nó không phải là chuyển tiếp mô hình của người khác, mà là một mô hình được cung cấp riêng biệt, nội dung người lớn hợp pháp, sáng tạo hư cấu và các chủ đề gây tranh cãi sẽ không bị từ chối. Wu Xianzhi API chỉ cung cấp một mô hình, tên mô hình là uncensored, giao diện tương thích định dạng OpenAI nên chi phí chuyển đổi rất thấp, nhưng nó cũng có ranh giới rõ ràng: chỉ xử lý văn bản, không hỗ trợ hình ảnh, âm thanh, vector và fine-tuning; nội dung liên quan đến tình dục với trẻ vị thành niên dù có hư cấu hay không cũng sẽ bị chặn, trả về 403.
Vì vậy, trước khi di chuyển, hãy tự hỏi: vấn đề bạn gặp phải là "giao diện không ổn định, giá cao" hay "mô hình luôn từ chối các yêu cầu hợp pháp của tôi"? Nếu là trường hợp thứ hai, việc chuyển sang API trung gian không có ý nghĩa lớn, chuyển sang API không kiểm duyệt chuyên dụng mới là giải pháp đúng đắn. Nhiều nhóm áp dụng cách kết hợp cả hai: các tác vụ chung tiếp tục sử dụng giao diện cũ, các yêu cầu cần đầu ra không kiểm duyệt được định tuyến riêng đến đây, phần sau sẽ hướng dẫn cách làm cụ thể.
Di chuyển từ OpenAI hoặc OpenRouter, cần sửa ba chỗ nào
Dù bạn đang dùng chính thức OpenAI, API tổng hợp như OpenRouter hay một API trung gian nào, chỉ cần mã nguồn dùng SDK tương thích OpenAI, bạn chỉ cần thay đổi ba thứ: base_url thành https://api.wuxianzhiapi.com/v1; api_key đổi thành khóa bạn lấy được tại /get-api-key/; model viết thống nhất là uncensored. Không có mô hình nào khác để chọn, trong GET /v1/models cũng chỉ có mô hình duy nhất này.
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 tương tự, đổi new OpenAI({...}) chứa baseURL và apiKey. Nếu dùng HTTP trực tiếp, đổi địa chỉ thành https://api.wuxianzhiapi.com/v1/chat/completions, giữ nguyên Authorization: Bearer <key>. Xem mã ví dụ cho 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}'
Đối chiếu tham số: những gì dùng được, những gì không áp dụng
Bảng dưới đây đã xem xét qua các trường thường gặp nhất khi di chuyển. Nguyên tắc là: các trường cốt lõi liên quan đến hội thoại và định dạng OpenAI đều có thể sử dụng bình thường; các chức năng liên quan đến "các mô hình khác, các phương thức khác" thì không có tại đây.
| Cách sử dụng trước đây | Xử lý như thế nào tại đây |
|---|---|
model (ví dụ các biến thể gpt) | Phải đổi thành uncensored |
messages (system / user / assistant / tool) | Định dạng giống nhau, sử dụng trực tiếp |
max_tokens | Mặc định 2048, tối đa 32,000; vượt quá sẽ báo lỗi 400 |
stream: true | Hỗ trợ, cuối cùng tự động thêm một khối sử dụng |
tools / tool_choice | Hỗ trợ, định dạng OpenAI |
| Độ dài ngữ cảnh | Prompt cộng đầu ra tối đa 100,000 tokens |
| Kích thước thân yêu cầu | Không vượt quá 8 MB |
| Tốc độ | Mỗi khóa API được 300 yêu cầu mỗi phút |
| Vector embeddings | Không hỗ trợ |
| Tạo hình ảnh / nhận diện hình ảnh, giọng nói, video | Không hỗ trợ, chỉ xử lý văn bản |
| Fine-tuning | Không hỗ trợ |
| Chuyển đổi giữa nhiều mô hình | Chỉ có một mô hình, không có danh sách để chuyển đổi |
Đối với các trường tùy chọn khác không có trong bảng, bạn không nên mặc định rằng chúng sẽ hoạt động theo cách của nhà sản xuất gốc. Cách an toàn nhất là chạy thử riêng một lượt trong môi trường kiểm thử, xác nhận hành vi phù hợp với kỳ vọng trước khi ra mắt; tình trạng hỗ trợ cụ thể hãy xem tài liệu API.
Phải làm sao khi thiếu khả năng: giải pháp thay thế cho vector, hình ảnh và giọng nói
Nếu dự án cũ của bạn đồng thời sử dụng hội thoại và tìm kiếm vector, khi di chuyển đừng nghĩ đến việc «chuyển hết sang đây». Vì nơi đây chỉ cung cấp hội thoại văn bản, nên các đoạn mã liên quan đến embeddings như tìm kiếm cơ sở tri thức hay loại bỏ trùng lặp ngữ nghĩa cần tiếp tục sử dụng dịch vụ vector cũ của bạn, hoặc chuyển sang giải pháp vector do bạn tự triển khai. Chỉ chuyển phần hội thoại sang đây, giữ nguyên phần tìm kiếm; hai bên không ảnh hưởng lẫn nhau, đây là cách tách đơn giản nhất.
Tương tự với hình ảnh và giọng nói. Ví dụ nếu sản phẩm của bạn là dạng «văn bản kèm hình ảnh», phần sinh văn bản có thể dùng endpoint này, còn phần hình ảnh tiếp tục dùng API hình ảnh cũ; nếu cần đọc văn bản bằng giọng nói, hãy chuyển phần văn bản đã sinh sang dịch vụ giọng nói có sẵn của bạn. Hãy tách riêng bước «sinh văn bản» thành một hàm riêng, sau này dù có ghép nối thêm khả năng nào khác thì phạm vi thay đổi cũng sẽ rất nhỏ.
Một trường hợp khác là mã nguồn của bạn dùng nhiều mô hình để phân công nhiệm vụ, ví dụ mô hình giá rẻ để phân loại, mô hình đắt tiền để sáng tạo. Ở đây chỉ có một mô hình, nên nhiệm vụ phân loại cũng do nó đảm nhận. May mắn là giá đầu vào là $0.25 / triệu token, chi phí cho các nhiệm vụ có đầu ra ngắn như phân loại rất thấp, bạn có thể đặt max_tokens nhỏ lại để chi phí gần như không đáng kể. Xem chi tiết giá tại trang giá.
Chạy song song: chuyển đổi giữa hai endpoint bằng biến môi trường
Điều đáng sợ nhất khi di chuyển là «cắt toàn bộ». Cách ổn định hơn là bạn hãy tạo một lớp bao mỏng trong mã nguồn, dùng biến môi trường để quyết định endpoint nào sẽ được gọi. Như vậy bạn có thể cho một phần nhỏ lưu lượng hoặc một số tính năng nhất định chạy trên endpoint mới trước; nếu có sự cố, chỉ cần thay đổi một biến là có thể quay lại. Vì cả hai đều dùng định dạng tương thích OpenAI, việc bao bọc rất đơn giản.
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)Bạn có thể chuyển đổi ở ba mức độ: theo môi trường (chuyển môi trường kiểm thử trước), theo tính năng (chỉ chuyển các endpoint sáng tạo), theo người dùng (chuyển đổi cho một nhóm nhỏ tài khoản). Dù ở mức độ nào, bạn cũng nên giữ lại trường provider trong log để dễ dàng đối chiếu và khắc phục sự cố khi có chênh lệch. Bạn cũng nên lưu trữ lịch sử hội thoại dưới dạng mảng messages chuẩn, như vậy cùng một đoạn hội thoại có thể tiếp tục được duy trì liền mạch giữa hai bên.
Danh sách kiểm tra chuyển đổi
Hãy rà soát theo thứ tự dưới đây trước khi đưa lên sản xuất, cơ bản sẽ không bỏ sót mục nào:
- Đăng ký tại /get-api-key/, lấy khóa và dùng thử với $0.50 (hết hạn sau 7 ngày) để kiểm tra mà không cần nạp tiền trước.
- Dùng
curl /v1/modelsđể xác nhận khóa hợp lệ và mạng hoạt động. - Chuyển ba mục
base_url,api_keyvàmodelsang dạng điều khiển bằng biến môi trường, để khóa không nằm trong kho lưu trữ mã nguồn. - Tìm kiếm trong mã nguồn các tên mô hình được cứng hóa, giá trị
max_tokensvà các lệnh gọi embeddings. - Kiểm tra mã xử lý streaming, đảm bảo tương thích với khối lượng cuối cùng có
choiceslà mảng rỗng. - Thêm cơ chế thử lại với độ trễ tăng dần theo cấp số nhân cho 429 và 503; thêm nhánh hiển thị thông báo rõ ràng cho 402 và 403.
- Chạy một loạt mẫu hồi quy bằng prompt thực tế của bạn, tập trung kiểm tra xem các trường hợp trước đây bị từ chối có xuất ra bình thường hay không.
- Đầu tiên hãy thử nghiệm với tỷ lệ lưu lượng nhỏ, so sánh mức tiêu thụ và độ trễ; khi ổn định mới mở rộng.
- Xác nhận sản phẩm của bạn hướng đến người dùng trưởng thành và mục đích sử dụng hợp pháp, đây là điều kiện tiên quyết để sử dụng endpoint này.
Một số lỗi phổ biến nhất khi di chuyển
Quên đổi tên mô hình. Nếu gửi nguyên đường dẫn mô hình từ nền tảng tổng hợp hoặc các model gpt cũ từ mã nguồn cũ, bạn sẽ nhận được phản hồi lỗi. Hãy tìm kiếm toàn bộ tên mô hình và đảm bảo yêu cầu cuối cùng gửi đi là uncensored.
Vượt quá max_tokens. Một số dự án đặt max_tokens lên 32.000 để mô hình viết dài. Tại đây, giới hạn tối đa cho một lần gọi là 32.000, vượt quá sẽ trả về 400. Tổng prompt cộng max_tokens không được vượt quá 100.000 tokens.
Khối lượng dùng khi streaming. Trước khi stream kết thúc, server sẽ thêm một khối chứa usage với choices là mảng rỗng. Nếu mã phân tích của bạn gọi chunk.choices[0], nó sẽ báo lỗi ở bước cuối. Không cần truyền stream_options thủ công.
Coi "không kiểm duyệt" là "không giới hạn". Nội dung người lớn hợp pháp, hư cấu và các chủ đề gây tranh cãi sẽ không bị từ chối, nhưng nội dung tình dục liên quan đến trẻ vị thành niên luôn bị chặn, bao gồm cả hư cấu và nhập vai, trả về 403 content_blocked. Sản phẩm cần tự mình kiểm soát việc xác minh độ tuổi người dùng.
Số dư và thời hạn dùng thử. Tín dụng dùng thử hết hạn sau 7 ngày, khi số dư cạn bạn sẽ nhận 402, mã lỗi là no_credit. Trong ứng dụng, bạn hãy chuyển đổi lỗi này thành thông báo dễ hiểu cho người dùng thay vì thông báo chung chung "lỗi dịch vụ". Bạn có thể tham khảo thiết kế các kịch bản cụ thể tại ứng dụng thực tế.
Câu hỏi thường gặp
Sau khi di chuyển, có cần viết lại các prompt cũ không?
Không cần thay đổi định dạng, cấu trúc messages hoàn toàn giống nhau. Tuy nhiên, bạn có thể xóa các phần «lách luật» trước đây được viết ra để vượt qua bộ lọc từ chối; hãy viết rõ vai trò và nhiệm vụ, vừa tiết kiệm token vừa ổn định hơn.
Trong quá trình di chuyển, có thể giữ đồng thời cả endpoint cũ và mới không?
Có, và chúng tôi khuyến nghị làm như vậy. Bạn hãy dùng biến môi trường để quyết định base_url, khóa và tên mô hình; trước tiên hãy cho một phần tính năng hoặc một nhóm người dùng nhất định chạy trên endpoint mới, nếu có sự cố chỉ cần thay đổi một biến là có thể quay lại.
Nếu chuyển đổi các lệnh gọi embeddings từ endpoint cũ sang thì sao?
Endpoint này không có hỗ trợ embeddings, yêu cầu sẽ trả về 404. Phần tìm kiếm vector vui lòng tiếp tục sử dụng dịch vụ cũ, chỉ chuyển các yêu cầu hội thoại sang đây.
Làm sao để biết hiệu quả sau khi di chuyển có tốt hơn không?
Hãy lấy một tập hợp các prompt thực tế trước đây bị từ chối hoặc bị sửa đổi để so sánh hồi quy, ghi lại tỷ lệ từ chối, độ dài phản hồi và số token trong usage. Các mẫu này phải đến từ chính nghiệp vụ của bạn, không phải từ bộ kiểm tra chung trên mạng.
Chỉ cần điền biểu mẫu để lấy khóa
Tạo tài khoản, sao chép khóa API, sửa đổi Base URL. Cấu hình rất đơn giản.
Lấy khóa API