20. מצב Headless ו-Agent SDK
עד עכשיו דיברנו על Claude Code כעל שיחה אינטראקטיבית: אתם מקלידים, קלוד עונה, אתם מאשרים. אבל אותו מנוע בדיוק אפשר להריץ בלי ממשק בכלל: מתוך סקריפט, מתוך צנרת (pipeline) של פקודות, או כספרייה בתוך אפליקציה שאתם בונים. בפרק הזה נכיר את מצב Headless (הרצת claude -p מהטרמינל) ואת Agent SDK (בניית סוכן משלכם ב-Python או ב-TypeScript). הפרק מיועד בעיקר למפתחים, ומעמיק יותר מפרקים אחרים במדריך.
מצב Headless: קלוד בלי ממשק
הוספת הדגל -p (או --print) לכל פקודת claude מריצה אותה פעם אחת, בלי ממשק אינטראקטיבי: קלוד מקבל בקשה, מבצע אותה, מדפיס תשובה ויוצא. זה נקרא גם "מצב הדפסה" (print mode), ובעבר נקרא "מצב Headless" — השם עדיין נפוץ, וגם ה-CLI משתמש בו בתיעוד.
claude -p "מה עושה מודול ההתחברות בפרויקט הזה?"
למה זה שימושי:
- סקריפטים: להריץ בדיקה, לתקן קוד או לסכם קובץ כחלק מתהליך אוטומטי.
- CI/CD: לינטר מותאם, סקירת קוד אוטומטית, או יצירת commit בסוף pipeline.
- אוטומציה: עיבוד קבצים בכמות גדולה, בלי שמישהו יושב מול המסך.
קלוד Code יוצא עם קוד 0 כשההרצה הצליחה, וקוד שונה מ-0 כשהיא נכשלה — כך סקריפט יכול להסתעף לפי התוצאה. דגל לא תקין מדווח כשגיאה ל-stderr לפני שההרצה מתחילה; כשל בתוך ההרצה עצמה (למשל אימות חסר) מודפס כתוצאה ל-stdout.
מצב Bare: התחלה מהירה יותר
הדגל --bare מדלג על גילוי אוטומטי של Hooks, Skills, פקודות מותאמות, Subagents, Plugins, שרתי MCP, זיכרון אוטומטי ו-CLAUDE.md — כך ההרצה מתחילה מהר יותר, ומתנהגת אותו הדבר בכל מכונה, בלי תלות בהגדרות אישיות שמישהו הגדיר לעצמו.
claude --bare -p "סכם את README.md" --allowedTools "Read"
בלי --bare, הרצת -p טוענת את כל ההקשר שסשן אינטראקטיבי היה טוען, כולל Hooks מ-.claude/settings.json ושרתי MCP מ-.mcp.json — גם בתיקייה שמעולם לא אישרתם. במצב Bare אין אימות של תעודות OAuth או Keychain, אז צריך להגדיר ANTHROPIC_API_KEY מראש (מ-Claude Console).
פלט מובנה לעיבוד אוטומטי
הדגל --output-format קובע איך התשובה חוזרת:
| ערך | מה מתקבל |
|---|---|
text (ברירת מחדל) | טקסט רגיל |
json | JSON מובנה עם התשובה, מזהה השיחה ומטא-דאטה, כולל עלות בדולרים |
stream-json | JSON בשורות נפרדות (NDJSON), לסטרימינג בזמן אמת |
claude -p "סכם את הפרויקט הזה" --output-format json
שדה התשובה נקרא result. שימוש נפוח בכלי כמו jq מחלץ בדיוק מה שצריך:
# חילוץ התשובה בלבד
claude -p "סכם את הפרויקט הזה" --output-format json | jq -r '.result'
פלט לפי סכימה מוגדרת
עם --json-schema אפשר לחייב את קלוד להחזיר בדיוק את המבנה שאתם צריכים:
claude -p "חלץ את שמות הפונקציות הראשיות מ-auth.py"
--output-format json
--json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}'
התוצאה המובנית מגיעה בשדה structured_output, לצד מטא-דאטה כמו שימוש בטוקנים.
סטרימינג בזמן אמת
עם --output-format stream-json יחד עם --verbose ו---include-partial-messages, אפשר לקבל את התשובה מילה-מילה, כשכל שורה היא אירוע JSON. השורה האחרונה היא הודעת result עם התשובה הסופית, העלות ומטא-דאטת השיחה. שימושי כשבונים ממשק משלכם שמציג את ההתקדמות של קלוד בזמן אמת.
שילוב בצנרת (pipe)
מצב Headless קורא מ-stdin, אז אפשר להזרים תוכן פנימה ולהפנות את הפלט הלאה, בדיוק כמו כל כלי טרמינל אחר:
cat build-error.txt | claude -p 'הסבר בקצרה מה הגורם השורשי לשגיאת הבנייה הזו' > output.txt
קלט מוזרם דרך stdin מוגבל ל-10MB. לתוכן גדול יותר, כתבו אותו לקובץ והפנו את קלוד לנתיב הקובץ בבקשה במקום.
Claude כחלק מסקריפט בנייה
דוגמה: סקריפט ב-package.json שמעביר את ה-diff מול main לקלוד ומבקש לאתר שגיאות כתיב:
{
"scripts": {
"lint:claude": "git diff main | claude -p "you are a typo linter. for each typo in this diff, report filename:line on one line and the issue on the next. return nothing else.""
}
}
מריצים עם npm run lint:claude. העברת ה-diff בצנרת חוסכת לקלוד את הצורך בהרשאת Bash כדי לקרוא אותו בעצמו.
אישור כלים בלי אינטראקציה
מכיוון שאף אחד לא יושב מול המסך לאשר פעולות, צריך לקבוע מראש מה מותר. מצב ההתחלה הקבוע של -p הוא תמיד Manual (ראו פרק 7: הרשאות ובטיחות), אז חייבים לציין הרשאות במפורש:
claude -p "הרץ את סוויטת הבדיקות ותקן כשלים"
--allowedTools "Bash,Read,Edit"
או לקבוע מצב הרשאות בסיסי לכל השיחה:
| מצב | מתאים ל… |
|---|---|
--permission-mode auto | מסווג בודק את רוב הפעולות במקומכם (ראו פרק 7: הרשאות ובטיחות) |
--permission-mode acceptEdits | קלוד עורך קבצים בלי לשאול, ופקודות קבצים נפוצות מאושרות אוטומטית |
--permission-mode dontAsk | כל מה שהיה דורש שאלה נדחה אוטומטית. מתאים ל-CI נעול |
לתהליכים שרצים לגמרי לבד, כמו משימה מתוזמנת, הוסיפו --permission-prompts none: כל מה שהיה דורש אישור אדם נדחה, קלוד מקבל הודעה שאין מי שיאשר ולא לנסות שוב, וההרצה ממשיכה. כללי הרשאות, Hooks מסוג PermissionRequest ומצב ההרשאות עדיין קובעים ראשונים — הדגל רק דוחה את מה שנשאר.
claude -p "עדכן את גרסאות התלויות והרץ בדיקות" --permission-mode auto --permission-prompts none
יצירת commit אוטומטית
claude -p "תסתכל על השינויים שנשמרו (staged) ותיצור commit עם הודעה מתאימה"
--allowedTools "Bash(git diff *),Bash(git log *),Bash(git status *),Bash(git commit *)"
המשך שיחות ממצב Headless
--continue ממשיך את השיחה האחרונה, ו---resume עם מזהה שיחה ממשיך שיחה מסוימת:
# בקשה ראשונה
claude -p "סקור את הפרויקט לאיתור בעיות ביצועים"
# המשך אותה שיחה
claude -p "עכשיו תתמקד בשאילתות למסד הנתונים" --continue
claude -p "תן סיכום של כל הבעיות שנמצאו" --continue
כשמריצים כמה שיחות במקביל, שומרים את מזהה השיחה כדי להמשיך את הנכונה:
session_id=$(claude -p "התחל סקירה" --output-format json | jq -r '.session_id')
claude -p "תמשיך את הסקירה הזו" --resume "$session_id"
מה זה Agent SDK
ה-Agent SDK נותן לכם את אותם כלים, אותה לולאת פעולה (agent loop) ואותו ניהול הקשר שמפעילים את Claude Code — אבל כספרייה שאתם מפעילים מתוך קוד משלכם, ב-Python או ב-TypeScript. במקום להריץ תהליך claude ולפרש את הפלט שלו, אתם קוראים לפונקציה שמחזירה לכם זרם הודעות, ובונים סביבה אפליקציה, אוטומציה או מוצר שלם.
| אם אתם… | השתמשו ב… |
|---|---|
| בונים סוכן בלי לממש בעצמכם את לולאת הכלים | Agent SDK — ספריית Python/TypeScript שמריצה את הלולאה בשבילכם |
| עובדים אינטראקטיבית או מריצים משימות חד-פעמיות מהטרמינל | Claude Code CLI — ממשק הטרמינל, לשימוש יומיומי |
| קוראים ל-API ישירות ומממשים את לולאת הכלים בעצמכם | Client SDK — גישה ישירה ל-API, בלי מנוע Claude Code |
| מריצים סוכנים ארוכי טווח בלי לנהל תשתית משלכם | Managed Agents — REST API מנוהל, Anthropic מריצה את הסוכן והסביבה המבודדת |
ה-SDK זמין כספרייה רק ל-Python ול-TypeScript. כדי להפעיל את אותה לולאת סוכן משפה אחרת, מריצים את ה-CLI כתת-תהליך עם -p ו---output-format json, כפי שראינו למעלה.
מה זמין דרך ה-SDK
| יכולת | מה היא נותנת |
|---|---|
| כלים מובנים | קריאה, כתיבה ועריכת קבצים, הרצת פקודות, חיפוש באינטרנט |
| Hooks | הרצת קוד מותאם בנקודות מפתח בלולאת הסוכן |
| Subagents | סוכני משנה למשימות ממוקדות (ראו פרק 16: סוכנים ועבודה במקביל) |
| MCP | חיבור כלים ומקורות מידע חיצוניים (ראו פרק 12: חיבור לכלים חיצוניים (MCP)) |
| הרשאות | שליטה מה רץ אוטומטית ומה דורש אישור |
| שיחות (Sessions) | שמירת הקשר בין קריאות, המשך או פיצול מאוחר יותר |
| Skills, פקודות וזיכרון | נטענים אוטומטית מ-.claude/ ומ-~/.claude/, בדיוק כמו ב-Claude Code |
| Plugins | חבילות של Skills, סוכנים, Hooks ו-MCP, נטענות לפי נתיב מקומי |
דוגמת קוד מינימלית
הדוגמה הבאה בונה סוכן שקורא קובץ Python, מזהה באגים שגורמים לקריסה, ומתקן אותם לבד. אלה שלבי ההקמה:
- התקנה: ב-TypeScript,
npm install @anthropic-ai/claude-agent-sdk. ב-Python,pip install claude-agent-sdk(אוuv add claude-agent-sdk). שתי הספריות כוללות בתוכן בינארי של Claude Code, כך שברוב המקרים אין צורך בהתקנה נפרדת. - מפתח API: יוצרים מפתח ב-Claude Console וקובעים אותו כמשתנה סביבה
ANTHROPIC_API_KEY. ה-SDK לא טוען קובצי.envאוטומטית. - כתיבת הסוכן: קוראים לפונקציית
queryעם הבקשה ועם אפשרויות תצורה.
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, ResultMessage
async def main():
async for message in query(
prompt="Review utils.py for bugs that would cause crashes. Fix any issues you find.",
options=ClaudeAgentOptions(
allowed_tools=["Read", "Edit", "Glob"],
permission_mode="acceptEdits",
),
):
if isinstance(message, AssistantMessage):
for block in message.content:
if hasattr(block, "text"):
print(block.text)
elif hasattr(block, "name"):
print(f"Tool: {block.name}")
elif isinstance(message, ResultMessage):
print(f"Done: {message.subtype}")
asyncio.run(main())
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "Review utils.py for bugs that would cause crashes. Fix any issues you find.",
options: {
allowedTools: ["Read", "Edit", "Glob"],
permissionMode: "acceptEdits"
}
})) {
if (message.type === "assistant" && message.message?.content) {
for (const block of message.message.content) {
if ("text" in block) {
console.log(block.text);
} else if ("name" in block) {
console.log(`Tool: ${block.name}`);
}
}
} else if (message.type === "result") {
console.log(`Done: ${message.subtype}`);
}
}
query היא נקודת הכניסה: היא מחזירה איטרטור א-סינכרוני, ולכן משתמשים ב-async for (או for await) כדי לקבל הודעות בזרימה — הרהור של קלוד, קריאה לכלי, תוצאת כלי, או התוצאה הסופית. ה-SDK מטפל בתזמור, בהרצת הכלים, בניהול ההקשר ובניסיונות חוזרים; אתם רק צורכים את הזרם. הלולאה מסתיימת כשקלוד מסיים את המשימה או נתקל בשגיאה.
אם מופיעה שגיאה כמו Not logged in או Invalid API key, ודאו ש-ANTHROPIC_API_KEY אכן מוגדר בסביבה שבה הסוכן רץ — ה-SDK לא קורא קובצי .env לבד.
מתי Agent SDK ומתי ה-CLI
ה-CLI (claude, כולל -p) מתאים לעבודה אינטראקטיבית, למשימות חד-פעמיות ולסקריפטים פשוטים שמריצים אותו כתת-תהליך. ה-Agent SDK מתאים כשאתם בונים מוצר או אפליקציה משלכם: ממשק צ'אט ייעודי, בוט שמטפל בפניות לקוח, כלי פנימי לצוות, או כל מערכת שצריכה שליטה תכנותית מלאה על ההודעות, ההרשאות וההתקדמות של הסוכן — לא רק טקסט שמודפס לטרמינל.
אם אתם בונים מוצר על בסיס ה-SDK, אסור לקרוא לו "Claude Code" או "Claude Code Agent", ואסור לחקות את המיתוג הוויזואלי שלו. השמות המותרים כוללים "Claude Agent" או "{שם המוצר שלכם} Powered by Claude". פרטים מלאים בתנאי השימוש המסחריים של Anthropic.
מעקב עלויות מובנה
עם --output-format json, שדה total_cost_usd ופירוט לפי מודל מגיעים בתוך הפלט, כך שסקריפטים יכולים לעקוב אחרי הוצאה בלי לגשת ללוח הבקרה. שני המספרים הם הערכות בצד הלקוח, ועשויים להיות שונים מהחיוב בפועל (ראו פרק 8: מודלים, רמות מאמץ, עלויות ומגבלות שימוש).
עצירה נקייה עם SIGTERM
עצירת הרצת -p עם SIGTERM (למשל kill או ממערכת ניהול תהליכים) מסיימת עם קוד יציאה 143, בלי לשמור תוצאה לתור שהיה באמצע. כדי לסיים תור בצורה מסודרת, שלחו SIGINT במקום, או קראו ל-interrupt() של ה-Agent SDK, לפני שעוצרים את התהליך. אפשר להמשיך תור שנקטע בהרצה מחודשת (--continue או --resume).
משימות רקע בסיום ריצה
אם קלוד פתח פקודת Bash ברקע (כמו שרת פיתוח), התהליך שלה נסגר כחמש שניות אחרי שהתוצאה הסופית הודפסה. אם קלוד הפעיל Subagent או Workflow ברקע, ההרצה ממתינה עד שהם מסתיימים — עד 10 דקות של המתנה רציפה ללא פעילות כברירת מחדל, ואפשר לשנות עם משתנה הסביבה CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS.
מעקב אחרי הודעות Subagent בזרם
הודעות מ-Subagents מופיעות בזרם עם שדה parent_tool_use_id שמצביע על הכלי שיצר אותן. כברירת מחדל מופיעות רק קריאות הכלים שלהם; הדגל --forward-subagent-text מוסיף גם את הטקסט וההרהור, כדי לשחזר את התמליל המלא של כל Subagent, כולל Subagents שקוראים לעוד Subagents.
אימות סביבת ריצה מתוך system/init
האירוע הראשון בזרם, system/init, מדווח על המודל, הכלים, שרתי ה-MCP והתוספים שנטענו. שדות plugin_errors ו-mcp_server_errors מאפשרים לשער ב-CI כאשר תוסף או שרת MCP נכשלו בטעינה, במקום להסתמך על אזהרה שמודפסת רק ל-stderr.
claude -p "בקשה"מריץ שיחה חד-פעמית בלי ממשק, מדפיס תשובה ויוצא עם קוד 0 או שגיאה.--bareמהיר יותר ועקבי בין מכונות, כי הוא מדלג על Hooks, Skills ו-MCP מקומיים.--output-format jsonו-stream-jsonנותנים פלט מובנה לעיבוד אוטומטי;--json-schemaמכריח מבנה מדויק.- מצב Headless קורא stdin, אז אפשר לשלב אותו בצנרת:
cat file | claude -p "...". - Agent SDK הוא הדרך לבנות אפליקציית סוכן משלכם ב-Python או ב-TypeScript, עם אותו מנוע שמפעיל את Claude Code — מתאים כשבונים מוצר, לא כשמריצים משימה חד-פעמית.
התוכן באתר נועד למידע כללי בלבד ואינו מהווה ייעוץ מקצועי, הצעה או התחייבות. נעשה מאמץ לדייק, אך ייתכנו שינויים, טעויות או חוסר עדכניות, והשימוש במידע הוא באחריות המשתמש. ככל שהדין מתיר, האתר ובעליו אינם אחראים לנזק שייגרם מהסתמכות על המידע. קישורים לאתרים חיצוניים הם באחריות אותם אתרים, וככל שקיימים קישורי שותפים, ייתכן שהאתר יקבל עמלה ללא תוספת עלות עבורכם. התוכן מוגן בזכויות יוצרים (חוק זכות יוצרים, התשס״ח-2007) ואין להעתיקו ללא רשות. שמות מותגים וסימני מסחר שייכים לבעליהם. ראו גם תקנון האתר ומדיניות הפרטיות.