4 שלב בניית מיומנויות

סביבת פיתוח — Setup לכל SDK

הפרק הכי פרקטי עד עכשיו: תתקינו Python, Node.js, כל SDK שנלמד בקורס, תגדירו מפתחות API בצורה מאובטחת, תבנו תבנית פרויקט סטנדרטית, ותגדירו כלים לניטור עלויות ו-debugging. בסוף הפרק — תהיה לכם סביבת עבודה מוכנה לכל פרק בקורס.

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

בפרקים 1-3 למדת את הבסיס התיאורטי: מה זה סוכן, איך הוא בנוי, ואיך הוא מתחבר לכלים. בפרק הזה אנחנו עוברים מתיאוריה לפרקטיקה. סביבת הפיתוח שתבנה כאן היא התשתית שתשרת אותך בכל שאר הפרקים: פרק 5 (Claude Agent SDK), פרק 6 (Vercel AI SDK), פרק 7 (OpenAI Agents SDK), פרק 8 (Google ADK + LangGraph), ופרקי הפרויקטים המתקדמים. השקעה של 2-3 שעות עכשיו תחסוך לך עשרות שעות של debugging אחר כך.

מילון מונחים — פרק 4
מונח (English) עברית הסבר
Virtual Environment (venv) סביבה וירטואלית סביבת Python מבודדת שמאפשרת להתקין חבילות לפרויקט ספציפי בלי להשפיע על חבילות גלובליות
uv מנהל חבילות Python מהיר שנכתב ב-Rust. מחליף pip, venv, poetry, pyenv — הכל בכלי אחד מהיר פי 10-100
Package Manager מנהל חבילות כלי שמתקין, מעדכן ומנהל ספריות (packages): pip/uv ל-Python, npm/pnpm/bun ל-Node.js
Environment Variable משתנה סביבה ערך שמוגדר ברמת מערכת ההפעלה וזמין לכל תהליך. דרך מאובטחת לאחסן מפתחות API
.env File קובץ סביבה קובץ טקסט פשוט שמכיל KEY=VALUE pairs. נטען לתהליך ע"י python-dotenv או dotenv ב-Node
.gitignore קובץ שמגדיר ל-Git אילו קבצים לא לעקוב אחריהם — חיוני להוספת .env כדי שמפתחות לא יגיעו ל-GitHub
SDK (Software Development Kit) ערכת פיתוח חבילת קוד שמספקת ממשק נוח לעבודה עם שירות — למשל Claude Agent SDK עוטף את Anthropic API
Version Pinning נעילת גרסה קיבוע גרסת חבילה מדויקת (==0.1.48 ב-Python, ^0.1.48 ב-npm) כדי למנוע שבירות מעדכונים
Docker Container קונטיינר יחידת הרצה מבודדת שמכילה קוד + כל התלויות. מבטיח ש"עובד לי על המחשב" = "עובד בכל מקום"
Token Budget תקציב טוקנים מגבלה שמגדירים כדי לשלוט בעלויות — מספר מקסימלי של טוקנים (קלט + פלט) לשיחה אחת
LLM Observability ניטור מודלים כלים שמאפשרים לעקוב אחרי ביצועי סוכנים: traces, latency, token usage, error rates
Rate Limit מגבלת קצב מספר הבקשות המרבי ליחידת זמן שספק API מאפשר — משתנה לפי tier ומודל
מתחיל 10 דקות חינם

בדיקת דרישות מקדימות — מה צריך לפני שמתחילים

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

כלי גרסה מינימלית למה צריך בדיקה
Python 3.11+ Claude Agent SDK, OpenAI Agents SDK, Google ADK, LangGraph, CrewAI python --version
Node.js 20+ Vercel AI SDK, Claude Agent SDK (TS), MCP SDK (TS) node --version
Git 2.30+ ניהול גרסאות, שיתוף קוד, .gitignore git --version
Code Editor VS Code / Cursor כתיבת קוד, debugging, extensions code --version
Docker 24+ (רשות) MCP servers, deployment, sandboxing docker --version
Terminal Windows Terminal / iTerm2 / כל טרמינל Linux
עשה עכשיו 2 דקות

פתח טרמינל והרץ את כל פקודות הבדיקה:

# בדיקת דרישות מקדימות — הרץ הכל ברצף
python --version    # צריך 3.11+
node --version      # צריך 20+
git --version       # צריך 2.30+
code --version      # VS Code
docker --version    # רשות — 24+

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

מתחיל 15 דקות פרקטי

סביבת Python — התקנה, Virtual Environments ו-uv

Python הוא שפת הבסיס של עולם ה-AI Agents. מתוך 7 ה-SDKs שנלמד, 6 מהם זמינים ב-Python (כולם חוץ מ-Vercel AI SDK שהוא TypeScript-only). אם אתם צריכים לבחור שפה אחת — Python.

התקנת Python 3.11+

התקנה לפי מערכת הפעלה
# macOS — עם Homebrew
brew install python@3.12

# Windows — עם winget
winget install Python.Python.3.12
# או: הורד מ-python.org/downloads

# Ubuntu/Debian
sudo apt update && sudo apt install python3.12 python3.12-venv

# אימות
python3 --version  # Python 3.12.x

למה 3.11 ולא 3.10? כמה סיבות: ביצועים (CPython 3.11 מהיר 10-60% מ-3.10), tomllib built-in, Exception Groups, ו-הכי חשוב — חלק מה-SDKs דורשים 3.11 כמינימום (בפרט Claude Agent SDK ו-Pydantic AI).

Virtual Environments — למה ואיך

אף פעם, אף פעם אל תתקינו חבילות Python ב-global. כל פרויקט צריך סביבה מבודדת משלו. למה? כי שני פרויקטים יכולים לדרוש גרסאות שונות של אותה חבילה, ובלי בידוד — שבירות בטוחות.

יש שלוש דרכים עיקריות ליצור virtual environment. אנחנו ממליצים על uv — אבל נכסה את כולן:

3 דרכים ליצור Virtual Environment
# === אופציה 1: venv (built-in, תמיד זמין) ===
python -m venv .venv
source .venv/bin/activate      # macOS/Linux
# .venv\Scripts\activate       # Windows
pip install -r requirements.txt

# === אופציה 2: uv (מומלץ! מהיר פי 10-100) ===
# התקנה: https://docs.astral.sh/uv/getting-started/installation/
curl -LsSf https://astral.sh/uv/install.sh | sh  # macOS/Linux
# winget install --id=astral-sh.uv -e             # Windows

# שימוש:
uv init my-agent                   # יוצר פרויקט חדש עם pyproject.toml
cd my-agent
uv add claude-agent-sdk openai-agents google-adk  # מתקין ישירות
uv run python agent.py             # מריץ בתוך ה-venv אוטומטית

# === אופציה 3: conda (לעבודה עם ML/DS) ===
conda create -n agents python=3.12
conda activate agents
pip install -r requirements.txt
מסגרת: בחירת מנהל חבילות Python
כלי מהירות ניהול Python Lock File למי מתאים
pip + venv איטי לא requirements.txt (ידני) מתחילים, סביבות מוגבלות
uv מהיר מאוד כן (uv python install) uv.lock (אוטומטי) מומלץ לכולם — הבחירה הטובה ביותר ב-2026
poetry בינוני לא poetry.lock פרויקטים קיימים שכבר משתמשים בו
conda איטי כן environment.yml Data Science עם חבילות C/CUDA

המלצת הקורס: השתמשו ב-uv. הוא מחליף את pip, venv, poetry, pyenv ו-pipx — הכל בכלי אחד שרץ מהר פי 10-100 מ-pip. כל דוגמאות הקוד בקורס יעבדו עם כל מנהל חבילות, אבל ה-uv commands יופיעו לצד pip commands.

