TH ▾
รับคีย์ API

Wu Xianzhi APIคู่มือการย้าย

คู่มือการย้าย API Gateway: เปลี่ยนจาก OpenAI, OpenRouter มาเป็น API แบบไม่เซ็นเซอร์

หากโปรเจกต์ของคุณใช้ OpenAI, OpenRouter หรือ API Gateway อื่นๆ และต้องการเปลี่ยนไปใช้ API แบบไม่เซ็นเซอร์ที่ไม่ปฏิเสธคำขอที่ถูกต้อง คุณเพียงแค่ต้องแก้ไขการตั้งค่าสามรายการ: base_url, คีย์ API และชื่อโมเดล บทความนี้จะอธิบายความแตกต่างระหว่าง API Gateway และโมเดลเฉพาะที่ไม่เซ็นเซอร์ พร้อมให้ตารางเปรียบเทียบพารามิเตอร์ โค้ดการรันอินเทอร์เฟซเก่าและใหม่แบบขนานผ่านตัวแปรสภาพแวดล้อม รายการตรวจสอบก่อนปล่อย และข้อผิดพลาดที่พบบ่อยที่สุดระหว่างการย้าย

อัปเดตล่าสุด

ประเด็นสำคัญ

  1. API Gateway ขายต่อโมเดลของผู้ผลิตซึ่งมีนโยบายเนื้อหาเดิม; โมเดลเฉพาะที่ไม่เซ็นเซอร์เท่านั้นที่แก้ปัญหาการปฏิเสธได้
  2. การย้ายเปลี่ยนเพียง 3 จุด: base_url เป็น https://api.wuxianzhiapi.com/v1,密钥,模型名 uncensored
  3. ไม่รองรับ embeddings รูปภาพ เสียง และการ fine-tune ให้ใช้บริการเดิม
  4. ใช้ตัวแปรสภาพแวดล้อมสำหรับการเปลี่ยนแบบค่อยเป็นค่อยไป หากมีปัญหา การเปลี่ยนตัวแปรเดียวก็เพียงพอที่จะย้อนกลับได้

API Gateway และโมเดลเฉพาะที่ไม่เซ็นเซอร์แตกต่างกันอย่างไร

ต้องอธิบายแนวคิดให้ชัดเจน มิฉะนั้นอาจเลือกทิศทางผิดระหว่างการย้าย API Gateway ทั่วไปโดยพื้นฐานแล้วคือการขายต่อหรือรวมโควตาการเรียกใช้โมเดลจากบริษัทใหญ่ โดยให้ที่อยู่เข้ากันได้กับ OpenAI เพื่อให้คุณใช้ SDK เดียวกันเพื่อสลับโมเดลต่างๆ ได้ มันแก้ปัญหาเรื่อง "การเข้าถึงและการชำระเงิน" เช่น จุดเข้าใช้งานรวม บิลรวม แต่โมเดลยังคงเป็นโมเดลเดิมซึ่งมีนโยบายเนื้อหาจากผู้ผลิตครบถ้วน: หัวข้อที่ควรปฏิเสธก็ยังคงปฏิเสธ การเปลี่ยนที่อยู่ API Gateway ไม่ได้เปลี่ยนจุดนี้

โมเดลเฉพาะที่ไม่เซ็นเซอร์เป็นอีกเรื่องหนึ่ง มันไม่ใช่การส่งต่อโมเดลของคนอื่น แต่เป็นโมเดลที่ให้บริการแยกต่างหาก เนื้อหาสำหรับผู้ใหญ่ที่ถูกต้องตามกฎหมาย งานสร้างสรรค์เชิงสมมติ และหัวข้อที่มีข้อโต้แย้งจะไม่ถูกปฏิเสธ Wu Xianzhi API ให้บริการโมเดลเพียงโมเดลเดียว ชื่อโมเดลคือ uncensored อินเทอร์เฟซเข้ากันได้กับรูปแบบ OpenAI ดังนั้นต้นทุนการย้ายจึงต่ำ แต่ก็มีขอบเขตที่ชัดเจน: จัดการเฉพาะข้อความ ไม่รองรับรูปภาพ เสียง เวกเตอร์ และการปรับแต่ง; เนื้อหาทางเพศที่เกี่ยวข้องกับเด็กไม่ว่าจะเป็นเชิงสมมติหรือไม่จะถูกบล็อกและตอบกลับเป็น 403

