מדריך גרוק CLI בעברית

תיעוד 40

סוכני משנה ופרסונות

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

סוכני משנה מופעלים כברירת מחדל.


#סוכנים מול פרסונות

סוכנים ופרסונות מתאימים אישית את ההתנהגות, אבל הם פועלים ברמות שונות:

סוכניםפרסונות
מה הם מגדיריםאת כל הסשן: מודל, כלים, מצב פרומפט, פרומפט מערכתשכבת התנהגות שנוספת לפרומפט של סוכן משנה
היקףסשן ראשי או סוכן משנהסוכני משנה בלבד
איך מגדירים אותםבהפעלה, או עם הגדרות סוכן (קבצי .md ב-.grok/agents/ או ב-~/.grok/agents/)ב-config.toml ([subagents.personas]) או בקבצי .toml תחת .grok/personas/. מוחלים בזמן פתרון סוכן משנה
מה הם שולטיםמודל, זמינות כלים, גוף הפרומפט, מיומנויותטון, פורמט פלט, מיקוד המשימה, וחוזי קלט ופלט
מי עורך אותםאתם: יצירה, מחיקה או החלפת מצב במודל הסוכנים, או על ידי עריכת קבציםאתם: הגדרת פרסונות מותאמות אישית בקונפיגורציה או בקבצים. פרסונות ארוזות הן לקריאה בלבד
דוגמאותgrok-build, explore, plan, cursorresearcher, concise

סוכן מגדיר את הסשן עצמו. פרסונה מעצבת איך סוכן משנה מתנהג בתוך סשן. סוכן משנה תמיד רץ כסוג סוכן (לדוגמה, general-purpose), והפתרון יכול להניח פרסונה מעל.

מנהלים את שניהם במודל הסוכנים. פותחים אותו עם /config-agents (כינוי /agents), או פותחים את לשונית Personas ישירות עם /personas. למודל שתי לשוניות: Agents ו-Personas.


#השבתת סוכני משנה

משביתים סוכני משנה עם דגל CLI, משתנה סביבה, או קובץ הקונפיגורציה (העדיפות הגבוהה ביותר קודם). אותם כללים חלים על ה-TUI האינטראקטיבי של grok, על grok agent stdio, ועל הרצות headless.

grok --no-subagents                  # This session only
export GROK_SUBAGENTS=0              # Environment variable
# ~/.grok/config.toml
[subagents]
enabled = false

רק enabled = false מפורש מכבה סוכני משנה. טבלת [subagents] שמגדירה max_depth, [subagents.models], או [subagents.toggle] בלי מפתח enabled משאירה אותם פעילים.


#איך סוכני משנה עובדים

כשהסוכן הראשי מזהה עבודה להאצלה, הוא קורא לכלי spawn_subagent כדי להתחיל סשן ילד. הילד רץ עם:

  • חלון הקשר משלו, עצמאי מההורה
  • סט כלים שנקבע לפי סוג הסוכן שלו ולפי מצב יכולת אופציונלי
  • הוראות פרסונה אופציונליות שמוחלות בזמן הפתרון

ההורה מקבל את הפלט של הילד, בדרך כלל סיכום, כשהילד מסיים.


#סוגי סוכנים מובנים

סוגים מובנים עדיין קיימים כסוגי מארח. המודל לא יכול לבחור אותם לפי שם. subagent_type שהושמט הוא general-purpose.

סוגתיאור
general-purposeסוג ברירת המחדל. סוכן עם יכולת מלאה לכל משימה.
exploreסוכן מחקר. מחפש, קורא, מריץ grep, ומריץ פקודות מעטפת, אבל לא עורך קבצים. משתמשים בו לחקירת בסיס קוד.
planסוכן תכנון. חוקר את בסיס הקוד ומייצר תוכנית מימוש מובנית. לא עורך קבצים.

סוכנים שמוגדרים בפרויקט או על ידי המשתמש יכולים להוסיף סוגים חדשים או להחליף את המובנים האלה באותו שם.

ל-spawn_subagent יש enum אופציונלי subagent_type כשקיימים סוכני תוסף, פרויקט או משתמש. הערכים שלו הם הסוכנים האלה, לדוגמה my-plugin:reviewer. שמות מובנים וסוכנים ארוזים על ידי xAI לא מופיעים ברשימה. אם רשימת tools של ההורה מגבילה הפעלה עם Agent(...), ה-enum מציג רק את הסוגים המותרים. סוג לא מוכר נכשל בקריאה עם רשימת הסוגים התקינים.


#פרסונות

פרסונה היא שכבת התנהגות בעלת שם. ההוראות שלה מוזרקות לשיחה של סוכן המשנה כ-<system-reminder>, שמעצב טון, פורמט פלט ומיקוד משימה בלי לשנות את סוג הסוכן, המודל או הכלים של סוכן המשנה.

