Agent Profiler: Ein Claude Code Profiler, der zeigt, wohin die Sitzungszeit geht
Wohin die Zeit einer Claude-Code-Sitzung geht: Modell, Tools, Subagenten, live in der Statuszeile. Mit OTLP-Export.
Berechtigungen
- Schreibt DateienKann Dateien auf deinem Rechner anlegen oder überschreiben ($.fs.write).
- NetzwerkKann HTTP-Anfragen senden oder mit MCP-Servern kommunizieren ($.http.fetch / $.mcp.*).
- Fängt Tool-Aufrufe abSieht jeden Tool-Aufruf von Claude (tool.call / tool.check) und könnte ihn blockieren oder verändern.
- Verändert die OberflächeZeichnet in die Oberfläche von Claude Code: Leisten, Bereiche, Statustext, Toasts (ui.render / $.ui.*).
- Fügt Befehle/Tools hinzuRegistriert neue Slash-Befehle oder Tools, die du oder Claude aufrufen können ($.command.register / $.tool.register).
- getestet mit
- v2.1.303
- zuletzt getestet
- erfordert
- Claude Code ≥ 2.1.287
- Oberflächen
- Statuszeile, Bereich, Toast
- Quelle
- YeonwooSung (Apache-2.0)
In Claude Code installieren:
/plugin install agent-profiler --marketplace YeonwooSung/my-claude-code-modsWas macht diese Mod?
Agent Profiler ist ein Claude Code Profiler von YeonwooSung und Teil der Sammlung my-claude-code-mods. Er beantwortet eine Frage: Wenn sich eine Sitzung langsam anfühlt, wohin ist die Zeit gegangen? Er teilt die Zeit jedes Turns in Warten auf das Modell, Tool-Ausführung, blockierende Subagenten und Engine-Overhead und zeigt das Ergebnis an drei Stellen.
- Eine Statuszeile, die sich aktualisiert, während Claude arbeitet, zum Beispiel
model 100% · tools 0% · ▶ model claude-haiku-5-5 12.5s. /profile, ein Textbericht über die ganze Sitzung, oder/profile turnfür den letzten Turn. Er listet Zeitkategorien, Zeit bis zum ersten Token, Token-Zahlen, langsame Tools, wiederholt gelesene Dateien, Subagenten und eine kurze Liste von Befunden auf./profile-pane, ein Live-Panel mit laufenden Anfragen und Tools./profile-exportschreibt die Sitzung als OTLP-JSON.
Die Mod ist vorsichtig mit ihren Aussagen. Sie meldet nie eine „Inferenzzeit“. Jeder Wert trägt eine Stufe: measured (von Claude Code geliefert, etwa die Tool-Dauer), observed (von der Mod an Ereignisgrenzen selbst gemessen), reported (Token-Verbrauch laut API) oder inferred (ein errechneter Rest). Die README des Autors verlangt Claude Code 2.1.287 oder neuer.
Demo
Die Aufnahme startet Claude Code mit geladener Mod im kleinen Demo-Projekt und bittet Claude, README.md zu lesen und das Projekt in einem Satz zu beschreiben. Während der Turn läuft, zählt die Statuszeile über der Fußzeile live mit: zuerst model 92% · tools 0%, dann model 100% mit der laufenden Anfrage ▶ model claude-haiku-5-5 und ihren vergangenen Sekunden. Nach dem Turn führt der Clip /profile aus. Der Bericht zeigt 29,0 s Wartezeit auf die Modellantwort, 5 ms Tool-Zeit, die Zeit bis zum ersten Token, 82,3k Eingabe-Tokens, den einen Read-Aufruf und den Befund, dass das Warten auf das Modell 100 % der Agentenzeit ausmachte.
Installation
Nutze eine der Methoden im Installationsblock; sie installieren direkt aus dem eigenen Marketplace des Autors. Dieser listet viele Plugins, wähle also agent-profiler. Statuszeile und Befehle erscheinen beim nächsten Sitzungsstart.
$ install agent-profiler
Erfordert Claude Code ≥ 2.1.287
Wird aus dem Marketplace des Autors installiert: YeonwooSung/my-claude-code-mods
1.Eine Zeile, direkt in Claude Code
/plugin install agent-profiler --marketplace YeonwooSung/my-claude-code-modsIn eine laufende Sitzung einfügen (v2.1.275+). Claude Code fragt zuerst, ob der Marketplace hinzugefügt werden soll.
2.Aus deiner Shell
claude plugin marketplace add YeonwooSung/my-claude-code-mods claude plugin install agent-profiler@my-claude-code-modsFühre danach in jeder bereits geöffneten Sitzung /reload-plugins aus.
3.Ohne Installation ausprobieren
git clone https://github.com/YeonwooSung/my-claude-code-mods claude --plugin-dir ./my-claude-code-mods/agent-profilerLädt die Mod nur für eine Sitzung. An deinen Einstellungen wird nichts geändert.
So funktioniert es
Das Modul hooks/register.tsx hält ein Profiler-Objekt im Speicher und füttert es an Ereignisgrenzen: turn.start und turn.complete, jeden Modellaufruf über turn.step, jedes Tool über tool.call sowie die eigene Tool-Dauer von Claude Code aus classic.PostToolUse. Der tool.call-Hook beobachtet nur. Er wartet mit await next(e) auf das Tool und gibt die Antwort unverändert zurück, aus hooks/register.tsx:
on('tool.call', async ($, e, next) => {
anonymous += 1
const id = e.tool_use_id ?? `anonymous-${anonymous}`
const tool = String(e.tool)
safe(() => profiler.toolStart(Date.now(), { id, tool, agentId: e.agentId, input: summarizeInput(tool, e as unknown as Record<string, unknown>) }))
paint($)
try {
const answer = await next(e)
safe(() => profiler.toolEnd(Date.now(), id, toolOutcome(answer)))
return answer
} // ...
}).catch(($, e, next) => next(e))Jeder Protokollschritt läuft über safe(), sodass ein Fehler im Profiler verworfen wird, statt die Sitzung zu stören. Die Statuszeile wird höchstens zweimal pro Sekunde neu gezeichnet. Nach jedem Turn schreibt die Mod die neu abgeschlossenen Spans nach <outputDir>/<sessionId>/<loadId>-<seq>.otlp.json, am Sitzungsende den Rest samt Wurzel-Span der Sitzung. Die Span-Namen folgen den GenAI-Konventionen (chat <model>, execute_tool <tool>, invoke_agent <type>). Span- und Trace-IDs sind deterministisch, ein zweimal gesendeter Sitzungsverlauf ergibt also dieselben Spans. Der Speicher ist auf 20.000 Anfragen und Tool-Aufrufe begrenzt; darüber hinaus fallen die ältesten abgeschlossenen Turns weg.
Anpassen
Drei Optionen stehen im /plugin-Einstellungsmenü oder in pluginConfigs:
| Option | Standard | Bedeutung |
|---|---|---|
otlpEndpoint |
leer | Basis-URL eines OTLP/HTTP-Collectors wie http://localhost:4318. Leer bedeutet nur Dateien. |
outputDir |
~/.claude/agent-profiler |
Wohin die Trace-Dateien gehen, ein Ordner pro Sitzung. |
exportCommandText |
false |
Turn-Prompts, Bash-Kommandozeilen und Suchmuster in den Export aufnehmen, offensichtliche Geheimnisse werden geschwärzt. |
Um einen Trace in Jaeger anzusehen, starte examples/jaeger/docker-compose.yml aus dem Repo, setze otlpEndpoint auf http://localhost:4318 und öffne http://localhost:16686. Grafana Tempo nimmt denselben OTLP/HTTP-Endpunkt.
Berechtigungen & Sicherheit
Wir haben vor dem Ausführen die Dateien gelesen, die das Plugin ausführen kann: .claude-plugin/plugin.json, hooks/hooks.json, hooks/register.tsx und die Jaeger-Compose-Datei vollständig. Von den elf Modulen in hooks/core/ haben wir export.ts, otlp.ts, redact.ts und die Eingabe-Zusammenfassung in profiler.ts vollständig gelesen und alle nach Netzwerk-, Prozess-, Datei-, eval-, import()- und Umgebungsaufrufen durchsucht (Treffer gibt es nur in register.tsx). Die Testdateien haben wir aufgelistet, nicht gelesen. Es gibt keine package.json, kein Installationsskript, keine Binärdatei, keinen gebündelten oder minifizierten Code, kein eval und kein dynamisches import(). Der Quelltext in hooks/ enthält keine Zeichen ohne Breite oder versteckten Zeichen; die einzigen Nicht-ASCII-Zeichen sind sichtbare Status- und Berichtssymbole wie █, ░, · und ⏱. Die Mod schleust keinen Text in Prompts oder Tool-Ergebnisse ein.
Auffälligkeiten:
- Schreibt standardmäßig Dateien. Sie ruft nach jedem Turn und am Sitzungsende
$.fs.writeauf, nach~/.claude/agent-profiler/<sessionId>/, solange duoutputDirnicht setzt. Das ist der eigene Ordner des Plugins, nichtsettings.jsonoder eine Shell-Datei, aber er wird ohne Rückfrage beschrieben. Die Dateien enthalten Zeiten, Token-Zahlen, Modellnamen, Tool-Namen, Dateipfade vonRead/Edit/Writeund eine Kategorie pro Bash-Befehl (etwa test oder build). Dateipfade werden immer exportiert. Prompts, Bash-Befehle und Suchmuster nur mitexportCommandText. - Netzwerk nur, wenn du zustimmst.
$.http.fetchwird nur aufgerufen, wennotlpEndpointnicht leer ist, und schickt nur dasselbe Trace-JSON per POST an<endpoint>/v1/traces. Der Host ist, was du einträgst. Zeigst du auf einen entfernten Collector, verlassen Dateipfade und, mitexportCommandText, geschwärzte Befehle deinen Rechner. Die README warnt, dass die Schwärzung nur nach bestem Bemühen erfolgt. - Liest eine Umgebungsvariable,
HOME, um~inoutputDiraufzulösen. - Fängt Tool-Aufrufe ab, ohne sie zu ändern.
tool.callundtool.checkwerden beobachtet und unverändert durchgereicht, beide mit.catch-Absicherung. Nichts wird abgelehnt oder umgeschrieben.claude plugin validatelistet auch dieclassic.*-Hooks als Gating-Hooks ohne.catch; es sind Beobachter, dienext(e)zurückgeben. Laut validate laufen dieclassic.*-Hooks nicht, wenn eine Organisation Claude Code verwaltet, dort kann der Bericht also unvollständig sein. - Keine Prozesse, keine Daemons, keine Modellaufrufe. Sie führt keine Befehle aus und hält keinen Hintergrunddienst. Die einzigen Timer laufen innerhalb der Sitzung.
- Optionaler externer Dienst. Jaeger oder Tempo braucht man nur, um Traces anzusehen. Die Compose-Datei zieht
jaegertracing/all-in-one:latestund wird von der Mod nie gestartet. - Lizenz. Apache-2.0 (die
LICENSEim Repo-Stammverzeichnis).
claude plugin validate meldete keine Fehler und keine Warnungen, nur die genannten Hinweise. Die 67 Tests des Autors in 11 Dateien liefen mit claude plugin test auf Claude Code 2.1.303 alle durch.
- Schreibt Dateien
- Kann Dateien auf deinem Rechner anlegen oder überschreiben ($.fs.write).
- Netzwerk
- Kann HTTP-Anfragen senden oder mit MCP-Servern kommunizieren ($.http.fetch / $.mcp.*).
- Fängt Tool-Aufrufe ab
- Sieht jeden Tool-Aufruf von Claude (tool.call / tool.check) und könnte ihn blockieren oder verändern.
- Verändert die Oberfläche
- Zeichnet in die Oberfläche von Claude Code: Leisten, Bereiche, Statustext, Toasts (ui.render / $.ui.*).
- Fügt Befehle/Tools hinzu
- Registriert neue Slash-Befehle oder Tools, die du oder Claude aufrufen können ($.command.register / $.tool.register).
Kompatibilität & Fehlerbehebung
Geprüft mit Claude Code 2.1.303 unter macOS: validate, die Tests des Autors und die Demo-Aufnahme. Laut README lief der eigene End-to-End-Test des Autors auf 2.1.280, und die Ereignisformen folgen den Typdeklarationen von 2.1.292. Panel und Statuszeile werden im Terminal und im Code-Tab der Desktop-App gezeichnet, nicht aber im VS-Code-Chatpanel oder in claude -p; der Text von /profile funktioniert überall.
- Keine Statuszeile oder Befehle. Prüfe, dass
claude --version2.1.287 oder neuer ist, und führe nach der Installation in eine laufende Sitzung/reload-pluginsaus. - Keine Trace-Dateien. Es wird nichts geschrieben, bis die Sitzungs-ID bekannt ist. Ein fehlgeschlagener Schreibvorgang erscheint einmal als Toast; prüfe, ob
outputDirbeschreibbar ist. - Zahlen starten nach Hot-Reload neu. Der Zustand im Speicher beginnt von vorn, bereits geschriebene Blöcke bleiben aber unter der alten Lade-ID auf der Platte.
- Über Bash geänderte Dateien. Die Erkennung wiederholter Lesezugriffe sieht sie nicht.
- Zeit im Modellserver (Warteschlange, Prefill, Decoding) lässt sich mit keinem clientseitigen Werkzeug aufteilen; die Zeit bis zum ersten Token fasst sie zusammen.
FAQ
- Sendet Agent Profiler meine Daten irgendwohin?
- Standardmäßig nicht. Die Mod schreibt Trace-Dateien in einen Ordner auf deinem Rechner. Nur wenn du die Option otlpEndpoint setzt, sendet sie eine Netzwerkanfrage und schickt jeden Trace-Block per POST an diese URL plus /v1/traces. An den Autor geht nichts.
- Wohin werden die Trace-Dateien geschrieben?
- Nach ~/.claude/agent-profiler/<sessionId>/, solange du outputDir nicht setzt. Nach jedem abgeschlossenen Turn und noch einmal am Sitzungsende wird eine Datei geschrieben. Sie enthalten Zeiten, Token-Zahlen, Tool-Namen und Dateipfade.
- Werden meine Prompts und Bash-Befehle exportiert?
- Nicht, solange du exportCommandText nicht einschaltest. Ist die Option aus, bleiben Prompts, Bash-Kommandozeilen und Suchmuster aus Dateien und POSTs heraus, nur eine Befehlskategorie wie test oder build bleibt erhalten. Ist sie an, werden sie nach bestmöglicher Schwärzung von Geheimnissen exportiert.
- Misst die Mod, wie lange das Modell rechnet?
- Nein, und die README sagt das auch. Gemessen wird, wie lange der Client gewartet hat, etwa die Zeit bis zum ersten Token, in der Netzwerk, Warteschlange und Prefill zusammenfallen. Jeder Wert trägt die Kennzeichnung observed, measured, reported oder inferred.
- Brauche ich Jaeger oder einen anderen Dienst?
- Nein. /profile und die Statuszeile funktionieren allein. Jaeger oder Grafana Tempo brauchst du nur, wenn du die exportierten OTLP-Traces in einer Oberfläche ansehen willst. Das Repo enthält dafür eine kleine Jaeger-docker-compose-Datei.
# Ähnliche Mods
EmpfohlenAgent Radar
Pro laufendem Subagent eine Live-Zeile über der Eingabe: Zeit, Tool-Anzahl und aktuelle Aktion, dazu ein /radar-Pane.
- über dem Prompt
- Bereich
- Toast
- Fängt Tool-Aufrufe ab
- Liest deine Prompts
- Verändert die Oberfläche
- Fügt Befehle/Tools hinzu
getestet mit v2.1.291
EmpfohlenCache Clock
Eine Prompt-Cache-Zeile unter der Statuszeile: Restzeit, Trefferquote und Tokens, die kalt neu gecacht werden.
- Statuszeile
- Liest Dateien
- Schreibt Dateien
- Führt Befehle aus
- Fügt Befehle/Tools hinzu
getestet mit v2.1.296
EmpfohlenTool-Call-Zähler
Zählt Claudes Tool-Aufrufe pro Turn und Sitzung, zeigt sie neben dem Spinner und ergänzt /tally als Übersicht.
- Spinner
- Verlauf
- Statuszeile
- Fängt Tool-Aufrufe ab
- Verändert die Oberfläche
- Fügt Befehle/Tools hinzu
getestet mit v2.1.310
Mehr in Timer, Todos, Standups, Statuszeile & Prompt-Leiste, Panes & Dashboards.