ดังนั้นก่อนย้ายให้ถามตัวเอง: ปัญหาของคุณคือ "อินเทอร์เฟซไม่เสถียร ราคาแพง" หรือ "โมเดลปฏิเสธคำขอที่ถูกต้องของฉันเสมอ"? หากเป็นกรณีหลัง การเปลี่ยน API Gateway ไม่ได้ช่วยมาก การเปลี่ยนไปใช้ API แบบไม่เซ็นเซอร์เฉพาะทางจึงตรงจุด วิธีที่ทีมจำนวนมากใช้คือการมีทั้งสองแบบไว้: งานทั่วไปยังคงใช้อินเทอร์เฟซเดิม คำขอที่ต้องการผลลัพธ์แบบไม่เซ็นเซอร์จะถูกกำหนดเส้นทางมาที่นี่โดยเฉพาะ ซึ่งเราจะอธิบายวิธีทำในบทถัดไป

การย้ายจาก OpenAI หรือ OpenRouter ต้องแก้ไข 3 จุด

ไม่ว่าจะใช้ OpenAI, OpenRouter หรือ API Gateway ตราบใดที่ใช้ SDK ที่เข้ากันได้กับ OpenAI สิ่งที่ต้องแก้มีสามอย่าง: base_url เปลี่ยนเป็น https://api.wuxianzhiapi.com/v1; api_key เปลี่ยนเป็นคีย์จาก /get-api-key/; model เขียนเป็น uncensored ไม่มีโมเดลอื่นให้เลือก ใน 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 ก็เช่นกัน ให้เปลี่ยน new OpenAI({...}) ใน baseURL และ apiKey หากโปรเจกต์ของคุณส่งคำขอ HTTP โดยตรง ให้เปลี่ยนที่อยู่คำขอเป็น https://api.wuxianzhiapi.com/v1/chat/completions และคงส่วนหัวคำขอเป็น Authorization: Bearer <คีย์> ไว้ การเขียนโค้ด 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}'

ตารางเปรียบเทียบพารามิเตอร์: อะไรใช้ได้ อะไรใช้ไม่ได้

ตารางด้านล่างครอบคลุมฟิลด์ที่พบบ่อยที่สุดระหว่างการย้าย หลักการคือ: ฟิลด์หลักที่เกี่ยวข้องกับการสนทนาและรูปแบบ OpenAI สามารถใช้ได้ตามปกติ; ฟีเจอร์ที่เกี่ยวข้องกับ "โมเดลอื่นหรือมอดาลิตี้อื่น" ไม่มีที่นี่

การใช้งานเดิมการจัดการที่นี่
model (เช่น gpt รุ่นต่างๆ)ต้องเปลี่ยนเป็น uncensored
messages (system / user / assistant / tool)รูปแบบสอดคล้องกัน ใช้ได้โดยตรง
max_tokensค่าเริ่มต้น 2048 สูงสุด 32,000; เกินจะส่งกลับ 400
stream: trueรองรับ เพิ่มบล็อกการใช้งานอัตโนมัติที่ท้ายสุด
tools / tool_choiceรองรับ รูปแบบ OpenAI
ความยาวบริบทพรอมต์รวมกับการตอบกลับ 100,000 โทเคน
ขนาด body ของคำขอไม่เกิน 8 MB
อัตรา300 คำขอต่อนาทีต่อคีย์
เวกเตอร์ embeddingsไม่รองรับ
การสร้างรูปภาพ / การรู้จำรูปภาพ เสียง วิดีโอไม่รองรับ จัดการเฉพาะข้อความ
การปรับแต่ง fine-tuningไม่รองรับ
สลับโมเดลหลายตัวมีเพียงโมเดลเดียว ไม่มีรายการให้สลับ

