AR ▾
احصل على مفتاح API

Wu Xianzhi APIدليل الترحيل

دليل الترحيل من واجهات API الوسيطة: التحويل من OpenAI وOpenRouter إلى واجهة API بدون رقابة

إذا كان مشروعك يستخدم حاليًا OpenAI أو OpenRouter أو واجهة API وسيطة، وترغب في التبديل إلى واجهة API بدون رقابة لا ترفض الطلبات المشروعة، فإن الأمر يتطلب تعديل ثلاثة إعدادات فقط: base_url، والمفتاح، واسم النموذج. يوضح هذا المقال الفرق بين الواجهات الوسيطة والنماذج المخصصة بدون رقابة، ثم يقدم جدول مقارنة المعلمات، وكود التشغيل المتوازي للواجهات القديمة والجديدة باستخدام متغيرات البيئة، وقائمة التحقق قبل النشر، وأبرز الأخطاء الشائعة أثناء الترحيل.

تم التحديث في

النقاط الرئيسية

  1. الواجهات الوسيطة تعيد بيع نماذج المصنع الأصلي، وسياسة المحتوى لا تتغير؛ فقط النماذج المخصصة بدون رقابة تحل مشكلة الرفض
  2. يتطلب الترحيل تعديل ثلاثة أماكن فقط: تغيير base_url إلى https://api.wuxianzhiapi.com/v1,密钥,模型名 uncensored
  3. لا يدعم embeddings، والصور، والصوت، والتدريب الدقيق؛ استخدم الخدمات الأصلية لهذه القدرات
  4. استخدم متغيرات البيئة للتبديل التدريجي، وفي حال حدوث خطأ، يكفي تغيير متغير واحد للعودة

ما الفرق بين واجهة API الوسيطة والنموذج المخصص بدون رقابة

وضح المفاهيم أولاً، وإلا ستواجه صعوبة في اختيار الاتجاه الصحيح أثناء الترحيل. تعتمد خدمات التحويل الشائعة لواجهات برمجة التطبيقات بشكل أساسي على إعادة بيع أو تجميع حصائل استدعاء نماذج الشركات الكبرى، وتوفر لك عنوانًا متوافقًا مع OpenAI لتتمكن من تبديل النماذج باستخدام نفس SDK. تحل هذه الخدمات مشكلة "الوصول والدفع"، مثل توحيد نقطة الدخول والفواتير، لكن النموذج نفسه يظل هو نفسه، وتظل سياسة المحتوى الأصلية كما هي: سيتم رفض المواضيع التي يجب رفضها، ولن يغير تغيير عنوان التحويل هذه الحقيقة.

النماذج الخاصة بدون رقابة هي قضية أخرى. إنها ليست إعادة توجيه لنموذج آخر، بل نموذج يُقدم بشكل منفصل، ولا يتم رفض المحتوى البالغ القانوني، والإبداع الخيالي، والمواضيع المثيرة للجدل. يوفر Wu Xianzhi API نموذجًا واحدًا فقط، واسم النموذج هو uncensored، الواجهة متوافقة مع تنسيق OpenAI، لذا فإن تكلفة الترحيل منخفضة، لكن لها حدودًا واضحة: تدعم النص فقط، ولا تدعم الصور أو الصوت أو المتجهات أو الضبط الدقيق؛ يتم حظر المحتوى الجنسي الذي يتضمن قاصرين بغض النظر عما إذا كان خياليًا أم لا، مع إرجاع رمز 403.

لذلك، اسأل نفسك قبل الترحيل: هل مشكلتك هي "عدم استقرار الواجهة أو ارتفاع السعر"، أم أن "النموذج يرفض طلباتي المشروعة باستمرار"؟ إذا كانت الحالة الثانية، فإن تغيير الواجهة الوسيطة لا طائل منه، والتبديل إلى واجهة API بدون رقابة مخصصة هو الحل المناسب. تتبنى العديد من الفرق نهج الدمج: المهام العامة تستمر عبر الواجهة الأصلية، بينما يتم توجيه طلبات المخرجات بدون رقابة إلى هذه الواجهة بشكل منفصل، وسنشرح كيفية القيام بذلك بالتفصيل لاحقًا.

أماكن التعديل الثلاثة عند الترحيل من OpenAI أو OpenRouter

سواء كنت تستخدم OpenAI الرسمي أو واجهة مثل OpenRouter أو أي خدمة وسيطة، طالما الكود يستخدم 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 <key>. راجع أمثلة الكود.

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 رمز (token)
حجم جسم الطلبلا يتجاوز 8 ميجابايت
معدل الطلب300 طلب لكل مفتاح في الدقيقة
المتجهات embeddingsغير مدعوم
توليد الصور / التعرف عليها، الصوت، الفيديوغير مدعوم، يعالج النصوص فقط
الضبط الدقيق fine-tuningغير مدعوم
تبديل بين نماذج متعددةيوجد نموذج واحد فقط، ولا توجد قائمة للتبديل

