Код
LlamaIndex
Используйте класс OpenAILike из LlamaIndex с базовым URL, вашим ключом и id модели. Задайте четыре флага, которые он не может угадать, а остальная часть LlamaIndex работает поверх.
Проверено 29 октября 2026 г.
Установка и подключение
pip install llama-index-core llama-index-llms-openai-like
export NOKEEP_API_KEY="sk-nokeep-test" # your own key once it connectsimport os
from llama_index.llms.openai_like import OpenAILike
llm = OpenAILike(
model="deepseek-v4.1-flash-uncensored",
api_base="https://nokeep.ai/v1",
api_key=os.environ["NOKEEP_API_KEY"],
is_chat_model=True,
is_function_calling_model=True,
context_window=1000000,
temperature=0.8,
)
print(llm.complete("Name three good names for a tavern.").text)is_chat_model=Trueотправляет chat completions. Без него LlamaIndex вызывает/v1/completions, которого у nokeep нет.is_function_calling_model=Trueпозволяет агентам иchat_with_toolsотправлять инструменты.context_windowпо умолчанию равен 3 900 токенам, поэтому LlamaIndex обрезает длинные чаты и найденный текст, чтобы они влезли. Укажите реальный контекст модели: 1 000 000 для DeepSeek, 128 000 для GLM.temperatureпо умолчанию равен 0.1, из-за этого художественный текст выходит плоским и повторяющимся. Задайте своё значение.
Чат и потоковая передача
from llama_index.core.llms import ChatMessage
messages = [
ChatMessage(role="system", content="You are a blunt editor."),
ChatMessage(role="user", content="Cut this opening line to ten words: ..."),
]
print(llm.chat(messages).message.content)
for part in llm.stream_chat(messages):
print(part.delta, end="", flush=True)Инструменты и агенты
import asyncio
from llama_index.core.agent.workflow import FunctionAgent
def get_weather(city: str) -> str:
"""Get the weather in a city."""
return f"18°C and clear in {city}"
agent = FunctionAgent(
tools=[get_weather],
llm=llm,
system_prompt="You answer questions about the weather.",
)
async def main():
print(await agent.run("What's the weather in Lisbon?"))
asyncio.run(main())Для одного вызова с инструментами без цикла используйте llm.chat_with_tools([tool], user_msg=...) и читайте вызовы через llm.get_tool_calls_from_response(...). См. Вызовы инструментов.
Размышления и другие поля
import os
from llama_index.llms.openai_like import OpenAILike
thinker = OpenAILike(
model="deepseek-v4.1-flash-uncensored",
api_base="https://nokeep.ai/v1",
api_key=os.environ["NOKEEP_API_KEY"],
is_chat_model=True,
context_window=1000000,
max_tokens=4000,
additional_kwargs={"reasoning_effort": "high", "min_p": 0.05},
)additional_kwargs попадает в каждый запрос как есть. Размышления входят в 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_choiceautoилиnone. Принудительный выбор инструмента (requiredили имя функции) получает400 unsupported_tool_choice. Если нужно принудительно выбрать инструмент, используйте DeepSeek. - Поля, которые модель не принимает, отбрасываются, а не отклоняются. Вызов всё равно получает ответ, а заголовок ответа
x-nokeep-ignoredназывает, что было пропущено. GLM оставляет толькоtools,tool_choiceиreasoning_effort, поэтому егоtemperatureиresponse_formatотбрасываются. См. какие поля принимает каждая модель. - `n` должен быть 1. Чтобы получить несколько ответов, делайте несколько вызовов.
- Только chat completions. Нет
/v1/responsesи/v1/embeddings; фреймворк, который по умолчанию использует одно из них, нужно направить на chat completions, а эмбеддинги нужны от другого провайдера.
Для RAG-приложения задайте Settings.llm = llm и оставьте модель эмбеддингов на месте: nokeep запускает чат-модель, а не эмбеддинги. С glm-5.3-flash-uncensored temperature, которое LlamaIndex отправляет при каждом вызове, отбрасывается и называется в x-nokeep-ignored.
Вопросы
Почему OpenAILike, а не OpenAI?
Класс OpenAI в LlamaIndex сверяет имя модели со своим списком и отказывается от незнакомых имён. OpenAILike принимает любое имя и любой базовый URL.
Индексирует ли LlamaIndex мои документы на nokeep?
Нет. Индексация и эмбеддинги работают там, где вы их настроили. До nokeep доходят только чат-вызовы, и nokeep хранит только количество токенов для каждого из них.