Aller au contenu principal

Utiliser une IA avec PHP

Comprendre comment interroger une IA, via une API REST, avec PHP

Notions théoriques

PHP, c'est quoi ?

PHP est un langage de programmation côté serveur principalement utilisé pour créer des sites web dynamiques.
Il est très populaire grâce à sa simplicité d’apprentissage et à son écosystème riche (WordPress, Laravel, Symfony, Drupal, etc.).

Voici quelques ressources pour apprendre ou se perfectionner en PHP :

Une API, c'est quoi ?

API et intelligence artificielle

Une API (Application Programming Interface) est un ensemble de règles qui permet à 2 logiciels de communiquer entre eux.

info

L’IA utilisée ici est de type LLM (Large Language Model), un modèle de traitement du langage naturel entraîné à comprendre et générer du texte.

L’API permet d’envoyer une requête à un modèle d’IA et de recevoir une réponse générée automatiquement.

Quelle API utiliser ?

Nous allons utiliser OpenRouter, une alternative gratuite (ou très économique) à OpenAI.

OpenRouter est une plateforme qui permet d’accéder à plusieurs modèles d'IA à travers une API unique :

  • OpenRouter est gratuit dans sa version de base pour de nombreux modèles
  • OpenRouter fonctionne avec une clé API que vous pouvez obtenir en quelques clics
  • OpenRouter donne accès à des modèles de fournisseurs populaires (OpenAI, Anthropic, Google, Mistral, etc.)

OpenRouter propose par exemple arcee-ai/trinity-mini:free, google/gemma-3n-e2b-it:free ou nvidia/nemotron-3-nano-30b-a3b:free — tous gratuits et rapides.

https://openrouter.ai/

astuce

Avec OpenRouter, vous n'avez pas besoin de créer un compte chez chaque fournisseur d’IA.
OpenRouter joue le rôle d’intermédiaire intelligent.

Comment fonctionne l’API OpenRouter ?

L’API d’OpenRouter est compatible avec le format de l’API Chat Completions d’OpenAI.

  • Vous envoyez un prompt (instruction + question)
  • Vous recevez une réponse générée par le modèle choisi

Pourquoi utiliser PHP ?

PHP reste l’un des langages les plus utilisés au monde pour créer des sites web dynamiques.
Il est particulièrement adapté quand :

  • votre projet est déjà en PHP (WordPress, Laravel, Symfony, etc.)
  • vous voulez ajouter une fonctionnalité d’IA directement dans un site existant
  • vous préférez ne pas ajouter une couche Python / Node.js supplémentaire

Fonctionnement général

Étapes pour utiliser OpenRouter avec PHP :

  1. Créer un compte sur https://openrouter.ai et récupérer une clé API
  2. Choisir un modèle gratuit (ex : arcee-ai/trinity-mini:free)
  3. Envoyer une requête POST au format JSON vers l’endpoint OpenRouter
  4. Lire et afficher / traiter la réponse JSON

Format d’une requête à l’API

URL de l’API :

https://openrouter.ai/api/v1/chat/completions

Exemple de corps JSON attendu :

{
"model": "arcee-ai/trinity-mini:free",
"messages": [
{
"role": "user",
"content": "Quelle est la différence entre include() et require() en PHP ?"
}
],
"temperature": 0.7
}

L’authentification se fait via l’en-tête :

Authorization: Bearer sk-or-v1-votre_clé_ici
attention

Ne jamais publier votre clé API dans un dépôt git public ou dans le code source visible côté client.


Exemple pratique

Voici un script PHP complet et commenté qui interroge OpenRouter :

<?php

// === CONFIGURATION ===
$apiKey = getenv('OPENROUTER_API_KEY') ?: 'sk-or-v1-xxxxxxxxxxxxxxxxxxxxxxxx'; // ← À sécuriser !
$model = 'arcee-ai/trinity-mini:free';

$headers = [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
];

$data = [
'model' => $model,
'messages' => [
[
'role' => 'user',
'content' => 'Quelle est la différence entre include() et require() en PHP ?'
]
],
'temperature' => 0.7,
];

// === ENVOI DE LA REQUÊTE ===
$ch = curl_init('https://openrouter.ai/api/v1/chat/completions');

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

$response = curl_exec($ch);

$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// === TRAITEMENT DE LA RÉPONSE ===
if ($httpCode === 200) {
$result = json_decode($response, true);
$answer = $result['choices'][0]['message']['content'] ?? '(réponse non trouvée)';

echo "Réponse de l'IA :\n";
echo "------------------------\n";
echo $answer . "\n";
} else {
echo "Erreur HTTP $httpCode\n";
echo $response . "\n";
}
Explications détaillées du code

1. Récupération de la clé API (sécurisée)

$apiKey = getenv('OPENROUTER_API_KEY') ?: 'sk-or-v1-xxxxxxxxxxxxxxxxxxxxxxxx';

On essaie de lire la clé depuis une variable d’environnement (recommandé en production).

2. Préparation des en-têtes

$headers = [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
];

3. Corps de la requête (payload)

$data = [
'model' => $model,
'messages' => [ /* ... */ ],
'temperature' => 0.7,
];

4. Envoi via cURL (méthode la plus fiable en PHP)

$ch = curl_init('https://openrouter.ai/api/v1/chat/completions');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$response = curl_exec($ch);