لا تفترض أن الحقول الاختيارية الأخرى غير المدرجة في الجدول ستعمل بنفس الطريقة التي تعمل بها لدى المزود الأصلي. من الممارسات الآمنة تشغيلها بشكل منفصل في بيئة الاختبار للتأكد من مطابقة السلوك للتوقعات قبل النشر، ويعتمد الدعم الفعلي على وثائق الواجهة.

ماذا تفعل مع القدرات غير المتاحة: بدائل للمتجهات والصور والصوت

إذا كان مشروعك الأصلي يستخدم كلًا من المحادثات واسترجاع المتجهات، فلا تفكر في "تغيير الكل" أثناء الترحيل. هنا نقدم محادثات نصية فقط، لذا فإن الكود المتعلق بـ embeddings، مثل استرجاع قاعدة المعرفة وإزالة التكرار الدلالي، يجب أن يستمر في استخدام خدمة المتجهات الأصلية الخاصة بك، أو استبدلها بحل متجهات تقوم بنشره بنفسك. قم بتغيير جزء المحادثة إلى هنا، واترك جزء الاسترجاع كما هو؛ لا يؤثر الاثنان على بعضهما البعض، وهذا هو أبسط فصل.

ينطبق الأمر نفسه على الصور والصوت. على سبيل المثال، إذا كان منتجك يعتمد على «نص مع صور»، فيمكن أن يمر توليد النص عبر هنا، بينما تستمر الصور في استخدام واجهة الصور الأصلية. وإذا كنت بحاجة إلى قراءة صوتية، فقم بتسليم النص المُولّد إلى خدمة الصوت الأصلية لديك. قم باستخراج خطوة «توليد النص» كدالة منفصلة، بحيث تكون التغييرات طفيفة جدًا عند دمج القدرات الأخرى لاحقًا.

إذا كنت تستخدم نماذج متعددة، فستستخدم النموذج الوحيد هنا لكل المهام. سعر الإدخال هو $0.25 / مليون رمز (token)، لذا يمكن إهمال تكلفة التصنيف بتقليل max_tokens. التفاصيل في صفحة الأسعار.

التشغيل بالتوازي: التبديل بين واجهتين باستخدام متغيرات البيئة

أكثر ما يخشاه المطورون عند الترحيل هو «القطع الكامل». الطريقة الأكثر أمانًا هي إنشاء طبقة تغليف رقيقة جدًا في الكود، وتحديد الواجهة التي سيتم استخدامها عبر متغيرات البيئة. هذا يسمح لك بتوجيه جزء صغير من حركة المرور أو جزء معين من الوظائف إلى الواجهة الجديدة أولاً، وفي حال حدوث خطأ، يمكنك التراجع عن طريق تغيير متغير واحد فقط. نظرًا لأن كلا الواجهتين تتوافقان مع تنسيق 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)

يمكن التبديل على ثلاث مستويات: حسب البيئة، حسب الوظيفة، أو حسب المستخدم. اترك حقل provider في السجلات للمقارنة. احفظ سجلات المحادثة كـ messages قياسية لتستمر المحادثة بسلاسة بين الجانبين.

قائمة التحقق للتبديل

راجع الخطوات التالية قبل النشر لتتأكد من عدم تفويت أي عنصر:

  1. سجّل في /get-api-key/ واحصل على مفتاحك، ثم قم بالتحقق باستخدام رصيد التجربة بقيمة $0.50 (صالح لمدة 7 أيام)، دون الحاجة إلى شحن الرصيد مسبقًا.
  2. استخدم curl /v1/models للتأكد من صلاحية المفتاح وإمكانية الوصول إلى الشبكة.
  3. حوّل القيم التالية إلى متغيرات بيئة: base_url، api_key، وmodel، بحيث لا يتم تخزين مفتاح API في مستودع الكود.
  4. ابحث في الكود عن أسماء النماذج الثابتة، وقيم max_tokens، واستدعاءات embeddings.
  5. تحقق من كود البث المتدفق (streaming) ليتوافق مع كتلة الاستخدام التي يكون فيها choices فارغاً.
  6. أضف آلية إعادة المحاولة بالتراجع الأسي لأخطاء 429 و503، وأضف فروع رسائل خطأ واضحة لأخطاء 402 و403.
  7. قم بتشغيل مجموعة من أمثلة الاختبار باستخدام الموجّه الخاص بك، مع التركيز على ما إذا كانت الاستجابات المرفوضة سابقًا يتم إخراجها بشكل طبيعي الآن.
  8. ابدأ بتجربة نسبة صغيرة من حركة المرور، وقارن استهلاك الرصيد وزمن الاستجابة، ثم قم بتوسيع النطاق إذا كانت النتائج جيدة.
  9. تأكد من أن المنتج موجه للمستخدمين البالغين وأن الاستخدام قانوني، فهذا شرط أساسي لاستخدام هذه الواجهة.

