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.
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:freeounvidia/nemotron-3-nano-30b-a3b:free— tous gratuits et rapides.
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
Liste des modèles gratuits et rapides (triés par faible latence) :
https://openrouter.ai/models?fmt=cards&input_modalities=text&max_price=0&output_modalities=text&order=latency-low-to-high
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 :
- Créer un compte sur https://openrouter.ai et récupérer une clé API
- Choisir un modèle gratuit (ex :
arcee-ai/trinity-mini:free) - Envoyer une requête POST au format JSON vers l’endpoint OpenRouter
- 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
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;
}
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
TP pour réfléchir et résoudre des problèmes
Préparation
- Créez un compte sur https://openrouter.ai afin d’obtenir une clé API (token ou jeton en français).
- Rendez-vous sur la page des clés API et générez / copiez votre clé : https://openrouter.ai/settings/keys.
- Assurez-vous d’avoir PHP ≥ 7.4 installé sur votre machine (la plupart des distributions récentes l’ont déjà).
- 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 curlou viaphpinfo().
- Installez Composer si vous ne l’avez pas encore (recommandé pour gérer les dépendances proprement) : https://getcomposer.org/download/
- (Optionnel mais fortement recommandé) Installez la bibliothèque
vlucas/phpdotenvpour gérer le fichier.env.
Une solution – Préparation
Vous devez être connecté pour voir le contenu.
Étape 1 : Créez un script de base avec cURL
- Ouvrez le fichier
index.php. - Définissez la clé API (temporairement en dur pour tester – on la sécurisera ensuite).
- Choisissez un modèle gratuit rapide (exemples :
arcee-ai/trinity-mini:free,google/gemma-3n-e2b-it:free, etc.). - Préparez un tableau PHP
$datacontenantmodel,messagesettemperature. - Préparez les en-têtes HTTP dans un tableau
$headers. - Utilisez
curl_init(), configurez les options nécessaires et envoyez la requête. - Affichez la réponse brute si erreur, ou extrayez le texte de la réponse si succès.
Une solution
Vous devez être connecté pour voir le contenu.
Étape 2 : Sécurisez la clé API avec un fichier .env
- Installez
vlucas/phpdotenvsi ce n’est pas déjà fait. - Chargez le fichier
.enven début de script. - Récupérez la clé via
$_ENVougetenv(). - Ajoutez une vérification : si la clé est absente → arrêter le script avec un message clair.
Une solution
Vous devez être connecté pour voir le contenu.
Étape 3 : Rendez le script interactif (saisie utilisateur)
- Demandez à l’utilisateur de saisir une question via
fgets(STDIN). - Supprimez les espaces inutiles avec
trim(). - Injectez la question dans le tableau
$data['messages']. - Envoyez la requête et affichez la réponse.
Une solution
Vous devez être connecté pour voir le contenu.
Étape 4 : Ajoutez une boucle pour poser plusieurs questions
- Déplacez les en-têtes et la clé en dehors de la boucle.
- Créez une boucle
while (true). - Demandez la question à chaque tour.
- Permettez de quitter avec les mots « exit » ou « quit » (insensible à la casse).
- Traitez chaque question dans la boucle.
Une solution
Vous devez être connecté pour voir le contenu.
Étape 5 : Enregistrez les échanges dans un fichier Markdown
- Après chaque réponse réussie, ouvrez un fichier
log.mden mode append. - Ajoutez un horodatage, la question, la réponse et un séparateur.
- Utilisez
file_put_contents()oufopen/fwriteavecLOCK_EXpour éviter les problèmes en concurrence.
Une solution
Vous devez être connecté pour voir le contenu.