Skip to main content
أدوات لتشغيل الوكلاء بأمان: حواجز حماية المدخلات والمخرجات تفحص ما يدخل إلى أي تشغيل وما يخرج منه (ومعاملات أدواته)، وحواجز حماية الرقع (patch) فحوص تُجرى على تغيير مقترح قبل أن تتصرف بناءً عليه، وتَعدّ أي خلل فشلًا (fail-closed)، والأدوات المعزولة تعمل داخل حاوية معزولة بدل عملية المستضيف. للقرارات البشرية الخاصة بكل استدعاء، راجع الموافقات؛ وللخطّافات التي تفحص كل استدعاء أداة أو ترفضه، راجع HookRegistry في نظرة عامة على الواجهة البرمجية.

حواجز حماية المدخلات والمخرجات

createAgent({ guardrails }) (أو ExecuteOptions.guardrails) يفحص التشغيل عند ثلاث نقاط، وتُنفَّذ كل قائمة بالترتيب: حاجز الحماية هو { name, check(ctx) }. يحتوي ctx على kind ('input' أو 'output' أو 'tool')، وtext، وmessages الخاصة بالتشغيل، وtoolName وargs في حالة استدعاء أداة، وsignal الخاصة بالتشغيل. تُعيد check (مباشرةً أو عبر وعد) { ok: true } أو { ok: false, reason, action?, replacement? }:
  • action: 'block' (القيمة الافتراضية) ينهي التشغيل بـ finishReason: 'guardrail' وبـ result.guardrail ({ name, kind, reason, toolName? }). تكون قيمة result.text هي '' ولا يُضاف الرد المحظور إلى سجل المحادثة؛ واستدعاء الأداة المحظور لا يُنفَّذ (ولا الاستدعاءات التي تليه في تلك الدورة) ويحصل على نتيجة “cancelled”، فيبقى سجل المحادثة صالحًا. ويُصدر stream() الحدث guardrail.tripped قبل run.done.
  • action: 'rewrite' يضع replacement مكان النص (وفي معاملات استدعاء الأداة: replacement هو المعاملات الجديدة بصيغة JSON)، ويرى حاجز الحماية التالي النص الجديد، ويُصدر stream() الحدث guardrail.rewrote.
مع onTripped: 'throw' يؤدي الحظر إلى رفض الوعد بالخطأ GuardrailError (LOUSHO_GUARDRAIL_TRIPPED، ومعه guardrail نفسه) بدلًا من ذلك. وإذا رمت check استثناءً فشل التشغيل. يشغّل الوكلاء الفرعيون حواجز حماية الوكيل الأب، ثم حواجزهم هم. وتذكر ملفات مواصفات الوكيل حواجز الحماية المضمَّنة بأسمائها في policy.guardrails (راجع الإعدادات).

حواجز حماية الرقع

runGuardrails(action, guardrails) ينفّذ كل الفحوص بالتزامن على رقعة مقترحة ويجمع النتائج في حكم واحد. يستخدمه مثال ops-pipeline لفحص رقعة وكيل الإصلاح قبل فتح طلب سحب (pull request):
الإغلاق عند الفشل (fail-closed). حاجز الحماية الذي يرمي استثناءً، أو يُرفض وعده، أو لا يُحسم ضمن مهلته (30 ثانية افتراضيًا)، أو يُحسم بأي شيء غير pass: true يُعدّ فاشلًا: runGuardrailSafely(guardrail, action) يغلّف كل حاجز. وحاجز الأمر يقتل عمليته حين تنقضي المهلة (وعلى Windows، شجرة العمليات كلها). اكتب حاجزك الخاص في صورة { name, check(action) } تُعيد { pass, reason? }.

الأدوات المعزولة

تختار الأداة العمل في بيئة معزولة بتحديد requiresSandbox: true وتوفير الدالة sandboxExecute(args, sandbox). عندها يستدعي المنفّذ sandboxExecute ومعها SandboxAdapter الخاص بالتشغيل بدل أن يستدعي execute:
  • NoopSandbox (الافتراضي) يعمل على المستضيف. إنه بديل شكلي وليس عزلًا.
  • SubprocessSandbox ينفّذ كل أمر في حاوية Docker جديدة، معزولة عن الشبكة وتُزال تلقائيًا، ولا يُوصَل بها أي مجلد من المستضيف سوى cwd الذي تمرّره. يحتاج إلى خدمة Docker (daemon) قيد التشغيل وإلى الاعتمادية النظيرة الاختيارية dockerode (npm install dockerode@^5.0.1؛ تُحمَّل عند أول استخدام). وعند إلغاء التشغيل (run.abort() أو signal) أو انقضاء مهلة الأمر، تُقتل الحاوية وتُزال.
  • نفّذ الواجهة SandboxAdapter (name وrun(cmd, args, opts) وwriteFile(path, content)) لدعم نظام خلفي آخر.
لوكلاء البرمجة، يضع SandboxShell أداة الصدفة (shell) في مساحة العمل خلف المحوّل نفسه؛ راجع أدوات مساحة العمل.