Код
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 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)В 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 дешевле, но сам выбирает инструменты.