5. Gestion de la réponse

if ($httpCode === 200) {
$result = json_decode($response, true);
$answer = $result['choices'][0]['message']['content'] ?? '(réponse non trouvée)';
echo $answer;
} else {
echo "Erreur HTTP $httpCode\n";
echo $response;
}
astuce

En production, on préfère :

  • stocker la clé dans .env + vlucas/phpdotenv
  • gérer les erreurs avec des exceptions
  • ajouter un timeout raisonnable
  • logger les erreurs

Test de mémorisation / compréhension


Quel est le rôle principal d’OpenRouter ?


Quel en-tête HTTP contient la clé API OpenRouter ?


Quelle est l’URL de l’endpoint chat completions d’OpenRouter ?


Quelle fonction PHP est la plus utilisée pour envoyer une requête HTTP POST ?


Comment convertir un tableau PHP en JSON pour l’envoyer ?


Que contient généralement la clé 'choices' dans la réponse ?


Quel rôle JSON utilise-t-on pour poser une question à l’IA ?


À quoi sert le paramètre 'temperature' ?


Quel est l'avantage principal d'OpenRouter par rapport à OpenAI pour l'accès aux modèles d'IA ?


Quel est le rôle exact de la propriété 'temperature' dans une requête à l'API d'une IA ?


Quel en-tête HTTP est obligatoire pour s'authentifier auprès de l'API OpenRouter ?


Quel est le danger principal concernant la gestion des clés API ?


Quel est l'avantage principal des modèles triés par 'latency-low-to-high' sur OpenRouter ?


Que signifie le sigle 'LLM' ?


Quel est le format attendu pour le corps de la requête envoyée à OpenRouter ?


Quel est le principal avantage d'utiliser OpenRouter plutôt que de s'inscrire chez chaque fournisseur d'IA ?


Dans le script PHP, pourquoi utilise-t-on json_encode() sur le tableau $data ?


Quel est le code HTTP attendu en cas de succès d'une requête à l'API OpenRouter ?


Quelle est la meilleure pratique recommandée pour gérer les erreurs en production avec l'API OpenRouter ?



TP pour réfléchir et résoudre des problèmes

Préparation

  1. Créez un compte sur https://openrouter.ai afin d’obtenir une clé API (token ou jeton en français).
  2. Rendez-vous sur la page des clés API et générez / copiez votre clé : https://openrouter.ai/settings/keys.
  3. Assurez-vous d’avoir PHP ≥ 7.4 installé sur votre machine (la plupart des distributions récentes l’ont déjà).
  4. Vérifiez que l’extension cURL est activée (très importante pour envoyer des requêtes HTTP).
    • Sur la plupart des installations locales (XAMPP, MAMP, Laragon, etc.), elle est déjà activée.
    • Vous pouvez vérifier avec la commande : php -i | grep curl ou via phpinfo().
  5. Installez Composer si vous ne l’avez pas encore (recommandé pour gérer les dépendances proprement) : https://getcomposer.org/download/
  6. (Optionnel mais fortement recommandé) Installez la bibliothèque vlucas/phpdotenv pour gérer le fichier .env.
Une solution – Préparation

Étape 1 : Créez un script de base avec cURL

  1. Ouvrez le fichier index.php.
  2. Définissez la clé API (temporairement en dur pour tester – on la sécurisera ensuite).
  3. Choisissez un modèle gratuit rapide (exemples : arcee-ai/trinity-mini:free, google/gemma-3n-e2b-it:free, etc.).
  4. Préparez un tableau PHP $data contenant model, messages et temperature.
  5. Préparez les en-têtes HTTP dans un tableau $headers.
  6. Utilisez curl_init(), configurez les options nécessaires et envoyez la requête.
  7. Affichez la réponse brute si erreur, ou extrayez le texte de la réponse si succès.
Une solution

Étape 2 : Sécurisez la clé API avec un fichier .env

  1. Installez vlucas/phpdotenv si ce n’est pas déjà fait.
  2. Chargez le fichier .env en début de script.
  3. Récupérez la clé via $_ENV ou getenv().
  4. Ajoutez une vérification : si la clé est absente → arrêter le script avec un message clair.
Une solution

Étape 3 : Rendez le script interactif (saisie utilisateur)

  1. Demandez à l’utilisateur de saisir une question via fgets(STDIN).
  2. Supprimez les espaces inutiles avec trim().
  3. Injectez la question dans le tableau $data['messages'].
  4. Envoyez la requête et affichez la réponse.
Une solution

Étape 4 : Ajoutez une boucle pour poser plusieurs questions

  1. Déplacez les en-têtes et la clé en dehors de la boucle.
  2. Créez une boucle while (true).
  3. Demandez la question à chaque tour.
  4. Permettez de quitter avec les mots « exit » ou « quit » (insensible à la casse).
  5. Traitez chaque question dans la boucle.
Une solution

Étape 5 : Enregistrez les échanges dans un fichier Markdown

  1. Après chaque réponse réussie, ouvrez un fichier log.md en mode append.
  2. Ajoutez un horodatage, la question, la réponse et un séparateur.
  3. Utilisez file_put_contents() ou fopen/fwrite avec LOCK_EX pour éviter les problèmes en concurrence.
Une solution