Ir al contenido
Toda la documentación

Código

LangChain

El ChatOpenAI de LangChain funciona con nokeep tal cual: dale la URL base, tu clave y un id de modelo. Python y JavaScript.

Revisado el 29 de octubre de 2026

Instalar y conectar

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, la URL base va dentro de configuration, no en el nivel superior. Un baseURL en el nivel superior se ignora y la llamada va al host por defecto con tu clave de nokeep.

Streaming

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 pide el uso en un stream solo para su host por defecto. Pon stream_usage=True para obtener los conteos de tokens con una URL base propia. El cliente de JavaScript los pide por su cuenta. Mira Streaming.

Llamadas a herramientas

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

Los dos modelos llaman herramientas. Los agentes de LangChain construidos sobre bind_tools funcionan igual. with_structured_output envía response_format con un esquema JSON, que deepseek-v4.1-flash-uncensored acepta y GLM descarta. Usa DeepSeek para la salida estructurada. Mira Llamadas a herramientas y Salida JSON.

Razonamiento y muestreadores

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 responde de inmediato, a menos que le pidas que piense. Deja espacio a una llamada con razonamiento: el razonamiento cuenta para max_tokens.

Trampas

  • `reasoning_effort` acepta solo los valores del propio modelo. deepseek-v4.1-flash-uncensored acepta none, low, high, max; glm-5.3-flash-uncensored acepta low, high. Los valores minimal, medium y xhigh de otras apps se ejecutan en el nivel más cercano del modelo (medium como high, xhigh como max donde el modelo lo tenga); cualquier otro valor da 400 invalid_reasoning_effort. Mira Razonamiento.
  • GLM elige sus propias herramientas. glm-5.3-flash-uncensored acepta solo tool_choice auto o none. Forzar una herramienta (required, o nombrar una función) da 400 unsupported_tool_choice. Usa DeepSeek cuando necesites forzar una.
  • Los campos que un modelo no acepta se descartan, no se rechazan. La llamada igual responde, y el encabezado de respuesta x-nokeep-ignored nombra lo que se dejó fuera. GLM conserva solo tools, tool_choice y reasoning_effort, así que su temperature y su response_format se descartan. Mira qué campos acepta cada modelo.
  • Las partes del contenido son solo texto e imágenes. Las partes image_url funcionan en deepseek-v4.1-flash-uncensored; GLM lee solo texto. Las partes de audio y de archivo (un PDF) dan 400 unsupported_input.
  • `n` debe ser 1. Para pedir varias respuestas, haz varias llamadas.
  • Solo chat completions. No hay /v1/responses ni /v1/embeddings; un framework que use cualquiera de los dos por defecto debe apuntar a chat completions, y los embeddings necesitan otro proveedor.

ChatOpenAI(use_responses_api=True) y useResponsesApi: true en JavaScript llaman a /v1/responses, que nokeep no tiene. Déjalos desactivados.

Preguntas

¿Necesito un paquete de LangChain para nokeep?

No. langchain-openai en Python y @langchain/openai en JavaScript funcionan con cualquier API compatible con OpenAI. Pon la URL base en https://nokeep.ai/v1.

¿Qué modelo debe usar un agente de LangChain?

deepseek-v4.1-flash-uncensored para la mayoría de los agentes: lee imágenes, acepta todos los muestreadores y se le puede pedir que llame a una herramienta. glm-5.3-flash-uncensored cuesta menos, pero elige sus propias herramientas.