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

תיעוד 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. מחזור חיים טיפוסי של הפעלה:

  1. אתחול (Initialize): הלקוח שולח initialize עם יכולות (capabilities).
  2. יצירת הפעלה (Create session): הלקוח שולח session/new עם ספריית עבודה.
  3. שליחת בקשות (Send prompts): הלקוח שולח session/prompt עם הודעות משתמש.
  4. קבלת עדכונים (Receive updates): הסוכן שולח הודעות session/update עם תוכן מוזרם.
  5. טיפול בהרשאות (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
Gitx.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 רשמיות זמינות עבור מספר שפות:


#לקוחות תואמים

לקוחסטטוס
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;
  }
}

#משאבים