ฟิลด์ทางเลือกอื่น ๆ ที่ไม่ปรากฏในตาราง อย่าสันนิษฐานว่าทำงานตามต้นฉบับ ให้ทดสอบแยกในสภาพแวดล้อมทดสอบก่อน เพื่อยืนยันว่าพฤติกรรมตรงตามความคาดหวังแล้วค่อยนำขึ้นระบบจริง โดยดูรายละเอียดการรองรับจาก เอกสาร API

ทำอย่างไรเมื่อขาดความสามารถ: ทางเลือกสำหรับเวกเตอร์ รูปภาพ และเสียง

หากโปรเจกต์เดิมของคุณใช้ทั้งการสนทนาและการค้นหาแบบเวกเตอร์ไปพร้อมกัน อย่าพยายามเปลี่ยนทุกอย่างในขั้นตอนการย้ายที่ เราให้บริการเฉพาะการสนทนาข้อความ ดังนั้นโค้ดที่เกี่ยวข้องกับ embeddings เช่น การค้นหาฐานความรู้หรือการลดความซ้ำซ้อนเชิงความหมาย ยังคงต้องใช้บริการเวกเตอร์เดิมของคุณ หรือเปลี่ยนไปใช้โซลูชันเวกเตอร์ที่ติดตั้งเอง การเปลี่ยนเฉพาะส่วนการสนทนามาที่นี่ ในขณะที่ส่วนการค้นหาคงเดิม เป็นวิธีการแยกที่ง่ายที่สุดโดยที่ทั้งสองส่วนไม่ส่งผลกระทบต่อกัน

หลักการเดียวกันนี้ใช้กับรูปภาพและเสียง หากผลิตภัณฑ์ของคุณเป็นรูปแบบ「ข้อความพร้อมภาพ」การสร้างข้อความสามารถผ่านที่นี่ได้ ส่วนภาพยังคงใช้ API รูปภาพเดิม หากต้องการการอ่านข้อความด้วยเสียง ให้ส่งข้อความที่สร้างเสร็จแล้วไปยังบริการเสียงที่มีอยู่ การแยกขั้นตอน「การสร้างข้อความ」ออกเป็นฟังก์ชันเฉพาะจะทำให้การปรับใช้ความสามารถอื่น ๆ ในภายหลังมีการเปลี่ยนแปลงน้อยที่สุด

อีกกรณีคือโค้ดของคุณใช้หลายโมเดล เช่น โมเดลราคาถูกสำหรับจัดประเภท และโมเดลแพงสำหรับสร้างเนื้อหา ที่นี่มีโมเดลเดียว จึงต้องให้โมเดลนี้ทำทั้งการจัดประเภท ด้วยราคาต่อโทเคน $0.25 / 1 ล้านโทเคน งานที่ผลลัพธ์สั้นอย่างการจัดประเภทจึงมีต้นทุนต่ำมาก โดยตั้งค่า max_tokens ให้ต่ำ ต้นทุนจะแทบเป็นศูนย์ รายละเอียดราคาดูที่ หน้าราคา

รันแบบขนาน: สลับระหว่างสอง API ด้วยตัวแปรสภาพแวดล้อม

สิ่งที่กลัวที่สุดในการย้ายคือการเปลี่ยนแบบ一刀切 (ตัดขาดทั้งหมด) วิธีที่มั่นคงกว่าคือการสร้างชั้นห่อหุ้มบาง ๆ ในโค้ด โดยใช้ตัวแปรสภาพแวดล้อมเพื่อตัดสินใจว่าจะใช้ API ใด วิธีนี้ทำให้สามารถส่งปริมาณการจราจรหรือฟังก์ชันบางส่วนไปยัง API ใหม่ก่อนได้ หากเกิดปัญหาเพียงเปลี่ยนตัวแปรเดียวก็สามารถย้อนกลับได้ เนื่องจากทั้งสองฝั่งใช้รูปแบบที่เข้ากันได้กับ OpenAI การห่อหุ้มจึงทำได้ง่ายมาก

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)

