דלג לתוכן הראשי

title: “Evaluation Suite” description: “תיעוד AgentEye Evaluation Suite.”

AgentEye מעריכה סשנים של agent שהושלמו על ידי POST של תמליל האירוע המלא לשירות מעריך יחיד שבבעלות הלקוח. המעריך מחזיר ניקוד או בתוך התגובה או על ידי החזרת job_id כדי שAgentEye יבצע poll עליו. התוצאות מאוחסנות והן מוצגות בדשבורד. מדריך זה מכסה:
  1. כיצד מתגלה השלמת סשן.
  2. החוזה HTTP שעל המעריך ליישם.
  3. הגדרת שרת AgentEye.
  4. צפייה בתוצאות.
  5. פתרון בעיות.
עבור העוזר Python שמיישם את החוזה בשבילך, ראה את agenteye-evaluator package ב-PyPI.

איך זה עובד

כאשר AgentEye SDK פולט אירוע agent_end לסשן, השרת מתזמן הערכה. לאחר מכן הוא עושה POST של תמליל האירוע המלא לשירות המעריך שלך, שיכול:
  • להחזיר את התוצאה בתוך התגובה עם {"status":"done", "scores":{...}, "reasoning":{...}, "summary":"..."}. התוצאה מצורפת לציר הזמן ההערכה של הסשן. reasoning ו-summary הם אופציונליים.
  • להשהות עם {"status":"pending", "job_id":"abc-123"}. AgentEye אז קורא ל-GET {EVALUATOR_ENDPOINT}/evaluate/abc-123 עד שהמעריך שלך מחזיר {"status":"done", ...} או {"status":"error", "error":"..."}. קצב ה-polling הוא לכל job: תגובה pending עשויה לכלול next_poll_secs כדי להציף; אחרת AgentEye משתמש בערך default_poll_interval_secs מ-GET /config; אחרת השרת חוזר ל-EVALUATOR_POLLING_INTERVAL_SECS (ברירת מחדל 10s). כל הערכים מוגבלים ל-[1s, 1h].
סשנים שלעולם לא פולטים agent_end (לדוגמה, process agent שקרס) יכולים גם להיאסף: GET /config של המעריך עשוי להחזיר {"inactivity_timeout_secs": 1800}, וAgentEye יעריך כל סשן שהיה inactive לאורך זמן זה. הגדר את השדה ל-null או השמט אותו כדי להשבית אפשרות חלופה זו. ה-pipeline הוא מלא no-op כאשר EVALUATOR_ENDPOINT לא מוגדר. סשן יכול להצבור הערכות טרמינליות מרובות לאורך זמן: כל אירוע agent_end (וכל re-eval ידני מהדשבורד) מוסיף שורת הערכה חדשה. זו הדרך הנתמכת להערכת שיחה שחודשה: משתמש מסיים agent, חוזר מאוחר יותר, שולח עוד אירועים, מסיים את ה-agent שוב, והערכה שנייה רצה כנגד תמליל מעודכן מלא. הדשבורד מעניק את ההערכה האחרונה כהכותרת הראשונה וההערכות הקודמות כציר זמן קובץ. כאשר הערכה אחת מתנהלת לסשן, אירועי agent_end נוספים לסשן זה מתעלמים; הבא אחרי השלמת ההערכה הרצה יתור הערכה חדשה כרגיל. הפלט inactivity מתחדש גם בסשנים שחודשו: אם אירועים חדשים מגיעים אחרי הערכה טרמינלית קודמת והסשן אז הופך ל-idle עברות inactivity_timeout_secs, הערכה חדשה מתורה. כשלים חולפים (5xx, 429, timeouts, network errors) נסיונות חוזרים עם exponential backoff עד EVALUATOR_MAX_ATTEMPTS; תגובות 4xx הן טרמינליות. AgentEye בטוח לריצה עם מספר instances שרת בקנה מידה אופקי; עבודה מחולקת כך שאותו סשן לעולם אינו מופץ פעמיים בו זמנית.

חוזה HTTP

כל נתיב מאומת משתמש bearer token auth. אותו ערך חייב להיות מוגדר בשני הצדדים:
  • שרת AgentEye: משתנה env EVALUATOR_TOKEN
  • שירות המעריך: מוגדר באותו אופן (SDK של agenteye-evaluator קוראת EVALUATOR_TOKEN לפי מוסכמה)
