11 שלב 3 — חיבור הכל

Copilot SDK — בנה כלים משלך

עד עכשיו השתמשת ב-Copilot ככלי מוכן — ב-VS Code, ב-CLI, ב-GitHub.com. בפרק הזה תעשה משהו שונה לחלוטין: תיקח את אותו מנוע אגנטי שמריץ את Copilot CLI ותטמיע אותו בתוך האפליקציה שלך. כלים מותאמים, מודלים לבחירה, MCP servers, streaming בזמן אמת — הכל דרך API פשוט וברור. זהו הצעד שהופך אותך ממשתמש Copilot לבונה כלים.

מה יהיה לכם בסוף הפרק הזה
יעדי למידה — מה תדעו לעשות
דרישות קדם
🔗 הפרויקט שלך

בפרק 5 למדת לחבר MCP servers ל-Copilot ב-VS Code וב-CLI — שרתי filesystem, GitHub, ושרתים מותאמים. בפרק הזה תיקח את אותה לולאה אגנטית שמריצה את Copilot CLI ותטמיע אותה באפליקציה שלך — עם כלים מותאמים, MCP servers ומודלים לבחירה. בפרק 12 תשלב את כל הכלים — SDK, CLI, GitHub.com וסוכני צד שלישי — בזרימת עבודה מקצה לקצה שפותרת בעיות אמיתיות.