טעות נפוצה #1: pip install בלי virtual environment

אם אתם מריצים pip install claude-agent-sdk בלי virtual environment פעיל, החבילות מותקנות ב-global Python. התוצאה: קונפליקטים בין פרויקטים, שבירות כשמעדכנים חבילה, ו-debug שלוקח שעות. תמיד וודאו שאתם בתוך venv (בדקו עם which python — צריך להצביע לתיקיית הפרויקט).

מתחיל 10 דקות פרקטי

סביבת TypeScript/Node.js — התקנה ומנהלי חבילות

TypeScript הופך לשחקן מרכזי בעולם ה-AI Agents. Vercel AI SDK הוא TypeScript-only, Claude Agent SDK ו-OpenAI Agents SDK יש להם TypeScript SDKs מלאים, Google ADK שחרר TypeScript SDK, ו-MCP SDK זמין גם ב-TypeScript. אם אתם מפתחי web — TypeScript יהיה הדרך הטבעית שלכם לבנות סוכנים.

למה TypeScript ולא JavaScript רגיל? בגלל Type Safety. כשאתם מגדירים כלים לסוכנים, אתם עובדים עם JSON Schemas, response objects מורכבים, ו-callback functions עם חתימות מדויקות. TypeScript תופס שגיאות בזמן כתיבה — לפני שהסוכן רץ ונכשל. בפרויקט סוכנים ממוצע, type checking מונע 20-30% מהבאגים שהיו מגיעים רק ב-runtime.

התקנת Node.js 20+

התקנת Node.js
# macOS — עם Homebrew
brew install node@22

# Windows — עם winget
winget install OpenJS.NodeJS.LTS
# או: הורד מ-nodejs.org

# Ubuntu/Debian
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs

# אימות
node --version   # v22.x.x
npm --version    # 10.x.x

בחירת מנהל חבילות Node.js

ב-Node.js יש שלושה מנהלי חבילות עיקריים. שלא כמו בעולם Python שם uv שולט ללא עוררין, בעולם Node.js אין בחירה "לא נכונה" — כולם טובים. ה-npm מגיע מובנה עם Node.js ועובד מצוין. pnpm חוסך מקום בדיסק ע"י שיתוף חבילות בין פרויקטים. bun הוא גם runtime וגם package manager, מהיר במיוחד אבל עדיין צעיר יחסית. אם אין לכם העדפה — npm מספיק. אם יש לכם הרבה פרויקטים — pnpm עדיף.

כלי מהירות דיסק Lock File הערות
npm בינוני גבוה package-lock.json מגיע עם Node.js, ברירת מחדל
pnpm מהיר נמוך pnpm-lock.yaml חוסך מקום ע"י content-addressable store
bun מהיר מאוד נמוך bun.lockb גם runtime, לא רק package manager
הגדרת פרויקט TypeScript לסוכנים
# יצירת פרויקט TypeScript חדש
mkdir my-agent-ts && cd my-agent-ts

# npm (ברירת מחדל)
npm init -y
npm install typescript tsx @types/node --save-dev
npx tsc --init

# או pnpm (מומלץ)
pnpm init
pnpm add typescript tsx @types/node -D
pnpm exec tsc --init

# הגדרת tsconfig.json מינימלית לסוכנים
cat > tsconfig.json << 'TSCONFIG'
{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "strict": true,
    "esModuleInterop": true,
    "outDir": "./dist",
    "rootDir": "./src",
    "declaration": true,
    "sourceMap": true
  },
  "include": ["src/**/*"]
}
TSCONFIG
עשה עכשיו 5 דקות

צור פרויקט חדש בשתי הסביבות. צור תיקייה my-first-agent עם שתי תת-תיקיות: python/ ו-typescript/. בתוך Python, צור venv (או uv init). בתוך TypeScript, הרץ npm init ותקין typescript. וודא ששתי הסביבות עובדות ע"י כתיבת "Hello Agent" בכל אחת.

מתחיל 15 דקות $0-10

מפתחות API — גישה לכל ספק

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

מפתח API (API Key) הוא מחרוזת ייחודית שמזהה אתכם מול הספק. כשהקוד שלכם שולח בקשה ל-Claude, GPT, או Gemini — הוא מצרף את המפתח לכל בקשה. הספק משתמש בו כדי לחייב אתכם, לאכוף rate limits, ולעקוב אחרי שימוש. מפתח API הוא כמו כרטיס אשראי דיגיטלי — כל מי שמחזיק בו יכול לבצע חיובים בשמכם. לכן, אבטחת מפתחות היא קריטית (הסעיף הבא).

Anthropic — Claude Models

פרמטרפרטים
אתרconsole.anthropic.com → API Keys → Create Key
Free Tier$5 credit חינמי לחשבון חדש
תשלוםPay-as-you-go, חיוב לפי token
שם המשתנהANTHROPIC_API_KEY
פורמטsk-ant-api03-...
SDKs שמשתמשים בוClaude Agent SDK, Vercel AI SDK (@ai-sdk/anthropic), LangChain

OpenAI — GPT Models

פרמטרפרטים
אתרplatform.openai.com → API Keys → Create new secret key
Free Tier$5 credit חינמי (18 חודשים)
תשלוםPay-as-you-go, Tiers 1-5 עם rate limits עולים
שם המשתנהOPENAI_API_KEY
פורמטsk-proj-...
SDKs שמשתמשים בוOpenAI Agents SDK, Vercel AI SDK (@ai-sdk/openai), LangChain

Google — Gemini Models

פרמטרפרטים
אתרaistudio.google.com → Get API Key
Free Tierנדיב מאוד: 15 RPM, 1,500 RPD, 1M TPM ב-Gemini 2.5 Pro
תשלוםPay-as-you-go, או Vertex AI (Enterprise)
שם המשתנהGOOGLE_API_KEY
פורמטAIzaSy...
SDKs שמשתמשים בוGoogle ADK, Vercel AI SDK (@ai-sdk/google), LangChain
השוואת Free Tiers — מרץ 2026

Google נותנת את ה-free tier הנדיב ביותר: 1,500 בקשות ביום ו-1 מיליון טוקנים לדקה ב-Gemini 2.5 Pro — מספיק ללמידה ופיתוח. Anthropic ו-OpenAI נותנים $5 credit — מספיק לכמה שעות של ניסויים. טיפ: התחילו עם Google לניסויים, עברו ל-Anthropic/OpenAI לפרויקטים שדורשים מודלים ספציפיים.

עשה עכשיו 10 דקות

פתח חשבון באחד הספקים (לפחות) וצור מפתח API. מומלץ להתחיל עם Anthropic — כי הפרק הבא (פרק 5) עוסק ב-Claude Agent SDK. אם יש לך כבר חשבון, וודא שהמפתח פעיל ע"י ריצת הבדיקה בסעיף הבא. שמור את המפתח במקום בטוח ביניים — בסעיף הבא נגדיר אחסון מאובטח.

בינוני 15 דקות קריטי

אבטחת מפתחות API — אל תישרפו

זה הסעיף הכי חשוב בפרק. הטעות מספר 1 של מפתחים מתחילים (ולא רק מתחילים) היא לדחוף מפתחות API ל-Git. ברגע שמפתח מגיע ל-GitHub — בוטים סורקים את כל ה-commits הפומביים בזמן אמת ומשתמשים במפתח תוך דקות.

