Aller au contenu
Toute la documentation

Guides

Appels d’outils

Les deux modèles appellent des outils au format OpenAI : vous décrivez des fonctions, le modèle en demande une, vous l’exécutez et renvoyez le résultat.

Vérifié le 26 octobre 2026

La boucle

  1. Envoyez tools : chacun est une fonction avec un nom, une description et des paramètres JSON Schema.
  2. Quand le modèle en veut une, finish_reason de la réponse vaut tool_calls et message.tool_calls les liste, avec les arguments sous forme de chaîne JSON.
  3. Exécutez chacune, et ajoutez un message tool avec son tool_call_id et le résultat.
  4. Renvoyez la conversation. Répétez jusqu’à ce que finish_reason vaille stop.
Python
import json
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://nokeep.ai/v1",
    api_key=os.environ["NOKEEP_API_KEY"],
)

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Today's weather in a city",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    },
}]

def get_weather(city):
    return {"city": city, "high_c": 21, "sky": "clear"}

messages = [{"role": "user", "content": "Should I bring a jacket in Lisbon today?"}]
while True:
    reply = client.chat.completions.create(model="deepseek-v4.1-flash-uncensored", messages=messages, tools=tools)
    message = reply.choices[0].message
    messages.append(message)
    if not message.tool_calls:
        print(message.content)
        break
    for call in message.tool_calls:
        result = get_weather(**json.loads(call.function.arguments))
        messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})

tool_choice

ModèleAccepte
deepseek-v4.1-flash-uncensoredauto, none, required, ou une fonction nommée. Aussi parallel_tool_calls.
glm-5.3-flash-uncensoredauto ou none. Il choisit ses propres outils ; toute autre valeur donne 400 unsupported_tool_choice.

Bon à savoir

  • Chaque message tool doit porter le tool_call_id auquel il répond, sans quoi l’appel est refusé avec 400 invalid_messages.
  • Les schémas d’outils voyagent avec chaque requête et comptent comme jetons d’entrée.
  • Les modèles n’exécutent rien eux-mêmes. Votre code exécute les outils, et décide donc de ce qu’ils peuvent atteindre.