代码
LangChain
LangChain 的 ChatOpenAI 无需改动即可与 nokeep 配合使用:填入 base URL、你的密钥和模型 id 即可。Python 和 JavaScript 均支持。
核对于 2026年10月29日
安装与连接
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 中,base URL 必须放在 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 只有在默认主机上才会在流式输出时请求用量信息。若使用自定义 base URL,请设置 stream_usage=True,才能获得 token 数。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"])两个模型都能调用工具。基于 bind_tools 构建的 LangChain 智能体工作方式相同。with_structured_output 会发送带 JSON schema 的 response_format: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只接受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` 必须为 1。 需要多个回复时,请发起多次调用。
- 仅支持 chat completions。 没有
/v1/responses,也没有/v1/embeddings;默认使用这两者之一的框架需要改为指向 chat completions,而嵌入功能需要使用其他服务商。
ChatOpenAI(use_responses_api=True) 以及 JavaScript 中的 useResponsesApi: true 会调用 /v1/responses,而 nokeep 并没有这个端点。请保持它们关闭。
常见问题
使用 nokeep 需要安装 LangChain 的专用包吗?
不需要。Python 中的 langchain-openai 和 JavaScript 中的 @langchain/openai 可用于任何兼容 OpenAI 的 API。把 base URL 设为 https://nokeep.ai/v1 即可。
LangChain 智能体应该使用哪个模型?
大多数智能体使用 deepseek-v4.1-flash-uncensored:它能读取图片,支持所有采样参数,并且可以强制调用工具。glm-5.3-flash-uncensored 成本更低,但会自行选择工具。