זו לא תיאוריה — זה קורה כל יום. ב-2025, GitHub זיהה יותר מ-39 מיליון secrets שנדלפו ל-repositories פומביים. Anthropic, OpenAI ו-Google כולם מפעילים Secret Scanning שמנטרל מפתחות חשופים אוטומטית — אבל בחלון הזמן בין הדליפה לביטול, הנזק כבר נעשה. העקרון הוא פשוט: secrets לא שייכים לקוד. נקודה.

אזהרה קריטית: מפתחות ב-Git = כסף שנגנב

בוטים סורקים את GitHub בזמן אמת. מפתח API שנדחף ל-public repository ינוצל תוך דקות — לא שעות, דקות. גם אם מחקת את ה-commit, הוא עדיין ב-Git history. הנזק הממוצע: $200-2,000. במקרים קשים: $10,000+. ההגנה היחידה: אל תכניס מפתחות לקוד בכלל.

שלב 1: קובץ .env

יצירת קובץ .env
# צור קובץ .env בתיקיית הפרויקט
# .env — NEVER commit this file!

# Anthropic
ANTHROPIC_API_KEY=sk-ant-api03-your-key-here

# OpenAI
OPENAI_API_KEY=sk-proj-your-key-here

# Google
GOOGLE_API_KEY=AIzaSy-your-key-here

# Optional: default model preferences
DEFAULT_MODEL=claude-sonnet-4-6-20260324
MAX_TOKENS=4096

שלב 2: .gitignore — קו ההגנה הראשון

קובץ .gitignore לפרויקט סוכנים
# === API Keys & Secrets ===
.env
.env.local
.env.*.local
*.key
*.pem

# === Python ===
__pycache__/
*.py[cod]
.venv/
venv/
*.egg-info/
dist/
build/

# === Node.js ===
node_modules/
dist/
.next/

# === IDE ===
.vscode/settings.json
.idea/
*.swp
*.swo

# === OS ===
.DS_Store
Thumbs.db

# === Agent-specific ===
logs/
*.log
.cache/

שלב 3: טעינת המפתחות בקוד

Python — טעינת מפתחות עם python-dotenv
# התקנה
pip install python-dotenv   # או: uv add python-dotenv

# שימוש בקוד
from dotenv import load_dotenv
import os

load_dotenv()  # טוען את .env לתוך os.environ

# גישה למפתחות
anthropic_key = os.getenv("ANTHROPIC_API_KEY")
openai_key = os.getenv("OPENAI_API_KEY")
google_key = os.getenv("GOOGLE_API_KEY")

# בדיקה שהמפתח קיים
if not anthropic_key:
    raise ValueError("ANTHROPIC_API_KEY not found in .env file!")

print("All API keys loaded successfully!")
TypeScript — טעינת מפתחות עם dotenv
// התקנה
// npm install dotenv

// שימוש בקוד — src/config.ts
import 'dotenv/config';

const requiredKeys = [
  'ANTHROPIC_API_KEY',
  'OPENAI_API_KEY',
  'GOOGLE_API_KEY',
] as const;

// בדיקה שכל המפתחות קיימים
for (const key of requiredKeys) {
  if (!process.env[key]) {
    console.warn(`Warning: ${key} not found in environment`);
  }
}

export const config = {
  anthropicKey: process.env.ANTHROPIC_API_KEY!,
  openaiKey: process.env.OPENAI_API_KEY!,
  googleKey: process.env.GOOGLE_API_KEY!,
  defaultModel: process.env.DEFAULT_MODEL || 'claude-sonnet-4-6-20260324',
};

שלב 4: בדיקה שהמפתחות עובדים

Python — בדיקת חיבור לכל ספק
"""verify_keys.py — בדיקת מפתחות API"""
from dotenv import load_dotenv
import os

load_dotenv()

def test_anthropic():
    import anthropic
    client = anthropic.Anthropic()
    msg = client.messages.create(
        model="claude-sonnet-4-6-20260324",
        max_tokens=50,
        messages=[{"role": "user", "content": "Say 'API key works!' in 3 words"}]
    )
    print(f"Anthropic: {msg.content[0].text}")

def test_openai():
    from openai import OpenAI
    client = OpenAI()
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        max_tokens=50,
        messages=[{"role": "user", "content": "Say 'API key works!' in 3 words"}]
    )
    print(f"OpenAI: {resp.choices[0].message.content}")

def test_google():
    from google import genai
    client = genai.Client(api_key=os.getenv("GOOGLE_API_KEY"))
    resp = client.models.generate_content(
        model="gemini-2.0-flash",
        contents="Say 'API key works!' in 3 words"
    )
    print(f"Google: {resp.text}")

if __name__ == "__main__":
    for name, test_fn in [
        ("Anthropic", test_anthropic),
        ("OpenAI", test_openai),
        ("Google", test_google),
    ]:
        try:
            test_fn()
        except Exception as e:
            print(f"{name}: FAILED - {e}")
טעות נפוצה #2: מפתחות hardcoded בקוד

לעולם אל תכתבו client = Anthropic(api_key="sk-ant-...") בקוד. גם אם זה "רק בדיקה," גם אם זה "רק לוקאלי." הרגלים רעים מובילים ל-commits מסוכנים. תמיד השתמשו ב-environment variables.

Key Rotation — חלפנות מפתחות

גם אם אף פעם לא דלף לכם מפתח — חלפנות תקופתית היא best practice. למה? כי אתם לא תמיד יודעים אם מפתח נחשף. אולי שלחתם אותו ב-Slack לקולגה. אולי הוא נשמר ב-clipboard manager. חלפנות כל 90 יום היא standard טוב.

איך עושים key rotation בלי downtime:

  1. צרו מפתח חדש בדשבורד הספק
  2. עדכנו את .env (ובכל environment: staging, production)
  3. בדקו שהמפתח החדש עובד (verify_keys.py)
  4. מחקו את המפתח הישן בדשבורד הספק

שלב 5: אבטחה מתקדמת (לפרודקשן)

קובץ .env מספיק לפיתוח מקומי, אבל לפרודקשן צריך Secrets Manager. ה-.env קובץ טקסט רגיל — אין הצפנה, אין audit log, אין version control. Secrets Manager מוסיף את כל הרבדים האלה. הנה השוואה מהירה:

כלימתי להשתמשעלות
קובץ .envפיתוח מקומי, למידהחינם
Dopplerצוות קטן, multi-environmentחינם ל-5 users
1Password CLIכבר משתמשים ב-1Password$3-8/user/month
AWS Secrets Managerפרודקשן ב-AWS$0.40 per secret/month
GCP Secret Managerפרודקשן ב-Google Cloud$0.06 per 10K accesses
InfisicalOpen source, self-hostedחינם (community)
עשה עכשיו 5 דקות

צור קובץ .env ו-.gitignore בפרויקט שלך. הכנס את המפתחות שיצרת לקובץ .env, וודא ש-.gitignore כולל את .env. אם יש לך Git מאותחל, הרץ git status וודא ש-.env לא מופיע ברשימת הקבצים.

בינוני 20 דקות פרקטי

התקנת כל ה-SDKs — מהקורס ועד הפרודקשן

בקורס הזה נעבוד עם 7 SDKs ראשיים + MCP SDK. הנה כל ההתקנות במרוכז. אתם לא חייבים להתקין את כולם עכשיו — אפשר להתקין כל SDK כשמגיעים לפרק שלו. אבל אם רוצים סביבה מוכנה מראש, הנה הכל.