אם EVALUATOR_TOKEN לא מוגדר, השרת לא שולח כל Authorization header; המעריך עשוי אז לקבל בקשות אנונימיות, וזה בסדר לרשת פנימית בלבד אך לא מעודדת באינטרנט הציבורי.

נתיבים שעל המעריך לשרת

נתיבגוף / paramsתגובה
GET /healthnone{"status":"ok"} (פתוח, ללא auth)
GET /confignone{"inactivity_timeout_secs": <int> | null, "default_poll_interval_secs": <int> | omitted}
POST /evaluateEvalRequest JSON{"status":"done", ...} או {"status":"pending", "job_id":"..."}
GET /evaluate/{id}noneאותה צורת תגובה כמו /evaluate

EvalRequest גוף שנשלח על ידי השרת

צורות תגובה

Sync (done):
reasoning (מפת הצדקה לכל ניקוד) ו-summary (סיפור בפסקה אחת כללי) שניהם אופציונליים. המפתחות ב-reasoning צריכים להשתקף מפתחות ב-scores; הדשבורד מעניק כל ערך בתוך שורת הניקוד שלו. מעריכים ישנים יותר שמחזירים רק scores ממשיכים לעבוד ללא שינוי; reasoning ו-summary פשוט קוראים כ-null ו-affordances ה-UI המתאימות מושמטות. Async (deferred):
next_poll_secs הוא אופציונלי; אם מושמט השרת חוזר ל-default_poll_interval_secs של המעריך מ-/config, ואז ל-משתנה env EVALUATOR_POLLING_INTERVAL_SECS שלו. שגיאה טרמינלית בצד המעריך:
השרת מתייחס לכל גוף 2xx אחר כשגיאת פרוטוקול ורושם terminal error לסשן.

כתיבת מעריך עם ה-SDK

חבילת Python של agenteye-evaluator נותנת לך wrapper FastAPI שמוקלד המיישם את חוזה HTTP הנ״ל. התקן אותה מ-PyPI:
מעריך קטן וקיום ווידיוק:
מופע app הוא ASGI-callable, כך uvicorn module:app מריץ אותו. עבור מעריכים שצריכים לדחות עבודה יקרה, החזר JobPending במקום ורשום @app.job_lookup handler; שרת AgentEye עושה poll ל-GET /evaluate/{job_id} עד שתחזיר סטטוס טרמינלי או עד שמגיע כובר ה-EVALUATOR_MAX_POLL_DURATION_SECS (ברירת מחדל 1 h). התיעוד API המלא, דפוס async, וסכמת אירוע: ה-README של agenteye-evaluator משלח בתוך כל tarball release ב- agenteye-enterprise releases page, או שאתה יכול קרא אותו בעמוד PyPI של החבילה.

הפעלת מעריך ב-Kubernetes

המעריך הוא השירות שלך: AgentEye לא משלח מעריך container ברירת מחדל. ה-release כולל דוגמאות Kubernetes manifests תחת deploy/examples/evaluator/ שאתה יכול ליישם כפי שהם אחרי החלפת התמונה שלך וtoken bearer משותף.

1. Containerize את המעריך שלך

Dockerfile מינימלי למעריך שלך:
runAsNonRoot (UID 10001) שומר על ה-container תואם ל-Pod Security restricted profiles.

2. צור את ה-bearer token המשותף

השתמש באותו ערך כמו EVALUATOR_TOKEN בשרת AgentEye. השרת שולח Authorization: Bearer <token> בכל בקשה; ה-SDK משתמש ב-hmac.compare_digest לבדיקה constant-time ודוחה חוסרי התאמה עם HTTP 401.

3. יישום דוגמא manifests

הדוגמה כוללת:
  • Deployment של 2-replica עם runAsNonRoot, read-only root filesystem, כל capabilities מושמטות, liveness + readiness ב-/health
  • ClusterIP Service על port 9000
  • secret.example.yaml template (מכוונים בכוונה מה-Kustomization; יצור את ה-secret האמיתי out-of-band כדי שלא token נחת ב-git)

4. wire AgentEye אליו

בשרת AgentEye, הגדר:
השרת fan out EVALUATOR_WORKERS × EVALUATOR_CLAIM_BATCH בקשות concurrent ברחבי כל evaluator pods (ברירות מחדל: 2 × 4 = 8). קנה מידה replicas וper-pod resource limits בשיתוף פעולה עם אלה server-side knobs.

verification