מילון מונחים — פרק 11
מונח באנגלית הסבר בעברית
Copilot SDK ערכת פיתוח תוכנה (Software Development Kit) שמטמיעה את הלולאה האגנטית של Copilot CLI בתוך האפליקציה שלך
CopilotClient האובייקט הראשי ב-SDK — יוצר ומנהל סשנים, מקביל ל-"מנוע" שמפעיל את האייג'נט
Agentic Execution Loop לולאת ביצוע אגנטית — הלולאה שבה האייג'נט מקבל משימה, מתכנן, בוחר כלי, מפעיל, בודק תוצאה, וחוזר עד שהמשימה מושלמת
defineTool פונקציה ב-SDK להגדרת כלי מותאם — שם, תיאור, פרמטרים (JSON Schema) ופונקציית handler שמבצעת את הפעולה בפועל
BYOK (Bring Your Own Key) אימות עם מפתח API ישיר מספק מודלים (OpenAI, Anthropic וכו'), בלי לעבור דרך GitHub — חיוב ישיר לספק
Streaming קבלת תשובות בזמן אמת, חלק אחרי חלק (token by token), במקום לחכות שהתשובה המלאה תסתיים
Infinite Sessions סשנים ללא הגבלת אורך — כש-context window מתמלא, ה-SDK דוחס את ההיסטוריה אוטומטית ומשחרר מקום
Session Persistence שמירת מצב הסשן (היסטוריה, כלים, מצב) לדיסק, כך שאפשר לחדש אותו מאוחר יותר — גם אחרי restart
מתחיל 5 דקות חינם מושג

מה זה Copilot SDK — ולמה זה משנה את הכל

עד עכשיו ב-Copilot עבדתם בתוך סביבות מוכנות — VS Code, טרמינל, GitHub.com. הייתם משתמשים של הלולאה האגנטית. ה-Copilot SDK (ראשי תיבות: Software Development Kit — ערכת פיתוח תוכנה) הופך אתכם לבונים.

הרעיון פשוט ומשנה כללי משחק: אותו מנוע שמריץ את Copilot CLI — אותה לולאה אגנטית (Agentic Execution Loop) של קלט, תכנון, בחירת כלי, הפעלה, בדיקת תוצאה וחזרה — עכשיו זמין כספריה שאפשר לייבא לכל אפליקציה. לא clone, לא חיקוי — ממש אותו קוד battle-tested שמפעיל את Copilot.

Agentic Execution Loop — Copilot SDK Prompt (קלט) Plan (תכנון) Select Tool (כלי) Execute (הפעלה) Check Result (בדיקה) Return / Repeat אותה לולאה שמפעילה את Copilot CLI — עכשיו בתוך הקוד שלך

בשורה תחתונה: Copilot ב-VS Code הוא אפליקציה אחת שבנויה מעל הלולאה הזו. עם ה-SDK, אתם בונים את האפליקציה. רוצים בוט שסורק PRs כל לילה? אייג'נט שעונה ללקוחות? כלי שמנתח קוד לפי סטנדרט של הצוות? ה-SDK מאפשר את כל זה.

למה לא פשוט לקרוא ל-API של OpenAI ישירות?

שאלה לגיטימית. הרי אפשר לקרוא ישירות ל-API של OpenAI, Anthropic או Google — אז למה לעבור דרך ה-SDK? התשובה: הלולאה האגנטית. כש-API רגיל מקבל פרומפט ומחזיר תשובה (one-shot), ה-SDK מריץ לולאה שלמה: הוא שולח את הפרומפט, המודל מחליט אם צריך כלי, ה-SDK מפעיל את הכלי, מחזיר את התוצאה למודל, והמודל ממשיך — שוב ושוב עד שהמשימה מושלמת. זה בדיוק מה שקורה ב-Agent Mode ב-VS Code.

אם הייתם רוצים לבנות את הלולאה הזו בעצמכם, הייתם צריכים:

ה-SDK נותן את כל זה מוכן. כמות הקוד שחוסכים: מאות שורות של boilerplate שמישהו כבר כתב, בדק ותיקן.

5 תרחישי שימוש שווים

כדי שהרעיון יהפוך לקונקרטי — הנה תרחישים שאנשים כבר בונים עם ה-SDK:

  1. בוט Code Review אוטומטי: רץ ב-GitHub Actions על כל PR, סורק שינויים, מוצא בעיות, ומשאיר הערות — בלי שמפתח אנושי ייגע
  2. Slack Bot לשאלות קוד: חבר צוות שואל "@copilot מה עושה הפונקציה X?", הבוט קורא את הקוד מ-GitHub ומסביר — בתוך Slack
  3. סורק תיעוד: אייג'נט שרץ כל לילה, קורא את הקוד, ומעדכן אוטומטית את ה-README ואת ה-API docs
  4. מנתח dependencies: בודק חבילות ישנות, CVEs, ופותח PRs אוטומטיים לעדכון — מותאם לסטנדרט הצוות
  5. עוזר onboarding: מפתח חדש מקבל בוט אישי שמכיר את כל ה-codebase ועונה על שאלות בזמן אמת

שפות נתמכות

ה-SDK זמין רשמית ב-4 שפות:

שפהחבילהסטטוס
Node.js / TypeScript@github/copilot-sdkTechnical Preview (רשמי)
PythoncopilotTechnical Preview (רשמי)
Gogithub.com/github/copilot-cli-sdk-goTechnical Preview (רשמי)
.NETGitHub.Copilot.SDKTechnical Preview (רשמי)

בנוסף, הקהילה פיתחה SDK-ים לא-רשמיים ל-Java, Rust ו-C++ — אבל שימו לב: אלה community-maintained ועשויים להישבר כש-API משתנה.

למה בפרק הזה נעבוד עם Node.js?

שתי סיבות מעשיות. ראשית, ה-SDK ל-Node.js הוא הכי בוגר — הוא יצא ראשון ויש לו הכי הרבה דוגמאות ותיעוד. שנית, הקונספטים זהים בכל השפות. אם תבינו את ה-API ב-TypeScript, המעבר ל-Python או Go הוא בעיקר תרגום syntax — לא שינוי חשיבה.

הנה השוואה מהירה של אותו "Hello World" בשתי שפות:

Node.js / TypeScriptPython
import { CopilotClient } from "@github/copilot-sdk" from copilot import CopilotClient
const client = new CopilotClient() client = CopilotClient()
const session = await client.createSession({...}) session = await client.create_session(...)
await session.sendAndWait({prompt: "..."}) await session.send_and_wait(prompt="...")

כמו שאתם רואים — ההבדל הוא camelCase מול snake_case. הלוגיקה זהה. אם אתם מפתחי Python, תרגישו בבית. הדוגמאות בפרק הזה ב-TypeScript, אבל כל קונספט מתורגם 1:1.

ה-SDK בהקשר של המערכת האקולוגית

איפה ה-SDK יושב ביחס לכלים שכבר הכרתם? בואו נסדר:

כליסביבהשליטה שלכםמתי
Copilot Chat (VS Code)IDEנמוכה — ממשק מוכןפיתוח אינטראקטיבי
Agent Mode (VS Code)IDEבינונית — פרומפט + כליםמשימות מורכבות בזמן פיתוח
Copilot CLIטרמינלבינונית — פקודות וסקריפטיםאוטומציה בסיסית, scripting
Copilot SDKהקוד שלכםמלאה — כלים, מודלים, UIאפליקציות, שירותים, בוטים

ככל שעולים בטבלה, השליטה שלכם גדלה — אבל גם כמות הקוד שצריך לכתוב. ה-SDK נותן שליטה מלאה במחיר של יותר אחריות. זו הסיבה שרוב המפתחים ישתמשו ב-Agent Mode ל-90% מהמשימות, וב-SDK ל-10% — אבל אותם 10% הם בדיוק המקרים שה-SDK בלתי ניתן להחלפה: אוטומציות, בוטים, ושירותים.

מה ה-SDK מספק — ומה לא

חשוב להבין את הגבולות:

ה-SDK נותןה-SDK לא נותן
לולאה אגנטית מוכנהממשק משתמש (UI)
חיבור מודלים (multi-model)אירוח (hosting) — אתם מריצים
כלים מותאמים (defineTool)כלים עסקיים מוכנים (CRM, DB)
MCP server integrationMCP servers עצמם — תתקינו בנפרד
Streaming ו-eventsWebSocket server לדפדפן
אימות (Copilot / BYOK)ניהול משתמשים, RBAC

ה-SDK הוא המנוע. את המכונית — ה-UI, ה-hosting, האינטגרציות — אתם בונים.

שימו לב: Technical Preview

ה-Copilot SDK הושק בינואר 2026 בסטטוס Technical Preview — מה שאומר שה-API עובד ואפשר לפתח איתו, אבל ממשקים עשויים להשתנות. אל תבנו production system בלי שכבת הפשטה (abstraction layer) שמפרידה את הקוד שלכם מה-SDK ישירות. ככה, כשה-API משתנה, תתקנו במקום אחד.

עשו עכשיו 2 דקות

פתחו טרמינל והריצו: copilot auth status. וודאו שאתם מחוברים ושיש לכם מנוי Copilot פעיל. אם לא — חזרו לפרק 6 והגדירו CLI auth. גם בדקו גרסת Node: node --version — צריך 18 ומעלה.

מתחיל 15 דקות חינם הקמה

התקנה ו-Hello World — האייג'נט הראשון שלך

הגיע הזמן לכתוב קוד. תוך 5 דקות יהיה לכם אייג'נט חי שרץ מתוך קובץ TypeScript שלכם. בואו נבנה אותו שלב אחרי שלב.

שלב 1: יצירת פרויקט

פתחו תיקייה חדשה וצרו פרויקט Node.js:

mkdir my-copilot-agent
cd my-copilot-agent
npm init -y
npm install @github/copilot-sdk tsx

tsx מאפשר להריץ TypeScript ישירות בלי שלב build — מושלם לפיתוח מהיר.

שלב 2: קובץ האייג'נט הראשון

צרו קובץ agent.ts:

import { CopilotClient } from "@github/copilot-sdk";

async function main() {
  // יצירת הלקוח — מתחבר ל-Copilot CLI מאחורי הקלעים
  const client = new CopilotClient();

  // יצירת סשן עם מודל ספציפי
  const session = await client.createSession({
    model: "gpt-4.1"
  });

  // שליחת פרומפט והמתנה לתשובה מלאה
  const response = await session.sendAndWait({
    prompt: "Analyze this project structure and suggest improvements"
  });

  console.log(response?.data.content);

  // ניקוי
  await client.stop();
  process.exit(0);
}

main();

שלב 3: הרצה

npx tsx agent.ts

מה שקורה מאחורי הקלעים: CopilotClient מפעיל מופע של Copilot CLI, שולח את הפרומפט דרכו, ומחזיר את התשובה. ה-CLI משתמש באימות שלכם (שהגדרתם בפרק 6) ובקרדיטים של המנוי שלכם.

הבנת הזרימה — מה קורה בין השורות

בואו נפרק את מה שקורה כשמריצים את הקוד הזה:

  1. new CopilotClient() — יוצר מופע שמתחבר ל-Copilot CLI ברקע. אם ה-CLI לא מותקן או לא מאומת, כאן תקבלו שגיאה
  2. client.createSession({ model: "gpt-4.1" }) — פותח סשן חדש. הסשן שומר את ההיסטוריה של השיחה, הכלים הזמינים, ומצב הביצוע. אפשר לפתוח כמה סשנים במקביל
  3. session.sendAndWait({ prompt: "..." }) — שולח את הפרומפט, ממתין שהלולאה האגנטית תסתיים (כולל קריאות כלים אם צריך), ומחזיר את התשובה הסופית
  4. response?.data.content — הטקסט של התשובה. ה-?. כי response יכול להיות null (למשל אם הייתה שגיאה)
  5. client.stop() — מנקה את כל המשאבים וסוגר את תהליך ה-CLI

נקודה חשובה: הסשן הוא stateful — הוא זוכר את כל מה שנאמר. אם תשלחו פרומפט שני, המודל יכיר את ההקשר מהפרומפט הראשון. זה מה שמאפשר שיחות multi-turn:

const r1 = await session.sendAndWait({ prompt: "List all .ts files in this project" });
console.log(r1?.data.content);

// הסשן זוכר! לא צריך לחזור על ההקשר
const r2 = await session.sendAndWait({ prompt: "Now count the lines in each of those files" });
console.log(r2?.data.content);
טעות נפוצה: לשכוח לעצור את ה-client

אם לא קוראים ל-client.stop() ו-process.exit(0), התהליך נשאר חי ברקע ותופס משאבים. זה מפתה לשכוח כי הקוד "עובד" בלי זה — אבל תגלו תהליכים זומבי שצורכים זיכרון. תמיד סגרו את ה-client.

עשו עכשיו 5 דקות

צרו את הפרויקט, העתיקו את הקוד, והריצו. שנו את הפרומפט ל-"What files are in the current directory?" והריצו שוב. שימו לב: האייג'נט מקבל גישה לכלי הקריאה של ה-CLI ויכול לקרוא קבצים אמיתיים.

מה קורה כשמשנים את המודל?

החליפו "gpt-4.1" ב-"claude-sonnet" או "gemini-2.5-pro" — והריצו שוב. תשובה שונה, סגנון שונה, אותו API. זו אחת הנקודות החזקות של ה-SDK: בחירת מודל היא פרמטר, לא ארכיטקטורה. אתם לא נעולים על ספק אחד.

פתרון בעיות נפוצות בהתקנה

כמה דברים שיכולים להשתבש בשלב ההתקנה — והפתרונות:

שגיאהסיבהפתרון
Error: copilot CLI not foundCopilot CLI לא מותקן או לא ב-PATHהתקינו: npm install -g @githubnext/github-copilot-cli או ודאו שה-CLI בנתיב
Error: Not authenticatedלא עשיתם loginהריצו copilot auth login ועקבו אחרי ההוראות
Error: No Copilot subscriptionחשבון GitHub בלי מנוי Copilotשדרגו ל-Pro ($10/חודש) ב-github.com/settings/copilot
ERR_MODULE_NOT_FOUNDTypeScript לא מוגדר נכוןודאו ש-tsx מותקן: npx tsx --version
בינוני 20 דקות חינם תרגול

כלים מותאמים — defineTool

האייג'נט הבסיסי שכבר יש לכם חכם — אבל מוגבל לכלים המובנים של Copilot CLI (קריאת קבצים, עריכה, חיפוש וכו'). עם defineTool אתם מרחיבים את יכולותיו: מגדירים כלי חדש, ואומרים לאייג'נט "אתה יכול להשתמש בזה".

