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

دردشة OpenAI في LangChain باستخدام واجهة API غير خاضعة للرقابة

تعمل فئة ChatOpenAI في LangChain مع أي نقطة نهاية متوافقة مع OpenAI، لذا فأنت تغير فقط عنوان URL الأساسي والمفتاح واسم النموذج. يوضح هذا الصفحة الإعداد في Python وNode، ثم يبني تدريجياً البث والأدوات ووكيلاً صغيراً.

تم التحديث

سلسلة متوازنة من الحلقات المتصلة تغذي فقاعات الدردشة في مكعب خادم، تمثل اتصال LangChain بـ API

نقاط رئيسية

  1. يحتاج ChatOpenAI إلى ثلاث إعدادات: base_url و api_key و model مضبوطة على uncensored.
  2. يمر البث المتدفق، واستدعاء الدوال، والمخرجات المهيكلة عبر واجهات LangChain القياسية.
  3. حدّ التزامن إلى 8 وتعامل مع HTTP 429 باستخدام عمليات إعادة المحاولة للبقاء ضمن الحدود.
  4. تكاليف تشغيل وكيل من عشر خطوات أقل من سنت واحد عند $0.15 و $0.50 لكل 1M رمز.

الإجابة المختصرة: ثلاث إعدادات على ChatOpenAI

إذا كنت تبحث عن chat open ai langchain، فغالباً لديك مشروع LangChain يستخدم بالفعل ChatOpenAI وتريد جعله يتحدث إلى خادم مختلف. هذا تغيير في التكوين، وليس إعادة كتابة. تتحدث الواجهة في هذا الموقع ببروتوكول إكمال الدردشة من OpenAI، لذا يعاملها LangChain كأي خادم آخر على طراز OpenAI.

تحتاج إلى عنوان URL الأساسي، ومفتاح API الخاص بك ومعرف النموذج uncensored. قم بتثبيت الحزم أولاً:

pip install -U langchain-openai langgraph

ثم أنشئ كائن النموذج:

import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
    temperature=0.8,
)

reply = llm.invoke("Write a two-sentence villain monologue for a heist novel.")
print(reply.content)

هذه هي عملية التكامل بأكملها. كل ميزات LangChain المبنية على ChatOpenAI تعمل الآن مع النموذج بدون رقابة: السلاسل، ومكونات الاسترجاع التي تستدعي نموذج الدردشة، ومحللات المخرجات والوكلاء. إذا لم يكن لديك مفتاح بعد، تشرح صفحة مفتاح API عملية التسجيل ورصيد التجربة المجاني بنقرة واحدة.

احتفظ بالمفتاح بعيداً عن الكود

ضع المفتاح في متغير بيئة واقرأه عند بدء التشغيل. على لينكس أو ماك:

export NOFILTER_API_KEY="paste-your-key-here"

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

هناك فخّ يقع فيه الكثيرون: يقرأ ChatOpenAI أيضاً المتغيرات OPENAI_API_KEY و OPENAI_API_BASE من البيئة. إذا كانت هذه المتغيرات مُعرّفة لمشروع آخر، فقد يرسل كائن مُعدّ جزئياً طلبك إلى الخادم الخاطئ. تمرير base_url و api_key صراحةً، كما هو موضح أعلاه، يزيل الغموض.

يمكنك تأكيد الاتصال بدون LangChain تماماً. يجب أن تُرجع نقطة نهاية النماذج إدخالاً واحداً:

curl https://api.nofilteraichat.com/v1/models \
  -H "Authorization: Bearer $NOFILTER_API_KEY"

إذا نجح ذلك لكن LangChain يفشل، فإن المشكلة في بيئة بايثون الخاصة بك، وليس في المفتاح. إذا فشل الاثنان مع خطأ 401، تحقق من وجود مسافة أو سطر جديد عالق في المفتاح. يوضح البدء السريع تنسيق الطلب الدقيق للمقارنة.

البث المتدفق واستخدام الرموز

تبدو واجهات الدردشة أفضل عندما تظهر الرموز (tokens) أثناء توليدها. تتيح لك LangChain ذلك عبر .stream()، ويرسل الخادم أجزاء (chunks) SSE قياسية عندما تكون stream: true مُفعّلة من الداخل.

from langchain_openai import ChatOpenAI
import os

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
    stream_usage=True,
)

final = None
for chunk in llm.stream("Describe a rainy harbour town in four sentences."):
    print(chunk.content, end="", flush=True)
    final = chunk if final is None else final + chunk

print()
print(final.usage_metadata)

