Перейти к содержанию
Вся документация

Код

LangChain

ChatOpenAI из LangChain работает с nokeep как есть: укажите базовый адрес, ключ и id модели. Есть и для Python, и для JavaScript.

Проверено 29 октября 2026 г.

Установка и подключение

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 базовый адрес указывается внутри 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 запрашивает подсчёт на потоке только для своего адреса по умолчанию. Задайте 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"])

Обе модели вызывают инструменты. Агенты LangChain, построенные на bind_tools, работают так же. with_structured_output отправляет response_format с JSON-схемой: её принимает 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. Чтобы получить несколько ответов, делайте несколько вызовов.
  • Только chat completions. Нет /v1/responses и /v1/embeddings. Фреймворк, который по умолчанию использует один из них, нужно перенастроить на chat completions, а embeddings берутся у другого провайдера.

ChatOpenAI(use_responses_api=True) и JavaScript-опция useResponsesApi: true обращаются к /v1/responses, которого у nokeep нет. Не включайте их.

Вопросы

Нужен ли пакет LangChain для nokeep?

Нет. langchain-openai в Python и @langchain/openai в JavaScript работают с любым API, совместимым с OpenAI. Укажите базовый адрес https://nokeep.ai/v1.

Какую модель должен использовать агент LangChain?

deepseek-v4.1-flash-uncensored для большинства агентов: он читает изображения, принимает все сэмплеры и может быть настроен на вызов инструмента. glm-5.3-flash-uncensored дешевле, но сам выбирает инструменты.