אנטומיה של כלי מותאם

כל כלי מוגדר עם 4 חלקים:

חלקתפקידדוגמה
nameשם ייחודי שהאייג'נט רואה"count_files"
descriptionמה הכלי עושה — באנגלית, למודל"Count files in a directory by extension"
parametersפרמטרים ב-JSON Schema{ type: "object", properties: { path: { type: "string" } } }
handlerפונקציה שמבצעת את הפעולהasync (args) => { ... return result; }

דוגמה מלאה: כלי ספירת קבצים

import { CopilotClient, defineTool } from "@github/copilot-sdk";
import { readdirSync, statSync } from "fs";
import { join, extname } from "path";

// הגדרת הכלי
const countFiles = defineTool("count_files", {
  description: "Count files in a directory, grouped by extension",
  parameters: {
    type: "object",
    properties: {
      directory: {
        type: "string",
        description: "Path to the directory to scan"
      }
    },
    required: ["directory"]
  },
  handler: async (args: { directory: string }) => {
    const counts: Record<string, number> = {};
    const files = readdirSync(args.directory);

    for (const file of files) {
      const fullPath = join(args.directory, file);
      if (statSync(fullPath).isFile()) {
        const ext = extname(file) || "(no extension)";
        counts[ext] = (counts[ext] || 0) + 1;
      }
    }

    return { directory: args.directory, total: files.length, by_extension: counts };
  }
});

// שימוש בכלי בסשן
async function main() {
  const client = new CopilotClient();
  const session = await client.createSession({
    model: "gpt-4.1",
    tools: [countFiles]   // <-- רישום הכלי
  });

  const response = await session.sendAndWait({
    prompt: "Count all files in the current directory and tell me the breakdown"
  });

  console.log(response?.data.content);
  await client.stop();
  process.exit(0);
}

main();

מה קורה כשמריצים: האייג'נט קורא את הפרומפט, מזהה שצריך לספור קבצים, קורא אוטונומית ל-count_files עם הנתיב הנוכחי, מקבל את התוצאה, ומנסח תשובה מפורטת. אתם לא צריכים לכתוב את הלוגיקה של "מתי לקרוא לכלי" — הלולאה האגנטית עושה את זה.

איך המודל "יודע" מתי להשתמש בכלי?

זה קורה בזכות ה-description שכתבתם. כשהמודל מקבל את הפרומפט "Count all files", הוא רואה גם את רשימת הכלים הזמינים עם התיאורים שלהם. תיאור טוב = המודל ידע מתי לקרוא לכלי. תיאור גרוע = המודל לא ישתמש בכלי גם כשצריך. כמה כללים:

כלים מרובים — האייג'נט מתאם בעצמו

כשרושמים כמה כלים, האייג'נט מחליט לבד באיזה סדר להשתמש בהם. למשל, אם יש לכם count_files ו-get_file_size, והפרומפט הוא "Find the largest TypeScript file" — האייג'נט עשוי:

  1. קודם לקרוא ל-count_files כדי לראות אילו קבצי .ts קיימים
  2. אז לקרוא ל-get_file_size על כל אחד מהם
  3. לנתח את התוצאות ולהגיד לכם מה הקובץ הגדול ביותר

כל זה בלי שכתבתם שורה אחת של לוגיקת תיאום. הלולאה האגנטית מטפלת בזה.

טעות נפוצה: לתת לכלי שם של כלי מובנה

אם תגדירו כלי בשם read_file או edit_file, ה-SDK יזרוק שגיאה — כי אלה שמות של כלים מובנים. אם בכוונה אתם רוצים להחליף כלי מובנה, תוסיפו overridesBuiltInTool: true להגדרה. אבל ברוב המקרים — פשוט בחרו שם ייחודי.

מה ה-handler יכול להחזיר?

ל-handler יש גמישות מלאה בסוג הערך המוחזר:

כלל אצבע: החזירו JSON כשהתוצאה מובנית (מספרים, רשימות, אובייקטים). החזירו מחרוזת כשהתוצאה היא טקסט חופשי. השתמשו ב-ToolResultObject כשצריך לסמן שגיאה.

Best Practices לכתיבת כלים

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

  1. שם ברור ב-snake_case: count_files, parse_config, write_report — לא doStuff
  2. description באנגלית תיאורית: המודל צריך להבין בדיוק מה הכלי עושה. שורה אחת מספיקה, אבל ספציפית
  3. פרמטרים מינימליים: כל פרמטר צריך description. שימו required על מה שחובה, optional על שאר
  4. Handler שלא זורק: עטפו ב-try/catch ותחזירו { error: "..." } במקום לתת ל-exception לעוף. האייג'נט מטפל טוב יותר בהודעת שגיאה מפורשת מאשר ב-crash
  5. תוצאה מידית: אם ה-handler לוקח יותר מ-30 שניות — שקלו לפרק אותו לשני כלים
עשו עכשיו 5 דקות

הוסיפו כלי שני לקוד: get_file_size שמקבל נתיב קובץ ומחזיר את הגודל בבייטים. הגדירו parameter בשם filePath מסוג string, וב-handler השתמשו ב-statSync(filePath).size. הריצו שוב עם הפרומפט "What's the largest file in the current directory?".

בינוני 15 דקות חינם תרגול

חיבור MCP Servers לאייג'נט

בפרק 5 חיברתם MCP servers ל-Copilot ב-VS Code — קבצי mcp.json, שרתי GitHub, filesystem ועוד. עכשיו תעשו את אותו דבר — אבל מקוד. ה-SDK תומך באותם שני סוגי שרתים שלמדתם:

סוגתקשורתדוגמהמתי
Local / STDIOתהליך מקומי, stdin/stdoutFilesystem MCP, Git MCPשרת שרץ על אותה מכונה
HTTP / SSEHTTP request לשרת מרוחקשרת ענן, API gatewayשרת חיצוני או בענן

חיבור שרת STDIO (מקומי)

const session = await client.createSession({
  model: "gpt-4.1",
  mcpServers: {
    filesystem: {
      type: "local",
      command: "npx",
      args: ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/project"],
      tools: ["*"]   // כל הכלים של השרת זמינים
    }
  }
});

מה קורה: ה-SDK מפעיל את תהליך ה-MCP server, מתחבר אליו דרך stdin/stdout, וחושף את כל הכלים שלו לאייג'נט. מרגע זה, האייג'נט יכול לקרוא קבצים, לכתוב קבצים, ולחפש — בדיוק כמו שהיה יכול דרך VS Code.

חיבור שרת HTTP (מרוחק)

שרתי HTTP מתאימים כשה-MCP server רץ על מכונה אחרת — ענן, שרת צוות, או שירות SaaS. ה-SDK מתחבר דרך SSE (Server-Sent Events) לקבלת עדכונים בזמן אמת:

const session = await client.createSession({
  model: "claude-sonnet",
  mcpServers: {
    "my-api": {
      type: "http",
      url: "https://my-mcp-server.example.com/sse",
      headers: {
        "Authorization": "Bearer my-token"
      },
      tools: ["*"]
    }
  }
});

ה-headers מאפשרים להעביר authentication — ככה ה-MCP server יודע מי אתם. שימו את הטוקן במשתנה סביבה, לא בקוד: headers: { "Authorization": `Bearer ${process.env.MCP_TOKEN}` }

חיבור מרובה — כמה שרתים בו-זמנית

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

