کد
LangChain
ChatOpenAI در LangChain همینطور با nokeep کار میکند: آدرس پایه، کلید و شناسهٔ مدل را به آن بده. هم برای Python و هم برای JavaScript.
بررسیشده در ۷ آبان ۱۴۰۵
نصب و اتصال
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 خودش آنها را درخواست میکند. بخش Streaming را ببین.
فراخوانی ابزار
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 با یک schema از JSON میفرستد؛ deepseek-v4.1-flash-uncensored آن را میپذیرد و GLM حذفش میکند. برای خروجی ساختاریافته از DeepSeek استفاده کن. بخشهای Tool calls و JSON output را ببین.
استدلال و نمونهگیری
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میگیرد. بخش Thinking را ببین. - GLM ابزارهایش را خودش انتخاب میکند.
glm-5.3-flash-uncensoredفقطtool_choiceبا مقدارautoیاnoneرا میپذیرد. اجبار به یک ابزار (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` باید ۱ باشد. برای چند پاسخ، چند تماس جدا بفرست.
- فقط chat completions.
/v1/responsesو/v1/embeddingsوجود ندارند؛ فریمورکی که پیشفرضش یکی از اینهاست باید به chat completions هدایت شود، و embeddings به ارائهدهندهٔ دیگری نیاز دارد.
ChatOpenAI(use_responses_api=True) و useResponsesApi: true در JavaScript، /v1/responses را صدا میزنند که nokeep ندارد. آنها را خاموش بگذار.
پرسشها
برای nokeep به بستهٔ LangChain نیاز دارم؟
نه. langchain-openai در Python و @langchain/openai در JavaScript با هر API سازگار با OpenAI کار میکنند. آدرس پایه را https://nokeep.ai/v1 بگذار.
یک ایجنت LangChain کدام مدل را باید استفاده کند؟
برای بیشتر ایجنتها deepseek-v4.1-flash-uncensored: تصویر میخواند، همهٔ نمونهگیرها را میپذیرد و میشود آن را وادار به صدا زدن ابزار کرد. glm-5.3-flash-uncensored ارزانتر است، ولی ابزارهایش را خودش انتخاب میکند.