נקודה חשובה על שמות חבילות: שמות ה-SDKs השתנו כמה פעמים ב-2025-2026. מה שהיה "Claude Code SDK" הפך ל-Claude Agent SDK. חבילת Python היא claude-agent-sdk (ולא anthropic-agent-sdk). ב-TypeScript: @anthropic-ai/claude-agent-sdk. אם אתם מוצאים דוגמאות קוד ישנות ברשת עם שמות חבילות אחרים — בדקו את ה-official docs לפני שמתקינים.

Python SDKs — כל ההתקנות

Python — התקנת כל ה-SDKs
# === עם pip (בתוך venv) ===
pip install anthropic                    # Anthropic API client
pip install claude-agent-sdk             # Claude Agent SDK
pip install openai                       # OpenAI API client
pip install openai-agents                # OpenAI Agents SDK
pip install google-genai                 # Google GenAI client
pip install google-adk                   # Google ADK
pip install langchain langchain-anthropic langchain-openai langgraph  # LangChain + LangGraph
pip install crewai crewai-tools          # CrewAI
pip install mcp                          # MCP SDK
pip install python-dotenv                # .env loading
pip install pydantic-ai                  # Pydantic AI (bonus)

# === עם uv (מומלץ — הכל בפקודה אחת) ===
uv add anthropic claude-agent-sdk \
     openai openai-agents \
     google-genai google-adk \
     langchain langchain-anthropic langchain-openai langgraph \
     crewai crewai-tools \
     mcp python-dotenv pydantic-ai

# === requirements.txt — לנעילת גרסאות ===
cat > requirements.txt << 'REQ'
anthropic>=0.45.0
claude-agent-sdk>=0.1.48
openai>=1.60.0
openai-agents>=0.13.0
google-genai>=1.10.0
google-adk>=1.2.0
langchain>=0.3.0
langchain-anthropic>=0.3.0
langchain-openai>=0.3.0
langgraph>=1.0.0
crewai>=0.95.0
mcp>=1.8.0
python-dotenv>=1.0.0
REQ

TypeScript/Node.js SDKs — כל ההתקנות

TypeScript — התקנת כל ה-SDKs
# === עם npm ===
npm install @anthropic-ai/claude-agent-sdk   # Claude Agent SDK (TS)
npm install ai                                # Vercel AI SDK core
npm install @ai-sdk/anthropic                 # Vercel + Claude
npm install @ai-sdk/openai                    # Vercel + OpenAI
npm install @ai-sdk/google                    # Vercel + Google
npm install @openai/agents                    # OpenAI Agents SDK (TS)
npm install @modelcontextprotocol/sdk         # MCP SDK (TS)
npm install dotenv                            # .env loading

# === עם pnpm (מומלץ) ===
pnpm add @anthropic-ai/claude-agent-sdk \
         ai @ai-sdk/anthropic @ai-sdk/openai @ai-sdk/google \
         @openai/agents \
         @modelcontextprotocol/sdk \
         dotenv

# Dev dependencies
pnpm add -D typescript tsx @types/node vitest
טעות נפוצה #3: לא לנעול גרסאות SDK

SDKs של סוכני AI מתעדכנים כל שבוע. עדכון אוטומטי יכול לשבור את הקוד שלכם בלי התראה. תמיד נעלו גרסאות ב-requirements.txt או package.json. השתמשו ב-== ב-Python ו-^ ב-npm. עדכנו ידנית, בדקו שהכל עובד, ורק אז נעלו את הגרסה החדשה.

בדיקה: "Hello World" לכל SDK

Python — בדיקת כל SDK
"""test_sdks.py — verify all SDKs are installed correctly"""

def test_imports():
    """Test that all SDKs import successfully."""
    results = {}

    # Claude Agent SDK
    try:
        import claude_agent_sdk
        results["Claude Agent SDK"] = f"v{claude_agent_sdk.__version__}"
    except ImportError as e:
        results["Claude Agent SDK"] = f"MISSING: {e}"

    # OpenAI Agents SDK
    try:
        import agents
        results["OpenAI Agents SDK"] = "OK"
    except ImportError as e:
        results["OpenAI Agents SDK"] = f"MISSING: {e}"

    # Google ADK
    try:
        import google.adk
        results["Google ADK"] = "OK"
    except ImportError as e:
        results["Google ADK"] = f"MISSING: {e}"

    # LangGraph
    try:
        import langgraph
        results["LangGraph"] = "OK"
    except ImportError as e:
        results["LangGraph"] = f"MISSING: {e}"

    # CrewAI
    try:
        import crewai
        results["CrewAI"] = "OK"
    except ImportError as e:
        results["CrewAI"] = f"MISSING: {e}"

    # MCP SDK
    try:
        import mcp
        results["MCP SDK"] = "OK"
    except ImportError as e:
        results["MCP SDK"] = f"MISSING: {e}"

    # Pydantic AI
    try:
        import pydantic_ai
        results["Pydantic AI"] = "OK"
    except ImportError as e:
        results["Pydantic AI"] = f"MISSING: {e}"

    print("\n=== SDK Installation Check ===")
    for sdk, status in results.items():
        icon = "+" if "MISSING" not in status else "X"
        print(f"  [{icon}] {sdk}: {status}")

    failed = [k for k, v in results.items() if "MISSING" in v]
    if failed:
        print(f"\n{len(failed)} SDK(s) missing. Install them before continuing.")
    else:
        print(f"\nAll {len(results)} SDKs installed successfully!")

if __name__ == "__main__":
    test_imports()
תרגיל 1: Full Environment Setup 20 דקות
  1. צור תיקיית פרויקט ai-agents-workspace
  2. בתוכה: צור python/ עם virtual environment ו-typescript/ עם npm init
  3. התקן את כל ה-SDKs בשתי הסביבות
  4. צור קובץ .env עם מפתח API אחד לפחות
  5. צור קובץ .gitignore שמגן על .env
  6. הרץ את test_sdks.py ואת verify_keys.py — ותקן עד שהכל ירוק

הצלחה: כל ה-SDKs imported בהצלחה, ומפתח API אחד לפחות מחזיר תשובה מה-API.

בינוני 10 דקות פרקטי

מבנה פרויקט סטנדרטי — תבנית שעובדת עם כל SDK

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

המבנה שנציג כאן עובד עם כל SDK בקורס. הרעיון: השינוי היחיד בין פרויקט ב-Claude Agent SDK לפרויקט ב-OpenAI Agents SDK הוא התוכן של agent.py — כל שאר המבנה זהה. Tools בתיקייה אחת. Prompts בתיקייה אחרת. Config בנפרד. Tests בנפרד. כשתגיעו לפרקי ה-SDK (5-9), תוכלו להתמקד בלימוד ה-SDK בלי לבזבז זמן על מבנה.

מבנה פרויקט מומלץ — עובד עם כל SDK
my-agent/
├── src/
│   ├── agent.py              # Main agent logic (or agent.ts)
│   ├── config.py             # Configuration, env loading
│   ├── tools/                # Custom tool definitions
│   │   ├── __init__.py
│   │   ├── search.py         # Search tools
│   │   ├── database.py       # DB tools
│   │   └── notifications.py  # Email/Slack tools
│   ├── mcp_servers/          # MCP server implementations
│   │   └── my_server.py
│   ├── prompts/              # System prompts and templates
│   │   ├── system.md         # Main system prompt
│   │   └── templates/        # Prompt templates
│   └── memory/               # Memory/state management
│       └── store.py
├── tests/                    # Test cases and evals
│   ├── test_tools.py         # Unit tests for tools
│   ├── test_agent.py         # Integration tests
│   └── evals/                # Evaluation datasets
│       └── golden_dataset.json
├── config/                   # Configuration files
│   └── models.yaml           # Model routing config
├── scripts/                  # Utility scripts
│   ├── verify_keys.py        # API key verification
│   └── test_sdks.py          # SDK installation check
├── .env                      # API keys (GITIGNORED)
├── .env.example              # Template for .env (safe to commit)
├── .gitignore                # Git ignore rules
├── requirements.txt          # Python dependencies (pinned)
├── pyproject.toml            # Python project config (uv/poetry)
├── package.json              # Node.js dependencies (if TS)
├── tsconfig.json             # TypeScript config (if TS)
├── Dockerfile                # Container definition
├── docker-compose.yml        # Multi-container setup
└── README.md                 # Project documentation

