Code
LangChain
Le ChatOpenAI de LangChain fonctionne avec nokeep tel quel : donnez-lui l'URL de base, votre clé et un identifiant de modèle. Python comme JavaScript.
Vérifié le 29 octobre 2026
Installer et se connecter
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)En JavaScript, l'URL de base va dans configuration, pas au premier niveau. Un baseURL au premier niveau est ignoré et l'appel part vers l'hôte par défaut avec votre clé nokeep.
Flux
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)En Python, ChatOpenAI ne demande l'usage d'un flux que pour son hôte par défaut. Réglez stream_usage=True pour obtenir les nombres de jetons avec une URL de base personnalisée. Le client JavaScript les demande de lui-même. Voir Streaming.
Appel d'outils
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"])Les deux modèles appellent des outils. Les agents LangChain construits sur bind_tools fonctionnent de la même façon. with_structured_output envoie response_format avec un schéma JSON, que deepseek-v4.1-flash-uncensored accepte et que GLM retire. Utilisez DeepSeek pour la sortie structurée. Voir Appels d'outils et Sortie JSON.
Réflexion et échantillonneurs
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 répond tout de suite, sauf si vous lui demandez de réfléchir. Laissez de la place à un appel avec réflexion : la réflexion compte dans max_tokens.
Pièges
- `reasoning_effort` n'accepte que les valeurs propres au modèle.
deepseek-v4.1-flash-uncensoredacceptenone,low,high,max;glm-5.3-flash-uncensoredacceptelow,high. Les valeursminimal,mediumetxhighd'autres applications passent au niveau le plus proche du modèle (mediumdevienthigh,xhighdevientmaxlorsque le modèle l'a) ; toute autre valeur renvoie400 invalid_reasoning_effort. Voir Réflexion. - GLM choisit ses propres outils.
glm-5.3-flash-uncensoredn'accepte quetool_choiceàautoounone. Forcer un outil (required, ou nommer une fonction) renvoie400 unsupported_tool_choice. Utilisez DeepSeek lorsque vous devez en forcer un. - Les champs qu'un modèle ne peut pas prendre sont retirés, pas refusés. L'appel répond quand même, et l'en-tête de réponse
x-nokeep-ignoredindique ce qui a été retiré. GLM ne garde quetools,tool_choiceetreasoning_effort, donc sontemperatureet sonresponse_formatsont retirés. Voir les champs acceptés par chaque modèle. - Les parties de contenu sont du texte et des images uniquement. Les parties
image_urlfonctionnent surdeepseek-v4.1-flash-uncensored; GLM ne lit que le texte. Les parties audio et fichier (un PDF) renvoient400 unsupported_input. - `n` doit valoir 1. Pour obtenir plusieurs réponses, faites plusieurs appels.
- Complétions de chat uniquement. Il n'y a ni
/v1/responsesni/v1/embeddings; un framework qui utilise l'un ou l'autre par défaut doit être pointé vers les complétions de chat, et les embeddings nécessitent un autre fournisseur.
ChatOpenAI(use_responses_api=True) et useResponsesApi: true en JavaScript appellent /v1/responses, que nokeep ne propose pas. Laissez-les désactivés.
Questions
Ai-je besoin d'un paquet LangChain pour nokeep ?
Non. langchain-openai en Python et @langchain/openai en JavaScript fonctionnent avec toute API compatible OpenAI. Réglez l'URL de base sur https://nokeep.ai/v1.
Quel modèle un agent LangChain doit-il utiliser ?
deepseek-v4.1-flash-uncensored pour la plupart des agents : il lit les images, accepte tous les échantillonneurs et peut être amené à appeler un outil. glm-5.3-flash-uncensored coûte moins cher, mais choisit lui-même ses outils.