Ctrl K
ComunidadGuías…

docs/evals.de.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
---
source_sha: "b01337524a1f"
title: "Eval-Runs"
description: "Ein Eval-Run beantwortet jeden Fall eines Datasets mit einer Agent-Version oder ihrem Entwurf, bewertet jede Antwort und vergleicht das Ergebnis mit einer Baseline."
---

# Eval-Runs { #eval-runs }

Ein **Eval-Run** lässt einen Agent jeden Fall einer Version eines
[Datasets](datasets.md) beantworten, bewertet jede Antwort so, wie das
[Scoring](datasets.md#scoring) des Datasets es vorgibt, und hält fest, was
passiert ist. Er beantwortet die Frage, die jemand beim Bearbeiten eines Agents
wirklich hat: Hat diese Änderung den Agent besser gemacht, schlechter oder
keines von beidem - und was hat es gekostet?

Ein Run besteht aus vier Entscheidungen: der **Agent** und was davon läuft
(eine veröffentlichte Version oder der Entwurf in seinem aktuellen Stand), die
**Dataset-Version**, die **Umgebung**, deren Testverbindungen die Fälle nutzen,
und optional **mehrere Modelle** nebeneinander. Im selben Run kann außerdem
eine **Baseline** laufen - eine frühere Version -, damit beide Seiten am selben
Tag auf denselben Provider treffen.

## In der Konsole { #in-the-console }

Der Tab **Evals** eines Agents zeigt ein kompaktes Diagramm über der Run-Historie, sobald Messergebnisse vorliegen. Das Diagramm bleibt sichtbar. Jede Zeile zeigt verglichene Versionen, Status, Urteil, Modell, Bestehensquote und bestandene Fälle im Verhältnis zur Gesamtzahl. Das Diagramm zeigt die
Bestehensquote Run für Run, der älteste links, eine Linie pro Dataset, jede mit
eigener Strichart. Ein Punkt ist rot, wo der Run Fälle verschlechtert hat, grün,
wo er sie behoben hat, bernsteinfarben, wo beides, und hohl für einen Entwurf; der
Hover sagt, was lief, wogegen und wann, und ein Klick öffnet den Run.

Die Achse zeigt Uhrzeiten, wenn die Historie innerhalb eines Tages liegt, auch eines vergangenen. Über mehrere Tage zeigt sie Daten für ältere Runs und Uhrzeiten für heutige, ohne gleiche Beschriftungen zu wiederholen. Der Tooltip enthält das vollständige Startdatum mit Uhrzeit. Ab mehr als 10 Runs zeigt ein
Schalter über dem Diagramm die letzten 10, die letzten 30 oder alle Runs; er
öffnet mit den letzten 10, und die Wahl bleibt in der Adresse der Seite, sodass
Zurück und ein Link sie behalten.

Die Tabelle zeigt die Runs mit den neuesten zuerst, jeder mit dem, was gegen was
getestet wurde, seinem Urteil (Verschlechtert 2, Insgesamt schlechter ·
4 verschlechtert, Erstes Ergebnis, Läuft) und der Bestehensquote jedes Modells, mit der Quote der ersten
Antworten beim Darüberfahren.

**Evals starten** (Run evals) öffnet den Startdialog mit der naheliegenden
Antwort: der Entwurf gegen die Live-Version, wenn sich der Entwurf von ihr
unterscheidet, die Live-Version allein, wenn nicht, und der Entwurf allein bei
einem Agent, den niemand veröffentlicht hat. Das Dataset, auf dem der Agent
zuletzt gemessen wurde - oder das einzige, das es gibt -, ist bereits
ausgewählt; Umgebung, Aufzeichnungen und Wiederholungen liegen unter
**Erweitert** (Advanced). Die Kosten werden berechnet, sobald die Felder
feststehen, und sagen, was die Antworten bewertet und was die Budgets des
Agents und der Organisation danach behalten; der Run startet erst über den
Button, der den Betrag nennt. **Entwurf weicht von vN ab**
(Draft differs from vN) auf der Seite des Agents - vN ist die zuletzt
veröffentlichte Version, und wenn die Wächter der Produktion sie auf einer
älteren halten, sagt ein zweites Badge, auf welcher, etwa „Produktion auf v1
(wartet auf Evals)“ - trägt einen Button **Entwurf testen** (Test draft), der
denselben Dialog öffnet. Der Veröffentlichungsdialog sagt, was der letzte Run
des Entwurfs ergeben hat - eine
[Prüfung der Vorschläge des Assistenten](authoring.md#check-with-evals) zählt,
sobald sie angenommen sind -, oder dass er seit seiner letzten Änderung nicht
getestet wurde, oder dass sein Test veraltet ist, ohne die Veröffentlichung
aufzuhalten.

Die Seite eines Runs öffnet mit seinem Urteil in wenigen Sätzen - die Fälle,
die der Kandidat jedes Mal verschlechtert oder behebt, wenn er sie gestellt
bekommt, einer davon zitiert mit der Zahl der Versuche, die es wiederholt
haben, ob er insgesamt besser oder schlechter ist, wenn die bestätigten
Änderungen das entscheiden können, und die Bestehensquote vorher und nachher -
und mit dem, was als Nächstes zu tun ist: sehen, was sich zwischen den beiden
Versionen geändert hat (History öffnet auf diesem Vergleich, gegen den
getesteten Spec statt den jetzigen Entwurf), die verschlechterten Fälle zeigen,
zurück zum Tab Bauen gehen oder den Entwurf veröffentlichen.

Publish ist nur dann die Hauptaktion, wenn keine Regression bestätigt wurde und
kein Fall des Kandidaten unbeantwortet oder unbewertet blieb, und der Run eines
seitdem geänderten Entwurfs bietet stattdessen **Erneut testen** (Test again)
an. Solange der Run
antwortet, sagt die Seite, wie viele erste Antworten vorliegen, und der
Vergleich wartet auf beide Seiten. Antworten, die der Bewerter nicht bewerten
konnte, sagen, warum, und zählen weder als bestanden noch als nicht bestanden,
und **Erneut bewerten** (Grade again) im Kopfbereich bewertet sie erneut, ohne den Agent zu
fragen, für jeden, der das Dataset laufen lassen darf.

Unter dem Urteil stehen die Seiten nebeneinander, wie die beiden abschneiden,
und die Fälle - jede Zeile mit einem Punkt für bestanden oder nicht bestanden
pro Seite, gefiltert nach Ergebnis oder Tag, jeder Fall mit dem, was er
erwartet, und den Antworten, Aufrufen und Bewerterbegründungen jeder Seite. Ein
gewählter Tag beschränkt die Seiten, die Änderungen und die Fälle auf ihn; das
Urteil gilt weiter für alle Fälle.

Sobald seine Wiederholungen vorliegen, schickt ein Run in die
[Prüfwarteschlange](datasets.md#review) des Datasets, wofür er einstehen
kann - jede bestätigte Regression und jede Antwort, an deren Bewertung sein
Bewerter gescheitert ist, eine pro Fall und Agent - und sagt, wie viele
(`routed_to_review`).
Eine [Prüfung des Vorschlags des Assistenten](authoring.md#check-with-evals)
schickt von sich aus nichts, da nichts angenommen wurde. Ein übersprungener
Bewerter schickt nichts: Seine Antworten warten auf der Seite des Runs auf
**Erneut bewerten** (Grade again). Wird das Senden abgelehnt, endet der Run
trotzdem, und seine Seite sagt, warum (`routing_error`).

**Nicht bestandene Fälle zur Prüfung senden** (Send failed cases to review)
schickt die übrigen nicht bestandenen Antworten einer Seite, für jeden, der das Dataset bearbeiten darf, und ein Fall, dessen
Bewertung eine Person überstimmt hat, wird als korrigiert markiert.

In beiden Fällen nimmt eine Antwort den Platz einer älteren, noch wartenden
Antwort desselben Falls und Agents ein, die die Warteschlange unentschieden
verlässt - ein Run nennt deren Zahl als `routed_replacing` - und eine Antwort,
die älter ist als die wartende, wird nicht gesendet. Die Antwort eines anderen
Agents auf den Fall wartet daneben.

Unter **Ergebnisse → Testläufe** zeigt ein Dataset alle gemessenen Agents in einem gemeinsamen Diagramm und einer Run-Tabelle. **Evals starten** öffnet den Dialog auf diesem Dataset und fragt nach dem Agent. Wenn alle Antworten mit demselben Konfigurationsfehler scheitern, steht **Start fehlgeschlagen** statt einer Bestehensquote; solche Runs fehlen im Qualitätsverlauf.

Die Karte **Eval-Runs** (Eval runs) im Dashboard listet die neuesten Runs der
Organisation mit ihrem Agent und ihrem Urteil. Die Fälle eines Evals und die
Bewertung durch den Bewerter bleiben aus jeder anderen Dashboard-Zahl heraus.
[Aktivität](console.md#activity) führt sie mit allen anderen Runs auf,
beschriftet mit **Eval** und **Bewerter**, und ihr Filter **Herkunft** grenzt die
Liste auf sie ein.

Die Liste in **Aktivität** zeigt, was jedem Run gestellt wurde - seine erste
Nutzernachricht oder die Frage des Eval-Falls und beim Run des Bewerters das,
was er bewertet hat -, damit sich ein Run wiederfinden und zu einem Fall machen
lässt. Ein Eval-Fall öffnet dort seinen Eval-Run auf diesem Fall, und
**Sehen, was das Modell sah** (See what the model saw) eines Falls öffnet, was
sein Modell bekommen hat.

**Alle ansehen** auf der Karte öffnet **Eval-Runs** unter `/evals`: jeden
Eval-Run, den Sie sehen dürfen, über alle Agents, der neueste zuerst,
seitenweise. Gibt es noch keinen, sagt die Seite, was ein Eval ist und wo man
einen startet.

## Einen Run starten { #starting-a-run }

Der Start besteht aus zwei Aufrufen, damit nichts ausgegeben wird, bevor jemand
gesehen hat, was es kosten wird.

```text
POST /api/v1/agents/{agent_id}/eval-runs/estimate   the estimate, nothing written
POST /api/v1/agents/{agent_id}/eval-runs            the same body; starts the run
```

Der Body nennt das Dataset (`dataset_id`, `dataset_version`), den Kandidaten
(`candidate: "version"` mit optionaler `version` oder `candidate: "draft"`),
die `environment_id`, die zu vergleichenden `model_profile_ids` und
`paired_baseline`. Die Schätzung ist der durchschnittliche Preis eines Runs des
Agents auf jedem Modell, gemessen an seinen letzten abgeschlossenen Runs, mal
die Zahl der Fälle, plus ein Aufruf des Bewerters pro Fall, wenn ein Bewerter
das Dataset bewertet .

Die Schätzung berücksichtigt modellgestützte Bewertung, wenn das Dataset sie verlangt, zum unter Bewertung gewählten Modellpreis. Kein Organisationsschalter deaktiviert diesen Bewerter.

Ein Agent ohne Historie auf einem Modell wird als typischer Fall geschätzt -
`EVAL_FALLBACK_INPUT_TOKENS` hinein, `EVAL_FALLBACK_OUTPUT_TOKENS` heraus - zum
eigenen Preis des Modells, oder mit `EVAL_FALLBACK_CASE_COST_USD` bei einem
Modell ohne bekannten Preis, und die Schätzung sagt, dass es eine grobe Annahme
ist (`basis: "fallback"`). Ein Bewerter ohne Historie wird genauso bepreist, auf
dem Modell, das sein veröffentlichter Spec nennt; die Schätzung warnt, wenn das
das getestete Modell ist, und die Seite eines Runs, wenn es das war. Die Kosten
der Baseline gehören zur Summe, außer eine aktuelle passende Baseline wird
wiederverwendet - dann kosten ihre ersten Antworten nichts, und die Schätzung
nennt den Run, aus dem sie stammen.

### Das verbleibende Budget { #the-budget-it-leaves }

Ein Eval nutzt die bestehenden Monatsbudgets des Agents und der Organisation.
Die Schätzung zeigt die verbleibenden Beträge nach dem vollständigen erwarteten
Aufwand als `agent_after_usd` und `org_after_usd`. Der Start wird mit `402`
abgelehnt, wenn erster Durchlauf plus `rerun_ceiling_usd` eines der Budgets
übersteigt. Die Obergrenze enthält alle bestätigenden Versuche bei geänderten
Ergebnissen, den Richter und Wiederholungen der Baseline, auch bei einer
wiederverwendeten Baseline. Tatsächliche Kosten können abweichen. Jede
Modellanfrage unterliegt weiterhin den Monatsbudgets; ein erschöpftes Budget
beendet den Run als `budget_exceeded`.

Auch die geschätzte Ausgabengrenze einer Suite enthält Wiederholungen und bei
Paaren beide Seiten. Die erste Veröffentlichungsschätzung enthält die bestehende
Version als Baseline der nächsten Veröffentlichung, selbst bei nur einer Version.
Diese Grenze entscheidet nur über den Start; sie stoppt keinen laufenden Test.
Jeder positive Kosten- oder Latenzanstieg von einer Baseline von null überschreitet
jede Prozentgrenze.

### Was abgelehnt wird { #what-is-refused }

Ein Run, der niemandem etwas sagen könnte, wird abgelehnt, bevor er geschätzt
wird:

- eine Dataset-Version ohne Fälle;
- Bewertung ohne erforderlichen Scorer, der einen Fall entscheiden kann: ergänze eine Prüfung, einen erwarteten Werkzeugaufruf oder Bewertungskriterien;
- ein Agent, der nie veröffentlicht wurde, für den eine Version verlangt wird -
  starte stattdessen seinen Entwurf;
- eine Baseline für eine erste Version, vor der es nichts gibt.

Eine Version, in der nur einige Fälle nichts haben, das sie bewertet, läuft
trotzdem, und die Schätzung zählt sie vorher (`ungraded_cases`): der
Startdialog, ein Check von Vorschlägen und der Dialog einer Suite sagen „1 Fall
has nothing to grade it. The result will be inconclusive.“

Eine unbekannte Umgebung liefert 404. Gleichzeitiges Erstellen oder Umbenennen von Suiten mit demselben Namen liefert 409 statt eines Serverfehlers. Ein lesbares Dataset ohne Bearbeitungs- oder Ausführungsrecht liefert 403 mit der fehlenden Berechtigung; ein nicht zugängliches Dataset bleibt bei 404 ohne Berechtigungsdetails. Ein ungültiger Entwurfstest erklärt, dass der Entwurf nicht ausgewertet werden kann, und behält die Feldprobleme bei.

### Vorschläge prüfen { #checking-suggestions }

**Er lernt nur aus Trainingsfällen.** Neben bewerteten Chats liest der Assistent fehlgeschlagene Trainingsantworten, bestätigte Regressionen, Bewerterbegründungen und Prüfungsnotizen aus zugänglichen [Datasets](datasets.md). Er erhält Trainingsquoten nach Tag und Bewerterkriterium sowie die Anzahl behobener und neuer Fehler. Kontrollfragen, Antworten und Bewertungen gelangen nie in seinen Prompt. Runs des Bewerters und des Assistenten bleiben ausgeschlossen.

Jeder Fall wird fest dem Training oder der Kontrolle zugeordnet, auch über Dataset-Versionen hinweg. Die Dataset-Einstellungen bestimmen den Kontrollanteil nur für künftige Fälle (standardmäßig 50%). Vorschlagsprüfungen messen ausschließlich Kontrollfälle; eine Verbesserungssitzung teilt die Fragen für jeden ihrer Versuche im selben Anteil neu auf und misst jeden Versuch auf seinem eigenen Kontrollteil. Beide benötigen mindestens fünf bewertbare Kontrollfragen.

Kopien von Trainingsfragen oder Quellbelegen werden anhand normalisierter Eingaben und der Quell-Run-ID ausgeschlossen, auch bei manueller Eingabe oder Generierung. Unter dem Minimum stoppt eine Sitzung mit `no_data` oder lehnt den Schritt ab, der zu wenige testen würde, und nennt die fehlende Anzahl. Der Run kennzeichnet beide Teile und ausgeschlossene Kopien. Normale Suites und Beförderungsschranken zählen weiterhin alle Fälle.

Eine Verbesserungssitzung fixiert Dataset-Version und Chat-Belegidentitäten. Ein späterer Versuch lernt aus den Trainingsergebnissen seiner eigenen Aufteilung, sodass eine Frage, die ein Versuch zurückgelegt hat, beim Schreiben des nächsten helfen kann; neue Chats und Fälle ändern nicht, was die Sitzung misst. Auf verschiedenen Fragen gemessene Versuche werden danach verglichen, was jeder gegenüber seiner eigenen Ausgangsfassung geändert hat, nicht nach ihren Bestehensquoten.

Eine menschliche Entscheidung und **Entscheidung zurücknehmen** verwerfen abhängige Run-Vergleiche und berechnen gespeicherte Suite-Ergebnisse in derselben Transaktion neu. Run, Suite, Umgebungsschranke und Beförderungsdialog zeigen das korrigierte Urteil und die prüfende Person. Das Audit hält alte und neue Zustände sowie Zählwerte fest; ein geändertes Suite-Urteil erzeugt eine neue Benachrichtigung. Namen werden aus der aktuellen Organisationsmitgliedschaft aufgelöst und nicht in aufbewahrte Ergebnisse kopiert.

Ein durch Prüfung erzielter Erfolg erlaubt eine ausdrückliche Beförderung. Er befördert oder verschiebt niemals automatisch eine folgende Umgebung, auch nicht beim periodischen Abgleich. Die Umgebungszeile zeigt das tatsächliche fehlgeschlagene oder korrigierte Wächterergebnis und verlinkt die Prüfung. Ein früheres Ergebnis mit anderen Fragen, Bewertungen, Schwellen oder einer anderen bereitgestellten Vergleichsversion bleibt als **Veraltet** mit Run-Link sichtbar, statt **Nicht geprüft** zu werden.

## Als was jeder Fall läuft { #what-each-case-runs-as }

Jeder Fall ist ein gewöhnlicher Run des Agents mit der Oberfläche `eval`. Er
wird vor jeder Modellanfrage gegen die Budgets geprüft, und seine Kosten
werden erfasst. Er bleibt aus den Nutzungszahlen des Dashboards heraus, die nur
die Produktion zählen und die Kosten des Eval-Verkehrs daneben melden
(`cost.eval_usd`), und die Run-Historie lässt ihn weg, wenn danach gefragt wird
(`?exclude_surface=eval`). Das Lesen des einzelnen Runs nennt den Eval-Run und
den Fall, den er beantwortet hat (`eval_case`), für eine lesende Person, die
das Dataset sehen darf. Er läuft als die Person, die den Eval gestartet hat,
mit ihrer aktuellen Rolle, und liest oder schreibt nicht ihr persönliches
Gedächtnis.

Jeder Fall läuft **isoliert**, wie [Umgebungen](environments.md) beschreibt:
Ein Tool mit einer Testverbindung in der Umgebung des Runs läuft gegen diese,
ein Tool, von dem bekannt ist, dass es nur liest, läuft auf der normalen
Verbindung, und alles, was ohne Testverbindung schreibt, wird nicht ausgeführt
- der Aufruf und seine Argumente werden als beabsichtigter Aufruf behalten, den
das Trajektorie-Scoring trotzdem bewertet.

Jeder isolierte Versuch erhält einen temporären Workspace für seinen eigenen
Run, auch wenn der Agent Dateien sonst pro Unterhaltung, Benutzer oder Agent
teilt. Er benötigt keine Chat-Unterhaltung und verwendet keine dieser
persistenten Dateien. Der Workspace wird am Ende des Runs freigegeben.

Ein Fall aus einer Conversation kann **aus der Aufzeichnung** des Runs
beantwortet werden, aus dem er stammt (`from_recordings`): Ein Aufruf, der zur
Aufzeichnung passt, bekommt das aufgezeichnete Ergebnis, einer, der nicht
passt, wird zurückgehalten und als abweichend markiert. Ein Fall ohne
verwendbare Aufzeichnung läuft isoliert ohne sie.

### Ein Entwurf zählt nie als Version { #a-draft-is-never-counted-as-a-version }

Ein Entwurf läuft über denselben Weg, mit zwei Unterschieden. Er wird zuerst
gegen den eigenen Zugriff der startenden Person geprüft - alles, was eine
Veröffentlichung prüfen würde -, weil ein Entwurf beim Speichern nie validiert
wurde. Und seine Runs werden keiner Version zugeordnet: Sie erscheinen nicht in
der Nutzung einer Version, und die Zahlen einer Version enthalten nie Antworten
ihres Entwurfs.

Der Entwurf wird beim Start des Runs kopiert, sodass jeder Fall auf denselben
Inhalt antwortet, auch wenn jemand weiter bearbeitet.

## Ausführen und abbrechen { #running-and-cancelling }

Ein Run wird im Hintergrund ausgeführt, als eigener Job im Worker, und
übersteht daher einen Neustart der API. Fälle laufen zu wenigen gleichzeitig:
höchstens `EVAL_RUN_CONCURRENCY` pro Run und höchstens `EVAL_ORG_CONCURRENCY`
über alle Eval-Runs einer Organisation, sodass ein Dataset mit 500 Fällen nicht
jede Anfrage belegen kann, die ein Provider der Organisation erlaubt.

Abbrechen (`POST /api/v1/eval-runs/{id}/cancel`, durch die Person, die ihn
gestartet hat, oder jeden, der den Agent bearbeiten darf) stoppt, was noch nicht
begonnen hat: Bereits laufende Fälle laufen zu Ende und werden behalten, und
kein weiterer Fall startet. Wer den Job eines Runs unter **Admin** →
**Background jobs** abbricht, bevor ein Worker ihn übernommen hat, bricht den
Run ebenso ab, binnen Sekunden.

Ein Run, den sein Worker nicht beenden kann - etwa weil ihm mitten im Run die
Datenbank wegbricht -, endet sofort als `failed`, wie ein Agent-Run: Seine
laufenden Fälle schlagen fehl, die übrigen werden übersprungen, und seine Seite
sagt, dass er an einem Fehler angehalten hat und neu gestartet werden sollte. Er
wird nicht fortgesetzt. Ebenso sofort als `failed` endet ein Run, dessen Job die
Zeit ausgegangen ist oder dessen Worker währenddessen heruntergefahren wurde.

Ein Worker kann auch kommentarlos sterben. Der Worker eines laufenden Runs meldet
alle `EVAL_HEARTBEAT_SECONDS`, dass er lebt; ein Run, dessen Worker schweigt und
dessen Fälle sich `EVAL_ABANDONED_AFTER_MINUTES` lang nicht bewegt haben, wird
von einem Sweep, den der Worker jede Minute ausführt, als fehlgeschlagen beendet,
der auch seine Plätze freigibt. Ein Worker, dessen Heartbeats so lange
fehlschlagen - auf einem Host, der zu ausgelastet ist, um seine Datenbank zu
erreichen -, wird ebenso beendet, obwohl er noch arbeitet, und sein Run muss neu
gestartet werden.

Ein Run in der Warteschlange hat noch keinen Worker, der melden könnte, dass er
lebt. Er darf auf einen freien Worker oder hinter einer pausierten Job-Art warten,
solange sein Job in der Warteschlange steht; der Sweep beendet ihn erst als
fehlgeschlagen, wenn kein Job mehr übrig ist, der ihn ausführen würde. Ein Fall,
den ein toter Worker in einem bereits beendeten Run laufend zurückgelassen hat,
schlägt nach denselben `EVAL_ABANDONED_AFTER_MINUTES` fehl. Ein laufender Fall
zählt auf `EVAL_ORG_CONCURRENCY`, bis er endet, auch nachdem sein Run
abgebrochen wurde.

Solange ein Run wartet oder läuft, lassen sich die Umgebung, die er nennt, und
das Modellprofil, auf dem eine seiner Seiten läuft, nicht entfernen: Seine
übrigen Fälle würden sonst gegen die Verbindungen der Produktion antworten oder
auf einem anderen Modell als die Fälle davor.

## Ergebnisse { #results }

Jeder Versuch behält die Antwort, die gemachten Aufrufe - jeder markiert als
ausgeführt, blockiert, wiedergegeben oder abweichend -, das Urteil und die
Begründung jedes Bewerters, seine Kosten, seine Tokens und seine Latenz.
Antwort und Aufrufe werden in das Ergebnis kopiert, weil ein Run eines Falls
keine Conversation hat, in der er ein Transkript behalten könnte.

Jeder Arm des Runs wird auf zwei Achsen zusammengefasst, und pro Tag:

| Achse | Misst |
|---|---|
| Qualität | Bestehensquote unter den entschiedenen Fällen, jeder so gewertet, wie die meisten seiner Versuche ausgingen; daneben die Quote der ersten Antworten; wie viele unentschieden blieben, und warum |
| Effizienz | Kosten pro bestandenem Fall, Tokens pro Fall und Latenz bei p50 und p95 |

Jeder Versuch geht auf eine von vier Arten aus (`state` am Versuch):

- **bestanden** oder **nicht bestanden** nach seiner Bewertung;
- ebenfalls **nicht bestanden**, wenn der Run des Agenten gescheitert ist - ein
  Werkzeug hat eine Ausnahme geworfen, sein Schrittlimit, eine Schleife, eine
  Guardrail, eine vom Provider abgelehnte Anfrage -, was eine Suite sofort
  durchfallen lässt, auch wenn die Wiederholungen des Falls bestehen;
- **unvollständig**, wenn der Provider nach seinen Wiederholungen gescheitert
  ist (ein Fehler 5xx, 408 oder 429 oder gar keine Antwort), ein Bewerter eine
  Ausnahme geworfen hat, der Run abgebrochen wurde oder das Budget ausging, oder
  seine Versuche unentschieden ausgingen;
- Bewertung ohne erforderlichen Scorer, der einen Fall entscheiden kann: ergänze eine Prüfung, einen erwarteten Werkzeugaufruf oder Bewertungskriterien;

Keiner der letzten beiden ist je bestanden; die Zusammenfassung zählt sie
getrennt (`incomplete`, `ungraded`).

Der Kopf eines Runs sagt „Bestehensquote 67 % · 1 von 3 Fällen unentschieden“ und nennt das
Ergebnis unentschieden, bis jeder Fall ein Urteil hat. Ein Provider, der die
Zugangsdaten ablehnt, wird als solcher genannt, und eine Seite, deren Antworten
alle mit demselben Fehler gescheitert sind, sagt das statt eines Urteils. Ein
Fall, an dem der Agent abgestürzt ist, wo die Baseline bestand, ist eine
Regression wie jede andere, gezeigt mit ihrem Fehler.

Eine Antwort, bei der der Bewerter gescheitert ist oder die er übersprungen hat, ist **nicht bewertet**: Der Run listet diese
Bewertungen als `ungraded_score_ids`, und sie erneut zu bewerten
(`POST /api/v1/datasets/{id}/scores/rescore`) liest die im Versuch behaltene
Antwort, statt den Agent zu fragen. Das Urteil einer Person bei der
[Prüfung](datasets.md#review) ersetzt für diesen Fall das Ergebnis der Scorer,
und die Zahlen des Runs folgen ihm.

Ein Bewerter, der sucht - [Knowledge search](concepts.md#system-agent-spec) auf
seinem Toolbox-Tab -, prüft die Fakten einer Antwort an den Wissensbasen des Agents,
der sie gab, und jede seiner Bewertungen führt unter ihrer Begründung auf, was
er dort fand: das Dokument und den Anfang der Stelle. Bis seine Runs ihm einen
Verlauf geben, bepreist die Schätzung jede Bewertung mit den Schritten des
Bewerters. Ein Bewerter beginnt mit Temperatur 0, damit dieselbe Antwort
zweimal gleich bewertet wird, und seine Seite warnt, wenn sie erhöht wird.

Ein abgeschlossener Run behält Urteil, Zählungen und Bestehensquoten seines
ersten Kandidaten als `outcome`, sodass eine Liste sie liest, ohne jeden Run
erneut zu vergleichen. Er wird erneut verglichen, wenn eine Person seitdem über
eine der Bewertungen entschieden hat, auf denen er beruht, oder eine davon
erneut bewertet wurde.

```text
GET /api/v1/agents/{agent_id}/eval-runs      an agent's runs, newest first; ?draft=current
GET /api/v1/datasets/{dataset_id}/eval-runs  a dataset's runs over the agents the reader may see
GET /api/v1/eval-runs/{id}                   one run, with each arm's summary and its outcome
GET /api/v1/eval-runs/{id}/cases             cases, what each expects, and every attempt;
                                             ?outcome=, ?tag=, ?arm_id=, ?case_id=
GET /api/v1/eval-runs/{id}/comparison        a candidate arm against its baseline
GET /api/v1/eval-runs/{id}/arms/{arm}/spec   the spec one side ran; needs agents:edit
```

`?draft=current` behält die Runs, die den Entwurf in seinem jetzigen Stand
getestet haben - denselben Spec, gleich in welcher Reihenfolge seine Schlüssel
gespeichert wurden, darunter eine Prüfung von Vorschlägen, die inzwischen
angenommen sind -, und genau das liest der Veröffentlichungsdialog.
`?draft=earlier` behält die Runs, die seit der Veröffentlichung der neuesten
Version einen anderen Entwurf getestet haben - eine Prüfung erst, wenn einer ihrer
Vorschläge angenommen wurde: den Test, von dem sich der Entwurf entfernt hat. Eine
Prüfung, die am Entwurf selbst gemessen wurde, zählt in keinem von beiden.

Ein Bewerterkriterium kann für alle Fälle oder nur für Fälle mit mindestens einem ausgewählten Tag gelten. Wählen Sie unter **Bewertung** (Grading) die Tags und prüfen Sie die Anzahl; ein Fall mit mehreren passenden Tags zählt einmal. Nicht passende Kriterien werden vollständig ausgelassen und können den Fall weder scheitern noch unentschieden lassen. Prüfungsnotizen können Kriterien für einen ausgewählten Fall-Tag werden. Eine Bereichsänderung ändert den Bewertungsfingerabdruck; Wächter übernehmen sie erst nach einem autorisierten Verschieben der Anheftung.

## Mit einer Baseline vergleichen { #comparing-with-a-baseline }

Ein Vergleich ordnet beide Seiten Fall für Fall über die stabile ID des Falls
zu und meldet jeden Fall als **Regression** (bestanden, jetzt nicht mehr),
**behoben** (nicht bestanden, jetzt bestanden), unverändert oder unvollständig.
Fälle, die nur eine Seite beantwortet hat, zählen als nicht verglichen. Ebenso
ein Fall, dessen Eingabe, Verlauf, Referenzantwort, Gegenbeispiel, erwartete
Aufrufe oder Checks sich zwischen den beiden Seiten geändert haben (`changed`):
Einen Check zu verschärfen ist eine Änderung des Falls, nicht des Agents, und
die Seite des Runs sagt, wie viele sich seit der Baseline geändert haben. Eine
Änderung seiner Tags oder seiner Notiz zählt nicht.

Die Baseline wird **beim Start des Runs** gewählt, als eigene Seite am Run
gespeichert und nie neu gewählt: Wer den Run nach der nächsten Veröffentlichung
öffnet, sieht denselben Vergleich.

**Die Standard-Baseline ist günstig**: der letzte abgeschlossene Run desselben
Datasets auf der Version vor dem Kandidaten - bei einem Entwurf die
veröffentlichte Version. Es zählt nur ein Run dieser Version, wie sie
veröffentlicht ist: auf ihrem eigenen Modell, ohne vorgeschlagenen Skill- oder
Kontextinhalt, mit jedem Fall beantwortet, mit demselben Scoring bewertet und in
derselben Umgebung mit denselben `from_recordings` und `live_reads` gelaufen.
Gibt es keinen, hat der Run keine Baseline; die Schätzung sagt das
(`missing_baseline_version`), und der Startdialog bietet an, diese Version
stattdessen daneben laufen zu lassen. Beide Seiten sind mit Datum, Modell und
Dataset-Version beschriftet, weil sie sich in den letzten beiden davon
unterscheiden können.

Ein Run kann stattdessen einen **früheren Run** desselben Agents auf demselben
Dataset als Baseline nennen (`baseline_run_id`), einen abgeschlossenen - so
sieht eine [Eval-Suite](#suites), die täglich dieselbe Version prüft, die
Drift.

### Eine Baseline im selben Run { #a-baseline-in-the-same-run }

Wenn eine Entscheidung vom Ergebnis abhängt - ein Promotion-Gate, eine mit
Evals geprüfte vorgeschlagene Änderung, ein Modellvergleich -, läuft die
Baseline **im selben Run** (`paired_baseline`, und immer bei
`purpose: "gate"`). Provider verändern sich von Tag zu Tag, und eine Regression,
gemessen an den Antworten der letzten Woche, kann am Provider liegen, nicht am
Agent.

Ein abgeschlossener Baseline-Arm ersetzt einen neuen Lauf nur, wenn Version,
Dataset-Version, Modell, Scoring und Bewerter übereinstimmen, er in derselben
Umgebung mit denselben `from_recordings` und `live_reads` lief und er
innerhalb von `EVAL_BASELINE_CACHE_HOURS` fertig wurde. Der Run nennt den Run, den er
wiederverwendet hat. Nur seine ersten Antworten werden wiederverwendet: Ein Fall,
der kippt, wird ihm in diesem Run erneut gestellt.

### Ein Kippen wird bestätigt, bevor es zählt { #a-flip-is-confirmed-before-it-counts }

Ein gekippter Fall wird `EVAL_RERUNS` Mal (standardmäßig 2) wiederholt, sobald
die ersten Antworten vorliegen. Eine Regression ist **bestätigt**, wenn jede
Wiederholung des Kandidaten wieder nicht besteht und - bei einer Baseline im
selben Run - jede Wiederholung der Baseline wieder besteht; sonst wird sie als
**unbestätigt** gemeldet. Eine Behebung wird genauso bestätigt.

Jede Baseline wird neben dem Kandidaten wiederholt - eine, die hier geantwortet
hat, oder eine, deren erste Antworten aus einem früheren Run stammen -, sodass
beide Seiten ein Kippen am selben Tag bestätigen und eine glückliche Antwort der
Baseline nichts bestätigt. Die einzige Ausnahme ist eine Baseline, die der
Kandidat selbst zu einem früheren Zeitpunkt ist - derselbe Spec auf demselben
Modell, auf dieselbe Weise ausgeführt, wie sie eine Suite, die täglich eine
Version prüft, zum Vergleich heranzieht: Ihre Wiederholungen wären nur wieder
die des Kandidaten, daher wird sie nicht wiederholt, und die Wiederholungen des
Kandidaten allein bestätigen die Drift.

Ein Run, der mit einer Baseline verglichen wird, braucht mindestens eine
Wiederholung; ein Run ohne Baseline darf sie überspringen. Ein Run, der mit
einem früheren Run verglichen wird, den er nie erneut gefragt hat - einer, der
geschrieben wurde, bevor Baselines an Runs gespeichert wurden, oder einer, der
von Hand mit einem anderen Run verglichen wurde -, sagt das, und keiner seiner
gekippten Fälle ist bestätigt.

Wiederholungen heben die Latte, statt sie zu senken: Ein Kippen gilt nur als
bestätigt, wenn es bei jeder Wiederholung hält, daher bestätigen mehr
Wiederholungen weniger Kippen. Ein kleines oder günstiges Modell, das einen Fall
von Versuch zu Versuch anders beantwortet, lässt seine Kippen unbestätigt, und
das Urteil lautet `no_difference`, auch wenn sich die Bestehensquote bewegt
hat - das heißt, das Modell ist bei diesen Fällen unbeständig, nicht dass sich
nichts geändert hat. Helfen mehr Fälle im Dataset, ein beständigeres Modell oder
eine niedrigere `temperature` in seinen [Model
Settings](models.md#model-settings) und das Durchsehen der unbestätigten Fälle
in der Tabelle.

Die Seite des Runs sagt es, wenn nichts hielt, aber drei oder mehr Fälle sich
einmal änderten oder die beiden Bestehensquoten 20 Punkte oder mehr
auseinanderliegen.

Die Bewertung kann sich so sehr bewegen wie das Modell. Ein Bewerter, dessen
Kriterium auf seiner Schwelle liegt - eine Skala von 1 bis 5, die ab 4 besteht,
etwa - bewertet fast dieselbe Antwort beide Male verschieden, sodass dieselbe
Version auf denselben Fällen unterschiedlich abschneidet. Eine
[Verbessern-Sitzung](authoring.md#the-improve-wizard) liest das aus ihren eigenen
Prüfungen, ohne neuen Modellaufruf, und ihr Ergebnis sagt es, wenn Antworten
innerhalb eines Versuchs beim erneuten Stellen verschieden bewertet wurden oder
sich die heutige Version zwischen Versuchen auf ihren gemeinsamen zurückgelegten
Fragen bewegt hat - weniger als fünf gemeinsame sind zu wenige, um das zu
beurteilen.

Verwende klare Ja/Nein-Kriterien, deterministische Format- und Längenprüfungen sowie ausreichend repräsentative Fälle. Wähle ein geeignetes unabhängiges Bewertungsmodell ausdrücklich im Tab **Bewertung** des Datasets; der Modellpreis belegt keine Bewertungsqualität.

### Wie beständig die Antworten sind { #how-steady-the-answers-are }

Ein **Stabilitäts-Run** misst das Rauschen, bevor etwas verglichen wird. Er
stellt jeden Fall des Datasets und dann jeden noch einmal - `reruns`-mal,
standardmäßig einmal - und vergleicht nichts. Der Run zählt die Fälle, die
einmal als bestanden und einmal als nicht bestanden bewertet wurden: Schon zwei
davon oder ein Fünftel der gestellten Fälle bedeuten, dass ein Vergleich auf
diesem Dataset höchstwahrscheinlich nichts zeigen würde, weil sich die Antworten
oder ihre Bewertung von selbst bewegen. Nur ein Fall mit einer bewerteten ersten
Antwort und einer bewerteten Wiederholung zählt.

Bevor eine [Verbessern-Sitzung](authoring.md#the-improve-wizard) beginnt, ist der
Test, wie der Agent heute antwortet, ein Stabilitäts-Run des Entwurfs, der jede
Frage zweimal stellt: standardmäßig bei einem Dataset mit weniger als 40 Fragen
und auf Wunsch bei einem größeren, da er die Kosten verdoppelt. Findet er die
Antworten unbeständig, sagt der Startbildschirm, dass die Sitzung
höchstwahrscheinlich nichts zeigen wird, mit einem Link zu den
Bewertungskriterien und zum Bewertungsmodell. Der letzte solche Run des Entwurfs
wird nach dem Neuladen der Seite wieder angezeigt.

Über die API ist es `stability: true` bei einem Run des Entwurfs oder einer
Version, ohne `paired_baseline` oder `baseline_run_id`; seine Leseantwort hat
`purpose` `stability` und `stability` mit `asked`, `unstable` und `noisy`.

### Was das Urteil sagt { #what-the-verdict-says }

Das Urteil beruht nur auf den bestätigten Kippfällen. Eine bestätigte
Regression macht den Kandidaten `worse` - ein Fall, den er jedes Mal
verschlechtert, ist Grund genug, nicht zu veröffentlichen -, nur bestätigte Behebungen
machen ihn `better`, beides macht ihn `mixed`, und gar kein bestätigter
Kippfall ist `no_difference`. Jeder Kippfall nennt die Frage des Falls.

Unabhängig davon ergibt ein exakter McNemar-Test über die bestätigten
Kippfälle `overall`: `worse` oder `better`, wenn er die beiden Seiten bei
`EVAL_SIGNIFICANCE` unterscheidet, und null, wenn es zu wenige Kippfälle gibt,
wie bei den meisten kleinen Datasets.

Die Bestehensquote zählt jeden Fall nach der Mehrheit seiner entschiedenen
Versuche - nur nach seiner ersten Antwort, wenn er nicht wiederholt wurde, und
das Urteil einer Person über diese Antwort geht beidem vor -, sodass sie mit
den bestätigten Kippfällen übereinstimmt. Die eigene Quote der ersten
Antworten wird daneben als `first_pass_rate` behalten.

### Ein anderer Bewerter macht den Vergleich ungültig { #a-different-judge-invalidates-the-comparison }

Jede Bewertung hält den [Bewerter fest, der sie vergeben hat](datasets.md#judge):
sein Modell, seine Version, einen Fingerabdruck der Rubrik und die Version des
eigenen Prompts des Bewerters. Wurden die beiden Seiten mit unterschiedlichen
Scoring-Einstellungen bewertet oder von einem anderen Bewerter, Modell, einer
anderen Rubrik oder einem anderen Prompt, ist der Vergleich `invalid` und gibt
kein Urteil - ein Kippen sagt dann etwas über die Bewertung, nicht über den
Agent. Eine Baseline, die unter einem früheren Prompt des Bewerters bewertet
wurde, sagt das und wird nicht als zwischengespeicherte Baseline
wiederverwendet.

Ein Run, dessen Bewerter sich änderte, während seine Fälle bewertet wurden, ist
ebenfalls `invalid`: Ein Fall, dessen Versuche Bewertungen zweier Bewerter tragen,
entscheidet sich nach dem, der mehr davon bewertet hat.

### Zwei Achsen, Qualität zuerst { #two-axes-quality-first }

Das Urteil betrifft die Qualität. Effizienz wird daneben gemeldet und nie
hineingerechnet: Kosten pro bestandenem Fall, Tokens und Latenz sind jeweils
`better`, `worse` oder `unchanged`, wobei eine Änderung innerhalb von
`EVAL_EFFICIENCY_TOLERANCE` als unverändert gilt.

## Modelle vergleichen { #comparing-models }

Mehrere `model_profile_ids` lassen den Kandidaten im selben Run einmal pro
Modell laufen, jedes als eigener Arm. Jeder Arm meldet seine Bestehensquote,
Kosten und Latenz nebeneinander. Mit einer Baseline im selben Run läuft die
Baseline auf dem zuerst genannten Modell, und jeder Arm wird mit ihr
verglichen.

## Suites { #suites }

Eine **Suite** ist ein Eval-Run, an dessen Start niemand denken muss. Sie nennt
den Agent, das Dataset, die Umgebung, deren Version sie prüft, und eine
Schwelle, die jedes Ergebnis erfüllen muss, und läuft dann selbstständig. Die
Karte **Suites** steht im Evals-Tab eines Agents unter den Runs: das Dataset
jeder Suite, wann sie läuft, ihre Schwelle und wie sie zuletzt abschnitt.
Geöffnet listet eine Suite jedes Ergebnis, warum es nicht bestand, die
verschlechterten Fälle und einen Link zum Eval-Run dahinter; die Seite dieses Runs
nennt die Suite, die ihn gestartet hat.

### Wann eine Suite läuft { #when-a-suite-runs }

Jede Kombination aus:

- **Nach Zeitplan** - ein Cron-Ausdruck, gelesen auf der Uhr einer Zeitzone,
  sodass `0 6 * * *` in `Europe/Berlin` vor und nach der Zeitumstellung sechs
  Uhr in Berlin ist. Sie prüft die Version, die ihre Umgebung ausliefert - die
  täglich geprüfte Produktionsversion bemerkt, wenn sich das Modell beim
  Provider oder eine Wissensbasis darunter ändert. Ein Lauf, der verpasst
  wurde, während der Worker stand, läuft einmal.
- **Bei Veröffentlichung** - jede neue Version, mit der Version davor im selben
  Eval-Run daneben.
- **Bei Promotion** - eine Version, die auf die Umgebung der Suite promotet
  wird (die Standardumgebung, wenn sie keine nennt), gemessen an der Version,
  die sie ersetzt.
- **Wenn sich eine Abhängigkeit ändert** - ein Skill oder eine Context-Datei,
  die die geprüfte Version bindet, wird bearbeitet, oder ein Dokument in einer
  Wissensbasis, die sie durchsucht, wird hinzugefügt, neu eingelesen oder
  gelöscht. Spezialisten, die die Version definiert, zählen als die Version.
  Eine Reihe von Änderungen ist ein Lauf, fällig
  `EVAL_SUITE_DEPENDENCY_DEBOUNCE_SECONDS` nach der ersten. Ein Modellprofil
  lässt sich nicht an Ort und Stelle ändern - einen Agent auf ein anderes zu
  richten ist eine Veröffentlichung -, und ein Provider, der das Modell dahinter
  austauscht, ist das, was der Zeitplan bemerkt.
- **Jetzt ausführen** - von Hand, als die Person, die es drückt.

Eine Suite, die darauf wartet, eine Version zu prüfen, nimmt den nächsten
Trigger für dieselbe Version auf, sodass eine Veröffentlichung und die
Promotion dieser Version danach ein Lauf sind. Eine Suite führt einen Eval-Run
zur Zeit aus; eine Änderung, die währenddessen kommt, wartet auf den nächsten.
Eine pausierte Suite läuft nicht, weder durch einen Trigger noch von Hand.

Eine Suite, die **eine Umgebung bewacht**, läuft auch vor einer Promotion
darauf - auf der Version, die promotet werden soll, neben der, die die Umgebung
ausliefert -, und die Promotion wartet, bis sie besteht; siehe
[Eine Promotion mit Evals bewachen](environments.md#guarding-a-promotion-with-evals).
Ihre Ergebnisse heißen *Vor der Promotion* (`gate`). Eine Suite, die eine
Umgebung bewacht, ist auf die Dataset-Version und das Scoring festgelegt, die sie
hatte, als sie Wächter wurde; das Dataset zu bearbeiten ändert also nicht, was
sie prüft, bis die Festlegung verschoben wird. Sie lässt sich erst löschen, wenn
sie dort abgenommen ist.

### Was ein Ergebnis erfüllen muss { #what-a-result-must-meet }

Ohne Mindestbestehensquote oder früheres vergleichbares Ergebnis erhält eine vollständige erste Messung den Status **Vergleichsbasis gesetzt**, auch wenn alle Fälle durchgefallen sind. Sie dient späteren Vergleichen und gilt nicht als bestanden: Sie öffnet keine Promotionsschranke und verschiebt keine folgende Umgebung. Setze eine Mindestquote für eine absolute Qualitätsanforderung. Beim Upgrade werden frühere Bestehensergebnisse ohne beide Kriterien neu eingestuft; bereits verschobene Umgebungen bleiben zur Prüfung durch den Betreiber bestehen.

Ein Ergebnis **besteht nicht**, wenn mehr Fälle reproduzierbar gegenüber der
Baseline brechen, als die Suite erlaubt - standardmäßig keiner, also lässt eine
bestätigte Regression es durchfallen -, oder wenn die Bestehensquote, jeder
Fall nach der Mehrheit seiner Versuche, unter das Minimum der Suite fällt. Die
Richtung aus dem McNemar-Test steht neben dem Ergebnis und entscheidet es nie.
Zwei optionale Grenzen prüfen die Effizienz: den Anstieg der Kosten pro
bestandenem Fall und der p95-Latenz gegenüber der Baseline; leer prüfen sie
nichts.

Ein Ergebnis, dessen Vergleich
[ungültig](#a-different-judge-invalidates-the-comparison) ist oder in dem auch
nur ein Fall unvollständig oder nicht bewertet blieb, ist **ohne Ergebnis** - nie
bestanden -, es sei denn, etwas ist klar durchgefallen: eine bestätigte
Regression oder ein Minimum, das die Bestehensquote verfehlt, selbst wenn jeder
unentschiedene Fall bestünde. Es nennt die Fälle, die unentschieden blieben.

Eine Guardrail-Blockade wird als Ablehnung mit der gespeicherten Begründung bewertet; vom Ausgabe-Guardrail zurückgehaltener Inhalt wird nicht bewertet. Das Warten auf eine Freigabe oder Antwort, ein Abbruch und ein unvollendeter Lauf lassen den Fall unvollständig. Ein fehlgeschlagener Lauf, eine gestoppte Schleife oder eine Schrittgrenze zählt als Ausfall. Die Ausfälle erster Antworten werden unabhängig von der Mehrheit der Versuche gezählt: Jeder solche Ausfall lässt die Suite scheitern, auch wenn Wiederholungen bestehen oder unentschieden enden.

Ein Wächter hält die Veröffentlichung des Bewerters zusammen mit Dataset und Bewertung fest. Eine neue Veröffentlichung ändert weder seine Läufe noch deren erneute Bewertung. Das Verschieben braucht `promotions:override` und protokolliert alte und neue Bewerterversion in `agent.environment_guards_changed`. Ein fehlender angehefteter Bewerter lässt die Bewertung unvollständig; eine neue Veröffentlichung wird nie automatisch gewählt. Nach dem Upgrade öffnen alte Läufe ohne gespeicherte Bewerteranheftung kein Tor.

Bei einer Suite ohne Wächter ändert eine neue Veröffentlichung die Bewertung: Der nächste Vergleich bleibt einmal ohne Ergebnis und der Eigentümer wird benachrichtigt. Eine
Bestehensquote unter dem Minimum lässt ein Ergebnis unabhängig vom Vergleich
durchfallen: Das Minimum braucht keine Baseline. Ein Ergebnis, dessen Eval-Run
abgebrochen wurde, ist ebenfalls ohne Ergebnis und sagt das; eines, dessen Run
fehlgeschlagen ist, ist ein Fehler.

Eine Suite läuft nicht, wenn ihre Schätzung das verbleibende Budget oder ihre eigene Grenze überschreitet, keine veröffentlichte Version existiert oder kein erforderlicher Scorer einen Fall entscheiden kann.

Geplante Läufe und Läufe nach
einer Abhängigkeit werden mit dem letzten bestandenen Lauf der Suite auf
derselben Version verglichen - dem letzten als gut bekannten Stand, sodass ein
verschlechterter Fall verschlechtert bleibt, bis ihn jemand behebt - und messen so die
Drift; eine Veröffentlichung oder Promotion lässt ihre Baseline im selben Run
laufen. Nach einem Ergebnis, das sich mit diesem Lauf nicht vergleichen ließ -
weil sich die Bewertung seitdem geändert hat -, lässt der nächste die Version
davor neben sich laufen, so bewertet, wie es jetzt geschieht, damit er wieder
bestehen und der Lauf werden kann, mit dem die folgenden verglichen werden.

Wenn beide zusammen das `max_run_usd` der Suite überschreiten würden, der
Kandidat allein aber nicht, läuft der Kandidat ohne die Version davor neben
sich: verglichen mit dem letzten vergleichbaren Lauf dieser Version, wenn noch
einer da ist, sonst an seinen eigenen Zahlen gemessen. Lässt sich nichts
vergleichen, sagt das Ergebnis „Not compared: running the earlier version too
would exceed the suite's cost cap.“, und ein bestandenes Ergebnis, das das sagt,
benachrichtigt den Eigentümer der Suite.

Eine [Prüfung der Vorschläge des Authoring-Assistenten](authoring.md#check-with-evals)
auf einer Suite wird am selben Schwellenwert gemessen, ist aber kein Ergebnis der
Suite: Sie steht in keinem ihrer Verläufe und benachrichtigt niemanden.

### Als wer sie läuft, und wer benachrichtigt wird { #who-it-runs-as-and-who-is-told }

Eine Suite läuft als die Person, die sie zuletzt gespeichert hat - ihr
**Eigentümer** -, mit deren Berechtigungen zum Start des Runs. Niemand sieht
einem geplanten Lauf beim Start zu, also stimmt, wer eine Suite speichert,
ihren Kosten zu, und das Formular nennt vorher den Preis eines Laufs und eines
Monats des Zeitplans. Wer die Suite sonst ändert, übernimmt sie. Eine Suite,
deren Eigentümer die Organisation verlässt oder sie nicht mehr ausführen kann,
pausiert mit dem Grund - ebenso eine, deren Umgebung entfernt wird, ob schon
pausiert oder nicht, statt still eine andere Version zu prüfen. Sie lässt sich
erst fortsetzen, wenn jemand wieder eine Umgebung für sie wählt.

Der Eigentümer wird benachrichtigt, wenn ein Ergebnis nicht besteht, ohne
Ergebnis bleibt oder nicht läuft - einmal pro Serie solcher Ergebnisse auf einer
Version, mit den verschlechterten oder unbewerteten Fällen -, im Benachrichtigungscenter und per E-Mail, wenn er sie
eingeschaltet hat. Slack ist noch kein Benachrichtigungskanal.

## Einstellungen { #settings }

| Einstellung | Standard | Was sie entscheidet |
|---|---|---|
| `EVAL_RUN_CONCURRENCY` | `3` | Fälle, die ein Run gleichzeitig ausführt |
| `EVAL_ORG_CONCURRENCY` | `6` | Fälle, die eine Organisation gleichzeitig ausführt, über ihre Runs hinweg |
| `EVAL_RERUNS` | `2` | Wiederholungen eines gekippten Falls; ein Run kann 0 bis 5 verlangen |
| `EVAL_BASELINE_CACHE_HOURS` | `24` | Wie alt eine passende Baseline sein darf, um wiederverwendet zu werden |
| `EVAL_SIGNIFICANCE` | `0.05` | Das Niveau, unter dem bestätigte Kippfälle ein Urteil sind |
| `EVAL_EFFICIENCY_TOLERANCE` | `0.05` | Eine relative Änderung von Kosten, Tokens oder Latenz, die als keine zählt |
| `EVAL_FALLBACK_INPUT_TOKENS` | `2000` | Die Input-Tokens, mit denen ein Fall auf einem Modell ohne Historie bepreist wird |
| `EVAL_FALLBACK_OUTPUT_TOKENS` | `400` | Die Output-Tokens, mit denen ein Fall auf einem Modell ohne Historie bepreist wird |
| `EVAL_FALLBACK_CASE_COST_USD` | `0.05` | Die Schätzung pro Fall auf einem Modell ohne Historie und ohne bekannten Preis |
| `EVAL_ESTIMATE_SAMPLE` | `50` | Wie viele letzte Runs die Schätzung mittelt |
| `EVAL_ABANDONED_AFTER_MINUTES` | `10` | Wie lange ein laufender Run bei schweigendem Worker stillstehen darf, bevor der Sweep ihn beendet |
| `EVAL_HEARTBEAT_SECONDS` | `60` | Wie oft ein arbeitender Run meldet, dass er lebt |
| `EVAL_SUITE_DEPENDENCY_DEBOUNCE_SECONDS` | `600` | Wie lange eine Suite nach einer Änderung an einem Skill, einer Context-Datei oder einer Wissensbasis wartet, damit eine Reihe von Änderungen ein Lauf ist |

## Zugriff { #access }

Einen Run zu starten - oder zu fragen, was er kosten würde - erfordert zuerst
`runs:view`: Ein Run kostet Geld, und wer ihn nicht lesen oder abbrechen könnte,
darf ihn nicht starten, welche Grants er auch hat. Wo die Konsole ihm sonst ein
Start-Bedienelement anbieten würde, zeigt sie es deaktiviert und sagt warum.
Jeder Weg, einen zu starten, fragt dasselbe: Run evals, eine Suite, Test Entwurf
und Mit Evals prüfen des Assistenten.

Ein Start erfordert dann `datasets:run` auf dem Dataset und `agents:run`
auf dem Agent, jeweils mit den Grants der Ressource aufgelöst. Den Entwurf
laufen zu lassen erfordert außerdem `agents:edit` auf dem Agent, weil der Entwurf
die laufende Arbeit der Bearbeiter ist. Der Bewerter braucht, wenn er das Dataset
bewertet, was das [Scoring](datasets.md#scoring) sagt.

Einen Run zu lesen erfordert `runs:view` und dass die lesende Person sowohl den
Agent als auch das Dataset sehen kann - ein Run über ein Dataset, das sie nicht
öffnen kann, wird nicht aufgelistet, und eine Anfrage danach per ID antwortet
`404`, wie bei einem Run einer anderen Organisation. Die Runs eines Datasets
erfordern außerdem `datasets:view` darauf und listen nur die Agents, die die
lesende Person sehen darf.

Eine Suite anzulegen, zu ändern, zu pausieren oder auszuführen erfordert
`agents:edit` und `agents:run` auf dem Agent, `datasets:run` auf dem Dataset und
`runs:view`,
und eine Person, die als sie selbst angemeldet ist: Eine Suite gibt als die
Person aus, die sie speichert, also kann das weder ein API-Schlüssel noch ein
Administrator, der für jemanden handelt. Die Suites eines Agents zu lesen
erfordert `runs:view` und den Agent; die Fragen der Fälle, die ein Ergebnis
nennt, sieht nur, wer das Dataset öffnen darf.

## Was ein Run behält { #what-a-run-keeps }

Ein Ergebnis enthält die Antwort des Agents und die Argumente jedes Aufrufs,
den er gemacht hat, und kann daher personenbezogene Daten aus dem beantworteten
Fall und aus der Aufzeichnung enthalten, aus der geantwortet wurde. Es wird mit
seinem Run gelöscht, und ein Run mit seinem Agent oder seinem Dataset; das
Löschen der Conversation, aus der ein Fall stammt, löscht keine bereits daraus
erzeugten Ergebnisse. [Datenschutz](data-protection.md) führt es mit den
anderen Speichern auf.

Erkannte Geheimnisse in gespeicherten Antworten, Werkzeugaufrufen und Fehlern werden durch dieselben Platzhalter wie in der Prüfung und Dataset-Fällen ersetzt. Die erste Bewertung prüft die Originalantwort im Arbeitsspeicher vor dem Speichern; eine erneute Bewertung verwendet die gespeicherten, bereinigten Daten. Das Upgrade bereinigt auch vorhandene Ergebnisse; ein Downgrade stellt entfernte Geheimnisse nicht wieder her.