پرش به محتوا
همه مستندات

کد

LangChain

ChatOpenAI در LangChain همین‌طور با nokeep کار می‌کند: آدرس پایه، کلید و شناسهٔ مدل را به آن بده. هم برای Python و هم برای JavaScript.

بررسی‌شده در ۷ آبان ۱۴۰۵

نصب و اتصال

pip install langchain-openai
export NOKEEP_API_KEY="sk-nokeep-test"  # your own key once it connects
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"],
)

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 ارزان‌تر است، ولی ابزارهایش را خودش انتخاب می‌کند.