כמה נקודות חשובות על המבנה:

קובץ .env.example — תבנית בטוחה ל-commit
# .env.example — Copy to .env and fill in your keys
# cp .env.example .env

# Required: At least one API key
ANTHROPIC_API_KEY=sk-ant-api03-your-key-here
OPENAI_API_KEY=sk-proj-your-key-here
GOOGLE_API_KEY=AIzaSy-your-key-here

# Optional: defaults
DEFAULT_MODEL=claude-sonnet-4-6-20260324
MAX_TOKENS=4096
LOG_LEVEL=INFO
עשה עכשיו 5 דקות

צור את מבנה התיקיות בפרויקט שלך. אפשר בפקודה אחת:

mkdir -p my-agent/src/{tools,mcp_servers,prompts/templates,memory} \
         my-agent/tests/evals \
         my-agent/config \
         my-agent/scripts
touch my-agent/src/__init__.py my-agent/src/tools/__init__.py
touch my-agent/.env.example my-agent/.gitignore

אחר כך העתק את תוכן ה-.gitignore מלמעלה, וצור .env.example.

מתחיל 10 דקות חינם

הגדרת IDE — VS Code ו-Cursor

VS Code (או Cursor, שהוא fork של VS Code) הוא ה-IDE המומלץ לפיתוח סוכנים. עם ה-extensions הנכונים, תקבלו autocomplete, linting, debugging, ואינטגרציה עם AI — הכל מתוך ה-editor.

Extensions חיוניים

Extensionלמהעדיפות
Python (ms-python)IntelliSense, linting, debugging ל-Pythonחובה
PylanceType checking מתקדם ל-Pythonחובה
TypeScript (built-in)מגיע מובנה ב-VS Codeחובה
ESLintLinting ל-JavaScript/TypeScriptמומלץ
PrettierAuto-formattingמומלץ
DockerDockerfile syntax + container managementמומלץ
YAMLSyntax highlighting ל-config filesמומלץ
REST Clientבדיקת API calls מתוך VS Codeנחמד
JSON ViewerFolding ו-formatting ל-JSON גדוליםנחמד
התקנת Extensions בפקודה אחת
# התקנה מהטרמינל
code --install-extension ms-python.python
code --install-extension ms-python.vscode-pylance
code --install-extension dbaeumer.vscode-eslint
code --install-extension esbenp.prettier-vscode
code --install-extension ms-azuretools.vscode-docker
code --install-extension redhat.vscode-yaml

הגדרות VS Code מומלצות לפרויקט סוכנים

.vscode/settings.json — הגדרות פרויקט
{
  "python.defaultInterpreterPath": ".venv/bin/python",
  "python.terminal.activateEnvironment": true,
  "python.analysis.typeCheckingMode": "basic",
  "editor.formatOnSave": true,
  "editor.tabSize": 4,
  "[python]": {
    "editor.defaultFormatter": "ms-python.python",
    "editor.tabSize": 4
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.tabSize": 2
  },
  "files.exclude": {
    "**/__pycache__": true,
    "**/.pytest_cache": true,
    "**/node_modules": true
  },
  "search.exclude": {
    "**/node_modules": true,
    "**/.venv": true
  }
}

Claude Code — ה-AI IDE לפיתוח סוכנים (מטא!)

כלי מיוחד שכדאי להכיר: Claude Code — ה-CLI של Anthropic שמאפשר לפתח קוד בשיתוף עם Claude ישירות מהטרמינל. במיוחד שימושי לפיתוח סוכנים, כי Claude מכיר את כל ה-SDKs מהקורס הזה. יש בזה אירוניה מסוימת: אתם בונים סוכני AI בעזרת סוכן AI.

הגדרת CLAUDE.md לפרויקט סוכנים
# CLAUDE.md — צור קובץ בתיקיית הפרויקט

## Project Context
This is an AI agent project. We use:
- Claude Agent SDK (Python) for main agent logic
- MCP SDK for tool servers
- pytest for testing

## Conventions
- All API keys loaded from .env via python-dotenv
- Type hints on all functions
- Docstrings on all public functions
- Tests in tests/ directory

## Important
- NEVER hardcode API keys
- NEVER commit .env files
- Always use virtual environment
עשה עכשיו 3 דקות

פתח את הפרויקט שלך ב-VS Code ובדוק שה-Python interpreter מצביע ל-venv שלך (שורת סטטוס בתחתית). אם לא — לחץ עליה ובחר את ה-interpreter מתוך .venv/bin/python. זה ימנע בעיות import מאוחר יותר.

בינוני 15 דקות חינם

Docker — בסיס לסוכנים בפרודקשן

Docker הוא אופציונלי לפיתוח מקומי, אבל כמעט חובה לפרודקשן. למה? כי סוכנים שעובדים על המחשב שלכם לא בהכרח יעבדו על שרת. Docker מבטיח סביבה זהה בכל מקום. בנוסף, Docker חיוני ל-MCP Servers בפרודקשן ול-sandboxing של כלים מסוכנים.

בהקשר של סוכני AI, Docker משרת שלוש מטרות:

אם אתם חדשים ב-Docker — אל תדאגו. אנחנו מכסים כאן רק את הבסיס. בפרקים מתקדמים (17-18) נעמיק ב-deployment patterns עם Docker.

Dockerfile בסיסי לסוכן Python

Dockerfile — סוכן Python
# Dockerfile
FROM python:3.12-slim

# Set working directory
WORKDIR /app

# Install dependencies first (cached layer)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copy source code
COPY src/ ./src/
COPY config/ ./config/

# Don't copy .env — pass secrets via environment variables
# docker run --env-file .env my-agent

# Run the agent
CMD ["python", "src/agent.py"]
docker-compose.yml — סוכן + MCP Server
# docker-compose.yml
version: "3.9"

services:
  agent:
    build: .
    env_file: .env
    depends_on:
      - mcp-server
    volumes:
      - ./logs:/app/logs

  mcp-server:
    build:
      context: .
      dockerfile: Dockerfile.mcp
    ports:
      - "3001:3001"
    env_file: .env
פקודות Docker בסיסיות
# בנייה
docker build -t my-agent .

# הרצה עם .env
docker run --env-file .env my-agent

# הרצה אינטראקטיבית (לדיבאג)
docker run -it --env-file .env my-agent bash

# docker-compose — הרצת הכל ביחד
docker compose up -d          # ברקע
docker compose logs -f agent  # מעקב אחרי לוגים
docker compose down            # עצירה
טעות נפוצה #4: COPY .env ל-Docker image

לעולם אל תעתיקו את קובץ .env לתוך ה-Docker image עם COPY .env .. כל מי שמושך את ה-image יקבל את המפתחות שלכם. תמיד העבירו secrets דרך environment variables בזמן ריצה: docker run --env-file .env או -e ANTHROPIC_API_KEY=....

בינוני 15 דקות קריטי

ניטור עלויות — אל תפשטו רגל

