本文へ移動
すべてのドキュメント

コード

LangChain

LangChainの ChatOpenAI は、そのままnokeepで動きます。ベース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では、ベース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 がストリームの使用量を要求するのは既定のホストだけです。独自のベースURLでトークン数を得るには 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"])

どちらのモデルもツールを呼べます。bind_tools で作ったLangChainのエージェントも同じように動きます。with_structured_output はJSONスキーマ付きの 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にしてください。 複数の返信が欲しければ、複数回呼び出してください。
  • チャット補完のみです。 /v1/responses も /v1/embeddings もありません。どちらかを既定にするフレームワークは、チャット補完を指すよう設定してください。埋め込みには別のプロバイダーが必要です。

ChatOpenAI(use_responses_api=True) と JavaScriptの useResponsesApi: true は /v1/responses を呼びますが、nokeepにはそれがありません。どちらも外したままにしてください。

よくある質問

nokeepに使うのにLangChainのパッケージは必要ですか?

いいえ。Pythonの langchain-openai、JavaScriptの @langchain/openai は、OpenAI互換のどのAPIでも動きます。ベースURLを https://nokeep.ai/v1 に設定してください。

LangChainのエージェントにはどのモデルを使うべきですか?

ほとんどのエージェントには deepseek-v4.1-flash-uncensored を。画像を読め、すべてのサンプラーを受け付け、ツールを呼ぶよう仕向けられます。glm-5.3-flash-uncensored は安いですが、ツールは自分で選びます。