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). نفس التنسيق، مصادر مختلفة.

📖 ملخص


📝 تمارين

  1. أساسي (الصعوبة: ⭐): استمع لأحداث tool_call، سجّل جميع استدعاءات الأدوات في ملف.
  2. متوسط (الصعوبة: ⭐⭐): أنشئ أمر /summarize يُولّد ملخصاً للجلسة.
  3. متقدم (الصعوبة: ⭐⭐⭐): نفّذ خط أنابيب نشر مدفوع بالأحداث: مراجعة كود ← اختبار ← نشر، كل مرحلة مشغلة بأحداث.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%