סוכני AI עולים כסף — כל קריאה ל-API צורכת טוקנים, וטוקנים עולים כסף. באג שגורם ללולאה אינסופית יכול ליצור חשבון של $500+ תוך לילה אחד. ניטור עלויות הוא לא "נחמד לעשות" — הוא חובה מיום ראשון.

ההבדל בין סוכני AI לתוכנה רגילה בהקשר עלויות הוא דרמטי. תוכנה רגילה: כותבים קוד, מריצים — העלות היא compute time (זניח). סוכני AI: כל "מחשבה" של הסוכן היא קריאת API שעולה כסף. סוכן שעושה 10 iteratons של חשיבה, כל אחת 5,000 טוקנים, מוכפל ב-3 tool calls — אתם כבר ב-150,000 טוקנים. עם Claude Sonnet, זה בערך $0.50-1.00 לשיחה אחת. עכשיו תכפילו ב-100 שיחות ביום — הגעתם ל-$50-100 ביום. בלי ניטור, החשבון יתפוצץ לפני שתבינו מה קרה.

מסגרת: "נוסחת עלות הסוכן"

העלות של כל הרצת סוכן מחושבת כך:

Cost = (Input_Tokens + Output_Tokens) × Price_per_Token × Number_of_Loops
סוג סוכןTool Callsטוקנים (משוער)עלות (Claude Sonnet)
סוכן פשוט (Q&A)0-11K-5K$0.01-0.02
סוכן עם כלים3-55K-20K$0.02-0.15
סוכן מחקר10-2030K-100K$0.20-1.00
סוכן מורכב (multi-agent)20-5050K-500K$0.50-10.00
באג: לולאה אינסופית100+1M+$50-500+ (!)

הכלל: הגדירו max_iterations ו-token budget תמיד. אין חריגים.

Billing Alerts — קו ההגנה הראשון

ספקאיפה מגדיריםמומלץ להגדיר
Anthropic console.anthropic.com → Settings → Spend Limits $25 (לימוד), $100 (פיתוח), $500 (פרודקשן)
OpenAI platform.openai.com → Settings → Limits $25 (לימוד), $100 (פיתוח), $500 (פרודקשן)
Google console.cloud.google.com → Billing → Budgets & Alerts $10 (free tier), $50 (pay-as-you-go)
עשה עכשיו 5 דקות

הגדר billing alerts עכשיו — לפני שאתה ממשיך לפרק הבא. היכנס לדשבורד של כל ספק שיש לך מפתח שלו, והגדר spend limit של $25 ללמידה. זה לוקח דקה אחת לכל ספק, ויכול לחסוך לך מאות דולרים.

ניטור שימוש בקוד

Python — Wrapper למעקב אחרי עלויות
"""cost_tracker.py — Track API costs per request"""
import time
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class UsageRecord:
    model: str
    input_tokens: int
    output_tokens: int
    cost_usd: float
    duration_ms: float
    timestamp: float = field(default_factory=time.time)


class CostTracker:
    """Simple cost tracker for LLM API calls."""

    # Approximate prices per 1M tokens (March 2026)
    PRICES = {
        "claude-sonnet-4-6": {"input": 3.0, "output": 15.0},
        "claude-haiku-3-5":  {"input": 0.80, "output": 4.0},
        "claude-opus-4-6":   {"input": 15.0, "output": 75.0},
        "gpt-4o":            {"input": 2.50, "output": 10.0},
        "gpt-4o-mini":       {"input": 0.15, "output": 0.60},
        "gemini-2.5-pro":    {"input": 1.25, "output": 10.0},
        "gemini-2.0-flash":  {"input": 0.10, "output": 0.40},
    }

    def __init__(self, budget_usd: float = 25.0):
        self.budget = budget_usd
        self.records: list[UsageRecord] = []

    def record(self, model: str, input_tokens: int,
               output_tokens: int, duration_ms: float):
        # Find matching price (partial match on model name)
        price = None
        for key, val in self.PRICES.items():
            if key in model:
                price = val
                break
        if not price:
            price = {"input": 5.0, "output": 15.0}  # conservative default

        cost = (
            (input_tokens / 1_000_000) * price["input"] +
            (output_tokens / 1_000_000) * price["output"]
        )

        record = UsageRecord(
            model=model,
            input_tokens=input_tokens,
            output_tokens=output_tokens,
            cost_usd=cost,
            duration_ms=duration_ms,
        )
        self.records.append(record)

        total = self.total_cost
        if total > self.budget * 0.8:
            print(f"WARNING: Spent ${total:.2f} of ${self.budget:.2f} budget!")
        if total > self.budget:
            raise RuntimeError(
                f"BUDGET EXCEEDED: ${total:.2f} > ${self.budget:.2f}"
            )
        return record

    @property
    def total_cost(self) -> float:
        return sum(r.cost_usd for r in self.records)

    def summary(self):
        total = self.total_cost
        total_input = sum(r.input_tokens for r in self.records)
        total_output = sum(r.output_tokens for r in self.records)
        print(f"\n=== Cost Summary ===")
        print(f"Requests:      {len(self.records)}")
        print(f"Input tokens:  {total_input:,}")
        print(f"Output tokens: {total_output:,}")
        print(f"Total cost:    ${total:.4f}")
        print(f"Budget left:   ${self.budget - total:.4f}")

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

אסטרטגיהחיסכוןאיך
Model Routing עד 90% Haiku/Flash לניתוב ומשימות פשוטות, Opus/GPT-5 לחשיבה מורכבת
Token Budget 50-80% max_tokens נמוך + max_iterations מוגבל
Caching 30-60% Cache תוצאות tools שלא משתנות (מזג אוויר — 30 דק', שערי מט"ח — 5 דק')
Prompt Optimization 20-40% System prompts קצרים וממוקדים, context retrieval ספציפי
Batch Processing 50% Anthropic Batch API — $1.50 per 1M input tokens (50% הנחה)
טעות נפוצה #5: אין max_iterations

סוכן בלי max_iterations או timeout הוא פצצה מתקתקת. אם הסוכן נכנס ללולאה (חוזר על אותו tool call כי לא מקבל תשובה מספקת), הוא ירוץ עד שייגמר ה-context window — ומי שמשלם על זה הוא אתם. תמיד הגדירו: max_iterations=25, max_tokens=8192, ו-timeout של 120 שניות.

תרגיל 2: Cost Tracker Implementation 15 דקות
  1. העתק את CostTracker לפרויקט שלך
  2. הוסף record אחרי כל קריאת API ב-verify_keys.py
  3. הגדר budget של $1.00 לבדיקה
  4. הרץ 10 קריאות API עם מודלים שונים
  5. הרץ tracker.summary() וראה כמה הוצאת

בונוס: הוסף שמירה ל-JSON כדי שתוכל לעקוב אחרי עלויות לאורך זמן.

בינוני 12 דקות פרקטי

כלי Debugging ו-Observability

סוכני AI קשים ל-debug. למה? כי הם לא דטרמיניסטיים — אותו input יכול לתת output שונה כל הרצה. לכן, debugging קלאסי (breakpoints, step-through) לא מספיק. צריך observability — היכולת לראות בדיוק מה הסוכן עשה, למה הוא בחר בכלי מסוים, ומה גרם לו להגיע לתשובה שהגיע אליה.

חשבו על debugging של סוכן כמו על חקירה בדיעבד. הסוכן כבר רץ, כבר "חשב," כבר בחר כלים, וכבר הגיע לתוצאה (נכונה או לא). אתם צריכים לחזור אחורה ולהבין למה הוא עשה מה שעשה. בלי traces ו-logs, אתם עיוורים. עם traces טובים — אתם יכולים לראות בדיוק באיזה שלב הסוכן "הלך לאיבוד": האם הוא בחר בכלי הלא נכון? האם תוצאת הכלי הייתה לא ברורה? האם ה-system prompt לא היה מספיק ספציפי?

