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

Código

LlamaIndex

Use a classe OpenAILike do LlamaIndex com a URL base, sua chave e um id de modelo. Defina quatro flags que ela não consegue adivinhar, e o resto do LlamaIndex funciona por cima.

Verificado em 29 de outubro de 2026

Instalar e conectar

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 envia chat completions. Sem ele, o LlamaIndex chama /v1/completions, que o nokeep não tem.
  • is_function_calling_model=True permite que agentes e chat_with_tools enviem ferramentas.
  • context_window vem por padrão com 3.900 tokens, então o LlamaIndex corta conversas longas e textos recuperados para caber. Defina o contexto real do modelo: 1.000.000 para o DeepSeek, 128.000 para o GLM.
  • temperature vem por padrão com 0,1, o que deixa a ficção sem graça e repetitiva. Defina a sua.

Chat e streaming

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)

Ferramentas e agentes

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

Para uma chamada com ferramentas e sem loop, use llm.chat_with_tools([tool], user_msg=...) e leia as chamadas com llm.get_tool_calls_from_response(...). Veja Chamadas de ferramentas.

Raciocínio e outros campos

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 vai em cada requisição exatamente como está. O raciocínio conta no max_tokens, então dê espaço a ele. Veja Raciocínio.

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.
  • `n` tem de ser 1. Para pedir várias respostas, faça várias chamadas.
  • Só chat completions. Não existe /v1/responses nem /v1/embeddings; um framework que usa um dos dois por padrão precisa ser apontado para chat completions, e embeddings precisam de outro provedor.

Para um app de RAG, defina Settings.llm = llm e mantenha seu modelo de embeddings onde está: o nokeep roda o modelo de chat, não os embeddings. Com glm-5.3-flash-uncensored, o temperature que o LlamaIndex envia em toda chamada é descartado e aparece em x-nokeep-ignored.

Perguntas

Por que OpenAILike e não OpenAI?

A classe OpenAI do LlamaIndex confere o nome do modelo com a lista dela e recusa nomes que não conhece. OpenAILike aceita qualquer nome e qualquer URL base.

O LlamaIndex indexa meus documentos no nokeep?

Não. A indexação e os embeddings rodam onde você os configurou. Só as chamadas de chat chegam à nokeep, e o nokeep guarda apenas a contagem de tokens de cada uma.