- סביבת Python 3.11+ עובדת עם virtual environment מוגדר
- סביבת Node.js 20+ עובדת עם TypeScript מוגדר
- מפתחות API ל-Anthropic, OpenAI ו-Google — מוגדרים בצורה מאובטחת בקובץ
.env - כל 7 ה-SDKs מותקנים ומוכחים עם "Hello World" בסיסי לכל אחד
- תבנית פרויקט סטנדרטית שעובדת עם כל SDK בקורס
- VS Code / Cursor מוגדר עם Extensions לפיתוח סוכנים
- Billing alerts מוגדרים בכל שלושת הספקים
- סביבת בדיקות בסיסית עם pytest ו-vitest
- תוכלו להגדיר סביבת פיתוח מלאה ל-Python וגם ל-TypeScript — עם ניהול חבילות מקצועי
- תוכלו לנהל מפתחות API בצורה מאובטחת — בלי לסכן אותם ב-Git
- תוכלו להתקין כל SDK בקורס (Claude Agent SDK, OpenAI Agents SDK, Google ADK, Vercel AI SDK, LangChain/LangGraph, CrewAI, MCP SDK) ולוודא שכל אחד עובד
- תוכלו לבנות מבנה פרויקט סטנדרטי שמתאים לכל SDK
- תוכלו להגדיר ניטור עלויות ולמנוע חשבונות מפתיעים
- פרקים קודמים: פרק 1 (מה זה סוכן AI), פרק 2 (ארכיטקטורה), פרק 3 (כלים ו-MCP)
- מה תצטרכו: מחשב עם גישת Admin (להתקנות), חיבור אינטרנט, כרטיס אשראי (לחשבונות API)
- ניסיון נדרש: שימוש בסיסי בטרמינל (command line), ידע בסיסי ב-Python או JavaScript
- זמן משוער: 2-3 שעות (כולל כל ההתקנות והבדיקות)
- עלות: $0-10 (הגדרת חשבונות API — רוב הספקים נותנים credit חינמי)
בפרקים 1-3 למדת את הבסיס התיאורטי: מה זה סוכן, איך הוא בנוי, ואיך הוא מתחבר לכלים. בפרק הזה אנחנו עוברים מתיאוריה לפרקטיקה. סביבת הפיתוח שתבנה כאן היא התשתית שתשרת אותך בכל שאר הפרקים: פרק 5 (Claude Agent SDK), פרק 6 (Vercel AI SDK), פרק 7 (OpenAI Agents SDK), פרק 8 (Google ADK + LangGraph), ופרקי הפרויקטים המתקדמים. השקעה של 2-3 שעות עכשיו תחסוך לך עשרות שעות של debugging אחר כך.
| מונח (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 ומודל |
בדיקת דרישות מקדימות — מה צריך לפני שמתחילים
לפני שמתחילים להתקין, בואו נוודא שהבסיס קיים. הטבלה הזו מסכמת את כל מה שצריך:
| כלי | גרסה מינימלית | למה צריך | בדיקה |
|---|---|---|---|
| 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 | — |
פתח טרמינל והרץ את כל פקודות הבדיקה:
# בדיקת דרישות מקדימות — הרץ הכל ברצף
python --version # צריך 3.11+
node --version # צריך 20+
git --version # צריך 2.30+
code --version # VS Code
docker --version # רשות — 24+
רשום מה חסר — נתקין הכל בסעיפים הבאים. אם הכל מותקן, דלג ישר לסעיף מפתחות API.
סביבת 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 — אבל נכסה את כולן:
# === אופציה 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 | 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.
אם אתם מריצים pip install claude-agent-sdk בלי virtual environment פעיל, החבילות מותקנות ב-global Python. התוצאה: קונפליקטים בין פרויקטים, שבירות כשמעדכנים חבילה, ו-debug שלוקח שעות. תמיד וודאו שאתם בתוך venv (בדקו עם which python — צריך להצביע לתיקיית הפרויקט).
סביבת 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+
# 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 חדש
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
צור פרויקט חדש בשתי הסביבות. צור תיקייה my-first-agent עם שתי תת-תיקיות: python/ ו-typescript/. בתוך Python, צור venv (או uv init). בתוך TypeScript, הרץ npm init ותקין typescript. וודא ששתי הסביבות עובדות ע"י כתיבת "Hello Agent" בכל אחת.
מפתחות 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 |
Google נותנת את ה-free tier הנדיב ביותר: 1,500 בקשות ביום ו-1 מיליון טוקנים לדקה ב-Gemini 2.5 Pro — מספיק ללמידה ופיתוח. Anthropic ו-OpenAI נותנים $5 credit — מספיק לכמה שעות של ניסויים. טיפ: התחילו עם Google לניסויים, עברו ל-Anthropic/OpenAI לפרויקטים שדורשים מודלים ספציפיים.
פתח חשבון באחד הספקים (לפחות) וצור מפתח API. מומלץ להתחיל עם Anthropic — כי הפרק הבא (פרק 5) עוסק ב-Claude Agent SDK. אם יש לך כבר חשבון, וודא שהמפתח פעיל ע"י ריצת הבדיקה בסעיף הבא. שמור את המפתח במקום בטוח ביניים — בסעיף הבא נגדיר אחסון מאובטח.
אבטחת מפתחות API — אל תישרפו
זה הסעיף הכי חשוב בפרק. הטעות מספר 1 של מפתחים מתחילים (ולא רק מתחילים) היא לדחוף מפתחות API ל-Git. ברגע שמפתח מגיע ל-GitHub — בוטים סורקים את כל ה-commits הפומביים בזמן אמת ומשתמשים במפתח תוך דקות.
זו לא תיאוריה — זה קורה כל יום. ב-2025, GitHub זיהה יותר מ-39 מיליון secrets שנדלפו ל-repositories פומביים. Anthropic, OpenAI ו-Google כולם מפעילים Secret Scanning שמנטרל מפתחות חשופים אוטומטית — אבל בחלון הזמן בין הדליפה לביטול, הנזק כבר נעשה. העקרון הוא פשוט: secrets לא שייכים לקוד. נקודה.
בוטים סורקים את GitHub בזמן אמת. מפתח API שנדחף ל-public repository ינוצל תוך דקות — לא שעות, דקות. גם אם מחקת את ה-commit, הוא עדיין ב-Git history. הנזק הממוצע: $200-2,000. במקרים קשים: $10,000+. ההגנה היחידה: אל תכניס מפתחות לקוד בכלל.
שלב 1: קובץ .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 — קו ההגנה הראשון
# === 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: טעינת המפתחות בקוד
# התקנה
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!")
// התקנה
// 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: בדיקה שהמפתחות עובדים
"""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}")
לעולם אל תכתבו client = Anthropic(api_key="sk-ant-...") בקוד. גם אם זה "רק בדיקה," גם אם זה "רק לוקאלי." הרגלים רעים מובילים ל-commits מסוכנים. תמיד השתמשו ב-environment variables.
Key Rotation — חלפנות מפתחות
גם אם אף פעם לא דלף לכם מפתח — חלפנות תקופתית היא best practice. למה? כי אתם לא תמיד יודעים אם מפתח נחשף. אולי שלחתם אותו ב-Slack לקולגה. אולי הוא נשמר ב-clipboard manager. חלפנות כל 90 יום היא standard טוב.
איך עושים key rotation בלי downtime:
- צרו מפתח חדש בדשבורד הספק
- עדכנו את
.env(ובכל environment: staging, production) - בדקו שהמפתח החדש עובד (
verify_keys.py) - מחקו את המפתח הישן בדשבורד הספק
שלב 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 |
| Infisical | Open source, self-hosted | חינם (community) |
צור קובץ .env ו-.gitignore בפרויקט שלך. הכנס את המפתחות שיצרת לקובץ .env, וודא ש-.gitignore כולל את .env. אם יש לך Git מאותחל, הרץ git status וודא ש-.env לא מופיע ברשימת הקבצים.
התקנת כל ה-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 — כל ההתקנות
# === עם 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 — כל ההתקנות
# === עם 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
SDKs של סוכני AI מתעדכנים כל שבוע. עדכון אוטומטי יכול לשבור את הקוד שלכם בלי התראה. תמיד נעלו גרסאות ב-requirements.txt או package.json. השתמשו ב-== ב-Python ו-^ ב-npm. עדכנו ידנית, בדקו שהכל עובד, ורק אז נעלו את הגרסה החדשה.
בדיקה: "Hello World" לכל 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()
- צור תיקיית פרויקט
ai-agents-workspace - בתוכה: צור
python/עם virtual environment ו-typescript/עם npm init - התקן את כל ה-SDKs בשתי הסביבות
- צור קובץ
.envעם מפתח API אחד לפחות - צור קובץ
.gitignoreשמגן על .env - הרץ את
test_sdks.pyואתverify_keys.py— ותקן עד שהכל ירוק
הצלחה: כל ה-SDKs imported בהצלחה, ומפתח API אחד לפחות מחזיר תשובה מה-API.
מבנה פרויקט סטנדרטי — תבנית שעובדת עם כל SDK
אחד הדברים שחוסכים הכי הרבה זמן בטווח הארוך הוא מבנה פרויקט עקבי. כשכל פרויקט סוכנים שלכם בנוי באותו מבנה, אתם לא צריכים "ללמוד מחדש" איפה הדברים נמצאים בכל פעם.
המבנה שנציג כאן עובד עם כל SDK בקורס. הרעיון: השינוי היחיד בין פרויקט ב-Claude Agent SDK לפרויקט ב-OpenAI Agents SDK הוא התוכן של agent.py — כל שאר המבנה זהה. Tools בתיקייה אחת. Prompts בתיקייה אחרת. Config בנפרד. Tests בנפרד. כשתגיעו לפרקי ה-SDK (5-9), תוכלו להתמקד בלימוד ה-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. חוסך זמן למפתח חדש שמצטרף.prompts/— System prompts בקבצים נפרדים (לא inline בקוד). מאפשר עדכון prompts בלי לשנות קוד.tests/evals/— הפרדה בין unit tests (דטרמיניסטיים) ל-evals (סטטיסטיים). נפרט בסעיף אחרון.config/models.yaml— הגדרות מודלים, routing rules, token budgets. שינוי ב-YAML לא דורש re-deploy.
# .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
צור את מבנה התיקיות בפרויקט שלך. אפשר בפקודה אחת:
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.
הגדרת 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 | חובה |
| Pylance | Type checking מתקדם ל-Python | חובה |
| TypeScript (built-in) | מגיע מובנה ב-VS Code | חובה |
| ESLint | Linting ל-JavaScript/TypeScript | מומלץ |
| Prettier | Auto-formatting | מומלץ |
| Docker | Dockerfile syntax + container management | מומלץ |
| YAML | Syntax highlighting ל-config files | מומלץ |
| REST Client | בדיקת API calls מתוך VS Code | נחמד |
| JSON Viewer | Folding ו-formatting ל-JSON גדולים | נחמד |
# התקנה מהטרמינל
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 מומלצות לפרויקט סוכנים
{
"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 — צור קובץ בתיקיית הפרויקט
## 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
פתח את הפרויקט שלך ב-VS Code ובדוק שה-Python interpreter מצביע ל-venv שלך (שורת סטטוס בתחתית). אם לא — לחץ עליה ובחר את ה-interpreter מתוך .venv/bin/python. זה ימנע בעיות import מאוחר יותר.
Docker — בסיס לסוכנים בפרודקשן
Docker הוא אופציונלי לפיתוח מקומי, אבל כמעט חובה לפרודקשן. למה? כי סוכנים שעובדים על המחשב שלכם לא בהכרח יעבדו על שרת. Docker מבטיח סביבה זהה בכל מקום. בנוסף, Docker חיוני ל-MCP Servers בפרודקשן ול-sandboxing של כלים מסוכנים.
בהקשר של סוכני AI, Docker משרת שלוש מטרות:
- Reproducibility: סביבה זהה בפיתוח, בדיקות, ופרודקשן. "עובד לי על המחשב" כבר לא תירוץ.
- Isolation: סוכן שמריץ קוד (כמו Claude Code Agent) צריך sandbox. Docker Container הוא sandbox מצוין.
- Deployment: כל פלטפורמת ענן (AWS, GCP, Azure, Fly.io, Railway) יודעת להריץ Docker Containers. בנית image = deploy לכל מקום.
אם אתם חדשים ב-Docker — אל תדאגו. אנחנו מכסים כאן רק את הבסיס. בפרקים מתקדמים (17-18) נעמיק ב-deployment patterns עם Docker.
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
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 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 # עצירה
לעולם אל תעתיקו את קובץ .env לתוך ה-Docker image עם COPY .env .. כל מי שמושך את ה-image יקבל את המפתחות שלכם. תמיד העבירו secrets דרך environment variables בזמן ריצה: docker run --env-file .env או -e ANTHROPIC_API_KEY=....
ניטור עלויות — אל תפשטו רגל
סוכני 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-1 | 1K-5K | $0.01-0.02 |
| סוכן עם כלים | 3-5 | 5K-20K | $0.02-0.15 |
| סוכן מחקר | 10-20 | 30K-100K | $0.20-1.00 |
| סוכן מורכב (multi-agent) | 20-50 | 50K-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 (פרודקשן) |
| console.cloud.google.com → Billing → Budgets & Alerts | $10 (free tier), $50 (pay-as-you-go) |
הגדר billing alerts עכשיו — לפני שאתה ממשיך לפרק הבא. היכנס לדשבורד של כל ספק שיש לך מפתח שלו, והגדר spend limit של $25 ללמידה. זה לוקח דקה אחת לכל ספק, ויכול לחסוך לך מאות דולרים.
ניטור שימוש בקוד
"""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% הנחה) |
סוכן בלי max_iterations או timeout הוא פצצה מתקתקת. אם הסוכן נכנס ללולאה (חוזר על אותו tool call כי לא מקבל תשובה מספקת), הוא ירוץ עד שייגמר ה-context window — ומי שמשלם על זה הוא אתם. תמיד הגדירו: max_iterations=25, max_tokens=8192, ו-timeout של 120 שניות.
- העתק את
CostTrackerלפרויקט שלך - הוסף record אחרי כל קריאת API ב-
verify_keys.py - הגדר budget של $1.00 לבדיקה
- הרץ 10 קריאות API עם מודלים שונים
- הרץ
tracker.summary()וראה כמה הוצאת
בונוס: הוסף שמירה ל-JSON כדי שתוכל לעקוב אחרי עלויות לאורך זמן.
כלי 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 בסיסי — קו ההגנה הראשון
"""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 בלי להריץ את כל הסוכן מחדש.
# התקנה
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
צור תיקיית logs/ בפרויקט שלך, וודא שהיא ב-.gitignore. העתק את agent_logger.py לתיקיית src/. לוגים מסודרים יחסכו לך שעות של debugging בפרקים הבאים.
הגדרת סביבת בדיקות — 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
# התקנה
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
// התקנה: 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 ובודקים שאחוז ההצלחה לא ירד.
הנה מבנה בסיסי:
{
"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"
}
]
}
- התקן pytest (או vitest ל-TypeScript)
- צור
pytest.iniעם markers ל-unit, integration, eval - כתוב 3 unit tests: בדיקת .env loading, בדיקת CostTracker, ובדיקת input validation
- הרץ
pytest -m unit -vוודא שהכל עובר - צור
golden_dataset.jsonעם 5 test cases בסיסיים
הצלחה: 3 tests ירוקים, golden dataset עם 5 cases, ו-pytest runner מוגדר.
זה "הבוחן" של הפרק — שילוב של הכל:
- צור פרויקט חדש מאפס בשם
chapter4-final - בנה את מבנה התיקיות המלא (מסעיף Project Structure)
- צור venv (Python) + npm init (TypeScript)
- התקן לפחות 3 SDKs ב-Python + 2 ב-TypeScript
- צור .env עם מפתח API, .gitignore שמגן עליו
- הרץ
test_sdks.py— לפחות 3 SDKs ירוקים - הרץ
verify_keys.py— לפחות ספק אחד מחזיר תשובה - הרץ
pytest -m unit— לפחות 2 tests ירוקים - בנה Docker image (
docker build -t chapter4-final .) — אופציונלי
הצלחה: פרויקט מלא עם SDKs, מפתחות, tests, ו-cost tracker — מוכן לפרק 5.
טעויות נפוצות — סיכום
חלק מה-SDKs יש להם dependency conflicts. למשל, CrewAI דורש גרסה ספציפית של pydantic שמתנגשת עם Google ADK. הפתרון: אם נתקלתם בקונפליקטים, צרו venv נפרד לכל SDK שיש לו בעיות. בפרקטיקה, רוב ה-SDKs מסתדרים ביחד — אבל אם pip צועק על version conflicts, זה הזמן להפריד.
אם כבר עשיתם git add . ו-git commit לפני שהוספתם .gitignore — הקבצים כבר ב-Git history. גם אם תוסיפו .gitignore אחר כך, ה-.env נשאר ב-history. הפתרון: תמיד צרו .gitignore כשלב ראשון לפני git init. אם כבר טעיתם: git rm --cached .env ואז commit חדש (אבל ה-history עדיין מכיל את הקובץ — צריך key rotation).
הרבה SDKs חדשים (Claude Agent SDK, Pydantic AI, google-adk) דורשים Python 3.11 כמינימום. אם אתם מקבלים שגיאות SyntaxError מיד אחרי import — בדקו את גרסת Python שלכם. הפתרון: uv python install 3.12 או brew install python@3.12.
| תדירות | משימה | זמן |
|---|---|---|
| יומי | בדוק usage dashboards של ספקי API — עלויות חריגות | 2 דק' |
| שבועי | בדוק עדכוני SDK — changelog של כל SDK שמותקן | 10 דק' |
| שבועי | הרץ pytest -m unit — וודא שהכל עדיין עובד | 2 דק' |
| חודשי | עדכן גרסאות SDK (בדוק changelog קודם!) | 30 דק' |
| חודשי | סקירת אבטחה: בדוק שאין מפתחות ב-Git history | 10 דק' |
| חודשי | בדוק rate limits ו-billing alerts — עדכן לפי צריכה | 5 דק' |
צרו פרויקט עם שלושה קבצים: (1) קובץ .env עם מפתח API אחד, (2) קובץ .gitignore שמגן על .env, (3) סקריפט Python/TypeScript שמייבא SDK אחד ושולח בקשה בסיסית. ברגע שקיבלתם תשובה מ-API — יש לכם את הבסיס. כל השאר זה שיפורים. אבל בלי הבסיס הזה — שום דבר מפרק 5 ואילך לא יעבוד.
- למה אסור להתקין חבילות Python בלי virtual environment? (רמז: קונפליקטים בין פרויקטים)
- מה קורה אם דוחפים קובץ .env ל-GitHub public repo? (רמז: בוטים, דקות, כסף)
- מה ההבדל בין unit tests ל-evals בהקשר של סוכני AI? (רמז: דטרמיניסטי vs סטטיסטי)
- איך מחשבים את העלות של הרצת סוכן? (רמז: נוסחת העלות — tokens x price x loops)
- למה צריך לנעול (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
- Python 3.11+ מותקן ועובד
- Node.js 20+ מותקן ועובד
- Virtual environment (venv או uv) מוגדר לפרויקט
- TypeScript project מוגדר עם tsconfig.json
- חשבון API באחד הספקים לפחות (Anthropic / OpenAI / Google)
- מפתח API נוצר ונבדק — מחזיר תשובה מה-API
- קובץ .env מוגדר עם מפתחות
- קובץ .gitignore מגן על .env ועל node_modules/__pycache__
- לפחות 3 SDKs ב-Python מותקנים ו-import עובד
- לפחות 2 SDKs ב-TypeScript מותקנים
- מבנה פרויקט סטנדרטי נוצר (src/, tests/, config/)
- VS Code / Cursor מוגדר עם Python + TypeScript extensions
- Billing alerts מוגדרים בכל ספק שנרשמתם אליו
- pytest (או vitest) מותקן ו-2+ unit tests ירוקים
- CostTracker מוכן לשימוש בפרויקט