תיעוד 39
מצב סוכן (ACP) ושילוב סביבות פיתוח (IDE)
מצב סוכן מריץ את Grok כשרת שפועל לאורך זמן, שלקוחות מתקשרים איתו מעל ACP (JSON-RPC). השתמש בו מסביבות פיתוח (IDEs), ערכות פיתוח (SDKs), מערכות הערכה (eval harnesses) ויישומים מותאמים אישית. עבור בקשה חד-פעמית שמדפיסה ויוצאת, השתמש במקום זאת ב-grok -p (מצב headless).
#אוטומציה ו-SDKs
עבור סקריפטים, CI, בדיקות הערכה (evals) ושרתי סוכנים, התחל עם always-approve כדי שכלים ירוצו ללא בקשות אישור אינטראקטיביות. כללי דחייה (deny rules) ו-hooks עדיין חלים.
# stdio (local process / many SDKs)
grok agent --always-approve stdio
# WebSocket server
grok agent --always-approve serve --bind 127.0.0.1:2419 --secret <token>ניתן גם להגדיר always-approve לכל הפעלה ב-session/new:
{
"cwd": "/path/to/project",
"mcpServers": [],
"_meta": { "yoloMode": true }
}משתמשי ממשק טקסט אינטראקטיבי (TUI) משאירים בדרך כלל את מצב ask המוגדר כברירת מחדל (או משתמשים ב-auto). ראה הרשאות ובטיחות.
#מה זה ACP?
הפרוטוקול Agent Client Protocol (ACP) מגדיר כיצד לקוחות מתקשרים עם סוכני תכנות מעל JSON-RPC. בשימוש עם Grok הוא מכסה:
- הפעלות (יצירה, טעינה, חידוש)
- בקשות (prompts) ותשובות מוזרמות
- עדכוני קריאות לכלים
- זרמי חשיבה ונימוק
- בקשות אישור הרשאה כאשר ההפעלה אינה במצב always-approve
#תעבורת stdio
הערוץ stdio הוא נתיב השילוב המקומי הנפוץ. הסוכן מתקשר ב-JSON-RPC דרך stdin ו-stdout:
grok agent --always-approve stdioלקוחות טיפוסיים: הרחבות לסביבות פיתוח (Zed, Neovim, Emacs), כלים מותאמים אישית וערכות ACP SDK.
#אפשרויות
אפשרויות סוכן חלות על כל תעבורה (stdio, serve, headless, leader). הן נכתבות אחרי agent ולפני שם המצב. דגלים ייעודיים למצב נכתבים אחרי המצב (לדוגמה serve --bind).
grok agent --always-approve --model grok-4.6 stdio
grok agent --always-approve serve --bind 127.0.0.1:2419 --secret <token>| דגל | תיאור |
|---|---|
-m, --model <MODEL> | מזהה מודל (לדוגמה grok-4.6). |
--always-approve | הרצה ללא בקשות אישור אינטראקטיביות עבור כלים. כינוי נוסף: --yolo. |
--reauth | אימות לפני שהסוכן מתחיל. |
--agent-profile <PATH> | טעינת פרופיל סוכן מקובץ. |
--leader / --no-leader | התחברות לתהליך מוביל (leader) משותף, או אילוץ סוכן מקומי. כאשר מתבקש פרופיל sandbox שאינו off, מצב leader נדחה כדי שכלים יישארו בתוך התהליך (ראה מצב Sandbox). |
#מצב שרת (Server mode)
grok agent --always-approve serve --bind 127.0.0.1:2419 --secret <token>לקוחות מתחברים דרך WebSocket ומבצעים אימות באמצעות אסימון סודי (secret token). אם תשמיט את --secret, הסוכן ידפיס אסימון שנוצר בעת ההפעלה, או שניתן להגדיר את GROK_AGENT_SECRET. התהליך שומר על המצב בין התחברויות מחדש של לקוחות. ההרשאות תואמות לנקודות כניסה אחרות, ראה הרשאות ובטיחות.
זהו שרת שאתה מריץ בעצמך, סביבות ארגז חול בענן המאוחסנות של Grok אינן מריצות את grok agent serve.
#ממסר WebSocket
כדי להגיע אל הסוכן דרך האינטרנט, חבר את הסוכן לממסר (relay) וכוון דפדפנים לאותו ממסר:
grok agent --always-approve headless --grok-ws-url wss://your-relay.example.com/ws#יסודות פרוטוקול ACP
התקשורת מתבצעת בפורמט JSON-RPC 2.0. מחזור חיים טיפוסי של הפעלה:
- אתחול (Initialize): הלקוח שולח
initializeעם יכולות (capabilities). - יצירת הפעלה (Create session): הלקוח שולח
session/newעם ספריית עבודה. - שליחת בקשות (Send prompts): הלקוח שולח
session/promptעם הודעות משתמש. - קבלת עדכונים (Receive updates): הסוכן שולח הודעות
session/updateעם תוכן מוזרם. - טיפול בהרשאות (Handle permissions): הסוכן עשוי לבקש אישור להפעלת כלי (או לאשר או לדחות בהתאם למצב ההרשאות).
#ארכיטקטורה
+------------------------------------------+
| ACP Client |
| (IDE, Editor, Custom Application) |
+-------------------+----------------------+
| JSON-RPC over stdio
+-------------------v----------------------+
| grok agent stdio |
| |
| +---------+ +---------+ +---------+ |
| | Session | | Tools | | MCP | |
| | Manager | | Registry| | Servers | |
| +---------+ +---------+ +---------+ |
+------------------------------------------+#עדכונים בהזרמה
ACP מזרים אירועים מובנים. כל הודעת session/update נושאת שדה sessionUpdate שמזהה את סוג העדכון:
ערך sessionUpdate | תיאור |
|---|---|
agent_message_chunk | מקטע של טקסט תגובת הסוכן. |
agent_thought_chunk | מקטע של נימוק וחשיבה פנימית של הסוכן. |
tool_call | הפעלת כלי חדשה (כותרת, סוג, סטטוס, קלט). |
tool_call_update | עדכון סטטוס או תוצאה עבור קריאת כלי שנמצאת בעיצומה. |
plan | תוכנית הביצוע של הסוכן. |
כל עדכון מציין את סוגו, כך שלקוח יכול להציג פאנלים נפרדים לחשיבה, לקריאות כלים ולטקסט התגובה.
#מתודות הרחבה
מעבר לפרוטוקול ACP הבסיסי, Grok מגדיר מתודות הרחבה תחת הקידומת x.ai/ עבור יכולות ייעודיות ל-SpaceXAI. אלו מכסות:
| קטגוריה | קידומת | דוגמאות |
|---|---|---|
| מערכת קבצים | x.ai/fs/* | list, exists, read_file, write_file |
| Git | x.ai/git/* | status, stage, commit, diffs, discard |
| עץ עבודה של Git (Worktree) | x.ai/git/worktree/* | create, remove, apply, list, gc |
| חיפוש | x.ai/search/* | fuzzy/open, fuzzy/change, content |
| טרמינל | x.ai/terminal/* | create, kill, output, wait_for_exit |
| ניהול הפעלות | x.ai/session/* | fork, resolve_local_for_worktree_resume |
| שיחה והיסטוריה | x.ai/* | prompt_history, rewind/*, compact_conversation |
| אימות | x.ai/auth/* | get_url, submit_code |
| משוב וטלמטריה | x.ai/* | feedback, telemetry/* |
הטבלאות כאן מציגות מתודות מייצגות בכל קטגוריה. קבוצת x.ai/* ייעודית ל-SpaceXAI ועשויה להתרחב בגרסאות הבאות, לכן יש להתייחס אליה כאל רשימה חלקית ולגלות את המתודות הזמינות מתוך תגובת ה-initialize של הסוכן.
#התראות (מהסוכן ללקוח)
הסוכן שולח התראות בדחיפה (push notifications) ללקוחות עבור עדכונים בזמן אמת:
| התראה | תיאור |
|---|---|
x.ai/search/fuzzy/status | עדכון תוצאות חיפוש מטושטש (fuzzy search) |
x.ai/git/worktree/status | התקדמות יצירת עץ עבודה (worktree) |
x.ai/fs_notify | התראת שינוי במערכת הקבצים |
x.ai/fs/index | עדכון אינדקס קבצים מלא |
x.ai/fs/index/delta | עדכון אינדקס קבצים הדרגתי (אינקרמנטלי) |
x.ai/session_notification | עדכונים ספציפיים להפעלה (סקירת diff, מצב ניסיון חוזר, דחיסה אוטומטית) |
x.ai/session/update | עדכון הפעלה (קריאות כלים, תוכן) |
#אפשרויות _meta של הפעלה
שדות אופציונליים ב-session/new:
| שדה | תיאור |
|---|---|
rules | כללים נוספים המצורפים לסוף הוראת המערכת (system prompt). |
systemPromptOverride | הוראת מערכת חלופית. |
agentProfile | שם פרופיל סוכן או אובייקט JSON. |
yoloMode | כאשר הערך הוא true, מופעל always-approve עבור הפעלה זו. |
autoMode | כאשר הערך הוא true, מופעל מצב הרשאות auto עבור הפעלה זו. נדרס כאשר always-approve כבר פעיל. |
{
"cwd": "/path/to/project",
"mcpServers": [],
"_meta": { "yoloMode": true }
}#ערכות ACP SDK
ספריות SDK רשמיות זמינות עבור מספר שפות:
| שפה | חבילה |
|---|---|
| TypeScript | @agentclientprotocol/sdk |
| Rust | agent-client-protocol |
| Python | agent-client-protocol-python |
| Go | acp-go-sdk |
| Kotlin | acp |
#לקוחות תואמים
| לקוח | סטטוס |
|---|---|
| Zed | נתמך |
| Neovim (CodeCompanion, avante.nvim) | נתמך |
| Emacs | נתמך |
| marimo notebook | נתמך |
| JetBrains | בקרוב |
#דוגמת שילוב: לקוח ACP ב-TypeScript
import { spawn, ChildProcess } from "child_process";
import * as readline from "readline";
class GrokACPChat {
private proc!: ChildProcess;
private sessionId!: string;
private rl!: readline.Interface;
constructor(private cwd = ".") {}
async init() {
this.proc = spawn("grok", ["agent", "--always-approve", "stdio"]);
this.rl = readline.createInterface({ input: this.proc.stdout! });
await this.request("initialize", {
protocolVersion: 1,
clientCapabilities: {
fs: { readTextFile: true, writeTextFile: true },
terminal: true,
},
});
const { sessionId } = await this.request("session/new", {
cwd: this.cwd,
mcpServers: [],
_meta: { yoloMode: true },
});
this.sessionId = sessionId;
return this;
}
private async request(method: string, params: any): Promise<any> {
return new Promise((resolve) => {
const msg = JSON.stringify({ jsonrpc: "2.0", id: 1, method, params });
this.proc.stdin!.write(msg + "\n");
this.rl.once("line", (line) => {
resolve(JSON.parse(line).result || {});
});
});
}
async *streamPrompt(text: string) {
const msg = JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "session/prompt",
params: {
sessionId: this.sessionId,
prompt: [{ type: "text", text }],
},
});
this.proc.stdin!.write(msg + "\n");
for await (const line of this.rl) {
const data = JSON.parse(line);
if (data.method === "session/update") {
const update = data.params.update;
yield update; // { sessionUpdate, content, title, ... }
} else if (data.result) {
break; // Final response
}
}
}
}
// Usage
const client = await new GrokACPChat(".").init();
for await (const update of client.streamPrompt("List the files in this project")) {
switch (update.sessionUpdate) {
case "agent_message_chunk":
process.stdout.write(update.content?.text || "");
break;
case "agent_thought_chunk":
console.log(`\n[Thinking: ${update.content?.text}]`);
break;
case "tool_call":
console.log(`\n[Tool: ${update.title}]`);
break;
}
}