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

Код

LlamaIndex

Используйте класс OpenAILike из LlamaIndex с базовым URL, вашим ключом и id модели. Задайте четыре флага, которые он не может угадать, а остальная часть LlamaIndex работает поверх.

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

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

Shell
pip install llama-index-core llama-index-llms-openai-like
export NOKEEP_API_KEY="sk-nokeep-test"  # your own key once it connects
llm.py
import 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, из-за этого художественный текст выходит плоским и повторяющимся. Задайте своё значение.

Чат и потоковая передача

Python
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)

Инструменты и агенты

Python
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(...). См. Вызовы инструментов.

Размышления и другие поля

Python
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_choice auto или 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 хранит только количество токенов для каждого из них.