Problème lors de l'enregistrement du workflow après avoir utilisé l'assistant IA n8n pour renommer les nœuds

Bonjour à tous,

J’ai récemment rencontré ce problème et l’ai corrigé manuellement. Je publie mes conclusions ici au cas où ce ne serait pas un comportement prévu — ou au cas où l’assistant IA aurait besoin d’améliorations.

Le problème

J’ai demandé à l’assistant IA n8n de renommer quelques nœuds dans l’un de mes workflows. Il a effectué la modification et tout semblait correct sur le canevas. Mais juste après, le workflow est devenu complètement impossible à enregistrer — chaque modification que j’ai apportée ensuite a échoué avec :

Problem saving workflow
Autosave failed: Cannot convert undefined or null to object

La console du navigateur affichait la même erreur se répétant continuellement depuis le rendu du canevas et le gestionnaire d’enregistrement :

Les symptômes (IA)

  • Renommer était la seule chose que j’ai demandé à l’assistant IA de faire, mais après sa modification, le JSON du workflow est revenu avec plusieurs champs au niveau du nœud explicitement définis à null — des choses comme credentials, webhookId, notes, notesInFlow, executeOnce, retryOnFail, alwaysOutputData et onError.
  • Tout nœud qui n’avait pas besoin de ces propriétés omet normalement simplement la clé dans une exportation n8n standard. L’aller-retour d’édition de l’assistant IA les a plutôt écrites comme null.
  • Une fois que cette structure a atteint le canevas, chaque action suivante (déplacement d’un nœud, enregistrement, enregistrement automatique) s’est échouée avec la même erreur Object.keys TypeError, car nodeTransforms.ts essaie de normaliser ces champs et ne s’attend pas à un null littéral.

La cause profonde (IA)

nodeTransforms.ts (utilisé à la fois par la logique de diff du canevas et par useWorkflowSaving.ts) appelle Object.keys(...) sur certaines propriétés de nœud (comme credentials) lors du calcul de la diff à enregistrer. Object.keys(null) lève une exception, donc dès qu’un nœud du workflow a null au lieu d’une clé omise, l’enregistrement/l’enregistrement automatique de tout le workflow casse — pas seulement ce nœud.

Il semble que le chemin d’édition de nœud de l’assistant IA sérialise l’objet nœud sans supprimer les clés qui se sont résolues à null, ce qui produit une forme de nœud techniquement valide en JSON mais non sûre pour le frontend.

La solution (manuellement)

Exportez le JSON du workflow, supprimez n’importe quelle clé sur n’importe quel nœud dont la valeur est null (plutôt que de la définir à null), et réimportez. Par exemple, sur les nœuds affectés, supprimez les clés comme :

"credentials": null,
"webhookId": null,
"notes": null,
"notesInFlow": null,
"executeOnce": null,
"retryOnFail": null,
"alwaysOutputData": null,
"onError": null

de sorte que l’objet nœud n’ait simplement pas ces clés du tout s’il ne les utilise pas. Après suppression des champs null et réimportation (Importer depuis un fichier dans un nouveau workflow, pas coller dans le canevas), le workflow s’est enregistré et auto-enregistré normalement.

J’espère que cela vous épargnera quelques heures de débogage !
Cela semble être un bug dans la façon dont l’assistant IA sérialise les éditions de nœuds — j’apprécierais une confirmation de la part de l’équipe n8n, car quiconque effectuerait des éditions en masse de nœuds avec celui-ci pourrait rencontrer le même problème.

Super découverte, @mohamed3nan !!!
Ça ressemble à un bug en effet

Bon article - signaler et documenter la cause première est vraiment utile. Si cela se reproduit et que tu veux éviter l’édition manuelle de JSON, un petit nœud Code peut automatiser le nettoyage :

const workflow = JSON.parse($input.item.json.workflowJson);
workflow.nodes = workflow.nodes.map(node =>
  Object.fromEntries(Object.entries(node).filter(([_, v]) => v !== null))
);
return { workflowJson: JSON.stringify(workflow) };

Colle le JSON du flux exporté dans un nœud Set, fais-le passer par celui-ci, et importe la sortie - cela te fait gagner quelques minutes si le bug affecte un flux complexe.

Une question, @mohamed3nan.
Avez-vous auto-hébergé votre bac à sable IA ?

Salut @kjooleng, je n’ai pas encore essayé l’auto-hébergement car cela semble un peu complexe,

J’utilise actuellement l’option Daytona car c’est beaucoup plus facile à configurer..

@mohamed3nan Puisque la fonctionnalité Assistant IA est encore en aperçu et présente ce bug, si c’est une tâche simple, ajuster les choses normalement ou manuellement est bien mieux.

J’ai créé ADO-5601 comme ticket interne pour résoudre ce problème.

Une nouvelle version n8n@2.33.0 a été publiée, qui inclut la pull request GitHub 34668.