mcpServers: {
  filesystem: { type: "local", command: "npx", args: [...], tools: ["*"] },
  github: { type: "local", command: "npx", args: ["-y", "@github/mcp-server"], tools: ["*"] },
  database: { type: "http", url: "https://db-mcp.example.com/sse", tools: ["query", "schema"] }
}

שימו לב לפרמטר tools: עם ["*"] כל הכלים של השרת זמינים. אפשר גם לפרט רשימה ספציפית — כדי להגביל את האייג'נט רק לכלים מסוימים. זה שימושי כשאתם רוצים שהאייג'נט יוכל רק לקרוא מ-database אבל לא לכתוב.

Custom Tools + MCP — חלוקת תפקידים

שאלה שעולה: אם MCP server נותן כלים, ו-defineTool גם נותן כלים — למה צריך את שניהם? התשובה: חלוקת תפקידים.

סוג כלימתידוגמה
MCP Serverשרת קיים עם כלים מוכניםfilesystem, GitHub, database
Custom Toolלוגיקה ספציפית שלכםניתוח לפי סטנדרט צוות, חישוב metrics מותאם

בפרויקט טיפוסי, תשתמשו ב-MCP servers לגישה לתשתיות (קבצים, Git, DB) ובכלים מותאמים ללוגיקה העסקית. הם משלימים זה את זה.

Troubleshooting — כשהחיבור נכשל

בעיות נפוצות עם MCP servers ב-SDK:

עשו עכשיו 5 דקות

הוסיפו לאייג'נט שלכם את ה-filesystem MCP server מהדוגמה למעלה. שלחו את הפרומפט "List all JavaScript files in the project and summarize their purpose". האייג'נט ישתמש בכלי הקריאה של ה-MCP server בנוסף לכלים שלכם.

בינוני 10 דקות freemium כלי

בחירת מודל — כל מודלי Copilot בידיים שלך

כשאתם בונים אייג'נט עם ה-SDK, בחירת המודל היא שלכם. כל המודלים שזמינים ב-Copilot — אותם מודלים שלמדתם בפרק 3 — זמינים גם כאן:

מודלמזהה ב-SDKמכפילמתי
GPT-4.1"gpt-4.1"1xברירת מחדל מאוזנת
GPT-4.1 mini"gpt-4.1-mini"0.25xמשימות פשוטות, חסכון
GPT-5"gpt-5"בדיקהחשיבה מורכבת
Claude Sonnet"claude-sonnet"1xכתיבת קוד, ניתוח
Claude Opus"claude-opus"בדיקהחשיבה עמוקה, משימות מורכבות
Claude Haiku"claude-haiku"0.25xמהיר וזול
Gemini 2.5 Pro"gemini-2.5-pro"1xקונטקסט ארוך, multi-modal

המכפילים חשובים: כשאתם בונים אייג'נט שרץ 100 פעמים ביום, ההבדל בין מודל 1x למודל 0.25x הוא משמעותי. אייג'נט שמשתמש ב-Claude Haiku או GPT-4.1 mini צורך רבע מהקרדיטים — מה שאומר שתוכלו להריץ אותו פי 4 יותר עם אותו תקציב.

Multi-Model Strategy — מודל שונה לכל שלב

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

// שלב 1: סיווג — מודל זול
const classifySession = await client.createSession({ model: "gpt-4.1-mini" });
const classification = await classifySession.sendAndWait({
  prompt: "Classify this file: is it a configuration, source code, test, or documentation?"
});

// שלב 2: ניתוח מעמיק — מודל חזק (רק אם צריך)
if (classification?.data.content.includes("source code")) {
  const analyzeSession = await client.createSession({ model: "claude-sonnet" });
  const analysis = await analyzeSession.sendAndWait({
    prompt: "Analyze this source file for code quality issues and security vulnerabilities"
  });
}

בדוגמה הזו, 80% מהקבצים מסווגים במודל 0.25x (זול). רק קבצי קוד מקור עוברים ניתוח מעמיק ב-1x. החיסכון: ~60% בקרדיטים לעומת הפעלת מודל 1x על הכל.

טיפ: Auto Model Selection

ב-VS Code, Copilot יכול לבחור מודל אוטומטית. ב-SDK, אתם בוחרים. זו גם אחריות וגם הזדמנות — אתם יכולים לבנות A/B testing: להריץ את אותו prompt על שני מודלים ולהשוות תוצאות. אייג'נט חכם בוחר את המודל הנכון לכל משימה, לא מודל אחד לכל דבר.

עשו עכשיו 3 דקות

חשבו על אייג'נט שאתם רוצים לבנות. כמה פעמים ביום הוא ירוץ? איזה מודל מתאים? חשבו את העלות החודשית (הרצות × מכפיל). האם נכנסים בתקרת המנוי? כתבו שורה אחת: "האייג'נט שלי ירוץ [X] פעמים ביום עם [מודל] = [Y] קרדיטים/חודש."

בינוני 10 דקות חינם הקמה

אימות — Copilot Subscription מול BYOK

ל-SDK יש שני מסלולי אימות. ההבדל ביניהם משפיע על המחיר, המודלים הזמינים, ואופן החיוב:

Two Auth Paths Copilot Subscription GitHub Account Copilot CLI Auth SDK (Premium Requests) All Copilot models Uses your plan quota BYOK (Bring Your Own Key) API Key (direct) Provider (OpenAI, etc.) SDK (Direct Billing) Provider's models only Billed by provider

מסלול 1: Copilot Subscription (ברירת מחדל)

כשיוצרים CopilotClient בלי הגדרות מיוחדות, ה-SDK משתמש באימות של Copilot CLI. זה אומר:

מסלול 2: BYOK (Bring Your Own Key)

עם BYOK תעבדו ישירות עם ספק מודלים — בלי לעבור דרך GitHub:

const session = await client.createSession({
  provider: {
    type: "openai-compatible",
    baseURL: "https://api.openai.com/v1",
    bearerToken: process.env.OPENAI_API_KEY
  },
  model: "gpt-4.1"
});

ספקים נתמכים ב-BYOK: OpenAI, Anthropic, Google AI Studio, AWS Bedrock, Microsoft Foundry, xAI, וכל ספק תואם OpenAI API.

דוגמה: BYOK עם Anthropic (Claude)

const session = await client.createSession({
  provider: {
    type: "openai-compatible",
    baseURL: "https://api.anthropic.com/v1",
    bearerToken: process.env.ANTHROPIC_API_KEY
  },
  model: "claude-sonnet-4-20250514"
});

דוגמה: BYOK עם AWS Bedrock

const session = await client.createSession({
  provider: {
    type: "openai-compatible",
    baseURL: "https://bedrock-runtime.us-east-1.amazonaws.com",
    bearerToken: process.env.AWS_SESSION_TOKEN,
    headers: {
      "X-Amz-Security-Token": process.env.AWS_SESSION_TOKEN
    }
  },
  model: "anthropic.claude-sonnet"
});

מגבלה חשובה: BYOK עובד עם static tokens בלבד. ה-SDK לא מרענן טוקנים אוטומטית. אם הטוקן שלכם פג תוקף (כמו ב-AWS sessions), הבקשות יכשלו ותצטרכו ליצור סשן חדש עם טוקן חדש. לכן, ב-production, תכננו מנגנון רענון מחוץ ל-SDK.

מתי כל מסלול? — ההשוואה המלאה

