Aller au contenu
Toute la documentation

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 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)

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-uncensored accepte none, low, high, max ; glm-5.3-flash-uncensored accepte low, high. Les valeurs minimal, medium et xhigh d'autres applications passent au niveau le plus proche du modèle (medium devient high, xhigh devient max lorsque le modèle l'a) ; toute autre valeur renvoie 400 invalid_reasoning_effort. Voir Réflexion.
  • GLM choisit ses propres outils. glm-5.3-flash-uncensored n'accepte que tool_choice à auto ou none. Forcer un outil (required, ou nommer une fonction) renvoie 400 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-ignored indique ce qui a été retiré. GLM ne garde que tools, tool_choice et reasoning_effort, donc son temperature et son response_format sont 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_url fonctionnent sur deepseek-v4.1-flash-uncensored ; GLM ne lit que le texte. Les parties audio et fichier (un PDF) renvoient 400 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/responses ni /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.