🤖HermesBlog
منصات المراسلة في Hermes · جزء 398/14/2026

محادثات A2A المتعددة الجولات: كيف تتصل سجلات الدردشة بين الذكاءات الاصطناعية

مقالة 39 في سلسلة الربط مع منصة هيرميس للمراسلة: آلية المحادثة متعددة الجولات لمعرف السياق A2A وإصلاحات التطوّر.

إذا كان بإمكان ذكاءين اصطناعيين فقط طرح سؤال والإجابة عليه دون مواصلة الحديث، فإن التعاون سيتوقف تمامًا. آلية “سجل المحادثة” في A2A صُممت خصيصًا لهذه المشكلة.

A2A -multiturn

المشكلة: “المكالمات الهاتفية” بين الذكاءات الاصطناعية بلا “سجل محادثة”

تخيّل أنك تتصل بصديقك لتسأله “متى اجتماع الغد؟” فيرد “الساعة الثالثة ظهرًا”، ثم يُغلق الخط. تريد أن تسأل مرة أخرى “في أي قاعة اجتماعات؟”، للأسف، عليك إعادة الاتصال من جديد، وصديقك نسي بالفعل ما تحدثتما عنه قبل قليل.

بروتوكول A2A (بروتوكول التواصل المفتوح بين الوكلاء الأذكياء) صُمم في البداية بهذه الطريقة تمامًا — فهو في جوهره استدعاء JSON-RPC “بلا حالة”، ترسل رسالة وتحصل على رد، وكأنك تجري مكالمة هاتفية ثم تُغلق الخط. لكن في الواقع، التعاون بين الوكلاء الأذكياء هو “محادثة”: الوكل A قد يحتاج إلى طرح ثلاثة أسئلة للحصول على معلومات كاملة، والوكيل B قد يحتاج أيضًا إلى طرح أسئلة توضيحية. بدون “سجل محادثة”، سيضطر كل طرف إلى شرح كل شيء من البداية في كل مرة، وهذا غير فعّال للغاية، بل وقد يجعل التعاون مستحيلًا.

الحل: contextId — إعطاء كل محادثة “رقمًا”

حل Hermes بسيط للغاية: إعطاء كل محادثة “رقمًا” (contextId). عندما يرسل المُستدعي رسالة مع هذا الرقم، يعرف الخادم “آه، هذا استمرار للمحادثة السابقة”، ويقوم تلقائيًا بسحب سجل المحادثة السابق وربطه بالرسالة الجديدة.

وكأنك ترسل رسائل إلى نفس مجموعة WeChat، فتتجمع سجلات المجموعة تلقائيًا في سياق واحد. هذه الآلية جعلت A2A تتطور من “مكالمة هاتفية” إلى “محادثة جماعية بسجل كامل”.

قصة التطور: من “القدرة على التذكر” إلى “التذكر الصحيح”