קריטריוןCopilot SubscriptionBYOK
הגדרהשורה אחת — model: "gpt-4.1"provider + baseURL + bearerToken
חיובPremium requests מהמנויישירות מהספק
מודלים זמיניםכל מודלי Copilotמודלי הספק בלבד
תקרהPro: 300, Pro+: 1,500לפי תוכנית הספק (בד"כ ללא תקרה)
אבטחהGitHub מנהלאתם מנהלים מפתחות
Enterprise complianceGitHub privacy policyprivacy policy של הספק
אבטחה חשובה: מפתחות API ו-bearer tokens אף פעם לא נשמרים לדיסק על ידי ה-SDK. אם אתם מחדשים סשן (resume), תצטרכו לספק את הפרטים מחדש. השתמשו במשתני סביבה (process.env) ולא בקוד קשיח.
מסגרת החלטה: Copilot Subscription מול BYOK
שאלהאם כןאם לא
יש לצוות מנוי Copilot Pro/Pro+?Subscription — הכי פשוטBYOK — אם יש מפתח ספק
צריכים מודל ספציפי שלא ב-Copilot?BYOK — גישה ישירה לספקSubscription — כל מודלי Copilot זמינים
שליטה מלאה בעלויות קריטית?BYOK — חיוב ישיר, ברור יותרSubscription — נוח, תקרה ברורה
פשטות הגדרה חשובה?Subscription — שורה אחתBYOK — לא מסובך, אבל דורש מפתח

כלל אצבע: התחילו עם Subscription. עברו ל-BYOK רק כשיש סיבה ספציפית — מודל חסר, עלות גבוהה מדי, או דרישת compliance.

מעבר בין מסלולים — אפשר גם את שניהם

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

// סשן 1: Copilot subscription למשימות רגילות
const regularSession = await client.createSession({
  model: "gpt-4.1-mini"  // שימוש בקרדיטים של Copilot
});

// סשן 2: BYOK למשימות שדורשות מודל ספציפי
const specialSession = await client.createSession({
  provider: {
    type: "openai-compatible",
    baseURL: "https://api.anthropic.com/v1",
    bearerToken: process.env.ANTHROPIC_API_KEY
  },
  model: "claude-opus-4-20250514"  // מודל שלא זמין דרך Copilot
});

הגישה הזו מאפשרת אופטימיזציית עלות: משימות רגילות עוברות דרך מנוי Copilot (חינם עד התקרה), ומשימות מיוחדות דרך BYOK (חיוב לפי שימוש).

עשו עכשיו 3 דקות

בדקו איזה סוג מנוי יש לכם: copilot auth status. אם יש לכם גם מפתח OpenAI או Anthropic, נסו ליצור סשן BYOK עם הדוגמה למעלה (שימו את המפתח במשתנה סביבה: export OPENAI_API_KEY=sk-...).

בינוני 10 דקות חינם תרגול

Streaming — תוצאות בזמן אמת

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

עם Streaming, התשובה מגיעה חלק-אחרי-חלק (token by token), בדיוק כמו שאתם רגילים לראות ב-ChatGPT או ב-Copilot Chat.

הפעלת Streaming

const session = await client.createSession({
  model: "claude-sonnet",
  streaming: true    // <-- זה כל מה שצריך
});

// האזנה לחלקי תשובה בזמן אמת
session.on("assistant.message_delta", (event) => {
  process.stdout.write(event.data.content);  // הדפסה ללא ירידת שורה
});

// האזנה לסיום
session.on("session.idle", () => {
  console.log("\n--- Response complete ---");
});

// שליחת הפרומפט (לא sendAndWait!)
await session.send({
  prompt: "Write a detailed analysis of the package.json in this project"
});

ההבדל המרכזי: session.send() (לא sendAndWait) — שולח את הפרומפט ומיד חוזר. התשובה מגיעה דרך ה-event listeners.

אירועים זמינים

אירועמתי נשלחשימוש
assistant.message_deltaכל חלק חדש של תשובההצגת טקסט בזמן אמת
tool.callהאייג'נט קורא לכלילוגים, ניטור
tool.resultכלי החזיר תוצאהלוגים, debugging
session.idleסיום מלא של התשובהניקוי, UI update

דוגמה מעשית: CLI app עם progress indicator

הנה דוגמה שלמה שמציגה progress בזמן שהאייג'נט עובד — מושלם ל-CLI tool:

let toolCallCount = 0;
let charCount = 0;

session.on("tool.call", (event) => {
  toolCallCount++;
  process.stdout.write(`\r🔧 Using tool: ${event.data.toolName} (#${toolCallCount})...`);
});

session.on("assistant.message_delta", (event) => {
  if (charCount === 0) process.stdout.write("\r" + " ".repeat(60) + "\r");  // נקה שורת progress
  process.stdout.write(event.data.content);
  charCount += event.data.content.length;
});

session.on("session.idle", () => {
  console.log(`\n\n--- Done! ${toolCallCount} tool calls, ${charCount} characters ---`);
});

המשתמש רואה: קודם "Using tool: read_file (#1)..." שמתעדכן, ואז כשהתשובה מתחילה — הטקסט זורם. זה חוויה טובה יותר מאשר מסך ריק שמחכה 30 שניות.

sendAndWait מול send — סיכום

מתודהמתייתרוןחיסרון
sendAndWait()סקריפטים, batch processingפשוט, קוד נקיאין feedback בזמן אמת
send() + eventsUI, CLI apps, ממשקי chatחווית משתמש טובה, ניטוריותר קוד, צריך event handlers
עשו עכשיו 5 דקות

העתיקו את דוגמת ה-Streaming, הריצו, וצפו בטקסט שזורם לטרמינל. עכשיו הוסיפו listener ל-tool.call שמדפיס: console.log(`[TOOL] ${event.data.toolName}(${JSON.stringify(event.data.args)})`) — כך תראו בדיוק מתי האייג'נט קורא לכלים.

מתקדם 10 דקות חינם מושג

זיכרון מתמשך ו-Infinite Sessions

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

Session Persistence — חידוש סשן

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

// סשן ראשון
const session = await client.createSession({
  model: "gpt-4.1",
  sessionId: "my-project-scan-001"
});
// ... עבודה ...
await session.disconnect();  // שומר מצב לדיסק, לא מוחק

// אחרי restart — חידוש
const resumed = await client.createSession({
  model: "gpt-4.1",
  sessionId: "my-project-scan-001"  // אותו ID!
});
// הסשן ממשיך מאיפה שעצר

חשוב: disconnect() שומר את המצב לדיסק ומשחרר זיכרון. deleteSession() מוחק הכל לצמיתות. אל תתבלבלו ביניהם.

Infinite Sessions — סשנים ללא הגבלת אורך

כל מודל מוגבל ב-context window — כמות הטוקנים שהוא יכול "לראות" בבת אחת. כשהשיחה ארוכה מדי — למשל, אייג'נט שסורק 50 קבצים ומנתח כל אחד — ה-context מתמלא ואי אפשר להמשיך. Infinite Sessions פותרות את הבעיה: ה-SDK דוחס אוטומטית את ההיסטוריה — מסכם את מה שהיה ומשחרר מקום:

const session = await client.createSession({
  model: "gpt-4.1",
  infiniteSessions: {
    enabled: true,
    backgroundCompactionThreshold: 0.80,  // התחל דחיסה ב-80%
    bufferExhaustionThreshold: 0.95       // חובה לדחוס ב-95%
  }
});

איך זה עובד:

מתי להשתמש בכל אפשרות?

תרחישpersistence?infinite?למה
סקריפט חד-פעמילאלאהסשן חי וימות עם התהליך
אייג'נט שרץ שעותכןכןצריך לשרוד restart ו-context ארוך
Slack botכן (לכל user)אפשריכל משתמש שומר את ההיסטוריה שלו
CI/CD pipelineלאלאכל run הוא עצמאי
ניתוח ריפו גדולאפשריכןContext מתמלא מהר עם קבצים רבים
Idle Timeout: ל-SDK יש timeout מובנה של 30 דקות. סשנים ללא פעילות מנוקים אוטומטית. אם אתם בונים אייג'נט שרץ כל הלילה — ודאו שיש פעילות לפחות פעם בחצי שעה, או הגדירו keep-alive.

disconnect() מול deleteSession() — אל תתבלבלו

ההבדל קריטי:

אם אתם לא בטוחים — השתמשו ב-disconnect(). תמיד אפשר למחוק אחר כך.

עשו עכשיו 3 דקות

חשבו על אייג'נט שאתם רוצים לבנות. הוא חד-פעמי (סקריפט) או מתמשך (שירות)? אם מתמשך — איזו קומבינציה של persistence ו-infinite sessions תבחרו? כתבו שורה אחת: "האייג'נט שלי הוא [סוג], ולכן אני צריך [persistence: כן/לא] ו-[infinite: כן/לא]."

מתקדם 45 דקות חינם תרגול

פרויקט: אייג'נט שסורק ריפוזיטורי ומייצר דוח

הגיע הזמן לחבר את כל מה שלמדתם לפרויקט אחד שלם. נבנה אייג'נט שסורק ריפוזיטורי ומייצר דוח Markdown מסודר — עם כלים מותאמים, MCP server, streaming ו-error handling.

Repo Scanner Agent — Architecture Your App (repo-scanner.ts) CopilotClient + Session Custom Tools count_lines parse_package_json write_report analyze_deps MCP Server filesystem (read/write) directory listing file search Model Claude Sonnet (analysis) or GPT-4.1 (generation) Streaming enabled Output: REPORT.md

הקוד המלא

import { CopilotClient, defineTool } from "@github/copilot-sdk";
import { readFileSync, writeFileSync, readdirSync, statSync } from "fs";
import { join, extname } from "path";

// === כלי 1: ספירת שורות ===
const countLines = defineTool("count_lines", {
  description: "Count lines of code in a file",
  parameters: {
    type: "object",
    properties: {
      filePath: { type: "string", description: "Path to the file" }
    },
    required: ["filePath"]
  },
  handler: async (args: { filePath: string }) => {
    const content = readFileSync(args.filePath, "utf-8");
    const lines = content.split("\n");
    return {
      file: args.filePath,
      totalLines: lines.length,
      nonEmptyLines: lines.filter(l => l.trim()).length
    };
  }
});

// === כלי 2: ניתוח package.json ===
const parsePackageJson = defineTool("parse_package_json", {
  description: "Parse package.json and extract key info",
  parameters: {
    type: "object",
    properties: {
      directory: { type: "string", description: "Project root directory" }
    },
    required: ["directory"]
  },
  handler: async (args: { directory: string }) => {
    try {
      const pkg = JSON.parse(readFileSync(join(args.directory, "package.json"), "utf-8"));
      return {
        name: pkg.name,
        version: pkg.version,
        dependencies: Object.keys(pkg.dependencies || {}),
        devDependencies: Object.keys(pkg.devDependencies || {}),
        scripts: Object.keys(pkg.scripts || {})
      };
    } catch {
      return { error: "No package.json found" };
    }
  }
});

// === כלי 3: כתיבת דוח ===
const writeReport = defineTool("write_report", {
  description: "Write a markdown report to a file",
  parameters: {
    type: "object",
    properties: {
      filePath: { type: "string", description: "Output file path" },
      content: { type: "string", description: "Markdown content" }
    },
    required: ["filePath", "content"]
  },
  handler: async (args: { filePath: string; content: string }) => {
    writeFileSync(args.filePath, args.content, "utf-8");
    return { success: true, path: args.filePath, bytes: args.content.length };
  }
});

// === הרצת האייג'נט ===
async function main() {
  const client = new CopilotClient();

  const session = await client.createSession({
    model: "claude-sonnet",
    streaming: true,
    tools: [countLines, parsePackageJson, writeReport],
    mcpServers: {
      filesystem: {
        type: "local",
        command: "npx",
        args: ["-y", "@modelcontextprotocol/server-filesystem", process.cwd()],
        tools: ["*"]
      }
    }
  });

  // ניטור כלים
  session.on("tool.call", (event) => {
    console.log(`\n[TOOL] ${event.data.toolName}(${JSON.stringify(event.data.args).slice(0, 80)}...)`);
  });

  // Streaming output
  session.on("assistant.message_delta", (event) => {
    process.stdout.write(event.data.content);
  });

  // מחכים לסיום
  const done = new Promise<void>((resolve) => {
    session.on("session.idle", resolve);
  });

  // הפרומפט — מנחה את האייג'נט לסרוק ולדווח
  await session.send({
    prompt: `Scan this repository thoroughly. Use the following steps:
1. List all files and directories
2. Parse package.json for dependencies and scripts
3. Count lines of code in the top 10 largest source files
4. Identify the tech stack and architecture patterns
5. Write a comprehensive report to REPORT.md

Include: project overview, tech stack, file structure summary,
dependency analysis, code metrics, and 3 improvement suggestions.
Format as clean Markdown.`
  });

  await done;
  console.log("\n\n=== Report generated! Check REPORT.md ===");
  await client.stop();
  process.exit(0);
}

main();

מה קורה כשמריצים:

  1. האייג'נט קורא את הפרומפט ומתכנן את המשימה
  2. משתמש בכלי ה-filesystem MCP כדי לסרוק את מבנה התיקיות
  3. קורא ל-parse_package_json כדי להבין את ה-dependencies
  4. קורא ל-count_lines על הקבצים הגדולים
  5. מנתח את כל המידע ומייצר דוח
  6. קורא ל-write_report כדי לשמור את הדוח לקובץ

וכל זה — אוטונומית. אתם כותבים פרומפט אחד והאייג'נט מחליט איך לבצע.

שדרוג: הוספת סשן מרובה סיבובים

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

// שלב 1: סריקה ואיסוף נתונים
await session.send({ prompt: "First, scan the project structure and list all source files" });
await waitForIdle(session);

// שלב 2: ניתוח מעמיק (הסשן זוכר את שלב 1!)
await session.send({ prompt: "Now analyze the top 5 largest files for code quality" });
await waitForIdle(session);

// שלב 3: כתיבת הדוח
await session.send({ prompt: "Write a comprehensive REPORT.md based on everything you found" });
await waitForIdle(session);

היתרון: כל שלב בנוי על התוצאות של הקודם. האייג'נט מצטבר ידע ומייצר דוח עשיר יותר. זה בדיוק הכוח של סשנים stateful — השיחה שומרת context, ולא צריך לחזור על מידע שכבר נאסף.

הרחבה: הוספת כלי analyze_deps

לסורק ריפוזיטורי מלא, שווה להוסיף כלי שמנתח dependencies. הנה דוגמה:

const analyzeDeps = defineTool("analyze_deps", {
  description: "Analyze node_modules to count installed packages and find outdated ones",
  parameters: {
    type: "object",
    properties: {
      directory: { type: "string", description: "Project root directory" }
    },
    required: ["directory"]
  },
  handler: async (args: { directory: string }) => {
    const nodeModules = join(args.directory, "node_modules");
    try {
      const packages = readdirSync(nodeModules)
        .filter(d => !d.startsWith("."));
      return {
        totalPackages: packages.length,
        scopedPackages: packages.filter(d => d.startsWith("@")).length,
        topLevel: packages.slice(0, 20)
      };
    } catch {
      return { error: "node_modules not found. Run npm install first." };
    }
  }
});

שימו לב ל-error handling — אם node_modules לא קיים (למשל, אחרי git clone בלי npm install), הכלי מחזיר הודעת שגיאה ידידותית במקום crash.

התמודדות עם שגיאות בפרויקט

בפרויקט אמיתי, דברים ישברו. הנה כמה תרחישים נפוצים:

עשו עכשיו 2 דקות

לפני שמתחילים את התרגילים — ודאו שהסביבה מוכנה: הריצו copilot auth status (מאומת?), node --version (18+?), npx tsx --version (עובד?). אם אחד מהם נכשל — תקנו לפני שממשיכים.

תרגיל 1: אייג'נט Hello World עם כלי מותאם 30 דקות

מטרה: לבנות אייג'נט SDK ראשון עם כלי מותאם שעובד.

  1. צרו תיקיית פרויקט חדשה והריצו npm init -y && npm install @github/copilot-sdk tsx
  2. צרו קובץ agent.ts עם CopilotClient בסיסי (העתיקו מדוגמת Hello World מסעיף ההתקנה)
  3. הגדירו כלי מותאם בשם count_files שמקבל נתיב תיקייה ומחזיר ספירת קבצים לפי סיומת (השתמשו בדוגמה מסעיף "כלים מותאמים")
  4. הוסיפו כלי נוסף בשם get_file_size שמחזיר גודל קובץ בבייטים. הנה הקוד:
    const getFileSize = defineTool("get_file_size", {
      description: "Get the size of a file in bytes",
      parameters: {
        type: "object",
        properties: {
          filePath: { type: "string", description: "Path to the file" }
        },
        required: ["filePath"]
      },
      handler: async (args: { filePath: string }) => {
        const stats = statSync(args.filePath);
        return {
          file: args.filePath,
          sizeBytes: stats.size,
          sizeKB: Math.round(stats.size / 1024),
          lastModified: stats.mtime.toISOString()
        };
      }
    });
  5. רשמו את שני הכלים ב-tools: [countFiles, getFileSize]
  6. שלחו פרומפט: "Analyze the current directory. Count all files by type, find the largest file, and summarize."

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

נקודת בדיקה: אם הכלי לא נקרא — בדקו את ה-description. אם הוא לא ברור מספיק, המודל לא ידע מתי להשתמש בו.

תרגיל 2: אייג'נט עם MCP Server ו-Streaming 30 דקות

מטרה: לחבר MCP server לאייג'נט SDK ולהפעיל streaming.

  1. התחילו מהקוד של תרגיל 1 — אותו פרויקט, אותם כלים מותאמים
  2. הוסיפו את ה-filesystem MCP server לתוך createSession:
    mcpServers: {
      filesystem: {
        type: "local",
        command: "npx",
        args: ["-y", "@modelcontextprotocol/server-filesystem", process.cwd()],
        tools: ["*"]
      }
    }
  3. הפעילו streaming: true ב-createSession
  4. הוסיפו listeners:
    • assistant.message_delta — הדפסת תשובה: process.stdout.write(event.data.content)
    • tool.call — לוג כלים: console.log(`\n[TOOL] ${event.data.toolName}`)
    • session.idle — סיום: console.log("\n--- Done ---")
  5. שנו ל-session.send() (לא sendAndWait!) ושלחו פרומפט: "Read the package.json and README.md files, then write a 3-paragraph summary of this project."

תוצאה צפויה: תראו את התשובה זורמת בזמן אמת, עם לוגים של קריאות כלים בזמן שהאייג'נט עובד. שימו לב לרגע שה-streaming עובר מ-"waiting for tool result" לטקסט זורם — זה הרגע שהלולאה האגנטית חוזרת מהכלי למודל.

אתגר נוסף: הוסיפו timer שמודד כמה שניות עברו מתחילת הבקשה עד סיומה. השתמשו ב-Date.now() לפני ואחרי.

מתקדם 10 דקות חינם אסטרטגיה

שיקולי Production — מ-prototype לפרודקשן

הקוד שכתבתם עובד מצוין ב-development. אבל לפני שמריצים אותו ב-production — ב-cron job, ב-CI/CD, או כשירות — צריך להתייחס לכמה נקודות קריטיות:

1. Rate Limits

Copilot מגביל שימוש כדי למנוע עומס. כשפוגעים ב-rate limit, אתם מקבלים שגיאה זמנית. הגישה חוזרת אחרי כמה דקות, אבל אייג'נט אוטומטי צריך לדעת לטפל בזה:

async function sendWithRetry(session: any, prompt: string, maxRetries = 3) {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      return await session.sendAndWait({ prompt });
    } catch (error: any) {
      if (error.status === 429 && attempt < maxRetries) {
        const waitTime = Math.pow(2, attempt) * 1000; // exponential backoff
        console.log(`Rate limited. Waiting ${waitTime/1000}s...`);
        await new Promise(r => setTimeout(r, waitTime));
      } else {
        throw error;
      }
    }
  }
}

