Pular para o conteúdo
Toda a documentação

Código

LangChain

O ChatOpenAI do LangChain funciona com o nokeep como está: dê a URL base, a sua chave e um id de modelo. Em Python e em JavaScript.

Verificado em 29 de outubro de 2026

Instale e conecte

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)

No JavaScript, a URL base vai dentro de configuration, não no nível de cima. Um baseURL no nível de cima é ignorado, e a chamada vai para o host padrão com a sua chave do 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)

Em Python, o ChatOpenAI pede o uso em um stream só para o host padrão dele. Defina stream_usage=True para receber as contagens de tokens com uma URL base própria. O cliente JavaScript pede por conta própria. Veja Streaming.

Chamada de ferramentas

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

Os dois modelos chamam ferramentas. Agentes do LangChain construídos com bind_tools funcionam do mesmo jeito. with_structured_output envia response_format com um schema JSON, que o deepseek-v4.1-flash-uncensored aceita e o GLM descarta. Use o DeepSeek para saída estruturada. Veja Chamadas de ferramentas e Saída em JSON.

Raciocínio e amostradores

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
)

O DeepSeek responde de imediato, a menos que você peça para pensar. Dê espaço a uma chamada com raciocínio: o raciocínio conta no max_tokens.

Armadilhas

  • `reasoning_effort` aceita só os valores do próprio modelo. deepseek-v4.1-flash-uncensored aceita none, low, high, max; glm-5.3-flash-uncensored aceita low, high. Os valores minimal, medium e xhigh de outros apps rodam no nível mais próximo do modelo (medium como high, xhigh como max onde o modelo tem esse nível); qualquer outro valor recebe 400 invalid_reasoning_effort. Veja Raciocínio.
  • O GLM escolhe as próprias ferramentas. glm-5.3-flash-uncensored aceita só tool_choice auto ou none. Forçar uma ferramenta (required, ou citar uma função) recebe 400 unsupported_tool_choice. Use o DeepSeek quando precisar forçar uma.
  • Campos que um modelo não aceita são descartados, não recusados. A chamada ainda responde, e o cabeçalho de resposta x-nokeep-ignored diz o que ficou de fora. O GLM mantém só tools, tool_choice e reasoning_effort, então seus temperature e response_format são descartados. Veja quais campos cada modelo aceita.
  • Partes de conteúdo são só texto e imagens. As partes image_url funcionam no deepseek-v4.1-flash-uncensored; o GLM lê apenas texto. Partes de áudio e de arquivo (um PDF) recebem 400 unsupported_input.
  • `n` tem de ser 1. Para pedir várias respostas, faça várias chamadas.
  • Só chat completions. Não existem /v1/responses nem /v1/embeddings; um framework que usa algum deles por padrão precisa ser apontado para chat completions, e embeddings precisam de outro provedor.

ChatOpenAI(use_responses_api=True) e o useResponsesApi: true do JavaScript chamam /v1/responses, que o nokeep não tem. Deixe-os desligados.

Perguntas

Preciso de um pacote do LangChain para usar o nokeep?

Não. O langchain-openai em Python e o @langchain/openai em JavaScript funcionam com qualquer API compatível com a OpenAI. Defina a URL base como https://nokeep.ai/v1.

Qual modelo um agente do LangChain deve usar?

deepseek-v4.1-flash-uncensored para a maioria dos agentes: ele lê imagens, aceita todos os amostradores e pode ser levado a chamar uma ferramenta. O glm-5.3-flash-uncensored custa menos, mas escolhe as próprias ferramentas.