yes I’m using the manner your suggest.
this is my all function : // Configuration initiale et importation des dépendances nécessaires
require(“dotenv”).config();
if (process.env.OPENAI_API_KEY) {
console.log(“La clé API OpenAI est chargée.”);
} else {
console.error(“La clé API OpenAI est manquante.”);
process.exit(1);
}
const OpenAI = require(“openai”);
const openai = new OpenAI(process.env.OPENAI_API_KEY);
const admin = require(“firebase-admin”);
// Vérifie si l’admin a déjà été initialisé
if (admin.apps.length === 0) {
const serviceAccount = require(“./file.json”);
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
}
/**
- Divise le texte du chat en messages distincts basés sur des séparateurs définis.
- @param {string} chatText Le texte complet du chat.
- @return {Array} Un tableau d’objets représentant les messages individuels.
*/
function splitChatIntoMessages(chatText) {
const lines = chatText.split(“\n”);
const messages = ;
lines.forEach((line) => {
if (line.startsWith(“Application:”)) {
messages.push({
role: “system”,
content: line.slice(“Application:”.length).trim(),
});
} else {
messages.push({
role: “user”,
content: line.trim(),
});
}
});
return messages;
}
/**
-
Récupère le dernier chat d’un utilisateur et analyse les réponses pour générer des recommandations.
-
@param {string} userId - L’identifiant de l’utilisateur.
*/
async function fetchLatestChatAndAnalyze(userId) {
try {
const querySnapshot = await admin.firestore()
.collection(“users”)
.doc(userId)
.collection(“chats”)
.orderBy(“timestamp”, “desc”)
.limit(1)
.get();
if (querySnapshot.empty) {
console.log(“Aucun entretien trouvé pour cet utilisateur.”);
return;
}
const chatDoc = querySnapshot.docs[0];
const chatData = chatDoc.data();
const chatText = chatData.chatText || “No response provided.”;
const docId = chatDoc.id;
// Prétraitement du chatText pour diviser en messages
const messages = splitChatIntoMessages(chatText);
// Appel de la fonction d’analyse avec les messages structurés
const recommendations = await analyzeAndRecommend(messages);
if (recommendations) {
await admin.firestore()
.collection(“users”)
.doc(userId)
.collection(“chats”)
.doc(docId)
.update({recommendations});
console.log(“Recommandations ajoutées au document de chat.”);
}
} catch (error) {
console.error("Erreur lors de la récupération ou de la mise à jour : ", error);
}
}
/**
- Analyse les réponses d’un utilisateur et recommande des améliorations.
- @param {Array} messages - Les messages de l’utilisateur.
- @return {Promise<string|null>} Les recommandations basées sur l’analyse.
*/
async function analyzeAndRecommend(messages) {
if (!messages || messages.length === 0) {
console.error(“Les messages de l’utilisateur ne sont pas valides ou absents.”);
return null;
}
const instructions = ### Instructions Examinez le chat et donne des axes d'amélioration dans les domaines suivants : technique, résolution de problèmes, . Proposez une recommandation principales basées sur votre analyse.
;
// Créez une copie des messages de l’utilisateur en excluant ceux avec le rôle “système”
const userMessages = messages.filter((message) => message.role === “user”);
// Ajoutez les instructions au début des messages de l’utilisateur
const apiMessages = [{role: “system”, content: instructions}, …userMessages];
// Log de la requête avant de l’envoyer
console.log(“Envoi de la requête à l’API OpenAI avec les paramètres suivants :”, JSON.stringify({
model: “gpt-3.5-turbo”,
messages: apiMessages,
max_tokens: 4000,
temperature: 0.5,
}, null, 2));
try {
const response = await openai.chat.completions.create({
model: “gpt-3.5-turbo”,
messages: apiMessages,
max_tokens: 4000,
temperature: 0.5,
});
// Loguez ici la réponse complète de l'API OpenAI pour inspection
console.log("Réponse de l'API OpenAI:", JSON.stringify(response.data, null, 2));
// Ajoutez cette vérification pour vous assurer que response et response.data.choices existent
if (response && response.data && response.data.choices && response.data.choices.length > 0) {
const recommendations = response.data.choices[0].message.content.trim();
console.log("Recommandations : ", recommendations);
return recommendations;
} else {
console.error("La réponse de l'API OpenAI ne contient pas de 'choices'");
return null;
}
} catch (error) {
console.error(“Erreur lors de l’appel à l’API OpenAI:”, error.message);
console.log(“Stack de l’erreur:”, error.stack);
return null;
}
}
module.exports = {fetchLatestChatAndAnalyze, analyzeAndRecommend};