2. Error Handling

לעטוף כל אינטראקציה ב-try/catch. סוגי שגיאות נפוצים:

שגיאהסיבהפתרון
429 (Rate Limit)יותר מדי בקשותExponential backoff
401 (Unauthorized)אימות לא תקיןבדקו copilot auth status
Connection ErrorCLI לא מותקן/מופעלודאו ש-copilot בנתיב
Tool TimeoutHandler של כלי מותאם לא חוזרהוסיפו timeout ל-handler

3. שכבת הפשטה (Abstraction Layer)

ה-SDK ב-Technical Preview. ה-API עשוי להשתנות. אל תפזרו קריאות SDK בכל הקוד — צרו wrapper:

// agent-wrapper.ts — שכבת הפשטה
export class MyAgent {
  private client: CopilotClient;
  private session: any;

  async init(model: string, tools: any[]) {
    this.client = new CopilotClient();
    this.session = await this.client.createSession({ model, tools });
  }

  async ask(prompt: string): Promise<string> {
    const response = await sendWithRetry(this.session, prompt);
    return response?.data.content || "";
  }

  async cleanup() {
    await this.client.stop();
  }
}

כשה-SDK ישתנה, תתקנו רק ב-agent-wrapper.ts — לא בכל הקוד.

4. עלות — חישוב שכדאי לעשות מראש