אחרי שagent מתנהל end-to-end, GET /evaluations בשרת AgentEye צריך להחזיר שורה עם status: "done" והניקוד שהמעריך שלך יצר.

הגדרת שרת AgentEye

הגדר בתהליך השרת:
משתנה Envמשמעות
EVALUATOR_ENDPOINTBase URL של המעריך שלך (http://evaluator:9000). Unset = pipeline disabled.
EVALUATOR_TOKENBearer token. חייב להיות שווה לערך ששירות המעריך מוגדר איתו.
EVALUATOR_WORKERSמשימות worker לכל instance שרת (ברירת מחדל 2).
EVALUATOR_CLAIM_BATCHשורות טענות לכל worker tick (ברירת מחדל 4). טבעות מעובדות concurrently; effective concurrency בנקודת הקצה של המעריך שלך היא EVALUATOR_WORKERS × EVALUATOR_CLAIM_BATCH.
EVALUATOR_POLL_IDLE_SECSכמה זמן עובד ישינה בין ניסיונות dispatch כאשר אין הערכה בגינה (ברירת מחדל 2s).
EVALUATOR_POLLING_INTERVAL_SECSfallback סופי עבור GET /evaluate/{id} cadence כאשר לא next_poll_secs לכל תגובה ולא default_poll_interval_secs של המעריך הוגדרו (ברירת מחדל 10s).
EVALUATOR_REQUEST_TIMEOUT_MStimeout לכל בקשה (ברירת מחדל 30000).
EVALUATOR_MAX_ATTEMPTSאחרי כל כשלים חולפים זה הרבה, התוצאה מתועדת כ-terminal error (ברירת מחדל 5).
EVALUATOR_CONFIG_REFRESH_SECSGET /config cadence (ברירת מחדל 300).
EVALUATOR_MAX_POLL_DURATION_SECSזמן wallclock מרבי שסשן עשוי להישאר בתור polling לפני שהוא מסתיים כ-timeout (ברירת מחדל 3600s). שומר כנגד מעריך שממשיך להחזיר pending לנצח.
כדי להפעיל ניקוד אוטומטי ברחבי המופע כולו, סדר את agenteye-evaluator Secret עם שני המפתחות מוגדרים. ב-bundled Kubernetes manifests, השרת קורא EVALUATOR_ENDPOINT ו-EVALUATOR_TOKEN מ-Secret זה אופציונלי. יצור אותו דרך תהליך ניהול Secret סטנדרטי של הארגון שלך, אז הפעל מחדש את Deployment של השרת כדי להרים את השינוי. ה-tuning knobs לעיל לא חוטים על ידי ברירת מחדל; חשוף משתנה env תואם בן container שרת ב-Deployment manifest שלך אם צריך להציף את ברירות המחדל. ראה deployment.md עבור טבלת משתנה env מלאה.

התיעוד API

שיטהנתיבהרשאה נדרשתתכנית
GET/evaluationsevaluations:readתוצאות terminal של שאילתה. תומכת session_id, agent_id, environment, status (done/error/timeout), ts_from, ts_to, cursor, limit, score_filters, latest_per_session. limit ברירת מחדל 50 וcapped ב-200 (שים לב שזה שונה מ-/events, שcaps ב-1000). environment מקבל רשימה מופרדת בפסיקים (למשל environment=prod,staging); ערכים בודדים עדיין עובדים. עם latest_per_session=true התגובה מכילה לכל היותר שורה אחת לכל session_id (ה-recent ביותר על ידי completed_at) המשמשת עמוד sessions-list כדי לכווץ ציר זמן הערכה של סשן לכותרת הנוכחית שלו. ברירות מחדל ל-false (מחזיר את ההיסטוריה המלאה).
GET/evaluations/aggregateevaluations:readhealth eval rolled-up לחתך מסונן: ספירה כוללת, done/error/timeout breakdown, per-score-key stats (count/avg/min/max/p50 מעל arbitrary scores מפתחות), וציר זמן bucketed. מקבל את אותם filter params כמו /evaluations בתוספת featured_keys (CSV של score keys לזרום) ו-latest_per_session. Powers הפיצ’ר Dashboards; מטריקות מדויקות מעל הסט כולו תואם, לא דגימה.
GET/evaluations/environmentsevaluations:readערכי environment מובחן מטבלת evaluations. משמש לאוכלוסיה dropdown filter scoped להערכה-קוראת נתונים.
GET/evaluation-jobsevaluations:readנראות לתוך הערכות in-flight. סנן לפי status (pending/polling).
GET/eventsevents:readstream אירועי raw של סשן. תומכת session_id, agent_id, event_type (CSV), environment (CSV), ts_from, ts_to, cursor, limit, ו-order. order הוא desc (newest-first, ברירת המחדל) או asc (oldest-first); ערך לא מוכר חוזר ל-desc. Cursor-paginate דרך response ה-next_cursor (event id): פדיון אותו חזור ל-cursor כדי לקבל עמוד הבא; עם asc עמוד הבא הוא אירועים אחרי ה-id זה, עם desc האירועים לפניו. limit ברירות מחדל 50 וcapped ב-1000.
GET/sessions/:session_id/exportevents:readמחזיר את גוף JSON המדויק שהמעריך יקבל לסשן זה, משרת כהטמון ניתן להורדה בשם session-<id>.json. שימושי לreplay סשנים production דרך agenteye-evaluator לבדיקה offline. הבייטים הם byte-identical למה ש-evaluator pipeline שולח.
POST/sessions/:session_id/re-evaluateevaluations:triggerתור הערכה חדשה לסשן; מתנהל בין אם קיימת הערכה קודמת ובין אם לא. התוצאה החדשה היא מתווסת לציר זמן ההערכה של הסשן במקום הודפסת ההערכה הקודמת, כך ניקוד קודם נשאר נראה כהיסטוריה. מחזיר 202 בתור, 404 לסשן לא ידוע, 409 אם הערכה כבר in-flight. השתמש בהוצאה אחרי development evaluator חדש, או לסשנים שלעולם לא פולטים agent_end.

סינון לפי score range: score_filters

GET /evaluations מקבל אופציונלי score_filters parameter שצמצם תוצאות לפי values מספריות בתוך ה-scores object. ה-parameter הוא CSV של key:min..max entries; כל bound עשוי להיות מושמט. ערכים מרובים משתלבים עם logical AND. שורות שבהן המפתח בשם היא היעדר או non-numeric אינן נכללות. בקשה עשויה להנשא לכל היותר 20 filter entries; חריגה זו מחזיר HTTP 400. דוגמאות:
כל /evaluations response object כל שדות אלה:
שדהסוגהערות
evaluation_idstring (UUID)המזהה הקנוני להערכה טרמינלית זו. כל הערכה טרמינלית מקבלת UUID חדש; סשן יחיד יכול להיות מחזיק מרובים.
idstring (UUID)backwards-compatibility ממשיך לשאת את אותו ערך כמו evaluation_id.
session_idstringהסשן שהערכה זו רצה כנגדו. סשן יכול להחזיק הערכות מרובות בציר הזמן.
agent_idstringמזהה את ה-agent שיצר את הסשן.
environmentstringתווית environment המועתקת מהסשן.
statusenumאחד מ-"done", "error", "timeout".
scoresobject | nullניקוד שהוחזר על ידי המעריך שלך.
reasoningobject | nullאופציונלי per-score justification map שהוחזר על ידי המעריך שלך. מפתחות בדרך כלל משקפים אלה ב-scores. הדשבורד מעניק כל ערך תחת שרת ניקוד שלו.
summarystring | nullאופציונלי one-paragraph סיפור כללי שהוחזר על ידי המעריך שלך. הדשבורד מעניק זאת מעל הפרוק per-score כהכותרת ההערכה.
errorstring | nullמלא על "error" / "timeout" בלבד.
attempt_countintegerמספר dispatch attempts (≥ 1).
duration_msinteger | nullמשך הניסיון הסופי.
completed_atstring (ISO 8601 UTC)כאשר התוצאה הטרמינלית נתונה. התוצאות מסודרות לפי completed_at (newest first).
created_atstring (ISO 8601 UTC)נושא אותו timestamp כ-completed_at (write-once semantics).

הרשאות

הרשאהמענקים
evaluations:readהערכות רשימה, צפייה בניקוד בדשבורד, וטעינה מדדי health של דשבורד.
evaluations:triggermanually תור הערכה לסשן via POST /sessions/:session_id/re-evaluate או דשבורד re-evaluate button.
dashboards:readצפייה בדשבורדים שמורים (גם צריך evaluations:read כדי לטעון את המדדים שלהם).
dashboards:writeיצור ועריכה dashboards.
dashboards:deleteמחק dashboards.
bootstrap admin (ADMIN_KEY, ADMIN_EMAIL) קיבל באופן אוטומטי אלה.

צפייה בתוצאות

  • /sessions/<id>: אירוע timeline + קריאה ימין המציגה את ניקוד הסשן וכל שגיאה מניסיון dispatch. אם המפתח שלך כולל evaluations:trigger, re-evaluate button מופיע ליד export button, שימושי לסשנים שלעולם לא פולטים agent_end, או פרש ניקוד אחרי הנפקת evaluator חדש. הדשבורד poll לתוצאה החדשה וmicroservices ה-right rail כאשר הוא נחת.
  • /sessions: filterable session grid; score column מציג evaluation status וניקוד של כל סשן בהצצה.
  • /dashboards: שמור eval-health views (ראה Dashboards למטה).
The Sessions grid with per-session evaluation status pills and colour-coded score badges (helpfulness, factuality, tool_efficiency, safety, coherence) grid sessions מציגה evaluation status וניקוד של כל ריצה בהצצה; red/amber/green badges יוצרים ניקוד נמוך להקפיץ. A session detail view with the evaluation scores and dispatch status in the right rail פתיחה סשן מציגה ציר זמן מלא לצד evaluation scores וכל dispatcher error בקריאה ימין.

Dashboards

עמוד ה-Dashboards (/dashboards) מאפשר לך שמור שילוב של evaluation filters כמו נקוב, reusable view וצפייה כיצד החתך זה של evaluations עושה בהצצה. Dashboards הוא משותף לעל כל הארגון שלך; כולם עם dashboards:read רואים את אותה סט. כל dashboard מכיווץ:
  • Filters: אותם קרים כמו sessions page: environment, status, agent, rolling time window, וscore-range filters (key:min..max).
  • A display configuration: אילו score keys לfeature, ה-green/amber/red health thresholds, אילו panels להציג, והאם לכווץ לאחרון evaluation לכל סשן.
כל card מציג את מספר הסשנים משחקה, done/error/timeout breakdown, הממוצע של כל featured score, וsmall trend sparkline. פתיחה dashboard מציגה full-size panels; open in sessions זורק אותך ל-sessions page pre-filtered לחתך בדיוק זה. מטריקות מחושבות server-side מעל הסט כולו משחקה (via GET /evaluations/aggregate), אז המספרים מדויקים ולא דגימה. An eval-health dashboard with average-score bars per evaluator dimension, a tool ok-vs-error breakdown, top tools, and an events-per-hour trend Permissions: צפייה צריך גם dashboards:read וגם evaluations:read; יצור וערוך צריך dashboards:write; מחק צריך dashboards:delete. bootstrap admin מקבל כל אלה באופן אוטומטי.

פתרון בעיות

Sessions קיימים אבל אין evaluations יוצרו. Confirm EVALUATOR_ENDPOINT מוגדר בתהליך השרת, שהשרת ומעריך חולקים אותו EVALUATOR_TOKEN value, וש-/health endpoint של המעריך שניתן להגיע מהשרת. עם EVALUATOR_ENDPOINT unset ה-pipeline הוא no-op. In-flight evaluations עומדים לערום. שאילתה GET /evaluation-jobs כדי לראות את ה-in-flight queue. Inspect attempt_count, next_attempt_at, ו-last_error על כל שורה. סיבות נפוצות: evaluator service בלתי מעביר או חוזר 5xx (נסיונות חוזרים עם backoff), wrong EVALUATOR_TOKEN (401 הוא terminal), או async evaluator שחוזר pending indefinitely (ראה למטה). Sessions שהושלמו אבל אין terminal evaluation. שאילתה GET /evaluation-jobs?status=polling; התוצאה עשויה עדיין להיות in-flight. אם job הוא stuck ב-pending, השרת יש בעיה להגיע למעריך; בדוק את המעריך הוא עד וכי EVALUATOR_TOKEN matches. HTTP 401 from evaluator: invalid bearer token. ה-EVALUATOR_TOKEN בשרת לא תואם את ערך המעריך service מוגדר איתו. הם חייבים להיות זהים. Async evaluator מחזיר pending לנצח. השרת poll GET /evaluate/{job_id} עד המעריך מחזיר done או error, או עד EVALUATOR_MAX_POLL_DURATION_SECS (ברירת מחדל 1 h) elapses. אחרי ה-cap ההערכה מתועדת כ-timeout ומוסרה מה-in-flight queue. הגדל EVALUATOR_MAX_POLL_DURATION_SECS אם המעריך שלך legitimately צריך יותר מברירת המחדל.