مع stream_usage=True، يحمل الجزء الأخير أعداد الرموز (tokens) للإدخال والإخراج، وهي الأرقام التي ترسلها واجهة API في نهاية البث. احتفظ بهذه الأرقام. إنها أرخص طريقة لمعرفة التكلفة الحقيقية للوكيل، ونستخدمها في قسم التكلفة أدناه.

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

Node وTypeScript

تستخدم حزمة جافا سكريبت اسماً مختلفاً قليلاً للخيار. توضع نقطة الأساس داخل configuration:

npm install @langchain/openai @langchain/core
import { ChatOpenAI } from "@langchain/openai";

const llm = new ChatOpenAI({
  model: "uncensored",
  apiKey: process.env.NOFILTER_API_KEY,
  configuration: { baseURL: "https://api.nofilteraichat.com/v1" },
  temperature: 0.8,
});

const res = await llm.invoke("Give me three names for a smuggler's ship.");
console.log(res.content);

أنواع TypeScript للاستجابة هي فئات رسائل LangChain المعتادة، لذا يستمر العمل في الكود الموجود الذي يقرأ res.content أو res.usage_metadata. عند تشغيل هذا داخل مسار الخادم، أنشئ النموذج مرة واحدة على مستوى الوحدة بدلاً من طلب لكل طلب. يتجنب ذلك إنشاء عميل HTTP جديد لكل استدعاء ويحافظ على سهولة فهم تزامن التنفيذ الخاص بك.

يتصرف كل شيء آخر، بما في ذلك .stream()، و .bindTools() و .withStructuredOutput()، بنفس الطريقة كما في Python. تُمرر درجة الحرارة (temperature)، و top_p، وتسلسلات التوقف، والبذرة (seed)، وخيارات العقوبة إلى النموذج، لذا يمكنك تعيينها في المُهيئ (constructor) كما تفعل مع أي واجهة خلفية أخرى على طراز OpenAI.

استدعاء الأدوات ووكيل صغير

تدعم واجهة برمجة التطبيقات استدعاء الدوال: حقول tools و tool_choice، و tool_calls المبعّث، ونتائج الأدوات التي تُعاد كرسائل role: "tool". يستخدم الوكيل الجاهز في LangGraph هذه الحلقة بالضبط. إليك وكيل بأداة واحدة:

import os
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent

@tool
def roll_dice(sides: int) -> int:
    """Roll a die with the given number of sides."""
    import random
    return random.randint(1, sides)

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
)

agent = create_react_agent(llm, [roll_dice])
out = agent.invoke(
    {"messages": [("user", "Roll a twenty-sided die twice and tell me the total.")]}
)
print(out["messages"][-1].content)

استخدام الأدوات مع النماذج مفتوحة الأوزان أقل قابلية للتنبؤ من النماذج الرائدة المستضافة، لذا تعامل معها على أنها شيء يجب اختباره. اكتب وصف الأدوات بكلمات واضحة، اجعل مخططات الحجج صغيرة، وخفض temperature (من 0.2 إلى 0.4) لخطوات الوكيل التي يجب أن تنتج حججاً صالحة. إذا عاد الطلب مشوّهًا، تعرضه LangChain كاستدعاء أداة غير صالح، وعادةً ما تحل إعادة المحاولة مع وصف أوضح المشكلة.

اجعل حلقة الوكيل محدودة. تمتلك LangGraph حدًا للتكرار، ويجب عليك تعيينه على رقم يمكنك تحمله. إذا كان بإمكان الوكيل استدعاء الأدوات إلى الأبد، فقد يستهلك سوء التوجيه الرصيد بينما تكون بعيدًا عن لوحة المفاتيح. يُعد الحد من 10 إلى 15 خطوة افتراضياً معقولاً لمعظم المهام، ويمكنك تمريره في التكوين عند استدعاء الوكيل.

المخرجات المهيكلة

المخرجات المهيكلة متاح من خلال response_format. في LangChain، اطلب ذلك باستخدام طريقة المخرجات المهيكلة وسمِّ المفاتيح في الموجّه الخاص بك:

from pydantic import BaseModel
from langchain_openai import ChatOpenAI
import os

class Character(BaseModel):
    name: str
    role: str
    secret: str

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
)
structured = llm.with_structured_output(Character, method="json_mode")
print(structured.invoke(
    "Return JSON with keys name, role and secret for a noir detective."
))

حدود المعدل، إعادة المحاولة والتكلفة

