claude plugin eval führt Ihr Plugin gegen eine Suite von Testfällen aus und bewertet die Ergebnisse. Jeder Fall ist eine realistische Eingabeaufforderung plus ein oder mehrere Grader. Ein Grader ist eine Bestanden/Nicht-Bestanden-Prüfung auf das, was Claude produziert hat, wie z. B. ein Regex über die Antwort, ob ein bestimmtes Tool aufgerufen wurde, oder eine Rubrik, die ein zweites Modell über die Antwort beurteilt.
Sie müssen die Suite nicht von Hand schreiben; claude plugin eval init fragt Sie nach Ihrem Plugin, schlägt die Fälle und Grader vor, probiert sie aus und schreibt die Dateien, und Sie können Claude bitten, dasselbe aus einer bereits offenen Sitzung zu tun.
Verwenden Sie Evals, um zu messen, wie zuverlässig Ihr Plugin Claude zum richtigen Ergebnis lenkt, um Regressionen zu erkennen, wenn Sie das Plugin ändern oder ein neues Modell ausgeliefert wird, und um zu sehen, was das Plugin im Vergleich zu keinem Plugin beiträgt.
Diese Seite ist für Plugin- und Skill-Autoren, die ein funktionierendes Plugin haben und sein Verhalten testen möchten, sowie für Teams, die Plugin-Änderungen in CI gaten. Das Fallformat unterscheidet sich von der Datei evals/evals.json, die das skill-creator Plugin verwendet. Um ein Plugin zu erstellen, siehe Plugins erstellen; um die Dateien eines Plugins auf Syntax- und Schemafehler zu überprüfen, anstatt sein Verhalten zu überprüfen, verwenden Sie claude plugin validate.
Jeder Eval-Durchlauf und jeder Judge-Grader ist ein echter Modellaufruf auf Ihrem Konto, der gegen die Nutzung Ihres Plans oder Ihre API-Rechnung angerechnet wird. Überprüfen Sie daher zunächst die Anforderungen. Erstellen Sie dann Ihre erste Eval-Suite, oder gehen Sie zu Evals in CI ausführen, wenn Sie bereits eine haben.
Anforderungen
Um Plugin-Evals auszuführen, benötigen Sie:- Claude Code v2.1.269 oder später. Führen Sie
claude --versionaus, um zu überprüfen, undclaude update, um zu aktualisieren. - Ein Plugin-Verzeichnis mit einem
plugin.jsonoder.claude-plugin/plugin.jsonManifest, oder ein Skills-Directory-Plugin. - Die gleiche Authentifizierung und den gleichen Modell-Provider, den Ihre normalen Claude Code Sitzungen verwenden. Eval-Durchläufe, Judge-bewertete Grader und
claude plugin eval initrufen das Modell mit Ihren Anmeldedaten auf, daher werden sie gegen Ihre Plan-Nutzungslimits oder Ihre API-Rechnung angerechnet. Wenn der Befehl Kosten meldet, ist die Zahl eine Listenpreis-Schätzung dieser Aufrufe.
Wie ein Eval-Durchlauf funktioniert
Eine Eval-Suite befindet sich in einem Verzeichnis namensevals/ innerhalb Ihres Plugins, angeordnet wie Fälle schreiben und verfeinern zeigt. Jeder Fall ist sein eigenes Unterverzeichnis mit einer Eingabeaufforderung und einem oder mehreren Gradern. Die Eingabeaufforderung ist etwas, das eine Person, die Ihr Plugin verwendet, eingeben könnte, wie z. B. eine Anfrage, die einer seiner Skills verarbeiten sollte.
Was in einem Durchlauf passiert
Für jeden Durchlauf eines Falls startet Claude Code eine frische, isolierte nicht-interaktive Sitzung mit nur Ihrem Plugin geladen, sendet die Eingabeaufforderung und lässt Claude arbeiten, bis es fertig ist oder das Limit des Falls für Züge oder Zeit erreicht. Jeder Grader überprüft dann die endgültige Antwort, das Transkript oder eine Datei, die Claude erstellt hat, und bestätigt oder lehnt ab.Wie ein Fall bewertet wird
Ein Durchlauf eines nicht-deterministischen Agenten sagt Ihnen wenig, daher wird jeder Fall standardmäßig dreimal ausgeführt. Der Score eines Durchlaufs ist der Anteil seiner bestandenen Grader, gewichtet, wenn Sie Gewichte festlegen, und der Score des Falls ist der Durchschnitt über seine Durchläufe. Ein Fall wird bestanden, wenn sein Score den--threshold erfüllt, standardmäßig 1,0. Bei Modellaufrufen führt eine Suite ungefähr Fälle × Durchläufe Agent-Durchläufe mit dem Plugin durch und ebenso viele für die Baseline ohne Plugin, plus drei kurze Judge-Aufrufe pro llm oder baseline Grader pro Durchlauf.
Die Baseline ohne Plugin
Ein hoher Score allein sagt Ihnen nicht, dass das Plugin geholfen hat, da Claude auch ohne es gleich gut abschneiden könnte. Um die beiden zu trennen, werden die Durchläufe jedes Falls standardmäßig mit keinem Plugin geladen wiederholt, und Sie erhalten zwei Scores,WITH und W/OUT. Ihr Unterschied, Δ, ist das, was das Plugin beigetragen hat. Wenn ein Fall sowohl mit als auch ohne Plugin 1,0 bewertet wird, ist das Plugin nicht das, was ihn bestanden hat. Die beiden Sätze von Durchläufen werden als With-Arm und Without-Arm bezeichnet; Vergleich mit einer Baseline ohne Plugin behandelt, wie Grader über sie hinweg bewertet werden und wie man die Baseline ausschaltet.
Erstellen Sie Ihre erste Eval-Suite
Diese Anleitung schreibt einen Fall für Ihr eigenes Plugin, führt ihn aus und liest das Ergebnis. Bevor Sie beginnen, stellen Sie sicher, dass Sie haben:- Claude Code v2.1.269 oder später und die anderen Anforderungen
- Ein Terminal, das in Ihrem Plugin-Stammverzeichnis geöffnet ist, dem Verzeichnis, das
plugin.jsonoder.claude-plugin/plugin.jsonenthält - Einen Skill im Plugin, den Sie testen möchten, und eine Anfrage, die ein Benutzer eingeben würde, die ihn auslösen sollte
1
Erstellen Sie die Fälle
Führen Sie vom Plugin-Stammverzeichnis aus aus:Wenn Claude Code diesem Verzeichnis noch nicht vertraut, fragt es zunächst
Trust this plugin directory?; antworten Sie mit y. Eine interaktive Claude Code Sitzung wird dann geöffnet. Claude liest Ihr Plugin und fragt Sie, wie ein gutes Ergebnis aussieht, schlägt Eingabeaufforderungen vor, die das Plugin auslösen sollten und nicht sollten, entwirft Grader für jeden, probiert sie einmal aus, um zu überprüfen, ob sie sich verhalten, und schreibt ein Fallverzeichnis pro Eingabeaufforderung unter evals/, jeweils nach seiner Eingabeaufforderung benannt. Wenn Claude Ihnen sagt, dass die Suite bereit ist, beenden Sie diese Sitzung mit /exit oder Ctrl+D, um zu Ihrer Shell zurückzukehren.Wenn Sie bereits eine Claude Code Sitzung am Plugin-Stammverzeichnis geöffnet haben, können Sie stattdessen Claude dort bitten, claude plugin eval init auszuführen. Claude führt den Befehl aus und stellt Ihnen dann die gleichen Fragen in dieser Konversation.Wenn Sie einen Fall lieber selbst schreiben möchten, um genau zu sehen, welche Dateien enthalten sind, folgen Sie Schreiben Sie einen Fall von Hand und kommen Sie hierher zurück, um ihn auszuführen.2
Führen Sie die Suite aus
Zurück an Ihrer Shell im Plugin-Stammverzeichnis führen Sie jeden Fall unter Sie haben diesem Verzeichnis bereits in Schritt 1 vertraut, daher startet der Durchlauf sofort. Wenn Sie den Fall stattdessen von Hand geschrieben haben, fragt der Durchlauf zunächst
evals/ aus:Trust this plugin directory? [y/N]; antworten Sie mit y. Was ein Durchlauf zugreifen kann erklärt, wofür Sie zustimmen.Jeder Fall wird dreimal mit Ihrem Plugin und dreimal ohne es ausgeführt, daher ist ein Fall sechs Durchläufe. Eine Fortschrittszeile wird gedruckt, wenn jeder Durchlauf fertig ist, mit dem Score dieses Durchlaufs und dem Urteil jedes Graders.3
Lesen Sie die Zusammenfassung
Wenn die Suite fertig ist, sehen Sie eine Zusammenfassungstabelle, gefolgt von dem Ort, an den der Bericht ging:
WITH ist der Score des Falls mit Ihrem Plugin geladen, W/OUT ist der Score ohne es, und ein positives Δ bedeutet, dass das Plugin den Score erhöht hat. COST ist eine Listenpreis-Schätzung der Modellaufrufe, und NOTES zeigt die Erklärung des höchstgewichteten fehlgeschlagenen Graders oder den Fehler des Durchlaufs aus dem With-Arm.4
Öffnen Sie den Bericht und iterieren Sie
Öffnen Sie die Ersetzen Sie
Published: URL oder den Report: Pfad, wenn keine Published: Zeile angezeigt wird, um das Urteil jedes Graders und die Erklärung für jeden Durchlauf zu sehen, und für llm Grader die Stimmen des Judges und den Auszug, den er bewertet hat. Die Published: Zeile wird nur angezeigt, wenn Ihr Konto Berichte veröffentlichen kann.Der häufigste erste Fund ist ein Δ nahe Null mit dem fehlgeschlagenen tool_used: Skill Grader des Falls, was bedeutet, dass Claude Ihren Skill bei natürlicher Formulierung nicht auswählt. Passen Sie die description des Skills an, führen Sie claude plugin eval . erneut aus und vergleichen Sie.Um einen Fall kostengünstig zu iterieren, führen Sie einen einzelnen Arm einmal aus. Ein einzelner Durchlauf ist verrauscht, daher bestätigen Sie jede Änderung bei den standardmäßigen drei Durchläufen, bevor Sie ihr vertrauen. Mit einem Arm zeigt die Tabelle SCORE und PASS% Spalten statt WITH, W/OUT und Δ:<case-name> durch einen der Verzeichnisnamen unter evals/.Fälle schreiben und verfeinern
Die Fälle, dieclaude plugin eval init schreibt, sind einfache Dateien, die Sie öffnen, ändern und hinzufügen können. Ein Fall ist ein Verzeichnis unter dem Eval-Verzeichnis des Plugins, das eine prompt.md, eine case.yaml oder beide enthält. Um Fälle zu gruppieren, verschachteln Sie sie unter einem Verzeichnis, das selbst kein Fall ist; alles innerhalb eines Fallverzeichnisses, wie graders/ und Fixture-Dateien, gehört zu diesem Fall.
Dies ist das Layout, das claude plugin eval init schreibt und das für neue Suites verwendet werden sollte. Die Eval-Suite-Referenz hat den vollständigen Baum, einschließlich Mocks und Ergebnisse:
Schreiben Sie einen Fall von Hand
Der empfohlene Weg ist, Claude die Fälle mitclaude plugin eval init schreiben zu lassen. Um stattdessen einen selbst zu schreiben, beginnen Sie mit einer leeren Vorlage. Der folgende Befehl schreibt einen Fall namens first-case mit einer Platzhalter-prompt.md und einem Platzhalter-Grader und führt nichts aus:
prompt.md schreiben Sie die Nachricht, die Claude in jedem Durchlauf erhält, und legen die Limits und Tools des Durchlaufs in seinem Frontmatter fest. Öffnen Sie evals/first-case/prompt.md und ersetzen Sie den Platzhalter-Body durch eine Anfrage, die einer Ihrer Skills verarbeiten sollte, formuliert wie ein Benutzer sie eingeben würde, anstatt den Skill zu benennen. Dieses Beispiel ist für einen Skill, der Commit-Nachrichten entwirft; verwenden Sie Ihre eigene Anfrage:
graders/ ist eine Prüfung, die nach dem Durchlauf angewendet wird. Öffnen Sie evals/first-case/graders/criteria.md und ersetzen Sie den Platzhalter durch eine Rubrik für das Judge-Modell, geschrieben als konkrete PASS- und FAIL-Bedingungen:
evals/first-case/graders/skill-fired.md, ersetzen Sie your-skill-name durch den name aus Ihrem Skill’s SKILL.md:
plugin-name:skill-name. Grader-Typen listet die anderen verfügbaren Prüfungen auf, wie z. B. das Abgleichen eines Regex oder das Bestätigen, dass eine Datei erstellt wurde.
Wenn beide Dateien gespeichert sind, führen Sie den Fall wie die Schnellstart mit claude plugin eval . vom Plugin-Stammverzeichnis aus.
Legen Sie Durchlauf-Limits und Tools in prompt.md fest
Legen Siemax_turns, timeout_seconds, model, tags und die allowed_tools eines Falls in der Frontmatter von prompt.md fest; die prompt.md Frontmatter Referenz listet jedes Feld und seinen Standard auf. Claude erhält den Body genau wie Sie ihn geschrieben haben. @path Erwähnungen darin werden nicht in Datei-Anhänge erweitert, daher müssen Sie, wenn Claude eine Datei lesen muss, ein Tool dafür in allowed_tools gewähren.
Wählen Sie Grader und gewichten Sie sie
Die Frontmatter eines Graders legt seinentype fest und optional ein weight, das ihn für mehr des Scores des Durchlaufs zählen lässt, und einen arm, der steuert, wie er gegen die Baseline bewertet wird. Von den sechs Typen werden regex, tool_used, tool_order und file_exists aus dem Transkript und den Dateien berechnet und kosten nichts, während llm und baseline ein Judge-Modell aufrufen und zu den Kosten des Durchlaufs beitragen.
Es gibt keine benutzerdefinierten Code-Grader. Grader-Typen listet die Optionen und Bestanden-Bedingungen jedes Typs auf, und was ein Grader ansehen kann listet die Werte auf, die target und focus akzeptieren.
Der Judge für llm und baseline Grader ist standardmäßig ein kleines schnelles Modell. Übergeben Sie --judge-model sonnet oder eine vollständige Modell-ID, um ein stärkeres für nuancierte Rubriken zu verwenden.
Wählen Sie Grader, die ein stabiles Signal geben
Einllm Grader fragt ein Modell nach einem Urteil, daher kann seine Antwort zwischen Durchläufen unterschiedlich sein, und sie unterscheidet sich mehr, je länger der Text ist, den es lesen muss. Diese Gewohnheiten halten die Scores einer Suite stabil genug, um ihnen zu vertrauen:
- Für lange Ausgaben wie eine generierte Datei bewerten Sie sie mit einem
regexGrader über den Inhalt der Datei, der die ganze Datei jedes Mal gleich überprüft. Behalten SiellmGrader für kurze Ausgaben, mit Rubriken, die als konkrete PASS- und FAIL-Bedingungen geschrieben sind. - Geben Sie jedem Fall einen Grader auf das Ergebnis, wie die endgültige Nachricht oder eine produzierte Datei, und einen auf wie Claude dorthin kam, wie
tool_usedodertool_order. Zusammen sagen sie Ihnen sowohl, ob die Antwort richtig war, als auch ob Ihr Plugin sie produziert hat. - Wenn ein
tool_used: SkillGrader eines Falls bestanden wird, aberΔnegativ ist, verdächtigen Sie den Judge vor dem Plugin. Ein kleines Judge-Modell kann eine korrekte Antwort als falsch markieren, weil sie anders formatiert ist als das, was die Rubrik beschreibt. Führen Sie erneut mit--judge-model sonnetaus und straffen Sie die Rubrik, damit die Formatierung das Urteil nicht entscheidet. - Um zu überprüfen, dass ein Build oder Test innerhalb des Durchlaufs bestanden wurde, bitten Sie die Eingabeaufforderung Claude, ihn auszuführen und das Ergebnis in eine Datei zu schreiben, bewerten Sie diese Datei und bestätigen Sie, dass der Befehl mit einem
tool_usedGrader ausgeführt wurde, desseninput_matchden Befehl benennt.
Bewerten Sie gegen die Baseline ohne Plugin
Wenn ein Plugin unter Test steht, wird jeder Fall standardmäßig in zwei Arms ausgeführt. Der With-Arm ist seine Durchläufe mit dem Plugin geladen, und der Without-Arm ist die gleiche Anzahl von Durchläufen ohne Plugin. Die Zusammenfassung und der Bericht zeigen beide Scores undΔ, den With-Arm Score minus den Without-Arm Score. Übergeben Sie --ablation none, um nur den With-Arm auszuführen, was die Kosten halbiert, wenn Sie den Vergleich nicht benötigen, wie z. B. beim Iterieren über Grader.
In einem Zwei-Arm-Durchlauf werden einige Grader mit scored: false gemeldet. Eine Prüfung wie „der Skill wurde aufgerufen” kann ohne das Plugin nie bestanden werden, daher würde das Zählen den Without-Arm gegen Null drücken und Δ aufblasen. Um die beiden Arms vergleichbar zu halten, schließt Claude Code solche Grader aus der Bewertung in beiden Arms aus und meldet sie im With-Arm nur als Bestanden/Nicht-Bestanden-Indikatoren. Das umfasst:
- Jeden
tool_usedGrader, dessentoolSkillist - Jeden Grader, den Sie mit
arm: with-onlymarkieren
arm: both auf einen Grader, um ihn in beiden Arms unabhängig zu bewerten, was Sie für eine „darf den Skill nicht aufrufen” Prüfung mit min: 0 und max: 0 wollen. Unter --ablation none wird nichts ausgeschlossen, daher kann die gleiche Suite in den beiden Modi einen anderen absoluten Score produzieren.
Verwenden Sie ein anderes Eval-Verzeichnis
Wennevals/ bereits von einem anderen Tool verwendet wird, behalten Sie die Suite in einem anderen Verzeichnis. Sie können dieses Verzeichnis in der plugin.json des Plugins aufzeichnen, damit jeder Durchlauf und jeder Mitarbeiter es verwendet, oder übergeben Sie es in der Befehlszeile für einen einzelnen Durchlauf:
- In
plugin.json: fügen Sie"experimental": { "evals": "quality/evals" }hinzu. - In der Befehlszeile: übergeben Sie
--eval-dir quality/evalsan sowohlclaude plugin evalals auchclaude plugin eval init.
qa oder quality/evals an; ein absoluter Pfad oder einer mit .. wird abgelehnt: als Flag-Wert ist es ein Fehler, während ein nicht verwendbarer Manifest-Wert eine Warning: Zeile druckt und der Durchlauf stattdessen evals/ verwendet. Fälle, Ergebnisse und init Ausgabe verschieben sich alle in dieses Verzeichnis.
Richten Sie Fixtures und Mocks ein
Ein Fall kann mehr als eine Eingabeaufforderung benötigen: Dateien oder ein Git-Repository im Arbeitsbereich, eine frühere Konversation zum Fortsetzen oder Antworten von den MCP-Servern, mit denen Ihr Plugin spricht. Jede davon wird neben dem Fall eingerichtet, damit Durchläufe wiederholbar bleiben.Säen Sie den Arbeitsbereich oder die Konversation
Jeder Durchlauf startet in einem leeren Arbeitsbereich. Wenn ein Fall mehr als die Eingabeaufforderung benötigt, fügen Sie nebenprompt.md eine case.yaml mit einem context Block hinzu.
Um zuerst Fixture-Dateien oder ein Git-Repository zu erstellen, schreiben Sie ein Bash-Skript im Fallverzeichnis und benennen Sie es in context.scaffold_script. Das Skript wird als Sie ausgeführt, außerhalb der Sandbox des Agenten, und nur wenn Sie --scaffold übergeben, daher übergeben Sie dieses Flag nur für Suites, die Sie oder Ihre Organisation geschrieben haben. Um eine frühere Konversation fortzusetzen, speichern Sie das Transkript als .jsonl Datei und benennen Sie es in context.history_file, und die Eingabeaufforderung des Falls wird zum nächsten Benutzer-Turn. Um Claude Fixture-Verzeichnisse im Fall während des Durchlaufs lesen zu lassen, listen Sie sie in context.add_dirs auf.
Eine case.yaml benötigt auch schema_version: "1.1" und name; die case.yaml Felder Referenz hat die vollständige Liste.
Diese case.yaml säet einen Arbeitsbereich aus einem Skript und lässt Claude Fixtures aus einem resources/ Verzeichnis lesen:
Mock MCP Server
Sie können ein Plugin evaluieren, dessen Skills MCP-Tools aufrufen, ohne den echten Service dahinter. Legen Sie eine Markdown-Datei pro Tool unterevals/mocks/<server>/<tool>.md für die ganze Suite oder unter einem eigenen mocks/ Verzeichnis eines Falls für einen Fall, wobei <server> der Name des Servers in der MCP-Konfiguration Ihres Plugins ist.
Ein Durchlauf startet niemals die echten MCP-Server Ihres Plugins, es sei denn, Sie fragen danach. Claude Code registriert einen Stand-In unter jedem Server-Namen. Tools mit einer Mock-Datei antworten daraus und sind ohne einen --allow-tools Grant erlaubt, und ein Tool ohne Mock-Datei ist für Claude nicht verfügbar. Ein Server ohne Mocks überhaupt erscheint in der mocked: Fortschrittszeile des Falls als plugin_<plugin>_<server>[not started: no mock].
Der Body der Datei ist das, was das Tool an Claude zurückgibt. Dieser Mock steht für ein create_issue Tool auf einem Server namens tracker ein, überprüft die Eingabe, die Claude sendet, und gibt den Titel zurück. Speichern Sie es als evals/mocks/tracker/create_issue.md:
{{input.<field>}} ein, und den Inhalt einer Fixture-Datei neben dem Mock mit {{file:fixtures/{input.<field>}.json}}. Der expect: Block schützt die Eingabe. Wenn ein Aufruf ihn verletzt, bricht der Durchlauf mit Score 0 ab und zeichnet auf, warum, daher kann ein Fall bestätigen, was Ihr Plugin den Server zu tun bat. Setzen Sie error: true, um den Body stattdessen als Tool-Fehler zurückzugeben, oder type: agent, um ein kleines Modell als Server aus Anweisungen im Body antworten zu lassen. Die Mock-Datei-Referenz listet jeden Schlüssel und die _server.md und _tools.json Dateien auf.
Um die Aufrufe selbst zu bewerten, zeigen Sie einen Grader auf target: mock_calls.
Um stattdessen gegen die echten MCP-Server des Plugins auszuführen, übergeben Sie eines dieser Flags. Entweder Weg laufen diese Prozesse als Sie, außerhalb der Sandbox des Durchlaufs, und ihre Tools benötigen einen --allow-tools Grant:
--allow-real-servers: starten Sie den echten Prozess für jeden Server, den Sie nicht gemockt haben, und beantworten Sie weiterhin gemockte Tools aus ihren Dateien--mocks off: ignorieren Siemocks/vollständig und starten Sie jeden Server, den das Plugin deklariert
Wiedergeben Sie Agent-Mock-Antworten
Eintype: agent Mock antwortet mit einem Aufruf an das --judge-model, daher variiert seine Ausgabe zwischen Durchläufen und ändert sich, wenn Sie den Judge ändern. Wenn ein Durchlauf ohne Fehler oder Abbruch abgeschlossen wird, speichert Claude Code jede Antwort, die ein Agent-Mock gab, unter dem Ergebnisverzeichnis in mock-recordings/.
Öffnen Sie ADOPT.txt dort, um jede Aufzeichnung und das .replay/<server>/ Verzeichnis zu sehen, um es neben den Mock zu kopieren, der es produziert hat. Nachdem Sie eine Aufzeichnung dort kopiert haben, beantworten spätere Durchläufe den identischen Aufruf daraus ohne Modellaufruf. Committen Sie mocks/.replay/ mit dem Rest von mocks/, damit CI-Durchläufe wiederholbar sind.
Führen Sie Evals aus
Sobald eine Suite existiert, führtclaude plugin eval sie aus. Sie wählen, welches Plugin und welche Fälle mit dem Zielargument ausgeführt werden, gewähren alle Tools, die die Fälle über die schreibgeschützte Menge hinaus benötigen, mit --allow-tools, und steuern Durchlauf-Anzahl, Modelle, Kosten und Ausgabe mit den anderen Optionen.
Wählen Sie aus, was zu evaluieren ist
Meistens führen Sieclaude plugin eval . vom Plugin-Stammverzeichnis aus, was jeden Fall in der Suite mit dem Plugin ausführt, in dem Sie stehen, geladen. Um eine einzelne prompt.md oder case.yaml Datei auszuführen oder um ein Plugin zu evaluieren, das Sie installiert haben, anstatt eines, das Sie entwickeln, übergeben Sie ein anderes Ziel:
Fügen Sie
--case <glob> hinzu, um nach Fallname zu filtern, und --tag <tag>, um Fälle mit beliebigen der angegebenen Tags zu behalten. Legen Sie das Ziel vor --tag, --allow-tools und --json. Die ersten beiden nehmen eine Liste und --json nimmt einen optionalen Pfad, daher liest jede von ihnen ein Ziel, das folgt, als ihren eigenen Wert.
Gewähren Sie Tools
Durchläufe halten niemals an, um um Erlaubnis zu fragen. Eingebaute Tools, die einen Grant benötigen, den Sie nicht gegeben haben, wieBash, Write, Edit, WebFetch und WebSearch, werden aus der Sitzung entfernt, daher kann Claude sie überhaupt nicht aufrufen. Die Allowlist ist die schreibgeschützten Tools, die der Fall in allowed_tools auflistet, aus Read, Glob, Grep, NotebookRead, Skill, Agent, TodoWrite und die Task-Tools TaskCreate, TaskGet, TaskList, TaskUpdate, TaskStop und TaskOutput, plus alles, was Sie mit --allow-tools gewähren, was auf jeden Fall in dem Durchlauf angewendet wird. Um Fällen die Verwendung von Bash, Write, Edit, WebFetch oder WebSearch zu ermöglichen, gewähren Sie sie selbst:
not granted auf. Tools auf einem gemockten MCP-Server benötigen keinen Grant. Tools auf einem echten Plugin-MCP-Server benötigen sowohl den Server gestartet, mit --allow-real-servers oder --mocks off, als auch einen Grant nach Name, wie --allow-tools "mcp__plugin_my-plugin_github__*"; Plugin-MCP-Tools werden mcp__plugin_<plugin>_<server>__<tool> benannt.
Wenn Sie Bash in irgendeiner Form gewähren, wird jeder Befehl unter Claude Code’s OS-Level Sandbox ausgeführt. Schreibvorgänge sind auf den Arbeitsbereich des Durchlaufs beschränkt, Ihr Home-Verzeichnis und die Claude Code Konfiguration sind nicht lesbar, und der Netzwerkzugriff ist auf Domains beschränkt, die Sie mit --allow-tools "WebFetch(domain:example.com)" gewähren. Wenn Sie Bash oder PowerShell auf einer Maschine ohne Sandbox-Backend gewähren, weigert sich Claude Code jeden Durchlauf, anstatt ihn uneingeschränkt auszuführen, und der Fall zeigt einen Durchlauf-Fehler und normalerweise Score 0. Natives Windows hat kein Backend, daher führen Sie Shell-gewährende Suites unter WSL2 aus; unter Linux installieren Sie zuerst bubblewrap und socat. Siehe die Sandboxing-Voraussetzungen.
Befehlsoptionen
Diese Tabelle behandelt die Optionen für Durchlauf-Anzahl, Modelle, Bewertung, Kosten, Tool-Grants, Mocks und Ausgabe. Führen Sieclaude plugin eval --help für die vollständige Liste aus, die auch --case, --tag, --eval-dir, --no-scaffold, --report und --verbose umfasst.
Führen Sie Evals in CI aus
Führen Sie in Ihrem CI-Job die Suite mit--json aus, um das Ergebnis zum Archivieren zu schreiben, und lassen Sie den Build beim Exit-Code fehlschlagen. Übergeben Sie --trust-plugin, damit der Job niemals bei der ersten Vertrauens-Eingabeaufforderung wartet, heften Sie beide Modelle fest, damit Scores über die Zeit vergleichbar sind, behalten Sie den Bericht lokal und setzen Sie eine Kostendecke als Obergrenze:
Probleme beim Schreiben oder Veröffentlichen des HTML-Berichts ändern niemals den Exit-Code. Um zu sehen, warum ein Fall niedrig bewertet wurde, führen Sie ihn lokal ohne
--json aus, damit die Pro-Durchlauf-Fortschritts- und Grader-Zeilen drucken.
Ein CI-Runner benötigt eine Claude Code Installation und Anmeldedaten in der Umgebung wie ANTHROPIC_API_KEY. Ohne --trust-plugin wird ein Job, dessen Checkout-Verzeichnis Claude Code noch nicht vertraut, mit Exit 1 verweigert, wenn es kein Terminal hat, oder wartet bei der Eingabeaufforderung, wenn der Runner eines zuweist. claude plugin eval init benötigt ein Terminal, um Ihnen seine Fragen zu stellen; führen Sie in CI claude plugin eval init --bare <name> aus, um die leere Vorlage zu erhalten.
Um Kosten vorhersehbar zu halten, geben Sie schnelle Every-Change-Suites nur Grader, die keinen Judge aufrufen, verwenden Sie --ablation none, wo Sie Δ nicht benötigen, und lassen Sie partial: true Dokumente und Durchläufe mit skippedPaidGraders aus jedem Trend, den Sie kartieren.
Lesen Sie die Ergebnisse
Jeder Durchlauf mit mindestens einem Fall schreibt einresults/<timestamp>/ Verzeichnis innerhalb des Eval-Verzeichnisses, das aggregate-result.json und report.html enthält. Für ein Pfad-Ziel, das unter dem Plugin liegt; für ein Plugin, das Sie benannt haben, liegt es unter Ihrem aktuellen Verzeichnis, wie die Ziel-Tabelle zeigt. Die Zusammenfassungstabelle, das JSON und der Bericht rendern alle die gleichen Ergebnisdaten.
HTML-Bericht
report.html ist eine einzelne in sich geschlossene Datei, die keine externen Anfragen stellt, daher können Sie sie an einen CI-Job anhängen oder von der Festplatte öffnen. Dieses Beispiel ist die Oberseite eines Berichts für einen Drei-Fall-Suite-Durchlauf mit --threshold 0.8; die angezeigten Kosten sind eine Listenpreis-Schätzung und variieren je nach Modell und Anzahl der Fälle:

- Die Urteilszeile und Kacheln beantworten die Frage, ob das Plugin über die gesamte Suite hinweg geholfen hat. Suite-Score ist der Durchschnitt der Pro-Fall-Scores mit Plugin, Ablations-Δ ist, wie weit dieser über oder unter dem Baseline-Score liegt, und Fälle zählt, wie viele den Schwellenwert erfüllt haben. Perfekte Durchläufe ist der Anteil der Mit-Plugin-Durchläufe, bei denen jeder Grader bestanden hat.
- Jede Fall-Karte zeigt das
Δdes Falls und den Score mit Plugin, mit einem Häkchen auf dem Balken beim Schwellenwert. Ein Fall, dessenΔnegativ ist, erhält eine rote linke Kante, daher heben sich Verschlechterungen beim Scrollen ab. - Innerhalb eines Falls kommen die Mit-Plugin-Durchläufe zuerst und die Baseline-Durchläufe danach. Jeder Durchlauf listet seine Grader mit einem Bestanden- oder Nicht-Bestanden-Chip auf. Ein fehlgeschlagener Grader ist bereits erweitert mit seiner Erklärung, und ein
llmGrader zeigt auch die Stimmen des Richters und die Beweise, die ihm gezeigt wurden, was ist, wo Sie herausfinden, warum ein Durchlauf niedrig bewertet wurde. Grader, die nicht zur Bewertung zählen, wietool_used: Skill, tragen einplugin-fired indicatorBadge. - Eingabeaufforderung und Grader, unter den Durchläufen, zeigen die Eingabeaufforderung des Falls und die Rubrik oder das Muster jedes Graders, damit jemand, der den Bericht ohne die Suite liest, sehen kann, was gefragt wurde und was als gut zählte.
Published: <url>. Übergeben Sie --no-publish, um ihn lokal zu behalten. Wenn keine Published: Zeile angezeigt wird, wie bei API-Schlüssel-Authentifizierung, ist die lokale Datei der Bericht.
Ein Durchlauf, den eine Claude Code Sitzung gestartet hat, wie wenn Sie Claude bitten, die Suite für Sie auszuführen, bleibt auch lokal, und seine Report: Zeile sagt kept local. Fügen Sie --publish-report zu diesem Befehl hinzu, um ihn zu veröffentlichen.
JSON-Ergebnis
aggregate-result.json und --json Ausgabe ist ein versioniertes Dokument mit schemaVersion: 1 für CI-Skripte zum Parsen. Feldnamen sind camelCase und neue Felder werden hinzugefügt, ohne bestehende umzubenennen, daher schreiben Sie Ihr Skript, um Felder zu ignorieren, die es nicht erkennt.
Dies sind die Felder, die ein Gating-Skript normalerweise liest. Das Dokument trägt auch die Suite-Konfiguration, jede Grader-Definition und Pro-Durchlauf-Grader-Ergebnisse mit Erklärungen und Beweisen:
Was ein Durchlauf zugreifen kann
claude plugin eval lädt die Skills und Hooks des Ziel-Plugins und führt seine Eval-Suite auf Ihrem Computer als Sie aus. Es auf ein Plugin zu zeigen ist die gleiche Vertrauensentscheidung wie claude --plugin-dir, daher evaluieren Sie nur Plugins, denen Sie vertrauen. Die in diesem Abschnitt beschriebene Isolation begrenzt, was der Agent unter Test erreichen kann; es ist keine Grenze gegen den Code des Plugins selbst, und eine Suite, die bestanden wird, sagt nichts darüber aus, ob das Plugin sicher ist.
Vertrauen Sie dem Plugin-Verzeichnis
Das erste Mal, wenn Sieclaude plugin eval gegen ein Verzeichnis ausführen, fragt Claude Code Trust this plugin directory?, bevor es etwas daraus lädt, es sei denn, Sie haben die Vertrauens-Eingabeaufforderung dort bereits in einer interaktiven claude Sitzung akzeptiert. Innerhalb eines Git-Repositorys vertraut das Beantworten mit Ja dem ganzen Repository, auch für interaktive Sitzungen. Wenn stdin oder stdout kein Terminal ist, oder unter --json, kann der Durchlauf nicht fragen und wird mit Exit 1 verweigert; übergeben Sie --trust-plugin, um das Vertrauen selbst zu bestätigen, nur für ein Plugin, das Sie auf Ihrem eigenen Computer ausführen würden. Ein Ziel, das Sie benennen, anstatt als Pfad zu geben, bedeutet ein installiertes Plugin oder ein Skills-Directory-Plugin, überspringt die Eingabeaufforderung.
Einige Teile des Plugins und der Suite werden nur ausgeführt, wenn Sie ihr Flag für diesen Durchlauf übergeben: ein Falls scaffold_script mit --scaffold, Tools über die schreibgeschützte Menge mit --allow-tools und die echten MCP-Server des Plugins mit --allow-real-servers oder --mocks off. Ein Falls allowed_tools und ein Skill’s eigenes allowed-tools Frontmatter können keines von ihnen erweitern. Wenn das Plugin Hooks ausliefert, die Sie nicht geschrieben haben, oder Sie seine echten MCP-Server starten, behandeln Sie seine Scores als beratend, es sei denn, Sie führen es in einer isolierten Umgebung wie einem Container oder CI-Runner aus, da Hooks und Server außerhalb der Sandbox des Agenten laufen und die Dateien berühren könnten, die die Grader lesen.
Wie Durchläufe isoliert sind
Jeder Durchlauf bekommt ein Wegwerf-Home-Verzeichnis, Arbeitsverzeichnis und Claude Code Konfiguration, und der Agent unter Test wird dort alsclaude -p Kind-Prozess mit nur Ihrem Plugin geladen ausgeführt. Behalten Sie diese Konsequenzen im Auge, wenn Sie Fälle schreiben:
- Nichts Persönliches oder Projekt-Ebene lädt. Ihre Benutzereinstellungen, Hooks,
CLAUDE.mdDateien, MCP-Server, andere installierte Plugins, Memory und Skills sind abwesend, und kein Projekt-Scoped.claude/oder.mcp.jsonüber der Sandbox wird gelesen. Die meiste Ihrer Shell-Umgebung wird auch zurückgehalten; nur eine Allowlist undEVAL_*Variablen erreichen den Durchlauf. Wenn das Plugin Setup benötigt, versenden Sie es im Plugin, erstellen Sie es in einemscaffold_scriptoder übergeben SieEVAL_*Variablen. - Verwaltete Richtlinie kann einen Durchlauf immer noch einschränken. Einschränkungen in verwalteten Einstellungen, die ein Administrator auf der Maschine bereitgestellt hat, gelten innerhalb eines Durchlaufs, daher können Ergebnisse auf einer verwalteten Maschine von einer nicht verwalteten durch diese Richtlinie unterschiedlich sein.
- Das Artifact-Tool ist aus. Ein Skill, der ein Artifact veröffentlicht, kann nur auf das bewertet werden, was er vor diesem Schritt produziert.
- Die Falldefinitionen sind vor dem Agenten verborgen. Ein Durchlauf kann das Eval-Verzeichnis nicht lesen, daher kann Claude die Eingabeaufforderung des Falls, seine Grader oder Nachbar-Fälle nicht sehen.
- Keine Netzwerk-Sandbox außerhalb von Shell-Befehlen. Shell-Befehle, die Sie gewähren, werden unter den Sandbox-Regeln des Netzwerks ausgeführt. Ein
WebFetch(domain:…)Grant erreicht diese Domain direkt, und die eigenen Hooks des Plugins und alle echten MCP-Server, die Sie starten, können jeden Host erreichen.
Eval-Suite-Referenz
Alles, was eine Eval-Suite enthalten kann, befindet sich unter dem Eval-Verzeichnis des Plugins,evals/, es sei denn, Sie haben ein anderes konfiguriert. Dieser Baum zeigt jede Datei, die claude plugin eval dort liest oder schreibt; nur prompt.md oder case.yaml ist erforderlich, damit ein Fall existiert:
prompt.md Frontmatter
prompt.md Frontmatter akzeptiert diese Felder. Ein unbekannter Schlüssel ist ein Fehler:
case.yaml Felder
case.yaml beschreibt den gleichen Fall in YAML und fügt die Felder hinzu, die auf andere Dateien zeigen. Es benötigt schema_version: "1.1" und name. Die prompt.md Felder description, tags, plugins, runs und expected_outcome gehen auf die oberste Ebene; model, max_turns, timeout_seconds, allowed_tools, append_system_prompt und env gehen unter execution:. Wenn beide Dateien existieren, überschreibt prompt.md Frontmatter die passenden case.yaml Felder, der prompt.md Body ist die Eingabeaufforderung und graders/*.md werden nach allen in case.yaml aufgelisteten Gradern hinzugefügt.
Diese Felder existieren nur in case.yaml:
Grader Frontmatter
Jede Grader-Datei untergraders/ nimmt diese Schlüssel in Frontmatter, plus die Optionen für seinen Typ. Der Name des Graders ist der Dateiname ohne .md:
Was ein Grader ansehen kann
regex Grader nehmen ein target und llm Grader nehmen einen focus. Beide akzeptieren die gleichen Werte:
Grader-Typen
Jeder Grader-Typ unten listet seine Optionen und wann er bestanden wird:Mock-Dateien
Eine<tool>.md Datei unter mocks/<server>/ beantwortet ein Tool. Sein Body ist das Tool-Ergebnis, mit {{input.<field>}} und {{file:fixtures/<name>}} Substitutionen. Sein Frontmatter akzeptiert diese Schlüssel:
Zwei optionale Dateien sitzen neben den Tool-Dateien in einem Server-Verzeichnis:
_server.md: ein einzelnertype: agentMock, der mehrere Tools beantwortet, aufgelistet in seinemtools:Frontmatter-Schlüssel. Ein<tool>.mdfür das gleiche Tool hat Vorrang. Legen Sie einenexpect:Guard auf das einzelne<tool>.md, nicht hier |_tools.json: eine gespeichertetools/listAntwort vom echten Server, daher tragen gemockte Tools ihre echten Beschreibungen und Eingabe-Schemas anstelle eines permissiven Platzhalters |
mocks/ Verzeichnis verwendet das gleiche Layout und überschreibt die Suite’s Mock-Datei für Datei.
Fehlerbehebung
Dies sind die Probleme, auf die Autoren am häufigsten stoßen, sortiert nach dem, was Sie sehen.„plugin eval is currently in early access”
Ihr Build ist älter als die allgemeine Verfügbarkeit des Befehls. Führen Sieclaude update aus und führen Sie den Befehl dann erneut in einer neuen Sitzung aus.
„plugin eval is currently unavailable”
Anthropic hat den Befehl serverseitig deaktiviert. Nichts auf Ihrem Computer schaltet ihn wieder ein; führen Sieclaude update aus und versuchen Sie es später in einer neuen Sitzung erneut.
„is not a trusted plugin directory, and this run cannot stop to ask you about it”
Dies ist der erste Durchlauf gegen ein Verzeichnis, dem Claude Code noch nicht vertraut, und es kann Sie nicht fragen, da stdin oder stdout kein Terminal ist oder Sie--json übergeben haben. Führen Sie claude plugin eval <dir> einmal in einem Terminal aus und beantworten Sie die Eingabeaufforderung, oder übergeben Sie --trust-plugin, wenn Sie dem Code und der Suite des Plugins vertrauen. Siehe What a run can access.
„No eval cases found”
Es existiert kein<case>/prompt.md oder <case>/case.yaml unter dem geltenden Eval-Verzeichnis, oder Ihre --case- und --tag-Filter haben keinen Fall gefunden. Führen Sie den Befehl aus dem Plugin-Root aus, oder führen Sie claude plugin eval init aus, um eine Suite zu erstellen.
Die Baseline-Arm zeigt kein Plugin, oder Delta ist null
Wenn die Zusammenfassung keineW/OUT-Spalte hat oder der Fall mit „ablation requested but no plugin resolved” fehlschlägt, wurde kein Plugin für den Fall gefunden. Fügen Sie plugins: ["../.."] zum Fall hinzu und geben Sie den Pfad vom Fall-Verzeichnis zum Plugin-Verzeichnis an.
Wenn das Plugin geladen wurde und Δ immer noch nahe bei null liegt, während Ihr tool_used: Skill-Grader fehlschlägt, ist das normalerweise ein echtes Ergebnis, was bedeutet, dass die description des Skills nicht auf die Formulierung der Eingabeaufforderung anspricht. Passen Sie die Beschreibung an und führen Sie die gleiche Suite erneut aus.
Alles bewertet null, obwohl die richtigen Dateien erstellt wurden
Ihre Grader zielen auffiles, die Liste der erstellten Pfade, wenn Sie die Inhalte der Datei gemeint haben. Verwenden Sie { source: file, path: <path> } als target oder focus. Separat zählt file_exists nur Dateien, die während des Durchlaufs erstellt wurden, daher ist eine Datei, die das Gerüst erstellt hat oder die Claude nur bearbeitet hat, für sie unsichtbar; bewerten Sie ihren Inhalt, oder verwenden Sie tool_used auf Edit.
Ein Regex über die Trace stimmt nicht mit Text überein, den ich sehen kann
Das Standard-target ist last_message, nicht die Trace. Wenn Sie trace als Ziel verwenden, ist es JSON pro Zeile, daher erscheinen Anführungszeichen als \". Regexes verwenden JavaScript-Syntax, daher setzen Sie i in flags, anstatt (?i) zu schreiben.
Tools werden verweigert, MCP-Tools fehlen, oder Bash wird nicht ausgeführt
Alles über die schreibgeschützte Menge hinaus benötigt Ihre Genehmigung, wie z. B.--allow-tools Bash Write. Ihre persönlichen MCP-Server werden in einem Durchlauf nie geladen. Die eigenen Server des Plugins starten nicht, es sei denn, Sie aktivieren sie, und ihre Tools benötigen dann auch eine --allow-tools "mcp__plugin_<plugin>_<server>__*"-Genehmigung; ein simuliertes Tool benötigt keine.
Der Durchlauf beendet sich mit 1, aber die Ergebnisse sehen gut aus
Das Standard---threshold ist 1,0, daher beendet sich der Befehl mit 1, wenn ein Fall unter perfekt bewertet wird. Legen Sie einen Schwellenwert fest, der Ihrem Standard entspricht. Exit 1 deckt auch eine Fall-Datei ab, die nicht geladen werden konnte, was auf stderr über der Tabelle gemeldet wird.
„—json output path must end in .json”
Sie haben das Ziel nach--json eingegeben, daher wurde es als Ausgabepfad gelesen. Geben Sie das Ziel zuerst an, wie in claude plugin eval . --json, oder geben Sie --json einen expliziten .json-Pfad.
Ein Grader zeigt passed: false unter einem Durchlauf, der 1,0 bewertet
Dieser Grader ist absichtlich von der Bewertung in einem Zwei-Arm-Durchlauf ausgeschlossen, und seinscored-Feld ist false. Siehe Compare against a no-plugin baseline.
Durchläufe schlagen mit einem Nutzungslimit- oder Rate-Limit-Fehler in der Mitte fehl
Wenn Ihr Konto während der Ausführung einer Suite das Nutzungslimit des Plans oder ein API-Rate-Limit erreicht, endet jeder spätere Durchlauf mit diesem Fehler, wird auf das bewertet, was er produziert hat, und bewertet normalerweise 0. Die Suite wird trotzdem beendet und ist nicht alspartial gekennzeichnet, daher kann das Ergebnis wie eine Regression aussehen. Überprüfen Sie die NOTES-Spalte oder cases[].arms.with[].error im JSON auf die Limit-Nachricht, bevor Sie den Bewertungen vertrauen, und führen Sie dann erneut aus, nachdem das Limit zurückgesetzt wurde, mit --runs 1 oder einem --case-Filter, wenn Sie darunter bleiben müssen.
Durchläufe überschreiten das Zeitlimit oder erreichen die Obergrenze für Durchläufe
Die Standardwerte sind 10 Durchläufe und 300 Sekunden. Erhöhen Siemax_turns und timeout_seconds im Fall für Aufgaben, die mehr benötigen, und verwenden Sie --max-cost-usd als Kostendeckel anstelle von engen Pro-Durchlauf-Limits.
Siehe auch
- Plugins erstellen: bauen Sie das Plugin, das Sie testen, und laden Sie es mit
--plugin-dirwährend der Entwicklung - Plugins-Referenz: die
plugin evalundplugin eval initBefehlseinträge und der Manifest’sexperimental.evalsSchlüssel - Skills: wie die
descriptioneines Skills entscheidet, wann Claude ihn aufruft, was das ist, was ein Fall, der überprüft, ob der Skill auslöst, misst - Sandboxing: die OS-Level Sandbox, die angewendet wird, wenn Sie Bash einem Durchlauf gewähren
- Erstellen und verteilen Sie einen Plugin-Marketplace: veröffentlichen Sie das Plugin, sobald seine Suite bestanden wird