כל פרומפט שהאייג'נט שולח צורך premium requests לפי מכפיל המודל. בואו נעשה חשיבון מהיר:

דוגמה: חישוב עלות אייג'נט יומי
תרחישהרצות/יוםמודלמכפילקרדיטים/יוםקרדיטים/חודש
סורק PR20Claude Sonnet1x20600
סורק PR (חסכוני)20GPT-4.1 mini0.25x5150
ניתוח ריפו2GPT-4.11x260
בוט Slack50Claude Haiku0.25x12.5375

Pro (300 קרדיטים/חודש) מספיק ל"סורק PR חסכוני" + "ניתוח ריפו". Pro+ (1,500 קרדיטים) מספיק לכל הארבעה. מעבר לתקרה — $0.04 לכל premium request נוסף.

אסטרטגיית חיסכון:

5. לוגים וניטור

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

import { appendFileSync } from "fs";

function log(level: string, message: string, data?: any) {
  const entry = JSON.stringify({
    timestamp: new Date().toISOString(),
    level,
    message,
    data
  });
  appendFileSync("agent.log", entry + "\n");
  if (level === "error") console.error(message);
}

// שימוש
session.on("tool.call", (event) => {
  log("info", `Tool called: ${event.data.toolName}`, event.data.args);
});

session.on("tool.result", (event) => {
  log("info", `Tool result`, { tool: event.data.toolName, success: !event.data.error });
});

בדקו את agent.log כל בוקר. חפשו שגיאות, rate limits, וכלים שנקראו בצורה לא צפויה.

6. Technical Preview — מה צפוי להשתנות?

ה-SDK בסטטוס Technical Preview מינואר 2026. בהתבסס על דפוסים מוכרים של GitHub, הנה מה צפוי:

העיקרון: כל מה שיכול להשתנות — הפרידו לקובץ config או ל-wrapper. מה שלא סביר שישתנה (הקונספט של client, session, send) — כנראה יישאר.

7. סיכום: רשימת בדיקה ל-Production Launch

לפני שמעלים אייג'נט SDK ל-production, וודאו:

טעות נפוצה: לבנות ישירות על API שישתנה

