Aller au contenu
Toute la documentation

Code

LlamaIndex

Utilisez la classe OpenAILike de LlamaIndex avec l’URL de base, votre clé et un identifiant de modèle. Réglez quatre indicateurs qu’il ne peut pas deviner, et le reste de LlamaIndex fonctionne par-dessus.

Vérifié le 29 octobre 2026

Installer et connecter

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 envoie des chat completions. Sans lui, LlamaIndex appelle /v1/completions, que nokeep ne propose pas.
  • is_function_calling_model=True permet aux agents et à chat_with_tools d’envoyer des outils.
  • context_window vaut 3 900 jetons par défaut ; LlamaIndex tronque donc les longs chats et les textes récupérés pour tenir. Réglez-le sur le contexte réel du modèle : 1 000 000 pour DeepSeek, 128 000 pour GLM.
  • temperature vaut 0,1 par défaut, ce qui rend la fiction plate et répétitive. Réglez la vôtre.

Chat et flux

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)

Outils et agents

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

Pour un seul appel avec outils et sans boucle, utilisez llm.chat_with_tools([tool], user_msg=...) et lisez les appels avec llm.get_tool_calls_from_response(...). Voir Appels d’outils.

Réflexion et autres champs

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 part tel quel dans chaque requête. La réflexion compte dans max_tokens, donc laissez-lui de la place. Voir Réflexion.

Pièges

  • `reasoning_effort` n’accepte que les valeurs du modèle. deepseek-v4.1-flash-uncensored accepte none, low, high, max ; glm-5.3-flash-uncensored accepte low, high. Les valeurs minimal, medium et xhigh d’autres applications passent au niveau le plus proche du modèle (medium devient high, xhigh devient max quand le modèle le propose) ; toute autre valeur reçoit 400 invalid_reasoning_effort. Voir Réflexion.
  • GLM choisit lui-même ses outils. glm-5.3-flash-uncensored n’accepte que tool_choice auto ou none. Forcer un outil (required, ou nommer une fonction) reçoit 400 unsupported_tool_choice. Utilisez DeepSeek si vous devez en forcer un.
  • Les champs qu’un modèle ne peut pas prendre sont écartés, pas refusés. L’appel répond quand même, et l’en-tête de réponse x-nokeep-ignored nomme ce qui a été laissé de côté. GLM ne garde que tools, tool_choice et reasoning_effort : son temperature et son response_format sont donc écartés. Voir les champs acceptés par chaque modèle.
  • `n` doit valoir 1. Pour plusieurs réponses, faites plusieurs appels.
  • Chat completions uniquement. Il n’y a ni /v1/responses ni /v1/embeddings ; un framework qui utilise l’un des deux par défaut doit être dirigé vers chat completions, et les embeddings demandent un autre fournisseur.

Pour une application RAG, réglez Settings.llm = llm et gardez votre modèle d’embeddings là où il est : nokeep fait tourner le modèle de chat, pas les embeddings. Avec glm-5.3-flash-uncensored, la temperature que LlamaIndex envoie à chaque appel est écartée et nommée dans x-nokeep-ignored.

Questions

Pourquoi OpenAILike et non OpenAI ?

La classe OpenAI de LlamaIndex vérifie le nom du modèle dans sa propre liste et refuse les noms qu’elle ne connaît pas. OpenAILike accepte n’importe quel nom et n’importe quelle URL de base.

LlamaIndex indexe-t-il mes documents sur nokeep ?

Non. L’indexation et les embeddings tournent là où vous les avez configurés. Seuls les appels de chat atteignent nokeep, et nokeep ne garde que le nombre de jetons de chaque appel.