Was es einen Agenten kostet, eine Ressourcendatei zu übersetzen
Lauf 20260812T160551Z-92885b, erfasst 2026-08-12
Jede Zahl auf dieser Seite stammt aus den unten aufgeführten Artefakten. Die Token-Zahlen sind Claudes eigene Abrechnung aus dem Stream und den Ergebnisobjekten des Print-Modus. Die Währungszahlen sind Näherungen, die die Claude Code CLI meldet, keine Abrechnungsbeträge.
Die Frage
Ein Coding-Agent, der eine i18n-Ressourcendatei übersetzen soll, kann die Arbeit selbst erledigen oder die Datei einem Übersetzer übergeben, der auf demselben Rechner läuft. Der erste verbraucht API-Token für jeden Wert. Der zweite verbraucht für die Werte keine, und BetterTranslator schafft es ganz ohne Agenten in der Schleife. Der Benchmark misst, was jeder Weg kostet, an einer Datei, in Token, in ungefähren Dollar, in Anfragen und in Uhrzeit.
Drei Arme wurden gemessen, benannt so, wie die Artefakte sie benennen.
| Arm | Was passiert | Wer übersetzt |
|---|---|---|
| direct | Claude Code liest die Datei und schreibt die Übersetzung selbst. Es ist kein MCP-Server konfiguriert. | Der Agent |
| mcp-path | Claude Code ruft translate_file auf dem lokalen BetterTranslator-MCP-Server auf und fragt job_status ab. Der Dateiinhalt gelangt nie in das Gespräch. | Das lokale Modell |
| mcp-value | Claude Code schickt die Werte durch translate_text und schreibt die Datei selbst. | Das lokale Modell |
Ein vierter Weg, BetterTranslators eigenes Fenster oder bt translate ganz ohne Agenten, verbraucht konstruktionsbedingt null API-Token und wird in der Hochrechnung als Nullzeile geführt.
Wie der Test gebaut wurde
| Held constant | Value |
|---|---|
| Agent | Claude Code CLI 2.1.228 |
| Model | claude-opus-5 |
| Prompt | identical across arms apart from one sentence |
| Session | fresh session per run |
| Repetitions | three per cell, the first excluded as cache warm-up |
| Language pair | English to Czech |
| Local engine | TranslateGemma, translategemma-4b-it-Q4_K_M.gguf, Q4_K_M |
| MCP transport | stdio, server bettertranslator 1.0.0, protocol 2024-11-05, 10 tools |
| Host | Windows 11, .NET SDK 10.0.302 |
| Corpus | 4,666 keys in 627,920 bytes, sha256 a8fdce5a, of which 1,242 were eligible under the selection rule |
Ein Wert kommt für einen Ausschnitt in Frage, wenn er eine Zeichenkette aus 20 bis 180 Zeichen ohne Pluralisierungs-Pipe, HTML-Tag oder Zeilenumbruch ist und, sobald die Platzhalter-Token entfernt sind, noch mindestens 4 Wörter und 20 ASCII-Buchstaben enthält. Jeder ausgewählte Wert ist Fließtext, den ein Übersetzer ändern muss. Jeder Ausschnitt ist ein Präfix des nächstgrößeren. Der vollständige Quell-Hash lautet a8fdce5aba678743b2aac57a9b8c06405e41b836cd174051fc09357da648a633.
| Slice | Keys | Bytes | sha256 |
|---|---|---|---|
| slice-10 | 10 | 1,205 | be639f19 |
| slice-50 | 50 | 5,109 | f0214d54 |
| slice-200 | 200 | 21,295 | 6a58de05 |
| slice-500 | 500 | 55,642 | 57e3b4d6 |
Hinweis zur Abrechnung: dieser Claude-Code-Build sendet keine OpenTelemetry-Metriken oder -Ereignisse, die Abrechnung je Anfrage wird also aus Claudes stream-json-usage-Blöcken und dem Ergebnisobjekt des Print-Modus gelesen. 4 Exporter-Konfigurationen wurden versucht, keine erzeugte Ausgabe. Als Gegenprobe vergleicht der Prüfstand beide Quellen je Lauf: 22 von 33 Läufen stimmen innerhalb von 2 Prozent überein, und die 11 abweichenden führen beide Zahlen in summary.csv.
Je Ausschnitt
| Slice and arm | Requests | cacheCreation | cacheRead | Total tokens | Approx USD | Wall clock s | Values delivered |
|---|---|---|---|---|---|---|---|
| slice-10 direct | 3.0 | 17,546 | 103,780 | 121,337 | 0.2602 | 23.4 | 10 of 10 |
| slice-10 mcp-path | 7.0 | 18,289 | 269,247 | 287,669 | 0.3362 | 17.3 | 10 of 10 |
| slice-50 direct | 3.0 | 22,704 | 105,376 | 128,091 | 0.4016 | 64.0 | 50 of 50 |
| slice-50 mcp-path | 13.5 | 18,523 | 541,119 | 560,011 | 0.4827 | 27.3 | 49 of 50 |
| slice-200 direct | 4.0 | 50,665 | 144,893 | 195,574 | 0.9510 | 143.4 | 198 of 200 |
| slice-200 mcp-path | 26.5 | 13,656 | 1,125,718 | 1,140,077 | 0.7553 | 78.6 | 195 of 200 |
| slice-500 direct | 3.5 | 92,294 | 140,597 | 232,903 | 2.2062 | 539.3 | 498 of 500 |
| slice-500 mcp-path | 24.0 | 24,068 | 1,032,698 | 1,057,235 | 0.8214 | 57.2 | none |
Der dritte Arm, der Vollständigkeit halber. Bei 500 Schlüsseln wurde er auf Anweisung nicht ausgeführt.
| Slice and repetition | Requests | Total tokens | Approx USD | Wall clock s | Values delivered | Gate |
|---|---|---|---|---|---|---|
| slice-10 | 5.0 | 212,361 | 0.3693 | 35.3 | 10 of 10 | pass, spread 32.7 percent |
| slice-50 | 15.5 | 740,057 | 0.8774 | 162.0 | 50 of 50 | pass, spread 48.0 percent |
| slice-200 rep 2 | 15 | 1,000,865 | 2.6973 | 639.2 | 198 of 200 | fail, model fallback |
| slice-200 rep 3 | 9 | 478,525 | 3.0136 | 206.1 | 0 of 200 | fail, model fallback and session limit |
Was das Delegieren ändert
Der delegierte Arm gegen den Agenten, der die Datei selbst übersetzt. Die Zeile mit 500 Schlüsseln ist nicht vergleichbar, weil der delegierte Arm keine Datei erzeugt hat.
| Slice | Delta tokens | Delta tokens percent | Delta USD approximate | Delta USD percent | Delta requests | Delta wall clock s |
|---|---|---|---|---|---|---|
| slice-10 | +166,332 | +137.1% | +0.0760 | +29.2% | +4.0 | -6.1 |
| slice-50 | +431,920 | +337.2% | +0.0811 | +20.2% | +10.5 | -36.8 |
| slice-200 | +944,503 | +482.9% | -0.1957 | -20.6% | +22.5 | -64.8 |
| slice-500 | not comparable |
Token und Geld ordnen diese Arme nicht gleich. In Token gibt es nirgends zwischen 10 und 500 Schlüsseln einen Schnittpunkt: der delegierte Weg kostet bei jedem gemessenen Ausschnitt mehr. In ungefähren Dollar kreuzen sich die beiden Linien bei etwa 87 Schlüsseln, weil der delegierte Weg frische Eingabe gegen Cache-Lesevorgänge tauscht und diese weit darunter abgerechnet werden. Bei 200 Schlüsseln ist der delegierte Weg der günstigere von beiden im Geld, obwohl er fast das Sechsfache an Token verbraucht.
Wohin die Token gehen: die Nutzlast bleibt tatsächlich aus dem Kontext heraus. Beim kleinsten Ausschnitt ist der gesamte MCP-Austausch 306 Bytes an Werkzeugargumenten und 707 Bytes an Werkzeugergebnissen gegenüber einer Eingabedatei von 1,205 Bytes, und die gesamte Werkzeugoberfläche fügt gegenüber dem Agentenweg 743 Token an Cache-Erzeugung hinzu. Der Preis ist die Anzahl der Anfragen. Jede job_status-Abfrage ist eine vollständige API-Anfrage, die das ganze Gespräch erneut abspielt, die Rechnung dieses Arms bestimmt also, wie oft er fragt, ob das lokale Modell fertig ist: 7.0 Anfragen bei 10 Schlüsseln, 26.5 bei 200. Der angepasste Boden mit einer leeren Datei liegt bei 244,502 Token. Halten Sie alles andere konstant und geben Sie dem Arm die Anfragezahl des Agentenwegs, wie es ein blockierender Aufruf oder ein Wartewerkzeug täte, und dieselbe Arbeit über 200 Schlüssel landet nahe 183,575 Token gegenüber 195,574. Die letzte Zahl ist Arithmetik auf gemessenen Kosten je Anfrage, kein gemessener Lauf.
Die ganze Datei
Hochgerechnet, nicht gemessen: die Datei mit 4,666 Schlüsseln passt nicht in ein Kontextfenster, die Hochrechnung wiederholt daher den größten gemessenen Ausschnitt, 200 Schlüssel, als 24 Stücke. Es ist Arithmetik über gemessene Läufe.
| Path | Tokens | Approx USD | Claude requests | Wall clock |
|---|---|---|---|---|
| Claude Code alone (direct) | 4,693,764 | 22.82 | 96 | 0h57m |
| Claude Code plus local BetterTranslator (mcp-path) | 27,361,836 | 18.13 | 636 | 0h31m |
| Claude Code plus local BetterTranslator (mcp-value) | 24,020,760 | 64.74 | not published | 2h49m |
| BetterTranslator alone, no agent | 0 | 0.00 | 0 | not published |
Zwei Zellen werden zurückgehalten. Die Anfragezahl von mcp-value hat bei 200 Schlüsseln keine Grundlage, die das Tor besteht, da beide Wiederholungen auf ein anderes Modell zurückgefallen sind. Die lokale Uhrzeit wird zurückgehalten, weil die Artefakte einander widersprechen.
Die Zeile mcp-path ist im Geld nur oberhalb des Break-even bei 87 Schlüsseln günstiger als der Agentenweg, und sie erreicht diesen Preis mit 27,361,836 Token gegenüber 4,693,764. Die mcp-value-Hochrechnung stützt sich auf Läufe, die das Tor ausgeschlossen hat, und ist als Obergrenze zu lesen, nicht als Ergebnis.
Das Fairness-Tor
Ein Lauf besteht nur, wenn seine Ausgabedatei ein JSON-Objekt ist, dessen Schlüsselsatz und Schlüsselreihenfolge exakt zum Ausschnitt passen, dessen Werte alle nicht leere Zeichenketten sind, dessen Platzhalter-Multimenge je Wert der Quelle entspricht und von dessen Werten keiner seiner Quelle gleicht. Die letzte Prüfung hat eine Ausnahme: ein Wert darf seiner Quelle gleichen, wenn jedes alphabetische Wort darin eine freigegebene Marke, ein Protokoll oder ein Gebietsschema-Token ist oder mit einem Großbuchstaben beginnt, was Produktnamen und großgeschriebene Eigennamen abdeckt, oder wenn der Wert eine Kommandozeile mit einem Programmnamen oder einer langen Option ist.
Über alle 33 aufgezeichneten Läufe meldet summary.csv 0 Fehler im Schlüsselsatz, 0 Fehler in der Schlüsselreihenfolge und 0 Fehler bei Platzhaltern. 29 der 33 Läufe haben überhaupt eine Datei geliefert. Jeder Ausschluss unten ist ein unübersetzter Wert, ein Modellwechsel, ein Sitzungslimit oder eine fehlende Datei.
| Arm | Slice | Rep | Total tokens | Requests | Values | Reason |
|---|---|---|---|---|---|---|
| mcp-path | slice-50 | 2 | 581,184 | 14 | 49 of 50 | 1 value equal to its source outside the allowlist |
| mcp-path | slice-50 | 3 | 538,837 | 13 | 49 of 50 | 1 value equal to its source outside the allowlist |
| mcp-path | slice-200 | 2 | 1,549,789 | 36 | 195 of 200 | 4 values equal to their source outside the allowlist |
| mcp-path | slice-200 | 3 | 730,364 | 17 | 195 of 200 | 4 values equal to their source outside the allowlist |
| mcp-value | slice-200 | 2 | 1,000,865 | 15 | 198 of 200 | model fallback across claude-opus-5 and claude-opus-4-8 |
| mcp-value | slice-200 | 3 | 478,525 | 9 | 0 of 200 | model fallback, then API error 429 on the account session limit |
| mcp-path | slice-500 | 2 | 513,111 | 12 | 0 of 500 | output file was never written |
| mcp-path | slice-500 | 3 | 1,601,358 | 36 | 0 of 500 | output file was never written |
Von 33 Läufen haben 33 eine Anfrage abgerechnet, 1 endeten am Sitzungslimit des Kontos und 3 sind vom angeforderten Modell auf ein anderes zurückgefallen, was diese unvergleichbar macht.
Grenzen
Der MCP-Server kostet mehr Token, nicht weniger. Bei jedem gemessenen Ausschnitt verbrauchte er mehr als der Agent, der die Datei selbst übersetzt: 137.1 Prozent mehr bei 10 Schlüsseln, 337.2 Prozent bei 50, 482.9 Prozent bei 200. Sein belegter Vorteil ist Geld oberhalb des Break-even bei 87 Schlüsseln, und dieser Vorteil besteht, weil Cache-Lesevorgänge unter frischer Eingabe abgerechnet werden. Es ist keine Token-Ersparnis und wird in keiner hier gemessenen Größe zu einer.
Es gibt kein Qualitätsurteil. Nichts in diesem Lauf bewertet Angemessenheit, Sprachfluss oder Bedeutung. Die einzige Messung auf Wertebene ist, ob ein Ausgabewert sich von seiner Quelle unterscheidet. Auf den Ausschnitten, auf denen sie gemessen wurde, ließ die lokale Engine 2.3 Prozent der Werte auf Englisch. Der Agentenweg bestand das Tor bei jedem Ausschnitt. Dieser Vergleich erfasst unübersetzte Werte und sonst nichts. Jede Aussage darüber, wie gut eine der beiden Seiten übersetzt, liegt außerhalb dieser Artefakte.
Der delegierte Weg erzeugte bei 500 Schlüsseln keine Datei. Alle 3 Wiederholungen haben Anfragen abgerechnet und nichts geliefert. Der Agent hörte auf zu warten, während der lokale Auftrag noch lief, und der MCP-Server stirbt mit der Sitzung, die ihn gestartet hat, die fertige Arbeit wurde also weggeworfen. Diese Läufe sind ein Lieferausfall und kein günstiges Ergebnis, deshalb sind sie aus der Differenztabelle ausgeschlossen und deshalb hat der größte Ausschnitt keinen direkten Vergleichswert.
Die Zahlen für die ganze Datei sind Hochrechnungen. Kein Lauf hat je alle 4,666 Schlüssel unter Messung übersetzt. Die Hochrechnung multipliziert den Ausschnitt mit 200 Schlüsseln mit 24. Eine andere Aufteilung, oder ein Kontext- oder Sitzungslimit auf halbem Weg, ändert das Ergebnis.
Dünne Wiederholungen. Zwei vergleichbare Wiederholungen je Zelle, weil Wiederholung 1 als Cache-Aufwärmung ausgeschlossen ist. Der Bericht markiert die Zellen mit großer Streuung: den Agentenweg bei 500 Schlüsseln (15.0 Prozent), mcp-value bei 10 Schlüsseln (32.7 Prozent) und bei 50 Schlüsseln (48.0 Prozent).
Eine Datei, ein Paar, ein Rechner. Eine einzige en.json, aus dem Englischen ins Tschechische übersetzt, auf einem Windows-Host, mit einem lokalen Modell in einer Quantisierung, gegen eine CLI-Version und ein Claude-Modell. Beide Seiten dieses Vergleichs bewegen sich über die Zeit.
Das nachvollziehen
btbench prepare --source <path to en.json> --model claude-opus-5 --sizes 10,50,200,500
btbench run --run <run-id> --arms direct,mcp-path --reps 3
btbench collect --run <run-id>
btbench compare --run <run-id>
prepare sondiert den MCP-Server, hasht die Quelle und schneidet die Ausschnitte. run führt jeden Arm und jede Wiederholung in einer frischen Sitzung aus. collect leitet summary.csv erneut aus den Transkripten ab. compare schreibt compare.md. Der Orchestrator ist ein .NET-Projekt, das zu btbench gebaut wird.
Die Artefakte
Jede Zahl oben löst sich auf eine dieser Dateien auf, auf den Abschnitt, die Tabellenzeile und die Spalte, die das Register festhält. Die vier, auf die sich die Zahlen berufen, reisen mit der Website, damit die Prüfung offline läuft.
| Datei | Inhalt |
|---|---|
| report.md | Der vollständige Bericht, alle Arme und Ausschnitte |
| compare.md | Der direkte Vergleich der zwei Arme |
| summary.csv | Eine Zeile je Lauf, jedes gemessene Feld |
| environment.json | Versionen, Git-Commit, MCP-Sonde, lokales Modell, Korpus-Hashes |
| raw.jsonl | Eine Zeile je API-Anfrage |
| runs.jsonl | Eine Zeile je Lauf, wie vom Orchestrator aufgezeichnet |
| logs | stream-json-Transkripte und Standardfehlerausgabe je Lauf |