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
- Une clé API Mistral. Pour en créer une, consultez Créer votre première clé API.
- Python 3.10 ou version ultérieure et uv.
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
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
uv run functions.pyVous 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.