# Journaliser un appel à une API de LLM pour en suivre le coût réel

> Mettre en place une journalisation détaillée des appels à un modèle de langage pour pouvoir justifier une facturation à un client final.

- Auteur : WordPress Développement
- Publié le : 2023-11-27
- Mis à jour le : 2023-11-27
- Catégorie : IA &amp; MCP
- URL : https://www.wpmoderne.fr/ia-mcp/journaliser-cout-appel-api-llm/

## L’essentiel

- Le nombre de jetons consommés varie fortement d'un appel à l'autre
- Une table dédiée permet un suivi plus fin qu'un simple fichier de log
- Le détail par fonctionnalité facilite la discussion avec le client

Combien coûte, chaque mois, l'assistant de rédaction intégré à un site pour un client qui facture cette fonctionnalité en supplément à ses propres clients ? Sans journalisation dédiée, la réponse tient dans une facture globale du fournisseur d'API, sans détail permettant de savoir quelle fonctionnalité du site consomme quoi. Cette opacité complique toute discussion sur l'évolution du tarif proposé.

Une table de journalisation dédiée, distincte des journaux d'erreurs habituels, répond directement à ce besoin en conservant une trace structurée de chaque appel effectué.

## Créer une table de suivi dédiée

Une table personnalisée, créée lors de l'activation du plugin via `dbDelta()`, conserve un enregistrement par appel, avec les informations nécessaires à une analyse ultérieure :

```
function creer_table_journal_ia() {
    global $wpdb;
    $table = $wpdb->prefix . 'journal_appels_ia';
    $charset = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table (
        id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        fonctionnalite VARCHAR(50) NOT NULL,
        jetons_entree INT UNSIGNED NOT NULL,
        jetons_sortie INT UNSIGNED NOT NULL,
        cout_estime DECIMAL(10,5) NOT NULL,
        date_appel DATETIME NOT NULL
    ) $charset;";

    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    dbDelta( $sql );
}
register_activation_hook( __FILE__, 'creer_table_journal_ia' );
```

## Enregistrer chaque appel après réception de la réponse

> L'essentiel à retenir : Le nombre de jetons consommés varie fortement d'un appel à l'autre ; Une table dédiée permet un suivi plus fin qu'un simple fichier de log ; Le détail par fonctionnalité facilite la discussion avec le client

La plupart des API de modèles de langage renvoient, dans leur réponse, le détail des jetons consommés en entrée et en sortie. Ce détail permet de calculer un coût estimé, à condition de connaître le tarif par jeton appliqué par le fournisseur au moment de l'appel :

```
function journaliser_appel_ia( string $fonctionnalite, array $usage ): void {
    global $wpdb;

    $tarif_entree  = 0.0000005;
    $tarif_sortie  = 0.0000015;

    $cout = ( $usage['prompt_tokens'] * $tarif_entree )
          + ( $usage['completion_tokens'] * $tarif_sortie );

    $wpdb->insert( $wpdb->prefix . 'journal_appels_ia', array(
        'fonctionnalite' => $fonctionnalite,
        'jetons_entree'  => $usage['prompt_tokens'],
        'jetons_sortie'  => $usage['completion_tokens'],
        'cout_estime'    => $cout,
        'date_appel'     => current_time( 'mysql' ),
    ) );
}
```

### Nommer les fonctionnalités de façon cohérente

Le champ `fonctionnalite` mérite une convention de nommage stable dès le départ, par exemple un identifiant court comme `resume_article` ou `traduction_fiche`, plutôt qu'un texte libre qui varierait d'un appel à l'autre et rendrait les regroupements ultérieurs plus difficiles.

## Construire un tableau de synthèse mensuel

Une requête d'agrégation, exécutée à la demande ou plus régulièrement via une tâche planifiée, produit un tableau de synthèse par fonctionnalité :

```
SELECT fonctionnalite,
       COUNT(*) AS nb_appels,
       SUM(jetons_entree + jetons_sortie) AS total_jetons,
       SUM(cout_estime) AS cout_total
FROM wp_journal_appels_ia
WHERE date_appel >= DATE_SUB(NOW(), INTERVAL 1 MONTH)
GROUP BY fonctionnalite
ORDER BY cout_total DESC;
```

## Présenter ce détail au client

Ce tableau, une fois présenté au client sous une forme lisible, change la nature de la discussion tarifaire. Plutôt que de négocier un forfait forfaitaire sans repère, le client visualise directement quelle fonctionnalité consomme le plus, et peut décider en connaissance de cause de restreindre son usage plutôt que de renoncer entièrement à l'assistant.

- Un tableau par fonctionnalité plutôt qu'un total unique difficile à interpréter
- Une tendance sur plusieurs mois plutôt qu'un instantané isolé
- Une marge de sécurité affichée entre le coût estimé et le coût réellement facturé par le fournisseur

> Un coût variable devient acceptable pour un client dès lors qu'il peut en observer le détail : l'opacité inquiète toujours plus que le montant lui-même.

## En résumé

Une table de journalisation dédiée, alimentée à chaque appel, transforme une dépense variable difficile à expliquer en un indicateur suivi et présentable. Ce suivi devient l'appui principal d'une discussion tarifaire sereine avec un client qui facture cette fonctionnalité à son propre public.
