Pi Agent: Event System & Command Registration
آخر تحديث: 2026-08-31
--- title: "نظام الأحداث وتسجيل الأوامر" description: "أتقن بنية Pi Agent المدفوعة بالأحداث وآلية تسجيل الأوامر لمعالجة الأحداث المخصصة وامتدادات الأوامر." order: 16 lang: ar
نظام الأحداث يحوّل الوكيل من "تسأل فيجيب" إلى اتصال حقيقي ثنائي الاتجاه.
1. نظرة عامة على نظام الأحداث
يستخدم Pi Agent بنية مدفوعة بالأحداث:
TEXT
📖 للعرض فقط
تدفق الأحداث
مصدر المشغل → ناقل الأحداث → المعالج
إدخال المستخدم توزيع/توجيه استدعاءات الأدوات
عودة الأداة تصفية/فرز تحديثات الواجهة
مؤقت فرز بالأولوية تسجيل الدخول
رسالة خارجية توجيه الأخطاء إشعارات
2. الأحداث المدمجة
| الحدث | المشغل | البيانات |
|---|---|---|
| on_chat_start | بدء المحادثة | session_id |
| on_chat_end | انتهاء المحادثة | session_id, summary |
| on_user_message | المستخدم يرسل رسالة | message |
| on_agent_response | الوكيل يستجيب | response |
| on_tool_call | استدعاء أداة | tool_name, params |
| on_tool_result | الأداة تعيد نتيجة | tool_name, result |
| on_error | يحدث خطأ | error, context |
| on_model_switch | تبديل النموذج | old_model, new_model |
| on_context_overflow | تجاوز السياق | size, limit |
3. الاستماع للأحداث
(1) أسلوب المُزخرف
PYTHON
from pi_agent import Agent
agent = Agent(name="monitored")
@agent.on("tool_call")
def log_tool_call(event):
print(f"Tool called: {event.tool_name}({event.params})")
@agent.on("error")
def handle_error(event):
print(f"Error: {event.error}")
with open("error_log.txt", "a") as f:
f.write(f"{event.error}\n")
@agent.on("agent_response")
def log_response(event):
print(f"Token usage: {event.response.usage}")
(2) أسلوب الفئة
PYTHON
from pi_agent import Agent, EventHandler
class MyHandler(EventHandler):
def on_tool_call(self, event):
print(f"Tool: {event.tool_name}")
def on_tool_result(self, event):
print(f"Result: {event.result}")
def on_error(self, event):
print(f"Error: {event.error}")
agent = Agent(name="monitored", event_handler=MyHandler())
4. أحداث مخصصة
(1) تعريف الحدث
PYTHON
from pi_agent import Event
class DeployEvent(Event):
name = "deploy"
fields = ["environment", "status", "url"]
(2) إطلاق الحدث
PYTHON
agent.emit("deploy", {
"environment": "production",
"status": "success",
"url": "https://myapp.example.com"
})
(3) الاستماع لحدث مخصص
PYTHON
@agent.on("deploy")
def on_deploy(event):
if event.status == "success":
send_notification(f"Deploy succeeded: {event.url}")
5. تسجيل الأوامر
(1) تسجيل أوامر تفاعلية
PYTHON
from pi_agent import Agent
agent = Agent(name="custom_cmd")
@agent.command("/deploy", description="نشر المشروع إلى البيئة المحددة")
def deploy_cmd(args: str):
env = args.strip() or "staging"
result = agent.run(f"انشر المشروع الحالي إلى {env}")
print(result)
@agent.command("/review", description="مراجعة الكود في الملف المحدد")
def review_cmd(args: str):
filename = args.strip()
result = agent.run(skill="code_review", file=filename)
print(result)
@agent.command("/cost", description="عرض إحصائيات استخدام الرموز للجلسة الحالية")
def cost_cmd(args: str):
usage = agent.session.get_usage()
print(f"استخدام الرموز: {usage.total_tokens}")
print(f"التكلفة المقدرة: ${usage.estimated_cost:.4f}")
6. فلاتر الأحداث
(1) التصفية الشرطية
PYTHON
@agent.on("tool_call", filter=lambda e: e.tool_name == "shell")
def log_shell_calls(event):
print(f"Shell command: {event.params.get('cmd')}")
(2) الأولوية
PYTHON
@agent.on("error", priority=10)
def critical_error(event):
send_alert(f"Critical error: {event.error}")
@agent.on("error", priority=1)
def log_error(event):
with open("errors.log", "a") as f:
f.write(f"{event.error}\n")
❓ أسئلة شائعة
س هل يمكن لمعالجات الأحداث تعديل بيانات الحدث؟
ج نعم، لكن يُنصح بالقراءة فقط لتجنب الآثار الجانبية. البيانات المعدلة مرئية للمعالجات اللاحقة.
س معالجة أحداث متزامنة أم غير متزامنة؟
ج الافتراضي متزامن، ينفذ بالأولوية. استخدم
async_handler=True للمعالجات غير المتزامنة.س الفرق بين الأوامر وأوامر الشرطة المائلة؟
ج الأوامر هي امتدادات مخصصة عبر
@agent.command(). أوامر الشرطة المائلة هي أوامر الوضع التفاعلي المدمجة (/help، /exit). نفس التنسيق، مصادر مختلفة.📖 ملخص
- مدفوعة بالأحداث: مشغل → ناقل أحداث → معالج
- 9 أحداث مدمجة تغطي دورة حياة الوكيل الكاملة
- أسلوبا استماع: المُزخرف وفئة EventHandler
- أحداث مخصصة وتسجيل أوامر توسّع القدرات التفاعلية
- الفلاتر والأولوية تتحكم في معالجة الأحداث
📝 تمارين
- أساسي (الصعوبة: ⭐): استمع لأحداث tool_call، سجّل جميع استدعاءات الأدوات في ملف.
- متوسط (الصعوبة: ⭐⭐): أنشئ أمر /summarize يُولّد ملخصاً للجلسة.
- متقدم (الصعوبة: ⭐⭐⭐): نفّذ خط أنابيب نشر مدفوع بالأحداث: مراجعة كود ← اختبار ← نشر، كل مرحلة مشغلة بأحداث.