Guide de démarrage : appeler vos propres fonctions

Dans ce guide de démarrage, vous décrivez une fonction Python à un modèle, laissez le modèle la demander quand une question en a besoin, exécutez la fonction et envoyez le résultat au modèle pour qu'il puisse répondre. Comptez environ 10 minutes. Ce schéma, appelé function calling, relie un modèle à vos propres données et systèmes. Pour toutes les options, consultez Function calling.

Avant de commencer

Avant de commencer

Configurez votre environnement

Configurez votre environnement

Créez un projet, installez le SDK Mistral et exportez votre clé API :

uv init call-functions --python 3.12 && cd call-functions
uv add mistralai
export MISTRAL_API_KEY="your-api-key"
1. Écrire le script

1. Écrire le script

Créez le fichier functions.py. Il définit get_order_status, la décrit au modèle en tant qu'outil et exécute l'échange en trois étapes :

import json
import os

from mistralai.client import Mistral

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])


def get_order_status(order_id: str) -> dict:
    """Your own code. Here, a lookup in a small table."""
    orders = {"A-1042": "shipped", "A-1043": "in preparation"}
    return {"order_id": order_id, "status": orders.get(order_id, "unknown")}


tools = [
    {
        "type": "function",
        "function": {
            "name": "get_order_status",
            "description": "Get the delivery status of an order.",
            "parameters": {
                "type": "object",
                "properties": {
                    "order_id": {"type": "string", "description": "The order ID, for example A-1042."},
                },
                "required": ["order_id"],
            },
        },
    }
]

messages = [{"role": "user", "content": "Where is my order A-1042?"}]

# 1. The model reads the question and asks for get_order_status.
response = client.chat.complete(model="mistral-small-latest", messages=messages, tools=tools)
assistant = response.choices[0].message
messages.append(assistant.model_dump(exclude_unset=True))

# 2. Your code runs the function and adds its result to the conversation.
for call in assistant.tool_calls or []:
    raw = call.function.arguments
    args = json.loads(raw) if isinstance(raw, str) else raw
    print(f"Model asked for: {call.function.name}({args})")
    result = get_order_status(**args)
    messages.append(
        {
            "role": "tool",
            "name": call.function.name,
            "tool_call_id": call.id,
            "content": json.dumps(result),
        }
    )

# 3. The model answers the question with the result.
final = client.chat.complete(model="mistral-small-latest", messages=messages, tools=tools)
print(final.choices[0].message.content)

Le modèle n'exécute jamais votre code : il renvoie le nom de la fonction et ses arguments, et votre script décide de l'exécuter ou non. Dans votre propre code, vérifiez le nom et les arguments avant d'exécuter quoi que ce soit.

2. L'exécuter

2. L'exécuter

uv run functions.py
Vous devriez voir

Vous devriez voir

L'appel de fonction demandé par le modèle, puis une réponse construite à partir de son résultat. La formulation de la réponse varie d'une exécution à l'autre :

Model asked for: get_order_status({'order_id': 'A-1042'})
Your order A-1042 has been shipped.
Aller plus loin

Aller plus loin