الإجابة المختصرة: ثلاث إعدادات على 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/coreimport { 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) مخصصة للدردشة النصية فقط. احتفظ بنموذج التضمين الخاص بك لدى مزود آخر واستخدم نقطة النهاية هذه للتوليد.
نفس النمط يعمل مع أطر عمل أخرى وواجهات الدردشة؛ يغطي دليل التكامل المزيد من العملاء البرمجية. لأي حالة غير عادية، يُعد صفحة الدعم المكان المناسب للبدء.
