跳到正文
全部文档

代码

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 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 中,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 成本更低,但会自行选择工具。