הכלל: Log everything, analyze selectively. תתעדו כל שלב — אבל תסתכלו על הלוגים רק כשמשהו לא עובד. הלוגים הם ה-"קופסה השחורה" של הסוכן שלכם.

כלי Debugging חיוניים

כליתפקידלמיעלות
MCP Inspector בדיקת MCP Servers בלי סוכן כל מי שבונה MCP Servers חינם
LangSmith Tracing, evals, monitoring ל-LangChain/LangGraph משתמשי LangChain Free tier + Plus $39/mo
Braintrust Evals, logging, prompt playground כולם Free tier + paid
Vercel AI SDK DevTools Inspection tool ל-Vercel AI SDK משתמשי Vercel AI SDK חינם
Arize Phoenix Open-source LLM observability כולם (self-hosted) חינם
Logfire (Pydantic) Observability ל-Pydantic AI משתמשי Pydantic AI Free tier
Jupyter Notebooks Prototyping אינטראקטיבי כולם חינם

Logging בסיסי — קו ההגנה הראשון

Python — Structured Logging לסוכנים
"""agent_logger.py — Structured logging for AI agents"""
import logging
import json
from datetime import datetime


def setup_agent_logger(name: str = "agent", level: str = "INFO"):
    """Create a structured logger for agent debugging."""
    logger = logging.getLogger(name)
    logger.setLevel(getattr(logging, level))

    # Console handler with structured format
    handler = logging.StreamHandler()
    formatter = logging.Formatter(
        '%(asctime)s | %(levelname)-7s | %(message)s',
        datefmt='%H:%M:%S'
    )
    handler.setFormatter(formatter)
    logger.addHandler(handler)

    # File handler for detailed logs
    file_handler = logging.FileHandler(
        f"logs/agent_{datetime.now():%Y%m%d}.log"
    )
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)

    return logger


# Usage example
logger = setup_agent_logger()

def log_tool_call(tool_name: str, params: dict, result: str,
                  duration_ms: float):
    """Log a tool call with all relevant details."""
    logger.info(json.dumps({
        "event": "tool_call",
        "tool": tool_name,
        "params": params,
        "result_length": len(result),
        "duration_ms": round(duration_ms, 1),
    }))

def log_llm_call(model: str, input_tokens: int,
                 output_tokens: int, duration_ms: float):
    """Log an LLM API call."""
    logger.info(json.dumps({
        "event": "llm_call",
        "model": model,
        "input_tokens": input_tokens,
        "output_tokens": output_tokens,
        "duration_ms": round(duration_ms, 1),
    }))

Jupyter Notebooks — Prototyping אינטראקטיבי

Jupyter Notebooks הם כלי מצוין לprototyping של סוכנים. היתרון: אפשר להריץ כל שלב בנפרד, לראות תוצאות ביניים, ולנסות גרסאות שונות של prompts בלי להריץ את כל הסוכן מחדש.

התקנת Jupyter לפרויקט סוכנים
# התקנה
pip install jupyter ipykernel    # או: uv add jupyter ipykernel

# רישום ה-venv כ-kernel
python -m ipykernel install --user --name=agents --display-name="AI Agents"

# הפעלה
jupyter notebook  # או: jupyter lab
עשה עכשיו 3 דקות

צור תיקיית logs/ בפרויקט שלך, וודא שהיא ב-.gitignore. העתק את agent_logger.py לתיקיית src/. לוגים מסודרים יחסכו לך שעות של debugging בפרקים הבאים.

בינוני 12 דקות פרקטי

הגדרת סביבת בדיקות — pytest, vitest ו-Golden Datasets

סוכני AI דורשים גישה שונה לבדיקות מתוכנה רגילה. בתוכנה רגילה, 2 + 2 תמיד שווה 4. בסוכנים, אותה שאלה יכולה לתת תשובות שונות בכל הרצה. "הצלחה" היא לא 100% — היא "80% מהפעמים הסוכן עונה נכון." זה דורש חשיבה סטטיסטית, לא חשיבה בינארית.

ההשלכה המעשית: אתם צריכים שלוש שכבות של בדיקות, לא רק אחת. Unit tests בודקים את ה"חלקים הדטרמיניסטיים" (כלים, validation, parsing). Integration tests בודקים שהסוכן + כלים עובדים ביחד. ו-Eval suites — סט של 50-100 שאלות עם תשובות צפויות — בודקים את ה"שורה התחתונה" — מה אחוז ההצלחה של הסוכן שלכם. מעבר מ-70% ל-85% הצלחה ב-eval suite הוא הישג משמעותי.

הנה ההבדלים בין שלוש השכבות:

שכבהמה בודקיםדטרמיניסטי?עלות APIתדירות
Unit Tests כלים בבידוד, פרסור, validation כן, 100% $0 כל commit
Integration Tests סוכן + כלים ביחד חלקית $0.10-1.00 כל PR
Eval Suite הסוכן על golden dataset לא — סטטיסטי $1-20 שבועי / pre-deploy

pytest — Unit Tests ל-Python

Python — הגדרת pytest לפרויקט סוכנים
# התקנה
pip install pytest pytest-asyncio    # או: uv add pytest pytest-asyncio -D

# pytest.ini (או pyproject.toml)
cat > pytest.ini << 'PYTEST'
[pytest]
testpaths = tests
asyncio_mode = auto
markers =
    unit: Unit tests (no API calls)
    integration: Integration tests (API calls required)
    eval: Evaluation tests (expensive, run manually)
PYTEST

# tests/test_tools.py — דוגמה ל-unit test
def test_weather_tool_validates_input():
    """Tool should reject invalid city names."""
    from src.tools.search import validate_city

    assert validate_city("Tel Aviv") == True
    assert validate_city("") == False
    assert validate_city(None) == False

def test_cost_tracker_budget():
    """CostTracker should raise when budget exceeded."""
    from src.cost_tracker import CostTracker
    import pytest

    tracker = CostTracker(budget_usd=0.01)
    tracker.record("claude-sonnet-4-6", 100000, 50000, 1000)

    with pytest.raises(RuntimeError, match="BUDGET EXCEEDED"):
        tracker.record("claude-sonnet-4-6", 100000, 50000, 1000)

# הרצה
# pytest -m unit          # רק unit tests (בלי API)
# pytest -m integration   # עם API calls
# pytest                  # הכל

vitest — Unit Tests ל-TypeScript

TypeScript — הגדרת vitest
// התקנה: npm install -D vitest
// או: pnpm add -D vitest

// vitest.config.ts
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    include: ['tests/**/*.test.ts'],
    environment: 'node',
    testTimeout: 30000,  // 30s for API calls
  },
});

// tests/config.test.ts — בדיקת configuration
import { describe, it, expect } from 'vitest';

describe('Configuration', () => {
  it('should load API keys from environment', () => {
    // This tests that .env is loaded correctly
    expect(process.env.ANTHROPIC_API_KEY).toBeDefined();
    expect(process.env.ANTHROPIC_API_KEY).toMatch(/^sk-ant/);
  });

  it('should have valid default model', () => {
    const model = process.env.DEFAULT_MODEL || 'claude-sonnet-4-6-20260324';
    expect(model).toContain('claude');
  });
});

// package.json — add script
// "scripts": { "test": "vitest run", "test:watch": "vitest" }

Golden Dataset — הבסיס ל-Evals