מגדירים פרסונות ב-config.toml או בקבצי .toml:

[subagents.personas.researcher]
instructions = "You are a thorough researcher. Always cite specific file paths."
description = "Deep investigator."

Grok Build מגלה פרסונות מבוססות קבצים מהמיקומים האלה, לפי סדר עדיפות:

  • .grok/personas/*.toml (פרויקט)
  • ~/.grok/personas/*.toml (משתמש)
  • ספריית הפרסונות הארוזות (העדיפות הנמוכה ביותר)

כל קובץ מגדיר פרסונה אחת, ושם הקובץ (בלי הסיומת) הופך לשם הפרסונה. פרסונות inline ב-config.toml גוברות על קבצים. רק קבצי .toml מתגלים.

מנהלים פרסונות בלשונית Personas של מודל הסוכנים (/personas). פרסונות ארוזות הן לקריאה בלבד. פרסונות שאתם מגדירים ניתנות לעריכה.

הערה: Grok Build מחיל פרסונות דרך פתרון סוכן משנה ותפקידים, לא דרך פרמטר של spawn_subagent. הסוכן הראשי לא מעביר שם פרסונה כשהוא מפעיל ילד.

#שדות פרסונה

שדהתיאור
instructionsטקסט הוראות inline שמוחל כשכבת הפרסונה.
instructions_fileנתיב לקובץ הוראות, נטען בזמן ההפעלה וממוזג אחרי instructions.
descriptionסיכום קצר שמוצג בקטלוג הפרסונות. אם חסר, נלקחת הפסקה הראשונה של instructions.
inputs / outputsחוזה קלט ופלט מוצהר (ראו להלן).
modelדריסת מודל שמוחלת כשהפרסונה בשימוש.
reasoning_effortמאמץ חשיבה שמוחל כשהפרסונה בשימוש.
default_isolationמצב בידוד ברירת מחדל (none או worktree).

#חוזי קלט ופלט

פרסונה יכולה להצהיר על הקלטים שהיא מצפה להם ועל הפלטים שהיא מייצרת. סוכן ההורה קורא אותם כדי לדעת איזה הקשר לספק ואילו תוצרים לצפות להם. זה מאפשר לשרשר פרסונות, כך שקובץ הפלט של פרסונה אחת הופך לקלט של הפרסונה הבאה:

[[subagents.personas.reviewer.inputs]]
name = "review_file"
io_type = "file"
required = true
description = "Path to the code under review"

[[subagents.personas.reviewer.outputs]]
name = "summary_file"
io_type = "file"
required = false
description = "Path to write review notes"

לכל שדה יש name, io_type (ברירת המחדל היא file), דגל required, ו-description.

#פתרון פרסונה

כשפרסונה חלה, Grok Build פותר את המודל ואת מאמץ החשיבה האפקטיביים בסדר הזה, העדיפות הגבוהה ביותר קודם:

  1. דריסה מפורשת בזמן ההפעלה
  2. ברירת מחדל של התפקיד
  3. ברירת מחדל של הפרסונה
  4. סשן ההורה

הבידוד עוקב אחרי אותו סדר בשלושת הצעדים הראשונים, אבל ברירת המחדל היא none (בלי worktree), במקום הורשה מסשן ההורה.

אם מתבקשת פרסונה אבל אי אפשר לפתור אותה: היא לא נמצאה, אין לה הוראות, או ש-instructions_file שלה לא קריא, ההפעלה נכשלת.


#הפעלת סוכני משנה

הסוכן הראשי קורא לכלי spawn_subagent. הפרמטרים שלו:

פרמטרתיאור
promptפרומפט המשימה המלא לסוכן המשנה.
descriptionתווית קצרה למשימה (3-5 מילים).
run_in_backgroundריצה ברקע והחזרת מזהה סוכן משנה. ברירת המחדל היא true.
isolationnone (סביבת עבודה משותפת, ברירת המחדל) או worktree (worktree מבודד של git).
resume_fromהמשך השיחה של סוכן משנה שהושלם. מעבירים את מזהה סוכן המשנה שלו.
cwdתיקיית עבודה לסוכן המשנה. בלעדי הדדית עם isolation: worktree. מתעלמים ממנו כש-resume_from מוגדר (הילד שממשיכים יורש את התיקייה של המקור שלו).

כשמריצים סוכן משנה ברקע, מאחזרים את התוצאה שלו אחר כך עם get_command_or_subagent_output.

#שליחת הודעות לסוכני משנה

הכלי send_subagent_message כבוי כברירת מחדל. מפעילים אותו עם GROK_ACTIVE_AGENT_MESSAGES או עם [features] active_agent_messages.

סשן השורש יכול לשלוח המשך לסוכן משנה שבבעלותו. כשהדגל פעיל, גם ילד שקיבל הרשאה מקבל את הכלי:

  • subagent_id: "parent" מכוון לסוכן המשנה ההורה הפעיל של אותו ילד.
  • מזהה סוכן עמיד מכוון לסוכן משנה מקומי אחר. סוכן משנה שהושלם ועומד בתנאים ממשיך עם אותה זהות.

ילד שההורה שלו הוא סשן השורש לא יכול לשלוח הודעה לשורש. סטי כלים אצור של הרתמה אף פעם לא מקבלים את הכלי. מצב יכולת שמוציא את הסוג הזה גם מסיר אותו.

שולחים שהם ילדים מוגבלים: 4 הודעות בטיסה לכל זוג שולח-יעד, ו-32 הודעות יוצאות לכל ניסיון שליחה. שליחה מעל המגבלה מחזירה QuotaExceeded.

סוכן משנה לא פעיל תמיד מתעורר עם ההודעה כתור הבא שלו. לסוכן משנה פעיל, הפרמטר האופציונלי delivery שולט איך ההודעה נוחתת:

  • steer (ברירת המחדל) מצטרף לתור הנוכחי בנקודה הבטוחה הבאה שלו.
  • queue ממתין כתור מוגן מאוחר יותר, במקום להיכנס לתור הפעיל.
  • interject דחוף: הוא נמסר לפני steers ממתינים בנקודה הבטוחה המוקדמת ביותר, והוא קוטע סוכן משנה שחסום בהמתנה לעבודה ברקע כדי שסוכן המשנה יקרא את ההודעה מיד. רק קריאת ההמתנה מסתיימת מוקדם. העבודה ברקע ממשיכה לרוץ.

אם סוכן המשנה פעיל אבל בין תורות, steer ו-interject כל אחד הופכים לתור אחד מוגן בתור, וסוכן המשנה מתחיל עליו. הדגל הישן queue: true עדיין מתקבל ומשמעותו delivery: "queue". delivery גובר כששניהם נוכחים.

התמליל מציג כל שליחה כשורה כמו של קריאת כלי, Sent message to find callers · steer: “re-check the arm64 job”: שם סוכן המשנה, ה-delivery, וכמה מההודעה שנכנס. השם הוא תיאור ההפעלה של סוכן המשנה (שורה ראשונה, 40 תווים), אחרת הפרסונה, התפקיד או התג שלו עם סוף המזהה שלו, אחרת subagent …xxxxxxxx מ-8 התווים האחרונים של המזהה שלו, ו-parent כשילד שולח הודעה להורה שלו. סיומת אחרי ה-delivery מסמנת שליחה שעדיין לא נחתה:

  • · sending בזמן שהשליחה בטיסה
  • · not delivered לשליחה שנדחתה, עם קוד הסיבה במילים כשמסלול ה-daemon נותן אחד, כמו ב-· not delivered: target needs resume
  • · unconfirmed לשליחה שהמעטפת לא יכלה לאשר, או לשליחה שתור שנעצר השאיר בטיסה

בחלונית צרה טקסט ההודעה בא קודם, אחר כך השמות מתקצרים, ה-delivery נשמט, והסיבה של שליחה שנדחתה מתקצרת ל-not delivered. במצב מורחב, השורה מציינת delivery או זמן שאין לכותרת שלה מקום בשורה מתחתיה.

הודעה שסוכן אחר שולח לסשן הזה נקראת find callers sent a message: “done”. הודעות עוקבות מתקפלות לשורה אחת, 3 messages with find callers, או 4 messages · find callers, scan src/ כשעוד סוכנים משתתפים, והגליף שלה פועם בזמן ששליחה בטיסה. Enter על השורה הזו מרחיב את הריצה. הודעה בודדת שומרת על שורה משלה, וכך גם הודעה שמתחילה את התור הבא אחרי שורת הסגירה של תור, כמו Worked for 25s. במסלול ה-daemon, בזמן שהודעה כזו ממתינה בתור של הסשן הזה, שורת התור שלה מציינת את השולח, find callers · “done”.

התמליל של סשן השורש מציג גם כל הודעה בין שניים מסוכני המשנה שלו אחרי שהשליחה מתייצבת, find callers sent a message to scan src/ · steer: “check the arm64 job”. ה-parent של סוכן משנה הוא סוכן המשנה שהפעיל אותו, ובסוכן משנה מקונן זה אינו השורש. במסלול המעטפת השורות האלה מגיעות מסוכני משנה בכל עומק, וסשן שהמשיכו מציג אותן לסוכני משנה שלא פתחתם. שורות מסוכן משנה שההיסטוריה שלו מעל 64 MiB מוצגות אחרי שפותחים אותו. במסלול ה-daemon הן מגיעות רק מסוכני המשנה של השורש עצמו, לא מסוכני המשנה שהם מפעילים.

Right (או l/e במצב vim) מרחיב הודעה לטקסט המלא שלה תחת כותרת. הכותרת של שליחה, או של הודעה בין שני סוכני משנה, נושאת את ה-delivery ואת הסטטוס שלה, כמו Sent message to find callers · queue · not delivered: target needs resume, והסיבה של שליחה שנדחתה או שלא אושרה יושבת בגוף מתחתיה. הכותרת של הודעה שהתקבלה נושאת את הזמן שבו היא הגיעה. Left (או h) מקפל אותה שוב. Enter, Ctrl+F, או לחיצה כפולה פותחים את התצוגה של סוכן המשנה בקצה השני, בדיוק כמו בשורת Subagent שלו: הנמען של שליחה, או השולח של הודעה שהסשן הזה קיבל או של הודעה בין שניים מסוכני המשנה שלו. כשאין תצוגה לפתוח, כמו עבור parent, הם מרחיבים את השורה במקום זה. אם אין בסשן הזה הפעלה שקראה למזהה בשם (ייצוא grok export שהוא headless, מזהה מסשן אחר, או מזהה מחוץ לעץ של הסשן הזה), השורה קוראת לו agent והמזהה שלו, מציגה את Agent ID: הגולמי כשהיא מורחבת, ולא יכולה לפתוח אותו. מזהה ברוחב של עד 14 עמודות נקרא שם במלואו, ומזהה רחב יותר, כמו UUID, מציג את 8 התווים האחרונים שלו (agent …xxxxxxxx). כש-features.resume_pagination פעיל, שליחה לסוכן משנה שהופעל בעמוד קודם נקראת כך עד שהעמוד נטען. הייצוא מדפיס כל הודעה תחת כותרת ## Sent message to find callers · steer, ## find callers sent a message או ## find callers sent a message to scan src/ · steer, עם הסטטוס שלה אחרי ה-delivery כששליחה לא נחתה.


#מצבי יכולת

מצב יכולת אינו ארגומנט הפעלה. הכלים של ילד מגיעים מסוג הסוכן שלו ומכל ברירת מחדל של תפקיד / הגדרה. general-purpose אינו מוגבל (all). הסוגים המובנים explore ו-plan קוראים, מחפשים ומריצים פקודות מעטפת, אבל לא יכולים לערוך קבצים.

מצבקריאהכתיבההרצהתיאור
read-onlyכןלאלאקריאה, חיפוש ובדיקה (גם חיפוש באינטרנט ו-LSP). בלי עריכות קבצים או מעטפת.
read-writeכןכןלאקריאה, ובנוסף יצירה, עריכה, מחיקה והזזה של קבצים. בלי מעטפת.
executeכןלאכןקריאה, ובנוסף הרצת פקודות מעטפת ומשימות רקע. בלי עריכות קבצים.
allכןכןכןגישה לא מוגבלת לכלים. ברירת המחדל ל-general-purpose.

#הורשת הקשר

#resume_from

הפרמטר resume_from מאפשר לסוכן משנה חדש להמשיך מהמקום שבו סוכן משנה שהושלם עצר, וזה שימושי לתהליכי עבודה מרובי שלבים:

  1. מפעילים סוכן משנה למחקר כדי לחקור בעיה.
  2. מפעילים סוכן משנה שני עם resume_from שמוגדר למזהה של סוכן המשנה הראשון, כדי שהוא ימשיך עם הקשר המחקר המלא.

סוכן המשנה החדש יורש את התמליל, את מצב הכלים ואת המודל של המקור. פרומפט המערכת והכלים שלו מרונדרים מחדש מהגדרת הסוכן הנוכחית. המקור חייב להיות מושלם (לא רץ), להשתייך לסשן הנוכחי, ולהשתמש באותו סוג סוכן.

#הורשת MCP

הסשן הראשי מניח את ה-frontmatter של mcpServers של הסוכן הפעיל מעל מיזוג הדיסק/לקוח לפי שם (כותרות agent.md גוברות על config.toml). החלפת הסוכן הראשי מחליפה את השכבה הזו במושב החדש בלבד. mcpServers inline של ילד עדיין הופכים ללקוחות בבעלות וגוברים על לקוחות משותפים שירשו. סוכני תוסף לא יכולים להצהיר על mcpServers.

סוכני משנה יורשים כברירת מחדל את שרתי ה-MCP שכבר מחוברים של סשן ההורה. זה כולל שרתי stdio/HTTP מקומיים וסוכנים שמקורם בתוסף (לדוגמה my-plugin:reviewer). הילד מגלה וקורא לכלים האלה עם search_tool / use_tool באותו אופן כמו ההורה.

שולטים בהורשה עם mcpInheritance ב-frontmatter של הסוכן:

ערךהשפעה
all (ברירת מחדל אם הושמט)ירושה של כל שרת MCP שמחובר להורה
noneבלי ירושה של שרתי MCP של ההורה
named: [server, …]ירושה רק של שמות השרתים שברשימה
except: [server, …]ירושה של כל שרתי ההורה חוץ מהשמות שברשימה

דוגמה:

---
name: research-only
description: Read MCP tools but not internal connectors
tools: search_tool, use_tool, Read
mcpInheritance:
  except:
    - internal-tools
---

סוכני תוסף יורשים MCP של ההורה באותו אופן. מטעמי אבטחה הם עדיין לא יכולים:

  • להצהיר על mcpServers משלהם ב-frontmatter של הסוכן (מתעלמים ממנו עם אזהרה)
  • להצהיר על hooks ב-frontmatter של הסוכן
  • להגדיר permissionMode: bypassPermissions

שרתי MCP ארוזים בתוסף (.mcp.json של התוסף) עדיין מתחברים להורה/סשן אחרי שהתוסף מקבל אמון: הם אינם הצהרת frontmatter של ילד בלבד. ראו Plugins ו-MCP Servers.


#בידוד: מצב worktree

למשימות שמשנות קבצים, מריצים סוכן משנה ב-worktree מבודד של git עם isolation: worktree. זה מונע מהעריכות של הילד להתנגש עם ההורה:

  • סוכן המשנה עובד בעותק משלו של עץ העבודה.
  • השינויים שלו נשארים מבודדים מההורה עד שממזגים אותם.
  • התוצאה של סוכן המשנה כוללת את נתיב ה-worktree.

Grok Build מנהל worktrees דרך שיטות ההרחבה x.ai/git/worktree/*, כולל פעולת apply שממזגת שינויים בחזרה לתיקיית העבודה הראשית.


#הגדרות

#מתגים לפי סוג ודריסות מודל

השביתו סוגי סוכנים מסוימים, או נתבו אותם למודל אחר:

[subagents.toggle]
explore = true                       # default -- omit to keep enabled
plan = false                         # disable the plan subagent

[subagents.models]
explore = "grok-4.6"                 # route explore to a specific model

דריסות מודל לפי סוג חלות על כל הורה. בלי דריסה, סוכן משנה יורש את המודל של ההורה.

#בחירת מודל על ידי הסוכן

הכלי spawn_subagent מציע לסוכן ארגומנט model, והתיאור שלו מפרט את המודלים שאפשר לבחור, למקרה שאתם מבקשים במפורש סוכן משנה על מודל אחר. עם [features] subagent_model_inheritance = true (או GROK_SUBAGENT_MODEL_INHERITANCE=1), שניהם מוסתרים בכל פעם שכל מודל בבורר שלכם הוא מודל xAI: סוכני משנה אז תמיד יורשים את המודל של ההורה, והפעלה שעדיין מציינת אחד נכשלת עם הודעה שמבקשת מהסוכן לנסות שוב בלעדיו. קטלוגים עם מודל צד שלישי, מודל בלי משפחה מוצהרת, או קטלוג שעדיין נטען שומרים את הארגומנט. קיבועי [subagents.models], תפקידים ופרסונות לא מושפעים. נקרא כשמפגש מתחיל. שינוי דורש הפעלה מחדש. סדר קדימות: קיבוע של requirements.toml/MDM, אחר כך משתנה הסביבה, אחר כך config.toml, אחר כך הגדרות מרוחקות, אחר כך ברירת המחדל (כבוי).

אפשר גם להחליף את זה מתוך /settings ← Models ← Subagent model inheritance:

  • מופעל: Grok לא יכול לקבוע מודלים לסוכני משנה
  • כבוי: Grok רשאי לבחור מודל אחר לסוכן משנה. נכנס לתוקף אחרי הפעלה מחדש.
  • הערה: ההגדרה הזו חלה רק כשכל המודלים הם "model_family" של xAI. סביר שלא תצטרכו להגדיר את ההגדרה הזו.

השורה מציגה את הערך שיחול אחרי הפעלה מחדש. החלפת המצב כותבת [features] subagent_model_inheritance = true או = false (false מפורש דורס true מרוחק). d (איפוס) מוחק את המפתח כדי שmanaged_config.toml, הגדרות מרוחקות, או ברירת המחדל יחולו שוב. סוכנים שכבר רצים שומרים את המצב שבו התחילו. כששכבה שconfig.toml שלכם לא יכול לדרוס קובעת את הערך, קיבוע של requirements.toml/MDM, משתנה הסביבה, שכבת GROK_CONFIG, או קמפיין פעיל, גם המתג וגם האיפוס נדחים עם toast שמציין את השכבה הזו.

#תפקידים ופרסונות מותאמים

הגדירו תפקידים מותאמים עם ברירות מחדל משלהם ליכולת ולמודל:

[subagents.roles.researcher]
description = "Deep research agent"
default_capability_mode = "read-only"
model = "grok-4.6"
prompt_file = ".grok/prompts/researcher.md"

הגדירו פרסונות מותאמות עם הוראות התנהגות:

[subagents.personas.concise]
instructions = "Be concise. No filler words."
# instructions_file = ".grok/personas/concise.md"  # or load from a file

Grok Build גם מגלה תפקידים מתוך .grok/roles/*.toml ופרסונות מתוך .grok/personas/*.toml. הגדרות בתוך config.toml גוברות על קבצים.


#חלונית המשימות (TUI)

Grok Build מציג עבודה רצה ועבודה שהסתיימה בחלוניות צד במסך הסוכן:

  • לחצו Ctrl+G כדי להחליף את חלונית המשימות, שמפרטת סוכני משנה פעילים ושהושלמו ופקודות רקע עם הסטטוס שלהן.
  • לחצו Ctrl+T כדי להחליף את חלונית ה-todo הנפרדת.

כדי לראות את סוגי הסוכנים והפרסונות הזמינים, פתחו את לוח הפקודות עם Ctrl+P ובחרו Manage Agents (/config-agents).

סוכני משנה מופיעים בראש חלונית המשימות בקבוצת "Subagents" מתקפלת משלהם.


#צפייה בסוכני משנה ב-TUI

סוכני משנה מופיעים בכמה מקומות ב-TUI האינטראקטיבי:

#גלילה לאחור (היסטוריית השיחה של ההורה)

כשסוכן משנה מופעל, בלוק מחזור חיים קומפקטי נוסף לגלילה לאחור של ההורה:

  • Subagent running: "do the thing" (Implementer · grok-4.6) · Thinking
  • או לסוכני משנה ברקע: Subagent started: "..."

בזמן ריצה, הבלוק מציג סיומת פעילות חיה (למשל "Running: cargo test", "Compacting", "Retrying (2/3)") שנמשכת ממעקב התורות של הילד. התבליט מונפש (או צבוע) לפי המצב.

לחצו Enter (או Ctrl-F) על הבלוק כדי לפתוח את התמליל המלא של סוכן המשנה.

לסוכני משנה חוסמים הרשומה היחידה מעדכנת את צבע התבליט כשהילד מסיים. לאלה שברקע, בלוק המשך Subagent completed/failed/cancelled in Xs: "..." מצורף.

#חלונית המשימות (Ctrl+G)

כפי שצוין למעלה: מקובצים תחת "Subagents", עם ספינרים, זמנים שחלפו, וגישה מהירה להריגה או לבדיקה. לחצו h כדי להחליף הסתרת שהושלמו / הצגת הכל.

#Dock (כשמופעל)

ה-dock מעל השורת הקלט מפרט סוכני משנה. כשה-dock בפוקוס, h מחליף הסתרת שהושלמו / הצגת הכל (אותו מסנן כמו חלונית המשימות). Left / Right מכווצים ומרחיבים כותרת מקטע.

#תצוגת מסגרת במסך מלא (התמליל של הילד)

כשאתם פותחים סוכן משנה (מבלוק גלילה לאחור או מחלונית המשימות), מסגרת עם גבול מחליפה את תצוגת ההורה ומציגה את התמליל המלא של הילד:

  • שורת כותרת בתוך המסגרת: סמל סטטוס (ספינר / ✓ / ✗), תווית + תיאור מודגש + מודל, תג אופציונלי "resumed"/"forked", פעילות חיה · זמן שחלף, וכפתור סגירה [✗].
  • הגלילה לאחור של הילד עצמו, החשיבה, וקריאות הכלים מוצגות בתוך המסגרת.
  • חלונית המשימות של ההורה, חלונית ה-todo, וה-dock מוסתרים למשך התצוגה.

שליחת הודעות לסוכן המשנה

לתצוגה של סוכן משנה יש composer ששולח אליו את ההודעות שלכם כשכל אלה מתקיימים: active_agent_messages מופעל, המפגש רץ על נתיב ה-daemon, שירות הרקע של Grok מציע הודעות לסוכני משנה, ומפגש השורש הפעיל את סוכן המשנה בעצמו, בשידור חי. חיבור מחדש או טעינה מחדש שומרים את ה-composer שתצוגה כבר יש לה, אבל לסוכן משנה שהתצוגה שלו נבנתה לראשונה משידור חוזר, כמו אחרי שאתם ממשיכים את המפגש, אין אחד. כך גם לסוכני משנה של workflow או לסוכני משנה של סוכני משנה. התצוגה שלהם תצפיתית: ה-composer מוסתר, וכדי לשלוח הודעה לאחד אתם סוגרים את התצוגה ומשתמשים ב-send_subagent_message מההורה (ראו שליחת הודעות לסוכני משנה).

Space בתמליל ממקד את ה-composer, ו-Esc על טיוטה ריקה מחזיר את הפוקוס. ה-composer מקבל את המקשים של ה-composer של השורש:

מקשמה הוא עושה
Enterשולח את הטיוטה. היא נכנסת לתור, או מבצעת steer כש-[ui].follow_up_behavior = "steer".
אקורד שליחה עכשיו (Ctrl+Enter, או זה של הטרמינל שלכם. ראו קיצורי מקלדת)מבצע steer לטיוטה. הוא אף פעם לא מבטל את התור של סוכן המשנה. במשפחת VS Code זה Ctrl+L, שלא שולח ציטוט ש-Ctrl+L הרגע הוסיף עד שאתם עורכים אותו.
Shift+Enter / Alt+Enter, או \ ואז Enterמוסיף שורה חדשה.
Ctrl+Mמחליף מצב מרובה שורות, שבו Enter מוסיף שורה חדשה ו-Shift+Enter / Alt+Enter שולחים.
Ctrl+L בתמליל, Enter במציג הבלוקיםמצטט את הבלוק הנבחר, הטקסט המודגש או שורת המציג לתוך הטיוטה, ומשאיר את התצוגה פתוחה.

!, # ו-& מוקלדים כטקסט, ו-/ ו-@ לא פותחים תפריט.

steer מצטרף לתור הרץ של סוכן המשנה בנקודה הבטוחה הבאה שלו. הודעה בתור ממתינה שהתור הזה יסתיים. הודעה יכולה גם להמתין אחרי המשימה הנוכחית שלה, עד שקריאת ה-Task שמריצה את סוכן המשנה חוזרת. סוכן משנה לא פעיל מתעורר עם ההודעה כתור הבא שלו.

בזמן שהודעה בדרך, הסרגל מציג sending..., ו-Enter ואקורד השליחה עכשיו לא עושים כלום. ברגע שלסוכן המשנה יש את ההודעה, הטיוטה מתנקה, אלא אם ערכתם אותה מאז, ו-toast אומר איך היא מגיעה: Steering find callers, Queued for find callers, Queued after its current task · find callers או Waking find callers. כששירות הרקע מדווח איך ההודעה הגיעה, ה-toast עוקב אחריו.

טיוטה שה-composer לא יכול לשלוח נשארת ב-composer:

  • פקודת לוכסן או תמונה מקבלות toast. סוכן משנה לא מריץ פקודות לוכסן, וההודעה נושאת טקסט בלבד.
  • הודעה שסוכן המשנה מסרב לה מקבלת שורה בתמליל שלו שאומרת למה, במילים של שירות הרקע כשהוא נותן אותן. דוגמאות הן סוכן משנה שההורה שלו חייב להמשיך קודם, הודעה מעל מגבלת האורך שלו, והודעות סוכן שכובו בשירות. Couldn't confirm the message arrived ו-Couldn't confirm the message was sent שניהם אומרים שסוכן המשנה אולי קיבל אותה, אז בדקו לפני שאתם שולחים אותה שוב.

בתצוגה הזו המתג של חלונית התור קורא queued. שורות התור שמתוארות למטה מפרטות את ההודעות שממתינות לסוכן המשנה.

בטרמינל שמאבד את Ctrl+Enter, כמו טרמינל VTE, JetBrains, WSL ב-Windows Terminal, או tmux בלי מקשים מורחבים (ראו קיצורי מקלדת), Ctrl+I מגיע גם כ-Tab, אז לתצוגה הזו אין מקש steer. הגדירו [ui].follow_up_behavior = "steer" כדי ש-Enter יבצע steer. זה גורם גם ל-Enter של ה-composer של השורש לבצע steer להמשך שלו. בקונסולת Windows, Ctrl+I עדיין מבצע steer.

מה עדיין עובד

  • גלילה, קיפול, העתקה, פתיחת קישורים, ופתיחת מציג הבלוקים על התמליל של הילד.
  • Ctrl+C מבטל את התור של הילד הזה. הוא לא מבטל את ההורה.
  • Ctrl+. / Ctrl+X פותח את דף העזר של קיצורי המקשים של הילד.
  • תצוגת הילד לא מציירת כפתור [Dashboard]. בתוך שכבת ה-dashboard הכפתור הוא הדרך חזרה.
  • Enter לא פעיל במציג הבלוקים מצטט את השורה הנבחרת, ו-Ctrl+L על התמליל את הבלוק הנבחר או את הטקסט המודגש. כשלתצוגה יש composer לשליחת הודעות לסוכן המשנה, הציטוט הולך לשם והתצוגה נשארת פתוחה. אחרת הוא נכנס ל-composer של ההורה והתצוגה נסגרת. בזמן שכרטיס ממתין על התצוגה שהייתה מקבלת את הציטוט, Enter לא עושה כלום ו-Ctrl+L מצייר מחדש את המסך במקום.

מה לא עושה כלום (fail closed)

אקורדים של השורש בלבד אף פעם לא מתחילים על המשטח הזה. הם לא פותחים חלון מודאלי על הילד, והם לא דולפים להורה:

  • לוח פקודות (Ctrl+P), בורר מודל (Ctrl+M מהתמליל. ב-composer הוא מחליף מצב מרובה שורות), בורר מפגש (Ctrl+R)
  • הגדרות, אישור תמיד (Ctrl+O), שליחה לרקע (Ctrl+B)
  • עורך פרומפט חיצוני, מחזור מצבים Shift+Tab

פעולה שנדחית היא ציור מחדש שקט. אין toast.

אם שכבת תור פרומפט מופיעה, היא מראה לקריאה בלבד. אי אפשר לערוך, לשלוח עכשיו, או להסיר שורות. RPC של התור תמיד מכוונים למפגש ההורה.

בנתיב ה-daemon, עם הודעות סוכן מופעלות, התצוגה של כל אחד מסוכני המשנה של מפגש השורש עצמו מפרטת את ההודעות שממתינות לו, בסדר שבו הן ירוצו. כל שורה מציינת את השולח שלה ואיך היא מגיעה, ואז מצטטת את ההודעה: fix login · after its task · “the login fix is in” ממתינה שקריאת ה-Task שמריצה את סוכן המשנה תחזור, ו-queued ממתין מאחורי התורות שמעליו. הפרומפט של קריאת ה-Task עצמה לא מציין שולח. שורה יוצאת כשהתור שלה מתחיל, כשהיא מבוטלת, או כשעצירה מורידה אותה. בחלונית צרה הסמן protected בא ראשון, אחר כך אופן המסירה, ואז טקסט ההודעה.

איך לצאת

  • q או Esc מגלילה לאחור חשופה, או לחיצה על [✗].
  • אם חיפוש בגלילה לאחור פתוח, q / Esc סוגרים קודם את החיפוש. לחיצה מאוחרת יותר סוגרת את התצוגה.
  • Ctrl+Q תמיד יוצא מ-Grok. הוא אף פעם לא נבלע כאן.

הגלילה לאחור של ההורה ממשיכה להציג את הסטטוס של סוכן המשנה אחרי שאתם סוגרים.


#מגבלות עומק

עומק הקינון ברירת המחדל הוא 1, אז רק המפגש ברמה העליונה יכול להפעיל סוכני משנה. ילד שכבר בתקרה הזו לא מקבל את spawn_subagent.

העלו את התקרה עם [subagents] max_depth או GROK_SUBAGENTS_MAX_DEPTH (מספר שלם של לפחות 1). משתנה הסביבה גובר על config.toml, שגובר על ההגדרה המרוחקת. מפגש שהעומק שלו כבר בתקרה לא יכול להפעיל סוכן משנה נוסף. קריאה שעדיין מגיעה לכלי נכשלת עם Subagent depth limit exceeded. ראו subagents.max_depth.


#מתי להשתמש בסוכני משנה

מקרי שימוש טובים:

  • חקירת בסיס קוד בזמן שההורה ממשיך בעבודה אחרת
  • הרצת בדיקות במקביל בזמן שההורה מממש שינויים
  • סקירת שינויים שנוצרו לפני שאתם מבצעים להם commit
  • האצלת משימות עצמאיות שלא תלויות זו בזו

מתי לא להשתמש:

  • משימות פשוטות שההורה יכול לטפל בהן ישירות
  • משימות שדורשות הלוך ושוב הדוק עם המשתמש, כי סוכן משנה רץ באופן אוטונומי ולא מתאים לחילופים אינטראקטיביים
  • משימות שבהן עלות הכנת ההקשר עולה על התועלת של המקביליות