Tool calling / function calling avec Velqa — style OpenAI
Le tool calling permet à un modèle d'appeler vos fonctions : vous décrivez des outils dans le paramètre tools, le modèle répond avec des tool_calls, vous exécutez la fonction correspondante puis renvoyez le résultat dans un message role: "tool". Velqa suit le format OpenAI à l'identique — pointez simplement votre base_url sur https://api.velqa.dev/v1.
Le cycle en 4 étapes
- Vous envoyez la requête avec la liste
tools(schémas de fonctions). - Le modèle répond avec
finish_reason: "tool_calls"et un ou plusieurstool_calls. - Vous exécutez la/les fonction(s) dans votre code.
- Vous renvoyez le résultat dans un message
{"role": "tool", ...}, puis rappelez le modèle pour obtenir la réponse finale.
Exemple complet en Python (outil get_weather)
import json
from openai import OpenAI
client = OpenAI(base_url="https://api.velqa.dev/v1", api_key="sk-...")
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Renvoie la météo actuelle d'une ville.",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "Nom de la ville"}
},
"required": ["city"],
},
},
}
]
# Votre implémentation réelle appellerait une API météo.
def get_weather(city):
return {"city": city, "temp_c": 24, "condition": "ensoleillé"}
messages = [{"role": "user", "content": "Quel temps fait-il à Rabat ?"}]
# Étape 1-2 : le modèle décide d'appeler l'outil
resp = client.chat.completions.create(
model="kimi-k2.6",
messages=messages,
tools=tools,
)
msg = resp.choices[0].message
messages.append(msg) # on garde l'appel d'outil dans l'historique
# Étape 3 : on exécute chaque tool_call
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = get_weather(**args)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": json.dumps(result),
})
# Étape 4 : le modèle produit la réponse finale à partir du résultat
final = client.chat.completions.create(
model="kimi-k2.6",
messages=messages,
tools=tools,
)
print(final.choices[0].message.content)Structure d'un tool_call
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\": \"Rabat\"}"
}
}Le champ arguments est une chaîne JSON — pensez à la parser (json.loads) avant de l'utiliser.
Bonnes pratiques
- Rajoutez toujours le message
assistantcontenant lestool_callsà l'historique avant les messagestool, sinon le modèle perd le lien. - Le
tool_call_iddu messagetooldoit correspondre à l'iddutool_call. - Un modèle peut demander plusieurs outils en parallèle : bouclez sur tous les
tool_calls.
Modèles recommandés pour les outils
Le tool calling est particulièrement fiable avec kimi-k2.6, minimax-m3 et glm-4.7. Voir la liste des modèles.
Voir aussi : aperçu du chat, streaming.