כמפתחים, אנחנו אוהבים לעבוד ישירות עם ה-API. אבל כשהסטטוס הוא Technical Preview, הממשק ישתנה. מפתחים שמפזרים קריאות CopilotClient ב-20 קבצים יצטרכו לתקן ב-20 מקומות. מפתחים שיוצרים wrapper מתקנים במקום אחד. תמיד צרו שכבת הפשטה.

מסגרת החלטה: SDK מול CLI מול Agent Mode
תרחישהכלי הנכוןלמה
משימה חד-פעמית בזמן פיתוחAgent Mode (VS Code)הכי מהיר, לא צריך קוד
סקריפט אוטומציה שרץ ב-cronCLIהפעלה מטרמינל, בלי UI
אוטומציה משובצת באפליקציהSDKשליטה מלאה, כלים מותאמים
ממשק משתמש מותאם (chat UI)SDKstreaming, events, UI control
CI/CD pipeline — PR reviewSDK + GitHub Actionsאינטגרציה עם workflow
Slack bot שעונה על שאלות קודSDKחיבור ל-API חיצוני + כלים

כלל אצבע: אם צריך כלים מותאמים או ממשק מותאם — SDK. אם מספיק CLI command — CLI. אם זה interactive בזמן פיתוח — Agent Mode.

מסגרת החלטה: בחירת מודל לאייג'נט SDK
סוג משימהמודל מומלץמכפילהנימוק
סיווג, תיוג, מיוןGPT-4.1 mini / Claude Haiku0.25xזול, מהיר, מספיק למשימות פשוטות
כתיבת קוד, ניתוחGPT-4.1 / Claude Sonnet1xאיזון בין יכולת לעלות
ארכיטקטורה, תכנון מורכבGPT-5 / Claude Opusגבוהשמרו ליד משימות שבאמת דורשות חשיבה עמוקה
קונטקסט ארוך מאודGemini 2.5 Pro1xחלון קונטקסט גדול, multi-modal

אסטרטגיה: התחילו עם מודל זול (0.25x), בדקו את התוצאות. שדרגו למודל יקר יותר רק אם האיכות לא מספקת. רוב המשימות האוטומטיות לא צריכות את המודל החזק ביותר.

Capstone: סורק ריפוזיטורי אוטומטי 45 דקות

מטרה: לבנות אייג'נט מלא שסורק ריפוזיטורי ומייצר דוח — עם כל מה שלמדתם בפרק.

  1. צרו פרויקט חדש: mkdir repo-scanner && cd repo-scanner && npm init -y && npm install @github/copilot-sdk tsx
  2. העתיקו את הקוד המלא מסעיף "פרויקט: אייג'נט שסורק ריפוזיטורי" למעלה
  3. הוסיפו כלי רביעי: analyze_deps — שקורא את node_modules וסופר כמה חבילות מותקנות
  4. הוסיפו sendWithRetry מסעיף Production במקום session.send ישיר
  5. הוסיפו abstraction layer: צרו agent-wrapper.ts וייבאו אותו ב-repo-scanner.ts
  6. הריצו על ריפוזיטורי אמיתי שלכם (גם קטן בסדר)
  7. בדקו את קובץ REPORT.md שנוצר — האם המידע מדויק?
  8. בונוס: שנו את המודל ל-gpt-4.1-mini והשוו את איכות הדוח. שימו לב להבדל בעלות (0.25x מול 1x)

תוצאה צפויה: קובץ REPORT.md מפורט שכולל: סיכום פרויקט, tech stack, מבנה קבצים, ניתוח dependencies, מדדי קוד, ו-3 הצעות לשיפור. אם עובדים עם streaming — תראו את הכל בזמן אמת בטרמינל.

בינוני 5 דקות חינם אסטרטגיה

שגרת עבודה

שגרת עבודה — SDK (בנוסף לשגרה מפרק 10)
תדירותמשימהזמן
יומיבדקו לוגים של אייג'נטים אוטומטיים — שגיאות, rate limits, תוצאות5 דקות
יומיבדקו צריכת premium requests — שהאייג'נטים לא שורפים קרדיטים2 דקות
שבועיסקירת איכות דוחות/תוצאות שאייג'נטים ייצרו — האם המודל הנכון נבחר15 דקות
שבועיבדקו עדכוני SDK — npm outdated @github/copilot-sdk5 דקות
שבועינסו מודל חדש/שונה על אחד האייג'נטים — האם יש שיפור?10 דקות
חודשיסקירת ארכיטקטורה: האם צריך להוסיף/להסיר כלים מותאמים?30 דקות
חודשיבדקו שה-abstraction layer מעודכן ומכסה את כל שימושי ה-SDK20 דקות

אם אתם עושים רק דבר אחד

אם אתם עושים רק דבר אחד מהפרק הזה

צרו פרויקט Node.js, התקינו @github/copilot-sdk, והריצו את דוגמת ה-Hello World. 5 דקות. אחרי שזה עובד — הוסיפו כלי מותאם אחד. ברגע שאתם רואים את האייג'נט קורא לכלי שאתם כתבתם — הבנתם את הרעיון. הכל אחרי זה הוא הרחבה.

בדקו את עצמכם

5 שאלות — 4 נכונות = עברתם
  1. למה ה-SDK משתמש ב-Copilot CLI מאחורי הקלעים, ומה ההשלכה על דרישות ההתקנה? (רמז: חשבו מה קורה אם CLI לא מותקן)
  2. מה ההבדל בין sendAndWait ל-send עם streaming, ומתי תבחרו כל אחד? (רמז: חשבו על UX מול פשטות קוד)
  3. למה חשוב ליצור שכבת הפשטה (wrapper) מעל ה-SDK, ומה יקרה בלעדיה? (רמז: מה הסטטוס של ה-SDK — ומה זה אומר על API stability)
  4. איך infinite sessions מטפלות בבעיית context window, ומה ה-tradeoff? (רמז: מה נאבד בדחיסה)
  5. מתי עדיף BYOK על Copilot Subscription, ומה החיסרון המרכזי? (רמז: חשבו על ניהול מפתחות ואבטחה)

סיכום הפרק

סיכום — Copilot SDK

בפרק הזה עשיתם מעבר מהותי: ממשתמשים של Copilot לבונים עם Copilot. גיליתם שאותה לולאה אגנטית שמפעילה את Copilot CLI — תכנון, בחירת כלי, הפעלה, בדיקת תוצאה — זמינה כספריה שאפשר לייבא לכל אפליקציה. למדתם להגדיר כלים מותאמים עם defineTool שהאייג'נט קורא להם אוטונומית, לחבר MCP servers מסוג STDIO ו-HTTP, לבחור מודלים בצורה חכמה שחוסכת קרדיטים עם אסטרטגיית multi-model, ולהגדיר אימות — גם דרך Copilot subscription וגם BYOK ישיר מול OpenAI, Anthropic ואחרים. בניתם אייג'נט שלם שסורק ריפוזיטורי ומייצר דוח Markdown, עם streaming בזמן אמת ו-error handling. והכי חשוב — הבנתם שב-Technical Preview צריך שכבת הפשטה כדי לא להישבר כש-API משתנה, ותכננתם אסטרטגיית עלות שתכסה אתכם ב-production.

המעבר מ"משתמש Copilot" ל"בונה עם Copilot" הוא לא רק שדרוג טכני — זו שינוי פרספקטיבה. עם ה-SDK, כל בעיה שחוזרת על עצמה הופכת לאייג'נט שפותר אותה אוטומטית. כל workflow ידני הופך ל-automation. וכל זה עם אותו מנוע battle-tested שכבר הוכיח את עצמו ב-Copilot CLI.

בפרק הבא — פרק 12 ואחרון — תשלבו את כל הכלים שלמדתם: SDK, CLI, Agent Mode, GitHub.com, וסוכני צד שלישי (Claude, Codex) — בזרימת עבודה אחת מקצה לקצה שפותרת בעיה אמיתית מקצה לקצה.

צ'קליסט — סימנו מה השלמתם