الوصف
أستخدم عقدة AI Agent في n8n مع Vertex AI (Gemini) كنموذج الدردشة، مدمجة مع أداة سير عمل فرعي تسمى search_rag التي تبحث في قاعدة بيانات متجهة Qdrant.
في كل مرة يستدعي AI Agent الأداة ويستقبل الرد، يفشل العامل فوراً مع:
Bad request - please check your parameters Google request failed with status code 400
لا توجد تفاصيل خطأ إضافية — لا توجد تتبعات للمكدس، لا توجد أخطاء على مستوى الحقل من Google.
السبب الجذري المحدد
بعد تصحيح أخطاء مكثف، حددت السبب الجذري التالي:
1. يتطلب Vertex AI/Gemini أن يكون functionResponse كائن JSON {}، وليس مصفوفة JSON []
يمتلك Gemini API متطلبات أكثر صرامة من OpenAI فيما يتعلق بصيغة functionResponse. تحديداً، يتوقع Gemini أن تكون استجابة الأداة كائن، وليس مصفوفة. عندما يُرجع سير العمل الفرعي [{...}] (مصفوفة تحتوي على كائن)، يعرّف Gemini هذا كحمل عمل غير صحيح ويُرجع خطأ 400 في خطوة التحقق من الطلب — قبل أن تقوم النموذج حتى بمعالجة المحتوى. هذا هو السبب في أن خطأ 400 «صامت» بدون تفاصيل على مستوى الحقل.
2. سير العمل الفرعي في n8n يُرجع دائماً مصفوفة — لا يمكن تغيير هذا
هذا هو السلوك الافتراضي في n8n: تُغلف جميع مخرجات سير العمل في مصفوفة [{...}]. الطريقة الوحيدة للإرجاع كائن بدلاً من مصفوفة في n8n هي استخدام الرد على Webhook مع First Incoming Item — لكن هذا النهج لا يمكن تطبيقه على أدوات سير العمل الفرعي داخل AI Agent.
3. LangChain يقوم بتسلسل الصيغة الخاطئة لـ Vertex AI
تستخدم عقدة Agent في n8n مجموعة LangChain للتواصل مع Vertex AI. يقوم LangChain بتسلسل مخرجات الأداة في سلسلة JSON ويضعها في functionResponse، لكن إذا كانت البنية على المستوى الأعلى مصفوفة، فإن بعض إصدارات SDK من Vertex AI ترفضها في خطوة التحقق قبل أن تقوم النموذج بمعالجتها.
مثال ملموس
ما يُرجعه سير العمل الفرعي حالياً (مصفوفة — غير صحيح لـ Vertex AI):
[
{
"message": "Found 3 result(s) for collection_type: media.",
"searchResults": [...],
"count": 3
}
]
ما يتوقعه Vertex AI (كائن — صحيح):
{
"message": "Found 3 result(s) for collection_type: media.",
"searchResults": [...],
"count": 3
}
ما تم تأكيده
- سير العمل الفرعي ينفذ بنجاح ويُرجع استجابة صحيحة
- الخطأ يحدث بعد استقبال العامل لاستجابة الأداة، وليس قبله
- الخطأ يحدث في كلا الحالتين: عند العثور على النتائج و عند عدم العثور على نتائج
- لا توجد قيم فارغة أو غير محددة في الاستجابة
- Vertex AI لا يتطلب اسم حقل معين —
messageوresultوoutputكلها مقبولة - Vertex AI لا يحظر المصفوفات المتداخلة —
searchResults: [...]داخل كائن بخير - القيد الوحيد هو: يجب أن تكون المستوى الأعلى كائن
{}، وليس مصفوفة[]
الأسئلة
- هل هناك أي طريقة لجعل أداة سير عمل فرعي في n8n تُرجع كائن JSON بدلاً من مصفوفة JSON لـ Vertex AI؟
- هل هذا تحديد معروف من تكامل n8n + Vertex AI؟
- هل لدى فريق n8n خطط لإصلاح مجموعة LangChain لفك تغليف المصفوفة تلقائياً في كائن عند استخدامها مع Vertex AI؟