أكثر الأخطاء شيوعًا أثناء الترحيل

نسيت تغيير اسم النموذج. إذا أرسلت مسار نموذج gpt القديم أو مسار منصة التجميع كما هو، ستحصل على استجابة خطأ. ابحث عن اسم النموذج وتأكد من إرسال uncensored.

تجاوز حد max_tokens.بعض المشاريع تضبط max_tokens على 32000 أو أكثر للسماح للنموذج بالكتابة بشكل أطول. هنا الحد الأقصى للطلب الواحد هو 32,000، وإذا تجاوزته ستحصل على خطأ 400. بالإضافة إلى ذلك، مجموع الرموز في الموجّه (prompt) وmax_tokens لا يمكن أن يتجاوز 100,000 رمز، لذا يجب تقليل الحد الأقصى للمخرجات إذا كان الطلب طويلًا.

كتل الاستخدام في الوضع المتدفق.يضيف الخادم تلقائيًا كتلة أخيرة تحتوي على usage قبل انتهاء التدفق، حيث يكون choices مصفوفة فارغة. إذا كان كود التحليل الخاص بك يستخرج القيمة مباشرةً عبر chunk.choices[0]، فسيحدث خطأ في الخطوة الأخيرة. كما أن بعض الأكواد القديمة قد ترسل stream_options للحصول على بيانات الاستخدام، وهو أمر غير مطلوب هنا.

اعتبار «بدون رقابة» يعني «بدون حدود». لا يتم رفض المحتوى البالغ المشروع أو الخيالي أو المثير للجدل، لكن محتوى البالغين مع القاصرين يُحظر دائماً (بما في ذلك الخيالي)، ويعيد 403 content_blocked. المنتج يحتاج للتحقق من عمر المستخدم.

انتهاء رصيد التجربة. تنتهي صلاحية رصيد التجربة بعد 7 أيام، وبعد استنفاد الرصيد ستتلقى خطأ 402، ورمز الخطأ هو no_credit. ترجم هذا الخطأ في التطبيق إلى رسالة مفهومة للمستخدم، بدلاً من "خطأ في الخدمة" بشكل عام. يمكنك الرجوع إلى مقال تصميم السيناريو المحدد لمراجعته.

الأسئلة الشائعة

هل يجب إعادة كتابة الموجّهات (Prompts) القديمة بعد الترحيل؟

لا حاجة لتغيير التنسيق، فبنية الرسائل (messages) متطابقة تمامًا. لكن يمكنك حذف التمهيدات «المتسللة» التي كُتبت سابقًا لتجاوز الرفض، واكتب الدور والمهمة بوضوح، مما يوفر الرموز (tokens) ويحسن الاستقرار.

هل يمكن الاحتفاظ بالواجهات القديمة والجديدة معًا أثناء الترحيل؟

نعم، وهذا موصى به. استخدم متغيرات البيئة لتحديد base_url والمفتاح واسم النموذج، واجعل جزءًا من الوظائف أو المستخدمين يستخدمون الواجهة الجديدة أولاً. في حال حدوث خطأ، يمكنك التراجع عن طريق تغيير متغير واحد فقط.

ماذا يحدث إذا قمت بنقل استدعاءات embeddings من الواجهة القديمة؟

لا توجد واجهة embeddings هنا، وستعود استجابة 404. يرجى الاستمرار في استخدام الخدمة الأصلية لاسترجاع المعلومات المتجهة، وقم بنقل طلبات المحادثة فقط.

كيف أعرف أن الجودة تحسنت بعد الترحيل؟

خذ مجموعة من الموجّهات (Prompts) الحقيقية التي كانت تُرفض أو تُعدل سابقًا وقم بإجراء مقارنة اختبارية، وسجل معدل الرفض، وطول الردود، وعدد الرموز في بيانات الاستخدام. يجب أن تكون العينات من أعمالك الخاصة، وليس من مجموعات الاختبار العامة على الإنترنت.

املأ النموذج فقط للحصول على المفتاح

أنشئ حسابًا، انسخ المفتاح، وعدّل Base URL. الإعداد بهذه السهولة.

الحصول على مفتاح API