ระดับการสลับสามารถทำได้สามชั้น: ตามสภาพแวดล้อม (สลับในสภาพแวดล้อมทดสอบก่อน), ตามฟังก์ชัน (สเฉพาะ API งานสร้างสรรค์), ตามผู้ใช้ (ทดสอบกับกลุ่มผู้ใช้บางส่วน) ไม่ว่าชั้นใด ๆ แนะนำให้เก็บฟิลด์ provider ไว้ในบันทึก日志 เพื่อใช้เปรียบเทียบและตรวจสอบเมื่อเกิดความแตกต่าง นอกจากนี้ควรจัดรูปแบบประวัติการสนทนาให้เป็นอาร์เรย์ messages มาตรฐาน เพื่อให้การสนทนาเดียวกันสามารถดำเนินต่อไปได้โดยไม่สะดุดระหว่างสองฝั่ง

รายการตรวจสอบการย้าย

ตรวจสอบตามลำดับด้านล่างก่อนนำระบบขึ้นใช้งาน จะไม่พลาดขั้นตอนสำคัญ:

  1. ลงทะเบียนที่ /get-api-key/ เพื่อรับคีย์ ใช้เครดิตทดลองใช้ $0.50 (ใช้ได้ภายใน 7 วัน) เพื่อตรวจสอบ ไม่ต้องเติมเงินล่วงหน้า
  2. ใช้ curl /v1/models เพื่อยืนยันว่าคีย์ใช้งานได้และเครือข่ายเชื่อมต่อถึงกัน
  3. เปลี่ยนค่า base_url, api_key และ model ให้ขับเคลื่อนด้วยตัวแปรสภาพแวดล้อม โดยไม่เก็บคีย์ลับไว้ในที่เก็บโค้ด
  4. ค้นหาชื่อโมเดลที่เขียนตายตัวในโค้ด ค่า max_tokens และการเรียกใช้งาน embeddings
  5. ตรวจสอบโค้ดสตรีมมิง ให้รองรับบล็อกข้อมูลสุดท้ายที่ choices ว่าง
  6. เพิ่มการลองซ้ำแบบ exponential backoff สำหรับ 429 และ 503 และเพิ่มเงื่อนไขแจ้งเตือนชัดเจนสำหรับ 402 และ 403
  7. ใช้พรอมต์จริงของคุณรันชุดตัวอย่างการทดสอบย้อนกลับ โดยเน้นดูว่าส่วนที่เคยถูกปฏิเสธนั้นแสดงผล是否正常
  8. เริ่มทดสอบกับปริมาณการจราจรเล็กน้อย เปรียบเทียบปริมาณการใช้งานและเวลาแฝง หากไม่มีปัญหาจึงขยายขนาด
  9. ยืนยันว่าผลิตภัณฑ์มุ่งเน้นไปที่ผู้ใช้ผู้ใหญ่ และวัตถุประสงค์การใช้งานถูกต้องตามกฎหมาย ซึ่งเป็นเงื่อนไขพื้นฐานในการใช้ API นี้

หลุมพรางที่พบบ่อยที่สุดระหว่างการย้าย

ลืมเปลี่ยนชื่อโมเดล หากส่งชื่อโมเดล gpt หรือเส้นทางโมเดลของแพลตฟอร์มรวมจากโค้ดเก่าไปโดยตรง จะได้รับ response ผิดพลาด ให้ค้นหาชื่อโมเดลทั้งหมดและแน่ใจว่าส่งค่า uncensored ออกไป

max_tokens เกินขีดจำกัด บางโปรเจกต์ตั้งค่า max_tokens ไว้ที่ 32,000 หรือมากกว่าเพื่อให้โมเดลเขียนยาว แต่ที่นี่ค่าสูงสุดต่อครั้งคือ 32,000 หากเกินจะส่งกลับ 400 นอกจากนี้ พรอมต์รวมกับ max_tokens ต้องไม่เกิน 100,000 โทเคน หากคำขออินพุตยาว ต้องลดขีดจำกัดเอาต์พุตลง

