בדיקת סוכנים היא יכולת מרכזית של הפריימוורק, ולא מחשבה שנייה. Agent-Lab כולל שתי תשתיות בדיקה משלימות, שבהן אפשר להשתמש גם לאימות הפריימוורק עצמו וגם לאימות הסוכנים שבונים על גביו:
- בדיקות אינטגרציה מפעילות את המערכת מול תשתית אמיתית (Postgres, Redis, Keycloak, embeddings, Headless Chrome) שמוקמת לפי דרישה עם testcontainers — ומכסות שירותים חיצוניים, פעולות מסד נתונים, חיפוש וקטורי ונקודות קצה של ה-API.
- סימולציות סוכנים מעריכות את התנהגות הסוכנים מקצה לקצה מול LLMs חיים, עם ציון שנקבע על ידי LLM-as-judge ומעקב לאורך זמן ב-Langfuse וב-LangWatch.
התצורה העיקרית של בדיקות האינטגרציה נמצאת ב-tests/conftest.py; יש להתאים אותה
לסביבה שלך.
הערה: בדיקות האינטגרציה והסימולציות מבצעות קריאות אמיתיות לשירותים חיצוניים ועלולות לגרום לעלויות. יש להריץ אותן בסביבה מבוקרת ולעקוב אחר השימוש.
בדיקות אינטגרציה
נדרש Docker (או סביבת הרצה אחרת לקונטיינרים) — חבילת הבדיקות מקימה קונטיינרים אמיתיים באמצעות testcontainers.
make test_unit # fast lane: boots the app with no infrastructure
make test_integration # the full real-infrastructure suite
make test # both, with coverage (gate: 90%)ההרצה הראשונה עשויה להימשך כמה דקות — ה-images של Docker ומודלי ה-embedding מורדים
פעם אחת. הכיסוי של agent_lab/ נאכף ב-CI (SonarCloud).
הפרויקטים שנוצרים מהשלד משקפים זאת: tests/ מכיל בדיקות smoke ללא קונטיינרים ולצדן
חבילת testcontainers אופציונלית.
סימולציות סוכנים
סימולציות הסוכנים מקצה לקצה נמצאות ב-tests/simulation/ וקוראות לספקי LLM חיים. הן
מסומנות agent_test ואינן נבחרות כברירת מחדל; מריצים אותן עם:
make test_simulations
# or a single track:
make scenario_simulation
make langwatch_simulation
make langfuse_simulationשלושה מסלולים משלימים חולקים את פונקציות העזר לאתחול הסוכנים, את השופט ואת הגדרות
מערכי הנתונים תחת tests/simulation/datasets/:
tests/simulation/scenario/— סימולציות שיחה באמצעות הפריימוורק langwatch-scenario: סימולטור משתמש מניע את הסוכן, וסוכן שופט נותן ציון לאינטראקציה.tests/simulation/langfuse/— ניסויים מבוססי מערכי נתונים באמצעות מערכי הנתונים של Langfuse. כל הרצה מסנכרנת את הגדרות מערכי הנתונים, מפעילה את הסוכן עבור כל פריט, נותנת ציון לפלט באמצעות LLM-as-judge בצד הלקוח, ורושמת את ההרצה ואת הציונים ב-Langfuse להשוואה לאורך זמן. המסלול מדולג אוטומטית כאשרLANGFUSE_BASE_URL(אוLANGFUSE_HOSTהמיושן),LANGFUSE_PUBLIC_KEYו-LANGFUSE_SECRET_KEYאינם מוגדרים.tests/simulation/langwatch/— אותם ניסויי מערכי נתונים, המשוכפלים ל- LangWatch באמצעותlangwatch.experiment, עם רישום ציון השופט לכל פריט. ההגדרות מסונכרנות באופן אידמפוטנטי למערך נתונים מאוחד יחיד בשםsimulations(עמודתdatasetמזהה את הגדרת המקור, משום שהתוכנית החינמית של LangWatch מאפשרת לכל היותר 3 מערכי נתונים לפרויקט). המסלול מדולג אוטומטית כאשרLANGWATCH_ENDPOINTו-LANGWATCH_API_KEYאינם מוגדרים.
סוכני הדוגמה המכוסים במסלולים: coordinator-planner-supervisor, react RAG, ראייה/מסמכים, אוטומציה של דפדפן, תזכירים קוליים ו-adaptive RAG.
הגדרת ה-LLM של השופט ושל הסוכנים
השופט (וסימולטור המשתמש של scenario) משתמשים במזהי מודל של litellm מול כל נקודת קצה התואמת ל-OpenAI API:
| משתנה סביבה | ברירת מחדל | ייעוד |
|---|---|---|
SIMULATION_JUDGE_MODEL |
openai/gpt-5-nano |
מזהה מודל litellm שבו משתמש ה-LLM-as-judge |
SIMULATION_JUDGE_API_BASE |
ברירת המחדל של הספק | נקודת קצה מותאמת תואמת OpenAI עבור מודל השופט |
SIMULATION_JUDGE_API_KEY |
ברירת המחדל של הספק | מפתח API לנקודת הקצה המותאמת |
הסוכנים הנבדקים רצים על LLM ברירת מחדל שמוגש מכל נקודת קצה תואמת OpenAI (לדוגמה שרת
inference ברשת המקומית), ומוקצה לכל בדיקה על ידי
tests/simulation/common/llm_factory.py. החריג הוא סוכן התזכירים הקוליים, שנשאר על
OpenAI (הוא זקוק לקלט שמע בצ'אט). ה-embeddings ממשיכים להשתמש בגיבוי
EMBEDDINGS_ENDPOINT (קונטיינר ה-Ollama של הבדיקות שמגיש את bge-m3), בהתאמה
ל-dump של pgvector. נקודת הקצה חייבת לתמוך ב-tool calling / פלט מובנה עבור החבילות
המבוססות על supervisor (אוטומציה של דפדפן, supervisor):
| משתנה סביבה | ברירת מחדל | ייעוד |
|---|---|---|
SIMULATION_LLM_MODEL |
אין (חובה) | תג המודל שמריץ את הסימולציות (לדוגמה qwen3:30b) |
SIMULATION_LLM_API_BASE |
אין (חובה) | נקודת קצה תואמת OpenAI שמגישה את המודל |
SIMULATION_LLM_API_KEY |
dummy-key |
מפתח API, אם נקודת הקצה דורשת |
הקמת פלטפורמות ההערכה
make test_simulations (ויעדי המסלולים הנפרדים) מריצים קודם את השלב
sync_simulation_evals, שמשכפל את הגדרות מערכי הנתונים לכל פלטפורמה מוגדרת. כדי להקים
גם את הגדרת ההערכה בצד השרת של Langfuse (חיבור LLM עבור מודל השופט, evaluator בשם
simulation_llm_as_judge, וכלל הערכה אחד לכל מערך נתוני סימולציה — גלויים באזור
Evaluations של Langfuse), מריצים:
uv run python tests/setup_simulation_evals.pyהסקריפט אידמפוטנטי ובטוח להרצה חוזרת.