I’m encountering an issue with the OpenAI API in Node.js

**I’m encountering an issue with the OpenAI API in Node.js: despite seemingly correct request syntax, the response is undefined when trying to access choices. Below is a key excerpt from my analyzeAndRecommend function, which aims to generate improvement recommendations from user chat responses. Despite valid request parameters and logs confirming the well-formed request, the API response lacks the expected choices. Any insights or shared experiences on how to address this issue would be greatly appreciated.

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,
});
I’ve filtered messages to include only user inputs, excluding system messages. Any advice to solve this problem would be greatly appreciated.

**

Your call to OpenAI is correct,using the right endpoint and passing the correct parameters.

It’s hard to see your full apiMessages and determine if that’s correct as you are using the rest parameter with the userMessages. But assuming this is correct.

Are you trying to access the response in the following manner:

console.log(response.choices[0].message.content)

If you are correctly accessing the content as per above, then I would say the problem is with your apiMessage and the the way the …userMessages is spreading the objects into the array.

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};

Have you tried running the basic sample on their website? Does that work?

https://platform.openai.com/docs/guides/text-generation/chat-completions-api

Maybe if you just do an indented pretty print (using JSON.stringify) of the entire object you’re posting and also a pretty print of the entire response, someone can more easily spot the issue.

2 Likes

I know this is not what you were asking about but I just had to refactor the code related to checking the response using optional chaining and nullish coalesance operator:

// Attempt to extract recommendations from the API response using optional chaining and nullish coalescing
const recommendations = response?.data?.choices?.[0]?.message?.content?.trim() ?? null;

if (recommendations) {
  console.log("Recommendations:", recommendations);
  return recommendations;
} else {
  console.error("La réponse de l'API OpenAI ne contient pas de 'choices'");
  return null;
}
1 Like

i try to post the journal but it is blocked by the administrator.
Is it normal ?

no It dosn’t work I have got the same error : DEFAULT 2024-03-13T01:51:57.587627Z [resource.labels.functionName: analyzeChatOnCreate] [labels.executionId: beo1mq37vdxa] Réponse de l’API OpenAI: undefined
DEFAULT 2024-03-13T01:51:57.587655Z [resource.labels.functionName: analyzeChatOnCreate] [labels.executionId: beo1mq37vdxa] La réponse de l’API OpenAI ne contient pas de ‘choices’

You may need to enhance your debugging skill.

Don’t write a lot of codes directly.
If your are not very experienced programmer, always start from a small part of code, and test it to confirm it works before you proceed.
Find an api example, use hard coded test data, and run it to get openai api response.
If it works, then you can go ahead. When you encounter problems, you can compare the difference between previous workable code and your additions, to find which parts make it broken.
We need to be patient in this progress, so we can finish our programming, and know what’s going on actually.

Or you may paste your code to ChatGPT, but if you are not familiar with the programming, you may waste lots of time negotiate with the model.

thanks for the tips, I will try step by step.