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