الكود
LangChain
يعمل ChatOpenAI من LangChain مع nokeep كما هو: أعطِه عنوان الأساس ومفتاحك ومعرّف النموذج. بPython وJavaScript معًا.
تم التحقق في 29 أكتوبر 2026
التثبيت والاتصال
pip install langchain-openai
export NOKEEP_API_KEY="sk-nokeep-test" # your own key once it connectsimport os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="deepseek-v4.1-flash-uncensored",
base_url="https://nokeep.ai/v1",
api_key=os.environ["NOKEEP_API_KEY"],
)
reply = llm.invoke("Name three good names for a tavern.")
print(reply.content)
print(reply.usage_metadata)في JavaScript يوضع عنوان الأساس داخل configuration، لا في المستوى الأعلى. الـbaseURL في المستوى الأعلى يُتجاهل، ويذهب الاستدعاء إلى الخادم الافتراضي بمفتاح nokeep الخاص بك.
البث
import os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="deepseek-v4.1-flash-uncensored",
base_url="https://nokeep.ai/v1",
api_key=os.environ["NOKEEP_API_KEY"],
stream_usage=True, # ask for the token counts in the last chunk
)
full = None
for chunk in llm.stream("Tell me a story in three lines."):
print(chunk.content, end="", flush=True)
full = chunk if full is None else full + chunk
print("\n", full.usage_metadata)في Python، يطلب ChatOpenAI الاستخدام في البث فقط عندما يكون الخادم الافتراضي. اضبط stream_usage=True للحصول على عدد الرموز مع عنوان أساس مخصص. عميل JavaScript يطلبها تلقائيًا. انظر البث.
استدعاء الأدوات
from langchain_core.tools import tool
@tool
def get_weather(city: str) -> str:
"""Get the weather in a city."""
return f"18°C and clear in {city}"
message = llm.bind_tools([get_weather]).invoke("What's the weather in Lisbon?")
for call in message.tool_calls:
print(call["name"], call["args"])النموذجان يستدعيان الأدوات. وكلاء LangChain المبنيون على bind_tools يعملون بالطريقة نفسها. يرسل with_structured_output الحقل response_format مع مخطط JSON، وهو ما يقبله deepseek-v4.1-flash-uncensored ويحذفه GLM. استخدم DeepSeek للمخرجات المنظّمة. انظر استدعاءات الأدوات ومخرجات JSON.
التفكير وأدوات أخذ العينات
import os
from langchain_openai import ChatOpenAI
thinker = ChatOpenAI(
model="deepseek-v4.1-flash-uncensored",
base_url="https://nokeep.ai/v1",
api_key=os.environ["NOKEEP_API_KEY"],
reasoning_effort="high",
max_tokens=4000,
extra_body={"min_p": 0.05}, # fields ChatOpenAI has no argument for
)يجيب DeepSeek فورًا ما لم تطلب منه التفكير. أعطِ استدعاء التفكير مساحة: التفكير يُحتسب ضمن max_tokens.
ملاحظات مهمة
- `reasoning_effort` يقبل قيم النموذج نفسه فقط.
deepseek-v4.1-flash-uncensoredيقبلnoneوlowوhighوmax؛ وglm-5.3-flash-uncensoredيقبلlowوhigh. القيمminimalوmediumوxhighمن التطبيقات الأخرى تُنفَّذ على أقرب مستوى يملكه النموذج (mediumكـhigh، وxhighكـmaxحيث يتوفر)؛ وأي قيمة أخرى تعطي400 invalid_reasoning_effort. انظر التفكير. - GLM يختار أدواته بنفسه. يقبل
glm-5.3-flash-uncensoredالقيمةautoأوnoneفقط فيtool_choice. فرض أداة (required، أو تسمية دالة) يعطي400 unsupported_tool_choice. استخدم DeepSeek عندما تحتاج إلى فرض أداة. - الحقول التي لا يقبلها النموذج تُحذف ولا تُرفض. يبقى الاستدعاء قائمًا، وترويسة الرد
x-nokeep-ignoredتذكر ما حُذف. يحتفظ GLM بـtoolsوtool_choiceوreasoning_effortفقط، لذلك تُحذفtemperatureوresponse_formatمنه. انظر الحقول التي يقبلها كل نموذج. - أجزاء المحتوى نصوص وصور فقط. أجزاء
image_urlتعمل علىdeepseek-v4.1-flash-uncensored؛ يقرأ GLM النص وحده. أجزاء الصوت والملفات (مثل PDF) تأخذ400 unsupported_input. - يجب أن يكون `n` مساويًا لـ1. لطلب عدة ردود، أرسل عدة استدعاءات.
- إكمال المحادثة فقط. لا يوجد
/v1/responsesولا/v1/embeddings؛ إطار العمل الذي يفترض أيًّا منهما يحتاج أن يُوجَّه إلى إكمال المحادثة، والتضمينات تحتاج مزودًا آخر.
ChatOpenAI(use_responses_api=True) وuseResponsesApi: true في JavaScript يستدعيان /v1/responses، وnokeep لا يملكه. اتركهما معطّلين.
أسئلة
هل أحتاج حزمة LangChain خاصة بـnokeep؟
لا. تعمل langchain-openai في Python و@langchain/openai في JavaScript مع أي واجهة متوافقة مع OpenAI. اضبط عنوان الأساس على https://nokeep.ai/v1.
أي نموذج ينبغي أن يستخدمه وكيل LangChain؟
deepseek-v4.1-flash-uncensored لمعظم الوكلاء: يقرأ الصور، ويقبل كل أدوات أخذ العينات، ويمكن جعله يستدعي أداة. glm-5.3-flash-uncensored أرخص لكنه يختار أدواته بنفسه.