Utilisation de l'IA
Utiliser l’intelligence artificielle pour corriger une question ouverte (qui n'est pas une réponse proposée dans un QCM mais demande la saisie de texte) dans un quiz JavaScript/React.
Notions théoriques
Pourquoi une question ouverte ?
Jusqu’à présent, notre quiz Cyber permettait de répondre à des questions à choix multiples (QCM).
Ce format est très pratique pour :
- Corriger automatiquement
- Donner un score rapide
- Proposer une expérience fluide
Mais il ne permet pas de vérifier la compréhension réelle de l’élève.
C’est pourquoi nous allons ajouter une question ouverte, où l’utilisateur doit écrire une réponse avec ses propres mots.
Comment corriger automatiquement ?
Corriger une réponse ouverte est plus complexe qu’un QCM.
Il faut :
- Analyser le sens de la réponse
- Déterminer si elle est correcte ou non
- Fournir un feedback personnalisé
Pour cela, nous allons faire appel à un modèle d’intelligence artificielle via une API.
Quelle API utiliser ?

Nous allons utiliser OpenRouter, une alternative gratuite à OpenAI.
- OpenRouter est gratuit dans sa version de base
- OpenRouter fonctionne avec une clé API que vous pouvez obtenir facilement
- OpenRouter permet d’accéder à des modèles comme GPT-3.5 ou Mistral
OpenRouter propose par exemple Mistral 7B Instruct, qui est très performants et gratuits à utiliser.
Voici la liste des modèles de génération de textes, gratuits, à faibles latences, disponibles sur OpenRouter :
Comment fonctionne l’API OpenRouter ?
L’API d’OpenRouter fonctionne comme celle d’OpenAI :
- Vous envoyez un prompt (texte d’instruction)
- Vous recevez une réponse générée par l’IA
Nous allons créer un prompt du type :
"Voici une question de cybersécurité. Évalue la réponse de l'utilisateur et dis-moi si elle est correcte. Puis donne un commentaire personnalisé."
Exemple pratique
Voici un exemple de composant React qui utilise OpenRouter pour analyser une réponse libre :
"use client";
import { useState } from "react";
export default function QuestionOuverte() {
const [reponse, setReponse] = useState("");
const [resultat, setResultat] = useState("");
async function analyserReponse() {
const prompt = `
Tu es un professeur de cybersécurité.
Voici la question : "Qu'est-ce qu'une attaque de phishing ?"
Voici la réponse de l'élève : "${reponse}"
Ta mission : dis si c'est correct ou non, et donne un commentaire personnalisé.
Réponds en une phrase.
`;
const response = await fetch("https://openrouter.ai/api/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": "Bearer VOTRE_CLE_API_OPENROUTER",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "mistralai/mistral-7b-instruct", // ou "openai/gpt-3.5-turbo"
messages: [{ role: "user", content: prompt }]
})
});
const data = await response.json();
setResultat(data.choices[0].message.content);
}
return (
<div className="max-w-xl mx-auto mt-10">
<h2 className="text-2xl font-bold mb-4">Question ouverte</h2>
<p className="mb-2">Qu'est-ce qu'une attaque de phishing ?</p>
<textarea
className="w-full border p-2 rounded"
rows={4}
value={reponse}
onChange={(e) => setReponse(e.target.value)}
/>
<button
onClick={analyserReponse}
className="mt-4 px-4 py-2 bg-blue-600 text-white rounded"
>
Envoyer ma réponse
</button>
{resultat && (
<div className="mt-6 p-4 bg-gray-100 rounded border">
<strong>Analyse de l'IA :</strong>
<p>{resultat}</p>
</div>
)}
</div>
);
}
Quelques méthodes à connaître
1. fetch()
fetch()pour appeler une API externe
const response = await fetch("https://openrouter.ai/api/v1/chat/completions", { ... });
2. JSON.stringify()
JSON.stringify()pour envoyer un objet JSON
3. Authorization: Bearer ...
Authorization: Bearer <jeton>pour s’authentifier avec une clé d'API.
Le préfixe Bearer dans l'en-tête HTTP Authorization indique que le schéma d'authentification utilisé est un token d'accès de type Bearer.
Que signifie le terme Bearer en informatique ?
- Bearer signifie "porteur" en anglais.
En informatique, un bearer token est un jeton d'accès qui accorde des droits à quiconque le possède (le "porteur"), sans nécessiter de preuve supplémentaire de possession (comme une clé cryptographique).
Toute personne ou entité présentant ce jeton peut l'utiliser pour accéder aux ressources protégées.
Voici comment l'utiliser dans une requête HTTP :
Authorization: Bearer <jeton>
Exemple :
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx
- Très répandu dans les API REST modernes (ex. : Google APIs, GitHub, etc.).
- Le token est généralement obtenu après une authentification (login), et transmis ensuite pour chaque requête protégée.
- Sécurité importante : Les bearer tokens doivent toujours être transmis via HTTPS (TLS), car quiconque intercepte le jeton peut l'utiliser.
Bonne pratique : sécuriser la clé API
- Il ne faut jamais afficher une clé API côté client, car le code exécuté dans le navigateur est visible par tous.
- Une clé exposée peut être copiée et utilisée par des personnes malveillantes, entraînant des frais ou des abus.
- Pour protéger cette clé, on doit l’utiliser uniquement dans du code exécuté côté serveur (comme une API route dans Next.js).