Ajout de la réponse dans le fil de la conversation

Inscris-toi

(c'est gratuit !)

Un compte est nécessaire pour participer aux discussions.

Créer un compte

Toutes les questions

Beachmountains

19 septembre 2024

Résolue
2 réponses

Problème de messages groupés dans la console

Bonjour , j'ai un problème la console me renvoie pas les messages groupés. ci dessous le code erreur ``` script.js:45 Uncaught TypeError: Cannot read properties of undefined (reading 'Html') at readResponseChunks (script.js:44:48) at async :1:1 ``` et ci- dessous l'historique de mon process. ``` addToLog("How does the print in python") ​How does the print in python​​ const answerBlock = addToLog("GPT is thinking") undefined answerBlock ​GPT is thinking​​ const reader = await fetchPromptResponse() undefined script.js:22 Fetch finished loading: POST "http://127.0.0.1:5000/prompt". fetchPromptResponse @ script.js:22 (anonymous) @ VM6991:1 reader ReadableStreamDefaultReader {closed: Promise} await readResponseChunks(reader, answerBlock) ``` merci

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.

Rechercher sur le site

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.