ככל שסוכני AI הופכים למתוחכמים יותר, מפתחים מבקשים מהם יותר ויותר לבצע משימות מורכבות, הדורשות עבודה הנמשכת שעות ואף ימים. עם זאת, לגרום לסוכנים להתקדם בעקביות על פני מספר חלונות הקשר נותר אתגר בלתי פתור.
האתגר המרכזי בסוכנים ארוכי טווח הוא שהם חייבים לפעול בסשנים נפרדים, וכל סשן חדש מתחיל ללא זיכרון ממה שקדם לו. דמיינו פרויקט תוכנה מאויש על ידי מהנדסים העובדים במשמרות, כאשר כל מהנדס חדש מגיע ללא זיכרון ממה שקרה במשמרת הקודמת. מכיוון שחלונות הקשר מוגבלים, ורוב הפרויקטים המורכבים אינם יכולים להסתיים בחלון יחיד, סוכנים זקוקים לדרך לגשר על הפער בין סשני קידוד.
פיתחנו פתרון דו-שכבתי כדי לאפשר ל-Claude Agent SDK לעבוד ביעילות על פני חלונות הקשר רבים: סוכן אתחול (initializer agent) שמקים את הסביבה בריצה הראשונה, וסוכן קידוד (coding agent) שממונה על התקדמות מצטברת בכל סשן, תוך השארת Artifacts ברורים לסשן הבא. דוגמאות קוד זמינות ב-quickstart המצורף.
האתגר: סוכנים ארוכי טווח
ה-Claude Agent SDK הוא מנגנון סוכנים רב עוצמה וכללי, המצטיין בקידוד, כמו גם במשימות נוספות הדורשות מהמודל להשתמש בכלים כדי לאסוף הקשר, לתכנן ולבצע. הוא כולל יכולות ניהול הקשר כגון דחיסה (compaction), המאפשרת לסוכן לעבוד על משימה מבלי למצות את חלון ההקשר. תיאורטית, עם מערך כזה, סוכן אמור להיות מסוגל להמשיך ולבצע עבודה מועילה למשך זמן ארוך באופן שרירותי.
אך דחיסה לבדה אינה מספקת. כברירת מחדל, אפילו מודל קידוד חזית כמו Opus 4.5 הפועל על Claude Agent SDK בלולאה על פני מספר חלונות הקשר, יתקשה לבנות אפליקציית ווב באיכות ייצור אם יינתן לו רק פרומפט ברמה גבוהה, כמו "בנה שיבוט של claude.ai".
הכישלונות של Claude התבטאו בשני דפוסים. ראשית, הסוכן נטה לנסות לבצע יותר מדי בבת אחת – למעשה, לנסות לבנות את כל האפליקציה ב"מכה אחת". לעיתים קרובות, הדבר הוביל לכך שהמודל מיצה את חלון ההקשר באמצע היישום, והותיר את הסשן הבא להתחיל עם תכונה שהייתה מיושמת למחצה וללא תיעוד. הסוכן היה צריך אז לנחש מה קרה, ולבזבז זמן ניכר בניסיון להפעיל מחדש את האפליקציה הבסיסית. זה קורה גם עם דחיסה, שלא תמיד מעבירה הוראות ברורות לחלוטין לסוכן הבא.
דפוס כישלון שני התרחש לעיתים קרובות בשלב מאוחר יותר בפרויקט. לאחר שכמה תכונות כבר נבנו, מופע סוכן מאוחר יותר היה סורק את הסביבה, רואה שהושגה התקדמות, ומכריז שהעבודה הושלמה.
זה מפרק את הבעיה לשני חלקים. ראשית, עלינו להקים סביבה ראשונית המניחה את היסודות לכל התכונות שפרומפט נתון דורש, מה שמכין את הסוכן לעבוד צעד אחר צעד ותכונה אחר תכונה. שנית, עלינו לכוון כל סוכן לבצע התקדמות מצטברת לעבר מטרתו, ובו בזמן להשאיר את הסביבה במצב נקי בסיום הסשן. ב"מצב נקי" אנו מתכוונים לקוד שיהיה מתאים למיזוג לענף הראשי: ללא באגים משמעותיים, הקוד מסודר ומתועד היטב, ובאופן כללי, מפתח יכול להתחיל בקלות עבודה על תכונה חדשה מבלי צורך לנקות תחילה בלגן לא קשור.
במהלך ניסויים פנימיים, התמודדנו עם בעיות אלו באמצעות פתרון דו-חלקי:
- סוכן אתחול (Initializer agent): סשן הסוכן הראשון משתמש בפרומפט מיוחד המבקש מהמודל להקים את הסביבה הראשונית: סקריפט
init.sh, קובץ claude-progress.txt המתעד את פעולות הסוכנים, ו-commit ראשוני של git המציג אילו קבצים נוספו. - סוכן קידוד (Coding agent): כל סשן עוקב מבקש מהמודל לבצע התקדמות מצטברת, ולאחר מכן להשאיר עדכונים מובנים.1
התובנה המרכזית כאן הייתה מציאת דרך שבה סוכנים יוכלו להבין במהירות את מצב העבודה כשהם מתחילים עם חלון הקשר חדש, דבר המושג באמצעות קובץ claude-progress.txt יחד עם היסטוריית ה-git. ההשראה לשיטות אלו הגיעה מהידע כיצד מהנדסי תוכנה יעילים פועלים ביום-יום.
ניהול סביבת העבודה
במדריך הפרומפטים המעודכן ל-Claude 4, שיתפנו כמה שיטות עבודה מומלצות לתהליכי עבודה המשתמשים במספר חלונות הקשר, כולל מבנה מנגנון המשתמש ב"פרומפט שונה עבור חלון ההקשר הראשון". "פרומפט שונה" זה מבקש מסוכן האתחול להקים את הסביבה עם כל ההקשר הנחוץ שסוכני קידוד עתידיים יזדקקו לו כדי לעבוד ביעילות. כאן, אנו מספקים צלילה עמוקה יותר לכמה ממרכיבי המפתח של סביבה כזו.


