דלג לתוכן הראשידלג לצור קשר
    דף הביתארכיטקטורה אגנטיתפרק 5
    פרק 5 מתוך 30 · 21.3
    ארכיטקטורה אגנטית

    SDK Hooks

    שכבת הבקרה הסודית

    פרק 5 / 30

    אודות הפרק

    פרומפט הוא בקשה, הוק הוא חוק. למדו על PreToolUse ו-PostToolUse — איך לאכוף כללים קריטיים בצורה דטרמיניסטית.

    הבעיה: פרומפט הוא בקשה, לא חוק

    יש לכם סוכן שמטפל בהחזרים כספיים. אתם כותבים בפרומפט: "אל תאשר החזר מעל 500 דולר." ברוב המקרים — זה יעבוד. אבל "ברוב המקרים" זה לא מספיק כשמדובר בכסף.

    פרומפט הוא הסתברותי (Probabilistic). הוא בקשה. יש סיכוי — קטן, אבל קיים — שהמודל יתעלם ממנו. ובבחינה של Claude Certified Architect — התשובה "נשים את זה בפרומפט" כמעט תמיד טעות כשמדובר בכללים קריטיים.

    הפתרון: Hooks

    Hooks הם פקודות שרצות בנקודות מסוימות בלולאה של הסוכן. הם דטרמיניסטיים (Deterministic) — תמיד רצים, תמיד אוכפים, בלי "שיקול דעת" של המודל.

    שני Hooks מרכזיים שצריך לדעת לבחינה:

    1. PreToolUse — רץ לפני שהכלי מופעל. זה ה-Hook שחוסם פעולות. למשל: אם מישהו מנסה לאשר החזר מעל 500 דולר — ה-Hook חוסם את הקריאה לכלי לפני שהיא קורית.
    2. PostToolUse — רץ אחרי שהכלי הופעל. זה ה-Hook שמנרמל פורמטים, כותב ללוג, ומוסיף הקשר לפני שהמודל רואה את התוצאה.
    # PreToolUse Hook — blocks refunds over $500
    def pre_tool_use_hook(tool_name: str, tool_input: dict) -> dict:
        """Runs BEFORE the tool is called. Can block the call."""
        if tool_name == "process_refund":
            amount = tool_input.get("amount", 0)
            if amount > 500:
                return {
                    "decision": "deny",
                    "message": f"Refund of ${amount} exceeds $500 limit. "
                               f"Escalate to human supervisor."
                }
        return {"decision": "allow"}
    
    
    # PostToolUse Hook — logs and normalizes after execution
    def post_tool_use_hook(tool_name: str, tool_output: dict) -> dict:
        """Runs AFTER the tool returns. Can modify the result."""
        # Log every tool call for audit
        log_to_audit_trail(tool_name, tool_output)
    
        # Normalize date formats before model sees the result
        if "date" in tool_output:
            tool_output["date"] = normalize_date(tool_output["date"])
    
        return tool_output

    PreToolUse חוסם לפני שזה קורה, PostToolUse בודק ומנרמל אחרי

    דוגמה מסוג שאלות הבחינה

    "אתם בונים סוכן שירות לקוחות עם גישה לכלי process_refund. איך תוודאו שהסוכן לא יאשר החזר מעל 500 דולר?"

    • אופציה א — "נוסיף הנחיה בפרומפט: אסור לאשר החזרים מעל 500 דולר."
    • אופציה ב — "נשתמש ב-PreToolUse Hook שבודק את הסכום ומחזיר deny אם עובר 500."

    💡 טיפ: התשובה — תמיד ב. כי פרומפט הוא הסתברותי, Hook הוא דטרמיניסטי. בבחינה, כשרואים שאלה על אכיפת כללים קריטיים (כסף, אבטחה, רגולציה) — התשובה היא תמיד אכיפה בקוד, לא בפרומפט.

    נקודות חשובות לבחינה

    • פרומפט = הסתברותי (בקשה). Hook = דטרמיניסטי (חוק).
    • PreToolUse — חוסם פעולות לפני שהן קורות
    • PostToolUse — בודק, מנרמל ומתעד אחרי שהכלי רץ
    • כשטעות עולה כסף, מפרה רגולציה, או פוגעת באבטחה — Hook, לא פרומפט
    • PreToolUse מחזיר deny כדי לחסום, allow כדי להמשיך
    • ~45% מהבחינה בנוי סביב הנושא של אכיפה דטרמיניסטית

    "פרומפט הוא בקשה. הוק הוא חוק. כשמדובר בכסף של לקוחות — אין מקום ל'ברוב המקרים'."

    💡 טיפ: בפרק הבא (יום 6) נלמד על פירוק משימות (Task Decomposition) — איך לפרק בעיות גדולות לניצחונות קטנים.