Golden Dataset הוא אוסף של 50-100 תרחישי בדיקה עם תשובות צפויות. זו ה"אבן הבוחן" של הסוכן שלכם — מה שמפריד בין "סוכן שעובד בהדגמה" ל"סוכן שעובד בפרודקשן." אתם בונים אותו בהדרגה לאורך הפרויקט: מתחילים עם 10 cases, מוסיפים כל פעם שמוצאים באג או edge case חדש, ועד שמגיעים ל-50+ cases. כל עדכון של prompt, כלי, או מודל — מריצים את ה-golden dataset ובודקים שאחוז ההצלחה לא ירד.

הנה מבנה בסיסי:

golden_dataset.json — מבנה בסיסי
{
  "version": "1.0",
  "description": "Golden dataset for agent evaluation",
  "test_cases": [
    {
      "id": "TC001",
      "category": "weather",
      "input": "What's the weather in Tel Aviv?",
      "expected_tool": "get_weather",
      "expected_params": {"city": "Tel Aviv"},
      "success_criteria": "Response mentions temperature and city name"
    },
    {
      "id": "TC002",
      "category": "no_tool",
      "input": "What is the capital of France?",
      "expected_tool": null,
      "success_criteria": "Answers 'Paris' without calling any tool"
    },
    {
      "id": "TC003",
      "category": "edge_case",
      "input": "Weather in !!@@##",
      "expected_tool": null,
      "success_criteria": "Asks for clarification, does not crash"
    }
  ]
}
תרגיל 3: Testing Setup 15 דקות
  1. התקן pytest (או vitest ל-TypeScript)
  2. צור pytest.ini עם markers ל-unit, integration, eval
  3. כתוב 3 unit tests: בדיקת .env loading, בדיקת CostTracker, ובדיקת input validation
  4. הרץ pytest -m unit -v וודא שהכל עובר
  5. צור golden_dataset.json עם 5 test cases בסיסיים

הצלחה: 3 tests ירוקים, golden dataset עם 5 cases, ו-pytest runner מוגדר.

תרגיל 4: End-to-End Verification 20 דקות

זה "הבוחן" של הפרק — שילוב של הכל:

  1. צור פרויקט חדש מאפס בשם chapter4-final
  2. בנה את מבנה התיקיות המלא (מסעיף Project Structure)
  3. צור venv (Python) + npm init (TypeScript)
  4. התקן לפחות 3 SDKs ב-Python + 2 ב-TypeScript
  5. צור .env עם מפתח API, .gitignore שמגן עליו
  6. הרץ test_sdks.py — לפחות 3 SDKs ירוקים
  7. הרץ verify_keys.py — לפחות ספק אחד מחזיר תשובה
  8. הרץ pytest -m unit — לפחות 2 tests ירוקים
  9. בנה Docker image (docker build -t chapter4-final .) — אופציונלי

הצלחה: פרויקט מלא עם SDKs, מפתחות, tests, ו-cost tracker — מוכן לפרק 5.

טעויות נפוצות — סיכום

טעות #6: התקנת כל ה-SDKs באותו environment

חלק מה-SDKs יש להם dependency conflicts. למשל, CrewAI דורש גרסה ספציפית של pydantic שמתנגשת עם Google ADK. הפתרון: אם נתקלתם בקונפליקטים, צרו venv נפרד לכל SDK שיש לו בעיות. בפרקטיקה, רוב ה-SDKs מסתדרים ביחד — אבל אם pip צועק על version conflicts, זה הזמן להפריד.

טעות #7: שכחת .gitignore לפני ה-commit הראשון

אם כבר עשיתם git add . ו-git commit לפני שהוספתם .gitignore — הקבצים כבר ב-Git history. גם אם תוסיפו .gitignore אחר כך, ה-.env נשאר ב-history. הפתרון: תמיד צרו .gitignore כשלב ראשון לפני git init. אם כבר טעיתם: git rm --cached .env ואז commit חדש (אבל ה-history עדיין מכיל את הקובץ — צריך key rotation).

טעות #8: שימוש ב-Python 3.9 או ישן יותר

הרבה SDKs חדשים (Claude Agent SDK, Pydantic AI, google-adk) דורשים Python 3.11 כמינימום. אם אתם מקבלים שגיאות SyntaxError מיד אחרי import — בדקו את גרסת Python שלכם. הפתרון: uv python install 3.12 או brew install python@3.12.

שגרת עבודה — פרק 4
תדירותמשימהזמן
יומיבדוק usage dashboards של ספקי API — עלויות חריגות2 דק'
שבועיבדוק עדכוני SDK — changelog של כל SDK שמותקן10 דק'
שבועיהרץ pytest -m unit — וודא שהכל עדיין עובד2 דק'
חודשיעדכן גרסאות SDK (בדוק changelog קודם!)30 דק'
חודשיסקירת אבטחה: בדוק שאין מפתחות ב-Git history10 דק'
חודשיבדוק rate limits ו-billing alerts — עדכן לפי צריכה5 דק'
אם אתם עושים רק דבר אחד מהפרק הזה 15 דקות

צרו פרויקט עם שלושה קבצים: (1) קובץ .env עם מפתח API אחד, (2) קובץ .gitignore שמגן על .env, (3) סקריפט Python/TypeScript שמייבא SDK אחד ושולח בקשה בסיסית. ברגע שקיבלתם תשובה מ-API — יש לכם את הבסיס. כל השאר זה שיפורים. אבל בלי הבסיס הזה — שום דבר מפרק 5 ואילך לא יעבוד.

בדוק את עצמך — 5 שאלות
  1. למה אסור להתקין חבילות Python בלי virtual environment? (רמז: קונפליקטים בין פרויקטים)
  2. מה קורה אם דוחפים קובץ .env ל-GitHub public repo? (רמז: בוטים, דקות, כסף)
  3. מה ההבדל בין unit tests ל-evals בהקשר של סוכני AI? (רמז: דטרמיניסטי vs סטטיסטי)
  4. איך מחשבים את העלות של הרצת סוכן? (רמז: נוסחת העלות — tokens x price x loops)
  5. למה צריך לנעול (pin) גרסאות SDK ב-requirements.txt? (רמז: עדכונים שבועיים, שבירות)

עברתם 4 מתוך 5? מצוין — אתם מוכנים לפרק 5 (Claude Agent SDK).

סיכום הפרק

בפרק הזה בנינו את התשתית המלאה לפיתוח סוכני AI. התחלנו בהתקנת Python ו-Node.js עם virtual environments ומנהלי חבילות מקצועיים (uv ו-pnpm). הגדרנו מפתחות API לשלושה ספקים (Anthropic, OpenAI, Google) ולמדנו לאחסן אותם בצורה מאובטחת עם .env ו-.gitignore. התקנו כל 7 ה-SDKs שנלמד בקורס ובדקנו שכל אחד עובד. בנינו מבנה פרויקט סטנדרטי שעובד עם כל SDK, הגדרנו VS Code עם ה-extensions הנכונים, ולמדנו Docker בסיסי לפרודקשן.

הנקודה הכי חשובה: ניטור עלויות. למדנו את "נוסחת עלות הסוכן," בנינו CostTracker, הגדרנו billing alerts, והבנו אסטרטגיות חיסכון. ולבסוף, הגדרנו סביבת בדיקות — pytest ו-vitest לשכבת ה-unit tests, ו-golden dataset כבסיס ל-evals.

בפרק הבא (פרק 5) נבנה את הסוכן הראשון שלנו עם Claude Agent SDK — ה-SDK של Anthropic שמביא את כוח Claude Code לקוד שלכם. כל מה שהתקנו כאן ישמש אותנו שם.

צ'קליסט — סיכום פרק 4