Agentic Evaluations¶
Evaluieren Sie Agenten, die Sie selbst ausführen, anhand ihrer Trajectories.
Führen Sie Ihren Agenten in seiner bestehenden Runtime aus, laden Sie die Trial-Ergebnisse hoch und lassen Sie elluminate die aufgezeichneten Trajectories prüfen und bewerten.
Was Agentic Evaluation ist¶
Wann Agentic Evaluations verwenden¶
Nutzen Sie diesen Workflow, wenn Ihr Agent mehrere LLM-Aufrufe ausführt, Tools verwendet oder Arbeit delegiert und Sie sowohl sein Vorgehen als auch seine finale Antwort bewerten möchten. Der Runner kann eigener Code, Harbor, LangChain, CrewAI, AutoGen oder ein anderes Framework sein.
Für einstufige Ausgaben oder Tool Calls, die elluminate selbst erzeugt, nutzen Sie den Leitfaden Tool Calling.
Kernkonzepte¶
- Task — eine Arbeitseinheit mit eindeutigem Task-Namen.
- Collection — die Menge der Tasks, üblicherweise mit einer
task- und optionaleninstruction-Column. - Trajectory (Trace) — das schrittweise Protokoll eines Runs: Messages, Tool Calls und Observations.
- Criterion — eine YES/NO-Frage, die anhand einer Trajectory bewertet wird. Ein Criterion Set gilt für jeden Task; taskspezifische Criteria gelten nur für einen Task.
- Overall Rating — die automatische YES/NO-Bewertung des gesamten Task-Erfolgs.
- Experiment — verbindet Collection und Criterion Set und enthält hochgeladene Traces, Ratings und Metriken.
Das Trajectory-Format¶
Ihr Runner muss eine ATIF-Trajectory erzeugen (Agent Trajectory Interchange Format). elluminate hat keinen frameworkspezifischen Importer: Konvertieren Sie die Runner-Ausgabe in ATIF, verpacken Sie sie in ein Trial-Ergebnis und laden Sie sie über die UI oder das SDK hoch.
ATIF beschreibt einen bereits ausgeführten Run. Es unterscheidet sich von UCE (elluminate.uce/1), einer Conversation-Eingabe, die elluminate selbst ausführt; siehe Conversations.
UI-Walkthrough¶
- Agentic Collection erstellen. Wählen Sie in Collections → New collection den Type Agentic. Behalten Sie
taskals eindeutige Text-Column bei; sie identifiziert jeden Upload.instructionist optional, wenn die Trajectory die Eingabe schon enthält. Agentic Experiments brauchen kein Prompt Template und generieren niemals automatisch Responses. - Criterion Set erstellen. Legen Sie in der Criteria Library klare YES/NO-Fragen an, die sich aus einer Trajectory beantworten lassen. Für Prüfungen, die nur für einen Task gelten, verwenden Sie taskspezifische Criteria.
- Agentic Experiment erstellen. Wählen Sie in Experiments → New den Type Agentic und anschließend Collection und Criterion Set.
- Agent extern ausführen und pro Task eine ATIF-Trajectory sammeln.
- Traces hochladen — über die UI oder das SDK. Bei aktivierter Bewertung bewertet elluminate jedes Criterion gegen jede Trajectory.
- Ergebnisse in der UI ansehen.
Automatisches Overall Rating
Jedes Agentic Experiment ergänzt seine festgeschriebene Evaluationsdefinition um Overall Rating. Es bleibt von einem gleichnamigen Criterion im Criterion Set getrennt.
Tasks aus einem Harbor-Zip importieren¶
Um Harbor Task Folder zu importieren, öffnen Sie eine Agentic Collection und wählen Add task → Upload zip. Das Archiv darf Folder in beliebiger Tiefe enthalten; jeder Folder mit task.toml wird zu einem Task.
tasks/
├── fix-parser/
│ ├── task.toml
│ ├── instruction.md
│ └── criteria.toml
└── needs-doc/
├── task.toml
└── instruction.md
| Datei | Pflicht | Importiert als |
|---|---|---|
task.toml |
ja | Task-Identität und Task-Konfiguration. Wenn vorhanden, wird [task].name verwendet, sonst der Folder-Name. |
instruction.md |
ja | Die Task-Anweisung; sie darf nicht leer sein. |
criteria.toml |
nein | Criteria nur für diesen Task. |
environment/, solution/, tests/ |
nein | Textbasierte Task-Konfiguration, die für den Export erhalten bleibt. |
Die Collection benötigt eine Task-Name-Column und eine Text-Column für die Anweisung. criteria.toml enthält einen [[criteria]]-Eintrag pro Criterion. Labels sind optional; wenn sie angegeben sind, müssen sie pro Task eindeutig sein, dürfen höchstens 25 Zeichen haben und nicht Overall Rating heißen. Criterion-Texte sind auf 4.000 Zeichen begrenzt.
Ein erneuter Import aktualisiert passende Tasks statt Duplikate anzulegen. Behalten Sie ein Criterion-Label bei, um seine Versionshistorie zu erhalten; ein neues Label entfernt das alte Criterion und legt ein neues an. Tasks, die im Archiv fehlen, bleiben unverändert.
Task-Konfiguration und Textdateien aus den genannten Verzeichnissen werden gespeichert und exportiert. Binärdateien, Dateien über 256 KB und andere Pfade werden gemeldet, aber nicht gespeichert. Pro Upload gelten: 25 MB komprimiert, 300 Tasks, 2 MB pro Datei, 100 Criteria pro Task sowie 100 Implementierungsdateien mit zusammen 1 MB pro Task.
Taskspezifische Criteria¶
Für Prüfungen, die nur für einen Task gelten, nutzen Sie die Tasks-Ansicht der Collection. Öffnen Sie den Criteria-Dialog eines Tasks, fügen Sie das Criterion hinzu und speichern Sie. Labels sind optional und pro Task eindeutig; Criteria können Task-Felder wie {{expected_outcome}} referenzieren.
Ein Experiment bewertet sein Criterion Set, die Criteria des Tasks und Overall Rating. Diese Werte werden beim Erstellen festgeschrieben; nach Änderungen erstellen Sie ein neues Experiment.
Agent-Traces in der UI hochladen¶
Öffnen Sie das Agentic Experiment und wählen Sie Agent-Traces hochladen. Sie können eine Datei ablegen oder JSON einfügen, dann die Task-Name-Column bestätigen, die Bewertung ein- oder ausschalten und eine Epoch für einen weiteren Run derselben Tasks setzen.
Nach dem Einlesen zeigt der Dialog, welcher Trace zu welchem Task gehört, so wie die Plattform es auflöst. Die übrigen stehen unter Nicht zugeordnete Traces und lassen sich per Drag-and-drop oder über die Liste des Tasks zuordnen. Ein Task ohne Trace wird übersprungen, nicht zugeordnete Traces werden nicht hochgeladen.
Format der Upload-Datei¶
Verwenden Sie ein .json-Objekt oder -Array oder eine .jsonl-Datei mit einem vollständigen Objekt pro Zeile. Jedes Objekt ist ein SDK-AgentTrialResult:
task_idodertask_namegibt an, zu welchem Task der Trace gehört.task_idist der stabilere Schlüssel: er übersteht eine Umbenennung und braucht keine Task-Name-Column. Ein Trace ohne beides wird in der UI nicht abgelehnt, dort ordnen Sie ihn nach dem Einlesen zu.trajectoryenthält die ATIF-Trajectory.reward,cost_usd,steps,messagesundcriterion_ratingssind optional.
Eine Trace-Datei ist keine Upload-Datei
Eine ATIF-Trajectory allein ist kein Trial-Result. Verschachteln Sie sie unter trajectory.
[
{
"task_name": "write-hello-world",
"reward": 1.0,
"cost_usd": 0.0042,
"trajectory": {
"schema_version": "ATIF-v1.0",
"session_id": "run-001/write-hello-world",
"agent": {
"name": "demo-agent",
"version": "0.1.0",
"model_name": "claude-sonnet-4-6"
},
"steps": [
{
"step_id": 1,
"source": "user",
"message": "Write a Python hello world script to hello.py"
},
{
"step_id": 2,
"source": "agent",
"message": "Writing hello.py.",
"tool_calls": [
{
"tool_call_id": "tc_1",
"function_name": "write_file",
"arguments": {"path": "hello.py", "content": "print('Hello, World!')"}
}
],
"observation": {
"results": [{"source_call_id": "tc_1", "content": "wrote 22 bytes"}]
},
"metrics": {"prompt_tokens": 420, "completion_tokens": 61, "cost_usd": 0.0042}
}
],
"final_metrics": {
"total_steps": 2,
"total_cost_usd": 0.0042,
"total_prompt_tokens": 420,
"total_completion_tokens": 61
}
}
}
]
Bei aktivem Evaluate after upload lassen Sie criterion_ratings weg und elluminate bewertet den Trace. Für vorab berechnete Ratings geben Sie die criterion_id aus der Experimentdefinition an; Labels dürfen mehrfach vorkommen. Ältere Experiments können weiterhin eindeutige Labels gegen ihre Live-Definition verwenden.
Trials werden unabhängig verarbeitet, daher blockiert eine ungültige Trajectory die übrigen nicht. Die Bewertung läuft im Hintergrund.
Ergebnisse in der UI ansehen¶
- Overview zeigt aggregierte Metriken, Pass-Raten pro Criterion und eine Experiment Summary, wenn sie verfügbar ist.
- Sample Navigator zeigt Phasen-Timeline, Trace und Ratings eines Samples. Sub-Agent-Traces stehen unter dem auslösenden Step.
- Responses Overview listet alle Responses.
SDK-Walkthrough¶
Das Beispiel legt eine Agentic Collection, ein Criterion Set und ein Experiment an oder verwendet vorhandene wieder, wandelt Runner-Ausgaben in AgentTrialResult um, lädt sie hoch und wartet auf die Bewertung.
export ELLUMINATE_API_KEY=<your-key>
uv run --directory elluminate_sdk python examples/example_harbor_agentic_upload.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 | |
Die Zuordnung vor dem Upload prüfen¶
preview_matching() beantwortet, zu welchem Task jeder Trial gespeichert würde, und speichert
nichts. Es läuft dieselbe Zuordnung wie der Upload, das Ergebnis ist also genau das, was der Upload
tun wird.
preview = experiment.preview_agent_results_matching(results)
for item in preview.unmatched_results:
print(item.index, item.reason)
Ein Upload, bei dem kein Result einen Task des Experiments benennt, wird komplett abgelehnt und
löst TaskMatchError aus. Der Fehler nennt die Tasks, die akzeptiert werden:
from elluminate import TaskMatchError
try:
experiment.upload_agent_results(results=results)
except TaskMatchError as exc:
for task_id, task_name in ((t.task_id, t.task_name) for t in exc.accepted_tasks):
print(task_id, task_name)
Ein Batch, in dem einige Results zutreffen, wird weiterhin gespeichert; der Rest steht in errors.
Laden Sie über task_id hoch, wenn Ihr Runner kein stabiles Namensschema hat oder ein Name
mehrdeutig ist, weil eine Zeile auf den Namen eines anderen Tasks umbenannt wurde.
Das Dev-Set erweitern (das Eval-Flywheel)¶
Fügen Sie Produktionsfehler zur Collection hinzu, damit spätere Runs sie ebenfalls abdecken. Neue Zeilen erweitern die Task-Menge; eine höhere Upload-Epoch führt dieselben Tasks erneut aus.
collection = client.get_collection(name="my-agent-dev-set")
collection.add_many([
{"task": "Neues Failure-Szenario aus der Produktion ..."},
{"task": "Weiterer Regressionsfall ..."},
])
AgentTrialResult-Felder¶
| Field | Pflicht | Beschreibung |
|---|---|---|
task_id |
eines von beiden | Die Row-ID des Tasks aus get_definition(). Sie hat Vorrang: das Result wird über die ID aufgelöst, ohne Namenssuche. |
task_name |
eines von beiden | Ein beim Erstellen des Experiments festgeschriebener Task-Name, oder der aktuelle Name der Zeile nach einer Umbenennung. |
messages |
nein | Finale Messages im OpenAI-Format auf der Response-Seite. |
reward |
nein | Primärer Reward-Score (0.0–1.0). |
steps |
nein | Anzahl der Agent-Steps oder LLM-Aufrufe. |
cost_usd |
nein | Gesamtkosten in USD; ohne Angabe aus der Trajectory abgeleitet. |
duration_seconds |
nein | Wall-Clock-Dauer. |
input_tokens |
nein | Alle Input-Tokens einschließlich Cache-Reads. |
output_tokens |
nein | Alle Output-Tokens. |
cached_tokens |
nein | Gecachte Input-Tokens, bereits in input_tokens enthalten. |
error |
nein | Fehlermeldung eines fehlgeschlagenen Trials. |
metadata |
nein | Freie Daten auf der Response-Seite. |
trajectory |
nein | ATIF-Trajectory, die das Backend validiert. |
criterion_ratings |
nein | Vorab berechnete YES/NO-Ratings; für festgeschriebene Experiments criterion_id verwenden. |
ATIF-Trajectory-Format¶
trajectory verwendet ATIF. Das Upload-Beispiel oben zeigt eine minimale ATIF-v1-Trajectory, die in einem Trial-Ergebnis verschachtelt ist.
Wie Kosten und Tokens ermittelt werden¶
elluminate nutzt die erste verfügbare Kostenquelle: cost_usd am Trial, final_metrics.total_cost_usd, die Summe der Step-Kosten (einschließlich Sub-Agents) und zuletzt eine Token-Schätzung anhand von model_name. Für Token-Summen gilt dieselbe Reihenfolge.
Input-Token-Zahlen enthalten Cache-Reads. Providerspezifische Cache-Write-Tokens gehören in metrics.extra (Run-Summen in final_metrics.extra); geschätzte Kosten erhalten ein ~. Senden Sie cost_usd oder metrics.cost_usd, wenn Ihr Runner die tatsächlichen Kosten kennt.