vendredi 25 septembre 2026

À propos

Contact

IA & MCP

Function calling des LLM : relier un modèle à vos fonctions WordPress

Décrire vos fonctions WordPress en JSON Schema, laisser le modèle choisir quel appel faire, et exécuter ce choix côté PHP de façon strictement contrôlée.

Par Clément Hadrot • 8 septembre 2023 • 5 min de lecture • Aucun commentaire
Function calling des LLM : relier un modèle à vos fonctions WordPress

La confusion la plus fréquente sur le function calling, chez les développeurs qui le découvrent, tient en une phrase mal comprise : non, le modèle de langage n’exécute jamais votre code. Il se contente de répondre qu’il souhaiterait appeler une fonction précise, avec des arguments précis, sous forme d’un objet JSON. C’est votre PHP qui décide, ensuite, s’il exécute réellement cet appel.

Cette distinction change tout dans la manière de concevoir une intégration. Voici comment relier un modèle à un petit ensemble de fonctions WordPress, en gardant le contrôle à chaque étape.

Décrire une fonction WordPress en JSON Schema

Le function calling repose sur un principe simple : vous décrivez au modèle, dans la requête, la liste des fonctions disponibles, leur nom, leur description en langage naturel, et le schéma JSON de leurs arguments. Le modèle utilise cette description pour décider s’il doit appeler une fonction et avec quels paramètres.

{
  "name": "rechercher_articles",
  "description": "Recherche des articles publiés sur le site par mot-clé et catégorie.",
  "parameters": {
    "type": "object",
    "properties": {
      "mot_cle": {
        "type": "string",
        "description": "Le terme à rechercher dans le titre et le contenu."
      },
      "categorie": {
        "type": "string",
        "description": "Le slug de la catégorie à filtrer, optionnel."
      },
      "nombre_resultats": {
        "type": "integer",
        "description": "Nombre maximum de résultats, entre 1 et 10."
      }
    },
    "required": ["mot_cle"]
  }
}

Envoyer cette description dans la requête à l’API

Cette description accompagne le message de l’utilisateur dans l’appel à l’API du modèle. Selon le fournisseur, elle se place dans un tableau tools ou functions de la requête. Le modèle répond alors soit par du texte classique, soit par une demande d’appel de fonction contenant le nom choisi et les arguments au format JSON.

$reponse = wp_remote_post( 'https://api.openai.com/v1/chat/completions', array(
    'timeout' => 20,
    'headers' => array(
        'Authorization' => 'Bearer ' . WPM_LLM_API_KEY,
        'Content-Type'  => 'application/json',
    ),
    'body'    => wp_json_encode( array(
        'model'    => 'gpt-4o-mini',
        'messages' => array(
            array( 'role' => 'user', 'content' => $question_utilisateur ),
        ),
        'tools'    => array(
            array( 'type' => 'function', 'function' => $schema_rechercher_articles ),
        ),
    ) ),
) );
L'essentiel à retenir : Le modèle choisit, PHP exécute ; JSON Schema décrit chaque fonction ; Aucun appel sans vérification des permissions

Exécuter l’appel demandé, jamais à l’aveugle

Une fois la réponse reçue, on vérifie d’abord que le modèle a bien demandé un appel de fonction, puis on décode les arguments avec json_decode() et on les valide avant toute exécution. Le nom de la fonction demandée est comparé à une liste blanche fixe, jamais exécuté dynamiquement avec call_user_func() à partir d’une chaîne fournie par le modèle sans contrôle.

function wpm_executer_appel_fonction( $nom_fonction, $arguments_bruts ) {
    $arguments = json_decode( $arguments_bruts, true );

    if ( 'rechercher_articles' !== $nom_fonction ) {
        return new WP_Error( 'wpm_fonction_inconnue', 'Fonction non autorisée.' );
    }

    if ( empty( $arguments['mot_cle'] ) ) {
        return new WP_Error( 'wpm_argument_manquant', 'Le mot-clé est requis.' );
    }

    $query = new WP_Query( array(
        's'         => sanitize_text_field( $arguments['mot_cle'] ),
        'category_name' => isset( $arguments['categorie'] ) ? sanitize_title( $arguments['categorie'] ) : '',
        'posts_per_page' => min( 10, absint( $arguments['nombre_resultats'] ?? 5 ) ),
    ) );

    return wp_list_pluck( $query->posts, 'post_title', 'ID' );
}

Renvoyer le résultat au modèle pour la réponse finale

Le résultat de la fonction est ensuite renvoyé au modèle dans un second appel, avec le rôle tool ou function selon le fournisseur, pour que le modèle formule une réponse finale en langage naturel à partir des données réelles renvoyées par WordPress, plutôt que d’inventer une réponse plausible.

Pourquoi ce va-et-vient est une garantie de fiabilité

Ce mécanisme en deux appels évite un défaut classique des LLM seuls : répondre avec assurance à une question qui nécessite des données à jour, en inventant un résultat vraisemblable. Avec le function calling, la réponse finale s’appuie sur les données réellement présentes dans la base WordPress au moment de la requête.

Les permissions restent votre responsabilité, pas celle du modèle

Le modèle ne connaît rien des capacités WordPress. Chaque fonction exposée doit vérifier elle-même les droits de l’utilisateur courant avec current_user_can() avant d’exécuter la moindre action, et particulièrement avant toute fonction qui modifie des données plutôt que de simplement les lire.

Le function calling déplace la décision « quoi faire » vers le modèle, mais la décision « est-ce autorisé » doit toujours rester en PHP, sans exception.

Notre verdict

Bien conçu, le function calling permet de construire des assistants qui interrogent réellement le contenu d’un site WordPress plutôt que de deviner. La discipline à tenir est constante : liste blanche de fonctions, validation stricte des arguments, vérification des permissions à chaque appel. Cette approche prépare d’ailleurs le terrain à des standards plus récents pour exposer des fonctions à des agents, que nous aborderons séparément.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi