مشكلة في حفظ سير العمل بعد استخدام مساعد n8n الذكي لإعادة تسمية العقد

مرحباً بالجميع،

واجهت هذه المشكلة مؤخراً وأصلحتها يدوياً. أنشر نتائجي هنا في حالة عدم كون هذا السلوك مقصوداً — أو في حالة احتياج مساعد الذكاء الاصطناعي للتحسين.

المشكلة

طلبت من مساعد n8n بالذكاء الاصطناعي إعادة تسمية عدة عقد في أحد سير عملي. أجرى التعديل وكل شيء بدا جيداً على لوحة الرسم. لكن بعد ذلك مباشرة، أصبح سير العمل غير قابل للحفظ تماماً — كل تعديل أجريته بعد ذلك فشل مع:

مشكلة في حفظ سير العمل
فشل الحفظ التلقائي: لا يمكن تحويل غير محدد أو فارغ إلى كائن

عرض وحدة تحكم المتصفح نفس الخطأ يطلق بشكل متكرر من محرر لوحة الرسم ومعالج الحفظ:

الأعراض (الذكاء الاصطناعي)

  • إعادة التسمية كانت الشيء الوحيد الذي طلبته من مساعد الذكاء الاصطناعي، لكن بعد تعديله، عاد JSON سير العمل مع عدة حقول على مستوى العقدة تم تعيينها بشكل صريح إلى null — أشياء مثل credentials، webhookId، notes، notesInFlow، executeOnce، retryOnFail، alwaysOutputData، و onError.
  • أي عقدة لا تحتاج إلى تلك الخصائص عادة ما تحذف المفتاح بالكامل في تصدير n8n القياسي. بدلاً من ذلك، كتب مساعد الذكاء الاصطناعي رحلة التعديل الدائرية بـ null.
  • بمجرد أن وصل هذا الشكل إلى لوحة الرسم، انهارت كل إجراء لاحق (نقل عقدة، حفظ، حفظ تلقائي) مع نفس خطأ Object.keys TypeError، لأن nodeTransforms.ts يحاول تطبيع تلك الحقول ولا يتوقع null حرفي.

السبب الجذري (الذكاء الاصطناعي)

nodeTransforms.ts (المستخدم في منطق مقارنة لوحة الرسم وفي useWorkflowSaving.ts) يستدعي Object.keys(...) على خصائص معينة للعقدة (مثل credentials) عند حساب الفرق للحفظ. Object.keys(null) يرمي استثناء، لذا بمجرد أن تحتوي عقدة واحدة في سير العمل على null بدلاً من مفتاح محذوف، ينقطع الحفظ/الحفظ التلقائي لسير العمل بأكمله — وليس فقط تلك العقدة.

يبدو أن مسار تعديل العقدة الخاص بمساعد الذكاء الاصطناعي يقوم بتسلسل كائن العقدة دون إسقاط المفاتيح التي تم حلها إلى null، مما ينتج عنه شكل عقدة صحيح من حيث JSON من الناحية الفنية ولكنه غير آمن للواجهة الأمامية.

الحل (يدوياً)

صدّر JSON سير العمل، وأزل أي مفتاح على أي عقدة قيمته null (بدلاً من تعيينها إلى null)، وأعد الاستيراد. على سبيل المثال، على العقد المتأثرة، أزل المفاتيح مثل:

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

بحيث يكون كائن العقدة ببساطة بدون تلك المفاتيح إذا لم تستخدمها. بعد تجريد حقول null وإعادة الاستيراد (الاستيراد من ملف إلى سير عمل جديد، وليس اللصق في لوحة الرسم)، عاد سير العمل للحفظ والحفظ التلقائي بشكل طبيعي.

آمل أن يوفر هذا لشخص ما عدة ساعات من تصحيح الأخطاء!
يبدو أن هذا خطأ في كيفية قيام مساعد الذكاء الاصطناعي بتسلسل تعديلات العقدة — سأقدر التأكيد من فريق n8n، حيث قد يواجه أي شخص يقوم بتعديل العقد بشكل مجموعة باستخدامه نفس العائق.

اكتشاف رائع، @mohamed3nan !!!
يبدو أنه خطأ فعلاً

كتابة جيدة - الإبلاغ عن السبب الجذري وتوثيقه مفيد حقًا. إذا حدث هذا مرة أخرى وكنت تريد تخطي تحرير JSON اليدوي، فيمكن لعقدة Code صغيرة أن تؤتمت التنظيف:

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

الصق JSON سير العمل المُصدَّر في عقدة Set، مرره عبر هذا، واستورد الناتج - يوفر بضع دقائق إذا حدثت الخطأ في سير عمل معقد.

سؤال واحد، @mohamed3nan.
هل قمت باستضافة رمل الذكاء الاصطناعي الخاص بك بنفسك؟

مرحباً @kjooleng، لم أحاول الاستضافة الذاتية بعد لأنها تبدو معقدة قليلاً،،

أستخدم حالياً خيار Daytona لأنه أسهل بكثير في الإعداد..

@mohamed3nan نظراً لأن ميزة مساعد الذكاء الاصطناعي لا تزال في مرحلة المعاينة وتحتوي على هذا الخلل، إذا كانت مهام بسيطة، فإن تعديل الأشياء بشكل عادي أو يدوي هو أفضل بكثير.

لقد أنشأت ADO-5601 كتذكرة داخلية لدينا لحل هذه المشكلة.

تم إصدار النسخة الجديدة n8n@2.33.0 والتي تتضمن طلب السحب على GitHub 34668.