บล็อก用量สตรีมมิง เซิร์ฟเวอร์จะเพิ่มบล็อกที่มี usage โดยอัตโนมัติก่อนสิ้นสุดสตรีม โดยที่ choices เป็นอาร์เรย์ว่าง หากโค้ดของคุณดึงค่าโดยตรงด้วย chunk.choices[0] จะเกิดข้อผิดพลาดในขั้นตอนสุดท้าย บางโค้ดเก่าอาจส่ง stream_options เพื่อขอ用量 ซึ่งที่นี่ไม่จำเป็นต้องทำ

การตีความ「ไม่เซ็นเซอร์」ว่าเป็น「ไม่มีขอบเขต」 เนื้อหาสำหรับผู้ใหญ่ที่ถูกต้องตามกฎหมาย เรื่องแต่ง และหัวข้อที่มีข้อโต้แย้งจะไม่ถูกปฏิเสธ แต่เนื้อหาเกี่ยวกับเพศสัมพันธ์ที่เกี่ยวข้องกับเด็กจะถูกระงับเสมอ รวมถึงในบริบทของการแต่งเรื่องและการสวมบทบาท โดยจะส่งกลับ 403 content_blocked ผลิตภัณฑ์ต้องจัดการการเข้าถึงของผู้ใช้ผู้ใหญ่ด้วยตนเอง

ยอดเงินและหมดอายุเครดิตทดลองใช้ เครดิตทดลองใช้หมดอายุใน 7 วัน เมื่อยอดเงินหมดจะรับสถานะ 402 รหัสข้อผิดพลาดคือ no_credit ในแอปพลิเคชัน ให้แปลงข้อผิดพลาดนี้เป็นข้อความที่ผู้ใช้เข้าใจง่าย แทนที่จะเป็น「บริการผิดพลาด」(บริการผิดพลาด) ทั่วไป สามารถดูการออกแบบสถานการณ์เฉพาะได้จาก กรณีการใช้งาน

คำถามที่พบบ่อย

ต้องเขียนพรอมต์ใหม่หลังย้ายหรือไม่?

ไม่ต้องเปลี่ยน format เพราะโครงสร้าง messages เหมือนเดิม สามารถลบ prompt แบบ "jailbreak" ที่ใช้เพื่อ bypass การปฏิเสธออกได้ โดยระบุบทบาทและงานให้ชัดเจนเพื่อประหยัด token และทำให้เสถียรขึ้น

สามารถเก็บ API เก่าและใหม่ไว้พร้อมกันได้ระหว่างการย้ายหรือไม่?

ได้ และแนะนำวิธีนี้ ใช้ตัวแปรสภาพแวดล้อมเพื่อกำหนด base_url, คีย์ และชื่อโมเดล โดยให้ฟังก์ชันบางส่วนหรือผู้ใช้บางส่วนใช้ API ใหม่ก่อน หากเกิดปัญหาเพียงเปลี่ยนตัวแปรเดียวก็สามารถย้อนกลับได้

หากย้ายการเรียกใช้งาน embeddings จาก API เก่ามา会发生什么?

ที่นี่ไม่มี API embeddings การร้องขอจะส่ง response 404 โปรดใช้บริการเวกเตอร์เดิมสำหรับการค้นหาแบบเวกเตอร์ โดยสลับเฉพาะคำขอการสนทนา

จะรู้ได้อย่างไรว่าการย้ายทำให้ประสิทธิภาพดีขึ้น?

ทำ regression test ด้วย prompt จริงที่เคยถูกปฏิเสธหรือถูกแก้ไข บันทึกอัตราการปฏิเสธ ความยาวของคำตอบ และจำนวน token ใน usage ใช้ตัวอย่างจากธุรกิจของคุณเอง ไม่ใช่ชุดทดสอบทั่วไปจากอินเทอร์เน็ต

กรอกแบบฟอร์มเพื่อรับคีย์

สร้างบัญชี คัดลอกคีย์ แก้ไข Base URL การตั้งค่าก็ง่ายเพียงเท่านี้

รับคีย์ API