200 OK، لكن العميل صامت: ثلاثة أخطاء في وكيل n8n من بيئة الإنتاج
بعد 20 يوماً تماماً من إغلاق الخطأ الأول، ظهر الخطأ الثاني. هذه المرة لم يكن النموذج اللغوي الكبير هو المسؤول، بل الطبقات المحيطة به: رموز غير مرئية، وفحوصات تحقق، وخانات اختيار معطّلة في الإعدادات. ثلاثة أخطاء مختلفة الطبيعة: • **علامات تحكم داخلية بدلاً من الرد**: نموذج GLM لا يرد إلا بـ `[VERDICT:…] [TASK:NONE]`، والمدقّق يمرّره كمحتوى صالح، وعقدة Format Response تحذف العلامات، فلا يتبقى للعميل سوى `\n\n \n` • **حد Meta البالغ 1000 بايت**: الاستبيان بالروسية (الاسم، التاريخ، المجال، الهاتف) يشغل 1030 بايت — الحرف الروسي الواحد يأخذ 2 بايت، والرمز التعبيري 3-4 بايت، فتفشل واجهة API برسالة Bad request • **كتالوج كامل بدلاً من اختيار محدد**: Schema Type لم يُحدَّد، فاستنتج n8n المخطط من المخطط نفسه بدلاً من مثال، وانتهى حقل category في الأسفل، فأصبحت الأداة تعيد المجموعة كاملة
معالج بواسطة الذكاء الاصطناعي من Habr AI؛ بتحرير Hamidun News
هذه هي القصة الثانية عن وكيل ذكاء اصطناعي في بيئة الإنتاج. قبل 20 يوماً، أغلقتُ خطأ Reasoning Lock: كان النموذج يستهلك الرموز (tokens) في تفكير داخلي خفي، ثم يرسل سلسلة نصية فارغة للعميل مع أن الحالة كانت تشير إلى نجاح العملية. أضفتُ مدقّقاً للردود الفارغة وأضفتُ أيضاً نظام تتبّع (telemetry). كتبتُ وقتها: «السجل فارغ — الطبقات تعمل بشكل صحيح». بقي السجل صامتاً لمدة 20 يوماً. ثم أرسل المدراء شكاوى جديدة عبر العميل: العميل يكتب في الرسائل المباشرة، والوكيل صامت. لكن هذه المرة لم يكن النموذج اللغوي الكبير هو السبب.
بنية المشروع: يعمل وكيل n8n في بيئة الإنتاج لورشة مجوهرات. في الليل، يستقبل الطلبات عبر الرسائل المباشرة في منصة تواصل اجتماعي، ويدير المحادثة، ويجمع بيانات استبيان (الاسم، تاريخ الميلاد، المجال، الهاتف)، وينشئ صفقة في amoCRM. التقنيات المستخدمة: n8n (مستضاف ذاتياً) + Redis (لذاكرة المحادثات، بمدة صلاحية 30 يوماً) + LangChain. تغيّر النموذج اللغوي الكبير: بدلاً من DeepSeek V4 Pro، يُستخدم الآن z-ai/glm-5.3-flash عبر OpenRouter، مع qwen/qwen3.8-flash كنموذج احتياطي. نما سير العمل (workflow) من 64 إلى 88 عقدة، وتم تنفيذ معالجة التعليقات ومنطق إعادة المحاولة.
الخطأ الأول: علامات تحكم بروتوكولية داخلية بدلاً من رد إنساني
فتحتُ سجل التنفيذات (executions) — كله نظيف. لا توجد عملية تنفيذ واحدة فاشلة. فرضية «تكرار Reasoning Lock» تسقط: النموذج يرد، وبسرعة. الأثر الوحيد في amoCRM: ردّت العميلة بـ«نعم» في الساعة 20:06 على تأكيد الطلب (المُرسَل في 20:02)، ثم لم يكن هناك سوى سجلّ في MESSENGER-ID، وصمت تام في الرسائل المباشرة.
فتحتُ بطاقة OpenRouter: 871 رمزاً (token) في completion، منها 766 رمزاً للتفكير الداخلي (reasoning) — فلا يتبقى سوى 105 رموز مرئية. من حيث الحجم، هذه علامات تحكم بروتوكولية داخلية: `[VERDICT:ORDER:DATA|HOT] [NEED_MANAGER_CALL] [STAGE:PERSONAL]`
نموذج GLM قد ردّ فعلاً. حسب البروتوكول. ولم يكتب كلمة إنسانية واحدة. كان DeepSeek 4.0 PRO ينغلق على نفسه، أما GLM فقد ظهر كطالب مثالي ملتزم بالقواعد: النص الإنساني غير مطلوب — فهو يسلّم النموذج الرسمي فقط.
لم يكشف المدقّق المشكلة لأنه يتحقق فقط من كون الناتج فارغاً أم لا (الناتج غير فارغ = نجاح). المؤشر الثابت «محتوى فارغ + رموز مستهلكة + finish_reason يساوي stop ≠ نجاح» فشل هو أيضاً: الرموز مستهلكة (نعم)، وfinish_reason يساوي stop (نعم)، والمحتوى غير فارغ (نعم). كان يتحقق من غياب الفراغ، لا من وجود نص إنساني.
ثم تأتي عقدة Format Response التي تحذف العلامات بحسب التصميم — فلا يتبقى سوى `\n\n \n` (سلسلة غير فارغة بالنسبة لـ n8n، ورموز بالنسبة لـ Meta، ولا شيء بالنسبة للعميل). والحارس (guard) قبل الإرسال يتحقق من أن العقدة isExecuted، لا من محتواها.
الخطأ الثاني: حد Meta البالغ 1000 بايت يكسر النص الروسي
بعد هذا التشخيص، ظهرت عقدة حمراء عند الإرسال النهائي:
``` NodeApiError: Bad request - please check your parameters Send direct message1 ```
حدث الفشل عند الاستبيان: الاسم، التاريخ، المجال، الهاتف، وفواصل بين الفقرات بـ `\n\n`. أطول رسالة في حياة الوكيل. توثيق واجهة Meta API ينص على: Message text must be UTF-8 and be 1000 bytes or less. ليس حروفاً، بل بايتات.
في ترميز UTF-8، يشغل الحرف الروسي 2 بايت، والرمز التعبيري 3 إلى 4 بايت (✨ = 3، 💎 = 4). فحد 1000 بايت يعادل تقريباً 500 إلى 550 حرفاً من النص الروسي. اختبرتُ نصاً روسياً من 570 حرفاً: شغل 1030 بايت. فالاستبيان الذي يحتوي على الاسم والتاريخ والمجال وثلاث فقرات وعبارة «هل كل شيء صحيح؟» يتجاوز الحد بسهولة. والأمر الأكثر إحباطاً أن `\n\n` ليس خطأً، بل هو فقرات إنسانية طبيعية كما في Word — خط معالجة مصمم أساساً للتفكير الداخلي (reasoning) تعثّر بسبب فاصل أسطر بسيط.
الخطأ الثالث: كتالوج كامل بدلاً من اختيار محدد — نوع
Schema غير صحيح
بينما كنتُ أعالج مشكلة الإرسال، وردت شكوى أخرى من المدراء: «الوكيل يعرض الشيء الخاطئ». يطلب العميل أقراط أذن، فيعرض الوكيل نصف الكتالوج؛ يطلب ساعات، فيعرض نصف الكتالوج مجدداً.
عقدة get_product_catalog1 من نوع أداة (tool) هي المسؤولة عن الكتالوج. خيار Specify Input Schema مفعّل، لكن Schema Type لم يُحدَّد. فيأخذ n8n القيمة الافتراضية — «Generate From JSON Example»: أعطني مثالاً، وسأستنتج المخطط منه. لكن في jsonSchemaExample لم يكن هناك مثال بيانات، بل المخطط (JSON Schema) نفسه، بحقوله type و properties و required و category (مع القيم المحتملة: bracelets، earrings، necklaces، luch، candles) و description.
لا يتحقق n8n من المحتوى — فاعتبر بصدق المخطط مثالاً، واستنتج مخططاً من مخطط. أصبحت المفاتيح العليا type و properties و required هي مثال الكائن، وانتقل category إلى الأسفل. فتقرأ الأداة inputData.json.category، وتحصل على undefined، فتنتقل إلى القيمة الافتراضية all. أي طلب يُعيد المجموعة كاملة بدلاً من اختيار محدد. تصحيح الخطأ يتطلب نقرة واحدة فقط (Schema Type ← «Define using JSON Schema»)، لكن البحث عنه استغرق ساعة ونصف.
الخلاصة
ثلاث طبائع مختلفة لمشكلة واحدة: النموذج يرد بعلامات تحكم داخلية بدلاً من نص، وواجهة API تفرض حداً صارماً بالبايت لا بالحروف، وإعدادات الأداة تختفي خلف قيمة افتراضية غير صحيحة. العقدة الخضراء هي أسوأ أنواع العقدة الحمراء — فعلى الأقل مع الفشل الصريح يكون واضحاً أين يجب البحث.
- 27 أكتوبر 2026تطبيق Hob مفتوح المصدر ينقل نمط Claude Cowork إلى حاسوبك المحمول دون الحاجة إلى السحابة
- 26 أكتوبر 2026DSReg تربط المتغيرات الكامنة في JEPA بالأسباب الحقيقية للبيانات
- 26 أكتوبر 2026Alibaba تطرح الجيل الثاني من نظارات Qwen بسعر يبدأ من $450
- 26 أكتوبر 2026Anthropic تستبدل Git بنظامها Scion: 7 مهندسين وClaude في 5 أشهر
أسئلة وأجوبة حول الخبر
ما أبرز التفاصيل حول الخطأ الأول: علامات تحكم بروتوكولية داخلية بدلاً من رد إنساني؟
فتحتُ سجل التنفيذات (executions) — كله نظيف. لا توجد عملية تنفيذ واحدة فاشلة. فرضية «تكرار Reasoning Lock» تسقط: النموذج يرد، وبسرعة. الأثر الوحيد في amoCRM: ردّت العميلة بـ«نعم» في الساعة 20:06 على تأكيد الطلب (المُرسَل في 20:02)، ثم لم يكن هناك سوى سجلّ في MESSENGER-ID، وصمت تام في الرسائل المباشرة. فتحتُ بطاقة OpenRouter: 871 رمزاً (token) في completion، منها 766 رمزاً للتفكير الداخلي (reasoning) — فلا يتبقى سوى 105 رموز مرئية. من حيث الحجم، هذه علامات تحكم بروتوكولية داخلية: `[VERDICT:ORDER:DATA|HOT] [NEED_MANAGER_CALL] [STAGE:PERSONAL]` نموذج GLM قد ردّ فعلاً. حسب البر
ما أبرز التفاصيل حول الخطأ الثاني: حد Meta البالغ 1000 بايت يكسر النص الروسي؟
بعد هذا التشخيص، ظهرت عقدة حمراء عند الإرسال النهائي: ``` NodeApiError: Bad request - please check your parameters Send direct message1 ``` حدث الفشل عند الاستبيان: الاسم، التاريخ، المجال، الهاتف، وفواصل بين الفقرات بـ `\n\n`. أطول رسالة في حياة الوكيل. توثيق واجهة Meta API ينص على: Message text must be UTF-8 and be 1000 bytes or less. ليس حروفاً، بل بايتات. في ترميز UTF-8، يشغل الحرف الروسي 2 بايت، والرمز التعبيري 3 إلى 4 بايت (✨ = 3، 💎 = 4). فحد 1000 بايت يعادل تقريباً 500 إلى 550 حرفاً من النص الروسي. اختبرتُ نصاً روسياً من 570 حرفاً: شغل 1030 بايت. فالاستبيان الذي يحتو
ما أبرز التفاصيل حول الخطأ الثالث: كتالوج كامل بدلاً من اختيار محدد — نوع Schema غير صحيح؟
بينما كنتُ أعالج مشكلة الإرسال، وردت شكوى أخرى من المدراء: «الوكيل يعرض الشيء الخاطئ». يطلب العميل أقراط أذن، فيعرض الوكيل نصف الكتالوج؛ يطلب ساعات، فيعرض نصف الكتالوج مجدداً. عقدة get_product_catalog1 من نوع أداة (tool) هي المسؤولة عن الكتالوج. خيار Specify Input Schema مفعّل، لكن Schema Type لم يُحدَّد. فيأخذ n8n القيمة الافتراضية — «Generate From JSON Example»: أعطني مثالاً، وسأستنتج المخطط منه. لكن في jsonSchemaExample لم يكن هناك مثال بيانات، بل المخطط (JSON Schema) نفسه، بحقوله type و properties و required و category (مع القيم المحتملة: bracelets، earrings، necklaces،
Test Frontier LLMs & Autonomous Agents in One Workspace
Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.
أهم ما في عالم الذكاء الاصطناعي — مرة كل أسبوع
سبع قصص مهمة فعلاً هذا الأسبوع، مختارة بعناية. بلا ضجيج ولا بيانات صحفية.
تم! تحقق من بريدك للتأكيد.