بعد حدٍّ معيّن، يصبح نسخ التسلسل نفسه من العُقد عبر عشرة pipelines دَينًا تقنيًا. وتتيح الـpipelines الفرعية لـpipeline أن يستدعي آخر كدالة: عرّف قطعة منطق مرّة واحدة، وأعِد استخدامها في كل مكان — بما في ذلك عبر المؤسسات.
لَبِنتان متناظرتان:
pipeline_callable(مستقبِل، مُعلَن على عقدة Start) يعرض pipeline خلف عنوان URL، بعقد إدخال وإخراج مُنمَّط.pipeline_call(عقدة) يستدعي ذلك الـpipeline: يربط مدخلاته من السياق الحالي ويخزّن النتيجة في مفتاح إخراج.
عرض pipeline (pipeline_callable)
على pipeline «الخدمة»، تضيف مستقبِل pipeline_callable يعلن عن:
- المدخلات — قائمة المعاملات المتوقَّعة (الاسم، النوع، مطلوب أو اختياري).
- المخرجات — مفاتيح النتيجة المُعادة.
- مفتاح الاستجابة — أي قيمة سياق تشكّل الاستجابة (
exchange.resultافتراضيًا). - وضع الاستجابة —
sync(ينتظر المُستدعِي استجابة JSON) أوstream(التقدّم في الوقت الفعلي). - الميزانية الزمنية — أقصى وقت تنفيذ (60 ثانية افتراضيًا، 300 ثانية كحد أقصى).
المدخل المُعلَن إلزاميًا والغائب عن الاستدعاء يُفشل هذا الاستدعاء (400).
يستقبل الـpipeline عندئذٍ عنوان URL عامًّا (مع رمز مميّز) لمشاركته مع الـpipeline المُستدعِي. والرمز المميّز قابل للتدوير في أي وقت لإبطال الوصول.
استدعاء pipeline (pipeline_call)
على pipeline «المُستهلِك»، تُهيَّأ عقدة pipeline_call بـ:
- عنوان URL للـpipeline المستهدَف (ثابت، غير قابل للقولبة: يُحلَّل عند الحفظ لكشف الحلقات).
- ربط إدخال — لكل معامل متوقَّع، مُحدِّد السياق الذي يزوّده.
- مفتاح الإخراج حيث تُخزَّن النتيجة (
exchange.subresultافتراضيًا). - الوضع (
sync،ack،stream) ومهلة (30 ثانية افتراضيًا، 300 ثانية كحد أقصى).
عند الفشل (مهلة، خطأ، استجابة مشوَّهة)، يتابع الـpipeline: يستقبل مفتاح الإخراج القيمة null ويصف مفتاح ._error ما حدث. ومن مسؤولية الـpipeline لديك تنسيق الاحتياطي (فرع احتياطي، تنبيه).
الاستدعاءات عبر المؤسسات: اختيار صريح ومُدقَّق
يمكن استدعاء pipeline فرعي من مؤسسة مختلفة — وهذا هو أساس مشاركة القدرات بين الكيانات. ويبقى النموذج صارمًا:
- مرفوض افتراضيًا. لا تكون الاستدعاءات عبر المؤسسات ممكنة إلا إذا صرّح بها مسؤول الـpipeline المعروض صراحةً (
allow_cross_org). - توقيع HMAC مُوصى به. بمجرّد فتح استدعاء عبر المؤسسات، يُفعَّل سرّ مشترك على الجانبين: يُوقَّع كل طلب (الترويسة
X-Pipeline-Signature)، ويرفض المستقبِل أي توقيع غائب أو غير صالح (401). وبمجرّد حفظ هذا السرّ، لا يُعرَض مجدّدًا أبدًا، على كلا الجانبين (انظر المحرّر المرئي، قسم الأسرار)؛ وإزالته من جانب المستدعي تُلغي التوقيع، وإزالته من الجانب المكشوف تُلغي التحقّق. - كل شيء يُتتبَّع. يكتب كل استدعاء سجلّ تدقيق (المؤسسة المُستدعِية، العقدة، العمق، زمن الاستجابة، الحالة) — قبل التنفيذ، بحيث يوجد أثر حتى في حال وقوع حادث. ويمكن للطرفين الاطّلاع على سجلّاتهما الخاصة (جانب المُستدعِي وجانب المُستدعَى)، وفقًا لحقوق الوصول بموجب GDPR.
الفوترة: تدفع المؤسسة المُستدعَاة مقابل الموارد (LLM، الصوت…) المُستهلَكة أثناء التنفيذ. منطق الضيف: أنت تستخدم موارد مضيفك.
منع الحلقات
الـpipeline الذي يستدعي نفسه، مباشرةً أو عبر سلسلة، سيستهلك أرصدة إلى ما لا نهاية. وهناك حمايتان:
- الكشف الساكن عند التسجيل (داخل مؤسسة): يرفض المحرّر نشر دورة مباشرة (
A → A) أو دورة غير مباشرة (A → B → C → A)، مستشهدًا بالسلسلة المخالِفة. - حارس وقت التشغيل (عبر المؤسسات، حيث تستحيل الرؤية الساكنة): يمرّر كل استدعاء عمقه؛ وبعد 10 مستويات، يُرفَض الاستدعاء.
أوضاع التنفيذ
- متزامن (
sync) — تنتظر العقدة الاستجابة الكاملة. مناسب للعمليات قصيرة المدّة. - بلا انتظار (
ack) — يُطلَق الاستدعاء ويتابع الـpipeline المُستدعِي فورًا؛ ويبقى مفتاح الإخراج فارغًا. - بثّ (
stream) — لـpipeline فرعي طويل المدّة (استدلال LLM، معالجة دفعية)، يُستقبَل التقدّم في الوقت الفعلي (تحت<مفتاح الإخراج>._progress)؛ وتنطبق المهلة عندئذٍ على أقصى مدّة بلا حدث، لا على المدّة الإجمالية.
متى تستخدمها
- تحليل تسلسل تعيد استخدامه عدّة pipelines (تلخيص سلسلة، تأهيل عميل محتمل، التحقق من مستند).
- مشاركة قدرة بين المؤسسات — كيان يعرض «التحقق من فاتورة مقابل ERP»، ويستهلكها آخر، مع مسار تدقيق على الجانبين.
- موازاة توزيع (fan-out) لمهام فرعية مستقلّة من حلقة.