إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
Agent Hooks هي قدرة إطار عمل عامل من الدرجة الأولى لتطبيق عناصر التحكم في الحوكمة ووقت التشغيل في نقاط محددة جيدا في تنفيذ العامل. ينفذ عقد AGENT-HOOKS-0.1 المحايد لإطار العمل، بحيث يمكن لمحركات النهج وبوابات الموافقة وحراس الموازنة وعوامل تصفية المحتوى وعناصر التحكم في الخروج استهداف سطح تحكم واحد مشترك.
Important
الوكيل Hooks هو مستوى تحكم، وليس مستوى بيانات تتبع الاستخدام. كل معترض يرجع حكم. وفي enforce الوضع، يعمل الإطار على هذا الحكم؛ وفي evaluate_only الوضع، يسجل الحكم دون تغيير التنفيذ. استخدم إمكانية المراقبة للتتبع السلبي والمقاييس والسجلات.
عامل Hooks غير متوفر حتى الآن .NET. استخدم البرنامج الوسيط للعاملوالموافقة على الأدواتوأمان العامل لإضافة عناصر تحكم وقت التشغيل إلى عوامل .NET.
عامل Hooks تجريبي في Python. يصدر ExperimentalWarning المصنع عند استخدامه لأول مرة، ويمكن تغيير واجهة برمجة التطبيقات الخاصة به قبل التوفر العام.
متى تستخدم الخطافات الوكيلة
استخدم Agent Hooks عندما تحتاج عناصر التحكم المطورة بشكل مستقل إلى عقد مشترك وقابل للتنفيذ عبر إدخال العامل ومكالمات النموذج واستدعاءات الأدوات والإخراج النهائي.
| Capability | استخدمه ل |
|---|---|
| خطافات الوكيل | قرارات النهج الموحدة والتحويلات والموافقات والميزانيات وعناصر التحكم في الخروج عبر دورة حياة العامل. |
| البرنامج الوسيط للعامل | سلوك شامل خاص بالتطبيق لا يحتاج إلى عقد Agent Hooks أو ضمانات وقت التشغيل الأساسية الخاصة به. |
| أمان العامل مع FIDES | تسميات ونهج تدفق المعلومات المحددة للمحتوى غير الموثوق به أو السري. |
| الموافقة على الأداة | تأكيد بشري لمكالمات أداة الوظائف الفردية. |
| إمكانية المراقبة | التتبعات السلبية والمقاييس والسجلات التي لا تتحكم في التنفيذ. |
ما يفرضه إطار عمل العامل
عند إضافة Agent Hooks إلى عامل، يطبق إطار عمل العامل حد فرض منسق عبر عمليات تشغيل العامل ومكالمات النموذج ومكالمات الأدوات. يوفر وقت التشغيل الضمانات التالية:
- فشل الإغلاق: يمنع الرفض الإجراء المحمي. لا تتجاوز السياقات غير الصالحة والأحكام غير الصالحة وفشل المعترض وفشل التنفيذ عناصر التحكم بصمت.
- تحويل إعادة الكتابة: يغير التحويل الرسائل الأصلية أو وسيطات الأدوات أو نتائج الأدوات أو الاستجابة النهائية التي يستخدمها التنفيذ فعليا. إذا تعذر تطبيق تحويل، يفشل التشغيل في الإغلاق.
- الدفق المخزن مؤقتا: لا يصل أي تحديث استجابة إلى المتصل حتى تمر استجابة النموذج الكاملة والإخراج النهائي نقاط الاعتراض الخاصة بهم.
-
استمرارية الحكم: والمثابرة تنتظر الحكم الذي يغطيها. ينتظر استمرار التشغيل القياسي بعد
outputالتشغيل ؛ وينتظر استمرار كل محفوظات استدعاء لكل خدمة لكلpost_model_call. - إكمال تثبيت المجموعة: يتم تثبيت أجزاء العامل والدردشة والدالة كوحدة واحدة، لذلك لا يمكن تكوين حد إنفاذ غير كامل عن طريق الخطأ.
العقد تعاوني وليس حدود عزل عملية. تعمل المعترضات في عملية المضيف وتتلقى المحتوى اللازم لاتخاذ القرارات. تسجيل المعترضات التي تثق بها فقط.
تثبيت خطافات الوكيل
تثبيت الإضافية الاختيارية agent-hooks للحزمة الأساسية:
pip install "agent-framework-core[agent-hooks]"
إذا كنت تستخدم uv:
uv add "agent-framework-core[agent-hooks]"
التبعية agent-hooks-sdk مستوردة كسولة. لا يؤدي agent_framework الاستيراد إلى تحميل SDK إلا إذا قمت بإنشاء حزمة برامج وسيطة ل Agent Hooks.
Note
agent-hooks لا يتم تضمين الإضافات عمدا في agent-framework-core[all]. قم بتثبيته بشكل صريح عندما تريد تمكين سطح التحكم التجريبي هذا.
إضافة اعتراض
يتلقى agent_hooks.AgentContext المعترض (تعيين سياق المواصفات، وليس agent_framework.AgentContext المستخدم من قبل البرنامج الوسيط للعامل) ويعيد حكما. يمنع المعترض التالي الإخراج النهائي الذي يحتوي على الكلمة secret. يفترض client المثال أن عميل دردشة إطار عمل العامل تم تكوينه بالفعل.
from agent_framework import Agent, create_agent_hooks_middleware
from agent_hooks import ALLOW, AgentContext, InterceptionBlocked, Verdict
class SecretEgressGuard:
def intercept(self, context: AgentContext) -> Verdict:
if (
context["interception_point"] == "output"
and "secret" in str(context["target"]).lower()
):
return Verdict.deny(
reason="secret_in_output",
message="The final response contains restricted content.",
)
return ALLOW
hooks = create_agent_hooks_middleware(
{"secret-egress": SecretEgressGuard()},
)
agent = Agent(
client=client,
instructions="You are a helpful assistant.",
middleware=[hooks],
)
try:
response = await agent.run("Summarize the account details.")
except InterceptionBlocked as exc:
print(f"Blocked: {exc.result.verdict.reason}")
مرر الحزمة كعنصر واحد في قائمة العامل middleware . تثبيت حزمة Agent Hooks واحدة بالضبط على كل عامل.
نقاط الاعتراض
يصدر إطار عمل العامل نقاط الاعتراض القابلة للتطبيق تلقائيا:
| نقطة اعتراض | عندما يتم إصداره | تحويل الهدف |
|---|---|---|
agent_startup |
قبل الإدخال الأول في جلسة عمل Agent Hooks | غير قابل للتحويل |
input |
عندما يدخل طلب خارجي العامل | إدخال المحتوى والدور |
pre_model_call |
قبل كل طلب نموذج | الرسائل المرسلة إلى النموذج |
post_model_call |
بعد كل استجابة نموذج كاملة | محتوى الاستجابة واستدعاءات الأدوات المنفذة في إطار العمل وسبب الانتهاء |
pre_tool_call |
قبل استدعاء كل أداة منفذة في إطار العمل | مُعاملات الأداة |
post_tool_call |
بعد نجاح أداة أو فشلها | نتيجة الأداة |
output |
قبل أن تصل الاستجابة النهائية إلى المتصل | محتوى الاستجابة النهائية |
agent_shutdown |
عند اكتمال جلسة عمل Agent Hooks أو فشلها أو إلغاؤها | غير قابل للتحويل |
عادة ما يصدر تشغيل يستدعي أداة ما:
agent_startup
input
pre_model_call → → pre_tool_callpost_model_call → → → → → → post_model_calloutput → pre_model_call → → post_tool_call → →agent_shutdown
الأحكام
يحتوي العقد على ثلاثة قرارات: allowو denyو.transform يوفر Python SDK أيضا مساعدين للتحذيرات والرفضات القابلة للرفع.
| النتيجة | واجهة برمجة تطبيقات Python | السلوك |
|---|---|---|
| السماح |
ALLOW او Verdict(decision=Decision.ALLOW) |
تابع مع الهدف دون تغيير. |
| السماح مع التحذير | Verdict.warn(...) |
تابع وقم بتضمين التحذير في سجل الاعتراض. |
| أنكر | Verdict.deny(...) |
حظر الإجراء المحمي. |
| رفض الموافقة المعلقة | Verdict.escalate(...) |
حظر ما لم يقم محلل الموافقة المكون بإرجاع حكم تصريح. |
| التحويل | Verdict(decision=Decision.TRANSFORM, transform=Transform(...)) |
أعد كتابة قيمة ضمن $target، ثم تابع مع القيمة المعاد كتابتها. |
يؤدي رفض مستوى التشغيل ومستوى النموذج إلى رفع InterceptionBlocked النتيجة المحمية ومنعها من الوصول إلى المتصل أو المرحلة التالية. في التماس أداة، يمنع رفض النهج إجراء الأداة أو يتجاهل نتيجته ويعيد خطأ تحكم يحتوي على سبب النهج، دون حمولة الهدف المرفوضة، إلى النموذج. يسمح هذا لحلقة العامل بالمتابعة. يؤدي فشل المضيف أو التنفيذ إلى إيقاف التشغيل.
تطبيق تحويل
يجب أن يبدأ مسار التحويل في $target. على سبيل المثال، يمكن أن يحل المعترض محل محتوى الاستجابة النهائية:
from agent_hooks import ALLOW, AgentContext, Decision, Transform, Verdict
class OutputRedactor:
def intercept(self, context: AgentContext) -> Verdict:
if context["interception_point"] != "output":
return ALLOW
return Verdict(
decision=Decision.TRANSFORM,
reason="redacted_output",
transform=Transform(
path="$target.content",
value="[Response removed by policy]",
),
)
يتم تطبيق التحويلات على قيم إطار عمل Content العامل، مع الحفاظ على المحتوى الغني المدعوم بدلا من تقليل كل قيمة إلى نص عادي. فشل إغلاق مسار مشوه أو استبدال غير متوافق بدلا من المتابعة بالقيمة الأصلية.
الموافقة على الأداة وتحويل الوسيطة
تعد الموافقة على أداة إطار عمل العامل و التماس موافقة Agent Hooks آليات منفصلة. بالنسبة إلى أداة دالة مع approval_mode="always_require"، ينشئ إطار عمل العامل طلب الموافقة البشرية قبل تشغيل البرنامج الوسيط للوظيفة.
pre_tool_call لذلك يمكن للتحويل تغيير الوسيطات بعد موافقة المستخدم على القيم الأصلية.
تحذير
لا تقم بتحويل الوسيطات في pre_tool_call للأدوات التي تستخدم approval_mode="always_require". قم بتحويل استدعاء الأداة في post_model_call بحيث يحتوي طلب الموافقة على إطار العمل على القيم المحولة، أو العودة Verdict.escalate(...) إلى pre_tool_call الموافقة وحلها من خلال Agent Hooks resolver.
الدفق والمثابرة
يحتفظ Agent Hooks بواجهة برمجة التطبيقات المتدفقة ولكنه يستخدم دلالات إخراج مخزنة مؤقتا. يقوم إطار عمل العامل بتجميع استجابة النموذج الكاملة، ويصدر post_model_call، ويجمع استجابة العامل النهائي، ويصدر output قبل إصدار أي تحديثات. إذا رفضت أي من النقطتين الاستجابة، فلن يتلقى المتصل أي تحديثات جزئية.
يتداول هذا السلوك زمن انتقال الرمز المميز لكل رمز مميز لإنفاذ الإخراج الذي تم إغلاقه بفشل. وينعكس تحويل الإخراج أيضا في التحديثات التي تم إصدارها في النهاية للمتصل.
يتم بوابات الثبات بواسطة نقطة الاعتراض التي تغطي عملية الثبات:
- بشكل افتراضي، ينتظر
outputعمل المحفوظات وغيرها من الموفرين بعد التشغيل الحكم. لا يستمر الإخراج الذي تم رفضه، ويتم استمرار تحويل الإخراج بعد التحويل. - عند تعيين
require_per_service_call_history_persistence=Trueعلى الدالةAgentالإنشائية أوclient.as_agent(...)، يستمر كل تبادل نموذج بعد أن يسمح حكمهpost_model_callبذلك. لا يعود الرفض اللاحقoutputإلى الحالة السابقة التي كانت تسمح بالمحفوظات بالفعل. - لاستمرارية ما بعد التشغيل الافتراضية، تظل محاولات إعادة المحاولة وراء القرار النهائي
output. بدلا من ذلك، يستمر وضع استدعاء لكل خدمة في كل استجابة نموذج تمر .post_model_call
Important
إذا كان يجب ألا يصبح محتوى النموذج دائما، ففرض هذا النهج عند post_model_callrequire_per_service_call_history_persistence=True. يحمي نهج الخروج للإخراج فقط ما يصل إلى المتصل، ولكنه لا يزيل تبادلات النموذج المسموح بها والمستمرة بالفعل بأثر رجعي في post_model_call.
جلسات العمل وسجلات التدقيق
بشكل افتراضي، ينشئ كل تشغيل عامل جلسة عمل Agent Hooks واحدة.
agent_startup وقوس agent_shutdown التشغيل، وتتلقى السجلات معرف جلسة عمل واحد بتسلسل متزايد بشكل رتيبة.
استخدم record_sink لتلقي كل InterceptionRecord:
records = []
hooks = create_agent_hooks_middleware(
{"secret-egress": SecretEgressGuard()},
record_sink=records.append,
)
تسجل سجلات الاعتراض القرار والسبب وملخص المعترض ووضعه وهويته وتسلسله دون نسخ الحمولة المعترض عليها في سجل التدقيق. لا يزال المعترض نفسه يتلقى السياق الكامل.
امتداد عمليات تشغيل متعددة بجلسة عمل واحدة
استخدم create_agent_hooks_middleware_from_emitter() عندما يمتلك التطبيق جلسة عمل Agent Hooks أطول عمرا، مثل محادثة مع دفتر الأستاذ واحد للموافقة:
from agent_framework import Agent, create_agent_hooks_middleware_from_emitter
from agent_hooks import AgentContextBuilder, InterceptionEmitter
emitter = InterceptionEmitter().register(SecretEgressGuard())
builder = AgentContextBuilder(
agent_id="support-agent",
framework="agent-framework",
session_id="conversation-42",
)
hooks = create_agent_hooks_middleware_from_emitter(emitter, builder)
agent = Agent(client=client, middleware=[hooks])
await emitter.emit(builder.agent_startup(tools_registered=[]))
await agent.run("First turn")
await agent.run("Second turn")
await emitter.emit(builder.agent_shutdown(reason="completed"))
في هذا النموذج، يقوم التطبيق بتكوين الباعث ويمتلك بدء التشغيل وإيقاف التشغيل وتنظيف الخطأ. يصدر البرنامج الوسيط نقاط التشغيل لكل من input خلال output.
تكوين الإنفاذ
create_agent_hooks_middleware() يقبل عناصر التحكم التالية:
| المعلمه | الغرض |
|---|---|
interceptors |
تسلسل من المعترضات أو تعيين الاسم إلى المعترض. مطلوب واحد على الأقل. |
resolver |
حل الرفض القابل للرفع من خلال قناة الموافقة. بدون محلل، يظل الرفض ساري المفعول. |
mode |
"enforce" تطبيق الأحكام.
"evaluate_only" يسجل ما قد يحدث ولكنه يسمح بكل إجراء. |
composition |
تحديد كيفية دمج أحكام اعتراض متعددة. |
identity_provider |
ينتج هويات سياق مرتبطة بالمحتوى. الافتراضي هو "jcs-sha256". |
timeout |
مهلة كل اعتراض وحلل للمكالمات التي يمكن انتظارها. الإعداد الافتراضي هو خمس ثوان. لا يمكن استباق اعتراض أو محلل متزامن يحظر حلقة الحدث بواسطة هذه المهلة. |
record_sink |
يتلقى كل سجل اعتراض خال من الحمولة. |
التكوين الافتراضي تسلسلي first_deny مع الموافقة التي تم تكوينها لإيقاف الطي. ترتيب اعتراض لذلك الأمور: وضع عناصر التحكم التي يجب تشغيلها دائما قبل عناصر التحكم التي يمكن أن تطلب الموافقة. راجع قائمة اختيار إنتاج Agent Hooks قبل تحديد ملف تعريف تكوين آخر.
طرح مع وضع التقييم فقط
استخدم evaluate_only لقياس سلوك النهج قبل الإنفاذ:
hooks = create_agent_hooks_middleware(
{"secret-egress": SecretEgressGuard()},
mode="evaluate_only",
record_sink=records.append,
)
في هذا الوضع، يتم تشغيل المعترضين وتتضمن السجلات أحكامهم، ولكن لا يتم حظر أي إجراء أو تحويله. لا تصف evaluate_only التوزيع على أنه حوكمة مفروضة.
قواعد التكوين
ضع الحزمة أولا في قائمة البرامج الوسيطة للعامل بحيث تشكل حدود التنفيذ الخارجية:
agent = Agent(
client=client,
middleware=[
create_agent_hooks_middleware([SecretEgressGuard()]),
application_middleware,
],
)
اتبع هذه القواعد:
- تثبيت حزمة Agent Hooks واحدة بالضبط لكل عامل. يتم رفض الحزم المكدسة.
- حافظ على الحزمة سليمة. لا يمكن تثبيت العامل والدردشة والبرامج الوسيطة للوظيفة بشكل منفصل.
- قم بتثبيت الحزمة على
Agent، وليس مباشرة على عميل دردشة أو من خلال موفر سياق. - البرامج الوسيطة الموضوعة قبل الحزمة خارج حدود التنفيذ. تعامل مع الموضع الخارجي كثقة خارجية.
- امنح كل عامل متداخل حزمته الخاصة عندما يحتاج نموذجه الداخلي ونشاط الأداة أيضا إلى اعتراض.
القيود الحالية
- Python فقط: لم يتم تنفيذ Agent Hooks بعد في .NET أو Go SDKs.
- واجهة برمجة التطبيقات التجريبية: يمكن أن تتغير تواقيع المصنع وسلوكه قبل التوفر العام.
- الدفق المخزن مؤقتا: لا يتم إصدار التحديثات الرمز المميز بواسطة الرمز المميز لأنه يجب أن يكتمل الإخراج قبل صدور حكم بفشل مغلق.
-
الأدوات المستضافة: لا تمر الأدوات التي ينفذها موفر النموذج من خلال التماس استدعاء الوظائف في Agent Framework. تظهر المكالمات والمخرجات الخاصة بهم في
post_model_call، ولكنpre_tool_callpost_tool_callلا يمكن حظر تنفيذ الموفر من جانب الخادم. - الحدود التعاونية: عامل Hooks لا يعترض بيئة الاختبار المعزولة أو يحمي من مضيف عدائي. لا تتم تغطية مسارات التعليمات البرمجية التي تتجاوز البنية الأساسية لبرنامج ربط العمليات التجارية للعامل المحمي.
- يؤثر توفر المعترض على توفر العامل: في وضع الفرض، يمنع فشل المعترض أو المهلة الإجراء المحمي حسب التصميم.
للحصول على إطلاق الإنتاج وأسباب الفشل وإرشادات التنبيه، راجع دفتر تشغيل عمليات Agent Hooks.
Agent Hooks غير متوفر بعد ل Go. استخدم البرنامج الوسيط للعاملوالموافقة على الأدواتوأمان العامل لإضافة عناصر تحكم وقت التشغيل إلى عوامل Go.