Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un comptelive_helpToutes les questions

Beachmountains
19 septembre 2024
Problème de messages groupés dans la console
Nous allons maintenant récupérer le stream envoyé depuis le backend pour l'ajouter au fur et à mesure côté frontend.
Pour ce faire, nous allons créer une nouvelle fonction asynchrone qui va récupérer le lecteur du stream, le consommer et ajouter chaque morceau au message de notre conversation.
async function readResponseChunks(reader, answerBlock) {
const decoder = new TextDecoder();
const converter = new showdown.Converter();
let chunks = "";
while (true) {
const {done, value} = await reader.read();
if (done) {
break;
}
chunks += decoder.decode(value);
answerBlock.innerHTML = converter.makeHtml(chunks);
}
}
reader correspond au lecteur que nous avons retourné dans la partie précédente (return response.body.getReader();).
gptOutput correspond au div qui contiendra le texte de la réponse de l'IA.
Nous créons ensuite deux constantes : decoder et converter.
decoder est un objet TextDecoder qui permet de lire les données du backend qui sont envoyées en bytes et les convertir en texte.
converter est un objet de la librairie showdown qui permet de convertir du texte en HTML. Pour l'utiliser, nous devons charger la librairie dans notre HTML.
Dans le fichier index.html, on rajoute donc cette balise dans le <head> :
<script src="https://unpkg.com/showdown/dist/showdown.min.js"></script>
Ajout du texte au message
Pour ajouter le texte renvoyé en morceau du backend dans le message, nous allons utiliser une boucle infinie que nous cassons (avec break) quand le stream se termine :
let chunks = "";
while (true) {
const {done, value} = await reader.read();
if (done) {
break;
}
chunks += decoder.decode(value);
gptOutput.innerHTML = converter.makeHtml(chunks);
}
L'objet ReadableStreamDefaultReader (https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultReader/read) retourne à chaque itération la valeur du stream et un booléen qui indique si le stream est terminé ou non.
Nous récupérons ces deux valeurs dans deux variables : done et value. Si done est true, nous utilisons break pour sortir de la boucle (et terminer la fonction).
Dans le cas contraire, on décode la valeur en bytes du stream avec decoder.decode et on l'ajoute à notre chunks.
Pour finir, on modifie le innerHTML du message de l'IA (gptOutput) pour ajouter le chunks converti en HTML au préalable avec converter.makeHtml.
Ajouter de la logique dans l'envoi du formulaire.
Il ne reste plus qu'à ajouter ces deux fonctions dans l'événement de l'envoi du formulaire :
document.addEventListener("DOMContentLoaded", () => {
const form = document.querySelector("#prompt-form");
const spinnerIcon = document.querySelector("#spinner-icon");
const sendIcon = document.querySelector("#send-icon");
form.addEventListener("submit", async (event) => {
event.preventDefault();
spinnerIcon.classList.remove("hidden");
sendIcon.classList.add("hidden");
// On ajoute la question de l'utilisateur
const prompt = form.elements.prompt.value;
addToLog(prompt);
// On ajoute un nouveau message de l'IA
const answerBlock = addToLog("GPT est en train de réfléchir...");
// On envoi la requête au backend
const reader = await fetchPromptResponse();
// On lit la réponse du backend et on l'ajoute au answerBlock
await readResponseChunks(reader, answerBlock);
});
});
Nous avons rajouté les lignes suivantes :
// On ajoute un nouveau message de l'IA
const answerBlock = addToLog("GPT est en train de réfléchir...");
// On envoi la requête au backend
const reader = await fetchPromptResponse();
// On lit la réponse du backend et on l'ajoute au answerBlock
await readResponseChunks(reader, answerBlock);
On commence par ajouter un nouveau message dans le fil de la conversation avec addToLog qui indique que GPT est en train de réfléchir. Cela nous permet de récupérer le div qui va contenir le message de l'IA.
Pour rappel, notre fonction addToLog clonait notre template et retournait le block du message :
function addToLog(message) {
let infoBlock = cloneAnswerBlock();
infoBlock.innerText = message;
return infoBlock;
}
Nous utilisons ensuite nos deux fonctions fetchPromptResponse et readResponseChunks pour faire la requête au backend et lire la réponse morceau par morceau pour l'ajouter dans le fil de la conversation.
Ce n'est pas fini...
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.