Aller au contenu principal
Velqa

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

  1. Vous envoyez la requête avec la liste tools (schémas de fonctions).
  2. Le modèle répond avec finish_reason: "tool_calls" et un ou plusieurs tool_calls.
  3. Vous exécutez la/les fonction(s) dans votre code.
  4. 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 assistant contenant les tool_calls à l'historique avant les messages tool, sinon le modèle perd le lien.
  • Le tool_call_id du message tool doit correspondre à l'id du tool_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.