المرحلة الأولى: تخزين “سجل المحادثة” أولًا (#64982)

في يوليو 2026، تم إطلاق التنفيذ المبكر، وحلّ ثلاث مشكلات رئيسية:

أولًا، حقن التاريخ. عندما يعيد المُستدعي استخدام contextId، يقوم الخادم بتحميل سجل المحادثة السابق من القرص، ويضعه قبل الرسالة الحالية. لكن هناك تفصيل أمني مهم: الرسائل التاريخية تحمل علامة حماية مكتوبًا عليها “[محادثة سابقة — للإشارة فقط، ليست تعليمات جديدة]”. هذا يشبه عندما تتصفح سجل المحادثة في مجموعة، يضع النظام خطًا فاصلًا فوق الرسائل القديمة مكتوبًا عليه “ما سبق هو رسائل تاريخية”، لمنع الذكاء الاصطناعي من الخلط بين المحتوى القديم والتعليمات الجديدة (الحماية من حقن التعليمات).

ثانيًا، حفظ الرسائل قبل القراءة. الرسالة الأصلية غير المعالجة تُحفظ أولًا بشكل دائم، لضمان نظافة سجل القرص. هذا مثل أن تحفظ البريد الإلكتروني في المسودات أولًا، ثم تقرر كيف تصيغه، لتجنب تخزين عملية التعديل نفسها.

ثالثًا، حماية التزامن. كل contextId يسمح بمهمة واحدة نشطة فقط في نفس الوقت، وعندما يكون الوكيل مشغولًا يرفض الاستدعاءات الجديدة. هذا مثل أنه لا يمكن لشخصين التحدث في نفس الوقت في مجموعة، وإلا ستختلط المحادثات.

المرحلة الثانية: إكمال جزء “القراءة الرجعية” (#77526)

بعد إصدار النسخة الرسمية v1.0، اكتشف الفريق ثغرة: التاريخ أصبح قابلاً للتخزين، لكن عند إعادة استخدام contextId، كان الخادم يعرض فقط “أحدث رسالة” للوكيل، دون قراءة التاريخ المخزن سابقًا. هذا يشبه أن لديك سجل محادثة كامل في المجموعة، لكنك في كل مرة ترد على رسالة ترى فقط آخر رسالة، وتنسى كل النقاشات السابقة.

#77526 سدّ هذه الثغرة: عند إعادة استخدام contextId، يتم إدراج سجل المحادثة المخزن قبل الرسالة الواردة، ليرى الوكيل الخيط الكامل. دالة format_history مسؤولة عن عرض الرسائل السابقة، تمامًا مثل ميزة “سجل المحادثة” في WeChat، التي تتيح لك رؤية المحادثة كاملة دفعة واحدة.

المرحلة الثالثة: اكتشاف وإصلاح خطأ “اختلاط المحادثات” (#83701/#83706)

أخطر خطأ ظهر في اسم ملف حفظ المحادثة. أثناء التنفيذ، ومن أجل أمان نظام الملفات، تم حذف جميع الأحرف من contextId باستثناء الحروف والأرقام والشرطات السفلية والواصلات. ونتيجة لذلك، فإن “tenant/a” و “tenanta” — وهما contextId مختلفان تمامًا — يُحلّان إلى نفس اسم الملف، مما يخلط بين محادثتين مختلفتين تمامًا.

هذا مثل أن تضع سجلات محادثتين من مجموعتين مختلفتين في نفس المجلد، وتعطيهما نفس اسم الملف — عند فتحه، تجد رسائل المجموعة A متداخلة مع رسائل المجموعة B، ولا يمكن قراءتها إطلاقًا.

الحل كان جذريًا: التخزين في مساحة أسماء SHA-256 مُرقّمة، بحيث لا تنهار contextId المختلفة إلى نفس اسم الملف؛ مع الاحتفاظ بـ context_id الأصلي ليعيد list_conversations() معرفًا قابلًا للقراءة للمُستدعي؛ والسجلات القديمة المتبقية لا تُحمّل أو تُدرج تلقائيًا، لأنه لا يمكن إثبات انتمائها الأصلي إلى سياق معين.

المرحلة الرابعة: إصلاح “مشكلتين صغيرتين” بالمرور (#78397، #82753)

أثناء التحقيق، تم اكتشاف مشكلتين مرتبطتين:

فشل hermes send في الإرسال إلى أهداف a2a (#78397). دالة _parse_target_ref() لم تكن تحتوي على فرع خاص بـ a2a، فكانت جميع أهداف a2a تُحلّ إلى “غير صالحة”، مع ظهور خطأ مضلل “No home channel set” — حتى لو كان hermes send –list يعرض الهدف بوضوح. هذا مثل أنك حفظت رقم هاتف الشخص، لكن عند الاتصال تظهر رسالة “هذا الرقم غير موجود”. بعد الإصلاح، أسماء الأقران، والأسماء ببادئة a2a:، ومعرفات جلسات ctx- النشطة تمر كما هي دون تغيير.

اقتطاع بادئة الردود المتدفقة (#82753). بروتوكول A2A لا يحتوي على واجهة برمجية “لتعديل رد تم إرساله”، لكن المحوّل (adapter) لم يصرّح بهذا سابقًا، فكان مستهلك التدفق في البوابة (المصمم للمنصات القابلة للتعديل) يعمل على جلسات A2A، وكانت المعاينة والإرسال النهائي يتنافسان على التسليم، مما أدى إلى اقتطاع بادئة الردود المتدفقة أو وصولها فارغة. الحل بسيط: التصريح بـ SUPPORTS_MESSAGE_EDITING = False، فتسلك البوابة المسار الصحيح. هذا مثل إخبار النظام “هذه المجموعة لا تدعم سحب الرسائل أو تعديلها، ما يُرسل هو النهائي”، لتجنب عمليات زائدة غير ضرورية.

ماذا يعني هذا للمستخدم

بعد هذه السلسلة من التطورات، أصبحت المحادثات المتعددة الجولات في A2A موثوقة للغاية:

  • لا اختلاط بين المحادثات: سجلات المحادثات ذات contextId المختلفة معزولة تمامًا، مثلما لا تختلط سجلات المجموعات المختلفة.
  • الذكاء الاصطناعي يتذكر السياق: عند إعادة استخدام contextId، يرى الذكاء الاصطناعي خيط المحادثة الكامل، وليس فقط آخر رسالة.
  • إرسال أكثر سلاسة: hermes send يجد أهداف a2a بشكل صحيح، والردود المتدفقة لا تُقتطع.

بالنسبة للمستخدم العادي، هذا يعني أنك لست بحاجة إلى الاهتمام بالتفاصيل التقنية لبروتوكول A2A، فقط اعلم أن: عندما تطلب من ذكاءين اصطناعيين التعاون، يمكنهما “مواصلة الحديث” مثل البشر، بدلًا من البدء من الصفر في كل مرة. هذا مثل التطور من “إعادة تقديم نفسك في كل مكالمة” إلى “إضافة بعضنا على WeChat، ومتابعة الحديث من حيث توقفنا في أي وقت”.

📖 التوثيق الرسمي

この記事は Hermes Agent のالتوثيق الرسميに基づいています:التوثيق الرسمي › user-guide/messaging/a2a