Utiliser le node Code

// Code amélioré pour traiter les différentes structures de réponse de Mistral Pixtral
const items = $input.all();
const updatedItems = items.map((item) => {
  try {
    // On vérifie d'abord si la réponse suit la structure attendue
    if (item.json && item.json.choices && item.json.choices[0] && item.json.choices[0].message && item.json.choices[0].message.content) {
      const content = item.json.choices[0].message.content;
      
      // Vérifier si content est déjà un objet (déjà parsé)
      if (typeof content === 'object' && content !== null) {
        // Le contenu est déjà un objet JSON, on le laisse tel quel
        console.log("Content is already a parsed object");
      } 
      // Vérifier si content est une chaîne qui contient du JSON
      else if (typeof content === 'string') {
        try {
          // Tenter de parser le contenu comme JSON
          item.json.choices[0].message.content = JSON.parse(content);
          console.log("Successfully parsed content string as JSON");
        } catch (parseErr) {
          console.log(`Content is a string but not valid JSON: ${parseErr.message}`);
          // On pourrait avoir un array mal formaté ou autre problème
          // Tenter de nettoyer et reformater si nécessaire
          if (content.includes('[') && content.includes(']')) {
            try {
              // Tentative de récupération si c'est un tableau
              const cleanedContent = content.replace(/\\s+/g, ' ').trim();
              const match = cleanedContent.match(/\\[(.*)\\]/);
              if (match) {
                const arrayContent = `[${match[1]}]`;
                item.json.choices[0].message.content = JSON.parse(arrayContent);
                console.log("Recovered array content from string");
              }
            } catch (recoveryErr) {
              console.log(`Recovery attempt failed: ${recoveryErr.message}`);
            }
          }
        }
      }
      
      // Normalisation: transformer le contenu en un format cohérent
      // pour éviter les problèmes d'accès aux propriétés
      const normalizedContent = item.json.choices[0].message.content;
      
      // Si le contenu est un tableau, on crée une structure compatible avec les deux formats
      if (Array.isArray(normalizedContent)) {
        console.log("Content is an array, creating normalized structure");
        
        // Extraire les données du premier élément du tableau s'il existe
        const firstItem = normalizedContent[0] || {};
        
        // Créer une structure normalisée qui combine les deux formats
        const normalizedStructure = {
          ...firstItem,  // Copier toutes les propriétés du premier élément
          _array: normalizedContent  // Garder aussi l'array original
        };
        
        // Remplacer le contenu par la structure normalisée
        item.json.choices[0].message.content = normalizedStructure;
      }
      
    } else {
      console.log("Response structure is not as expected");
    }
  } catch (err) {
    console.log(`Error processing item: ${err.message}`);
  }
  
  return item;
});

return updatedItems;