المفتاح الكامل يسمح بـ 8 طلبات متزامنة و 300 طلب في الدقيقة. يسمح المفتاح التجربي بـ 2 و 60. عند تجاوز أي من هذين، تجيب واجهة API بـ HTTP 429 ورمز خطأ: rate_limited لطلبات في الدقيقة، و concurrency لعدد كبير جدًا في وقت واحد. يؤدي الحمل الزائد المؤقت أيضًا إلى إرجاع 429، مع رأس Retry-After: 5.

توفر لك LangChain خيارين لهذا. max_retries على النموذج يعيد محاولة الاستدعاءات الفاشلة مع تأخير، ويحدّ max_concurrency في تكوين التشغيل من العمل المتوازي:

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
    max_retries=4,
    timeout=120,
)

answers = llm.batch(
    ["Prompt one", "Prompt two", "Prompt three", "Prompt four"],
    config={"max_concurrency": 6},
)

يترك تعيين max_concurrency على 6 لمفتاح كامل هامشاً لعملية ثانية. تذكر أن كل خطوة وكيل هي طلب منفصل، وتشغل الخطوة المنقولة بالبث خانتها حتى ينتهي البث.

تكلفة تشغيل الوكيل

التسعير هو $0.15 لكل 1M رمز إدخال و $0.50 لكل 1M رمز إخراج. لنفترض أن خطوة الوكيل ترسل 3,000 رمز من السجل والأدوات والتعليمات، ويكتب النموذج 500 رمز. تكلفة الإدخال هي 3,000 × $0.15 / 1,000,000 = $0.00045. تكلفة الإخراج هي 500 × $0.50 / 1,000,000 = $0.00025. تكلفة الخطوة الواحدة هي $0.0007. تكلفة تشغيل من عشر خطوات هو $0.007، وتكلفة 1,000 من هذه التشغيلات هي $7.00.

يعيد الوكلاء إرسال سجلهم المتزايد في كل خطوة، لذا تهيمن رموز الإدخال. يعد تقصيص مخرجات الأدوات القديمة أرخص تحسين متاح لديك. الطلبات الفاشلة أو المرفوضة لا تُ charged. تفاصيل عمليات الشحن والمكافآت موجودة في صفحة الأسعار.

مشاكل شائعة

  • خطأ 404 في كل الطلبات. يجب أن ينتهي عنوان URL الأساسي بـ /v1 ولا يتضمن /chat/completions. LangChain تضيف المسار تلقائياً.
  • النموذج غير موجود. معرف النموذج الوحيد هو uncensored. أسماء مثل gpt-4o لن تعمل.
  • أخطاء في السياق. حجم النافذة هو 100,000 رمز (token) للموجّه بالإضافة إلى النص المكتمل. سلاسل الاسترجاع الطويلة قد تتجاوز هذا الحد. قم بتلخيص أو تقصيص النص قبل الإرسال.
  • حجم الطلب كبير جداً. الحد الأقصى لحجم الجسم هو 8 MB، وهو أمر مهم إذا قمت بحشو مستندات كاملة في الموجّه.
  • فشل ميزة التضمين (Embeddings). هذه الواجهة البرمجية (API) مخصصة للدردشة النصية فقط. احتفظ بنموذج التضمين الخاص بك لدى مزود آخر واستخدم نقطة النهاية هذه للتوليد.

نفس النمط يعمل مع أطر عمل أخرى وواجهات الدردشة؛ يغطي دليل التكامل المزيد من العملاء البرمجية. لأي حالة غير عادية، يُعد صفحة الدعم المكان المناسب للبدء.

أسئلة وأجوبة

هل يمكنني استخدام ChatOpenAI مع عنوان URL أساسي مخصص؟

نعم. مرر base_url (baseURL داخل الإعدادات في Node)، ومفتاحك والنموذج uncensored. لا تهتم LangChain بأي خادم يجيب طالما أنه يتبع بروتوكول دردشة OpenAI.

هل يعمل البث المتدفق في LangChain مع هذه الـ API؟

نعم. تبث واجهة API عبر SSE وترسل الاستخدام في النهاية، لذا تعمل .stream() و astream()، وتعطيك stream_usage=True أعداد الرموز.

هل يمكنني استخدام تضمين (Embeddings) أو متاجر المتجهات في LangChain معها؟

لا للتضمين، لأن الـ API لا تحتوي على نقطة نهاية للتضمين. استخدم مصدر تضمين آخر للاسترجاع وأرسل النص المسترجع إلى نقطة النهاية هذه للتوليد.

ماذا يحدث عند الوصول إلى حدّ المعدل؟

تحصل على HTTP 429 مع الكود rate_limited أو concurrency. اضبط max_retries على ChatOpenAI وحدّ max_concurrency عند أو أقل من 8 على المفتاح الكامل.

مفتاحك على بُعد نموذج واحد

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

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