Guillaume Duvernay

Jev senkte die Kosten dieses KI-Agenten um 61 %

AI efficiencyagentscostexperiment

Dies ist die ausführliche Version eines Experiments. Kurzfassung lesen

Im Juli schrieb ich, dass kleine Modelle entscheiden sollten, was große Modelle zu sehen bekommen: Es geht nicht darum, eine Aufgabe an ein günstigeres Modell weiterzuleiten, sondern kleine Modelle neben dem großen einzusetzen, damit sie auswählen, welche Tokens es überhaupt liest. Am Ende des Artikels schrieb ich, die Kosten seien ein Grund zum Experimentieren, aber kein Beweis, und jemand müsse den Test durchführen.

Am 15. September wurde dann Jev veröffentlicht. Es ist das erste System-One-Modell von TypeSafe: Es erzeugt überhaupt keinen Text, sondern liefert kalibrierte Wahrscheinlichkeiten für Antworten, die dein Code vorgibt. Es kostet $0.042 pro Million Eingabe-Tokens und antwortet in wenigen hundert Millisekunden. Mit dieser Kombination lassen sich zwei sehr konkrete Varianten der Juli-Idee günstig genug umsetzen, um sie tatsächlich zu messen.

Also habe ich diese beiden Varianten getestet.

Skills vorab laden. Bekommt ein Agent einen Katalog interner Dokumente, braucht er einen ganzen zusätzlichen Durchlauf, um zu entscheiden, welches er lesen soll, und es dann über ein Tool abzurufen. Jev kann diese Entscheidung vor dem ersten Durchlauf für einen Bruchteil eines Cents treffen. Die Dokumente stehen dann bereits im Prompt.

Tool-Daten filtern. Eine echte API-Antwort enthält größtenteils Felder, mit denen ein Agent nichts anfangen kann. In einem MCP-Setup landen sie trotzdem alle im Kontextfenster und werden in jedem weiteren Durchlauf erneut gesendet. Jev kann jedes Feld einer Antwort bewerten, bevor der Agent sie zu sehen bekommt.

Beides sind Klassifizierungsaufgaben, keine Schreibaufgaben. So fielen die Ergebnisse bei 192 Läufen mit 8 Aufgaben aus, berechnet mit den Preisen für Claude Opus 5:

Ob ein Chat-Titel noch zur Unterhaltung passt, ist eine weitere mögliche Entscheidung für Jev. Ich beschreibe diesen Anwendungsfall in meinem Artikel über das Erstellen von Unterhaltungstiteln. Mit Jev habe ich ihn noch nicht gemessen.

Dieselben 8 Aufgaben, derselbe Agent, dieselbe deterministische Bewertung. Jev macht im Balken rechts 3% der Kosten aus. Die vollständige Methode und alle Einzelwerte pro Aufgabe stehen weiter unten.

Bei der besten Aufgabe sanken die Kosten um 61%. Der Durchschnitt über alle acht Aufgaben liegt bei 29%, der geringste Wert bei 13%. In jedem Versuchsarm bestanden 99% der Qualitätsprüfungen, auch beim einfachen Agenten. Es musste also nichts aufgegeben werden, um diese Einsparungen zu erzielen.

Das gesamte Experiment kostete $1.17.

Was Jev ist

Jev erzeugt keinen Text. Du übergibst ihm einen state und eine Reihe typisierter Fragen. Zurück kommt eine kalibrierte Wahrscheinlichkeitsverteilung über die Antworten, die dein Code definiert. TypeSafe bezeichnet Jev als System-One-Modell, das mit dem trainiert wurde, was das Unternehmen als Reinforcement Learning für kalibrierte Entscheidungen beschreibt.

WasWert
Preis$0.042 pro Million Eingabe-Tokens, Ausgabe kostenlos
Kontext32,000 Tokens
Latenz, hier gemessen300 bis 600 ms, p50, unabhängig von der Batchgröße
EndpunktPOST /api/alpha/decisions auf OpenRouter

Was dieses Experiment überhaupt erst möglich macht, ist Batch-Verarbeitung. Alle Fragen werden in einem HTTP-Aufruf übermittelt, der state wird nur einmal gesendet. 264 Datenfelder zu bewerten erfordert eine Anfrage, nicht 264.

Mechanismus eins: Skills vorab laden

Vor dem ersten Durchlauf des Agenten liest Jev die Anfrage und die einzeilige Beschreibung jedes Skills. Den Inhalt der Skills sieht Jev nie. Alles mit einem Wert von mindestens 0.55 wird vollständig in den System-Prompt eingefügt.

Schritt 3 ist der entscheidende Punkt. Der Richtlinientext steht bereits im ersten Prompt. So kennt der Agent die Regel für Tag 10, noch bevor er irgendetwas aufgerufen hat.

Das Tool read_skill bleibt verfügbar. Der Agent kann also weiterhin alles abrufen, was der Router übersehen hat. Das ist wichtig, denn der Router übersieht durchaus Dinge.

Mechanismus zwei: Tool-Payloads filtern

Nachdem ein Tool geantwortet hat und bevor seine Ausgabe den Agenten erreicht, wird jedes Blattfeld der Antwort auf seine Relevanz für die aktuelle Anfrage bewertet. Alles unter 0.35 wird entfernt.

Die angezeigten Werte stammen aus dem Laufprotokoll und entsprechen den Feldern, die am nächsten am Schwellenwert liegen. Die meisten Felder liegen deutlich von 0.35 entfernt; ihre genauen Werte wurden nicht gespeichert und werden daher nicht angezeigt.

Bemerkenswert an diesen Werten: Die Felder, die bei diesem Aufruf wegfallen, liegen bei 0.31 bis 0.34, die erhaltenen bei 0.35 bis 0.37. Der Grenzwert ist also tatsächlich eine Grenze, und einige Felder wechseln zwischen den Durchläufen die Seite. trial_end erzielte in einem Durchlauf 0.34, in einem anderen 0.37. Kein für die Aufgabe benötigtes Feld lag jemals in diesem Bereich.

Woher die Sicherheit tatsächlich kommt

Im dritten Schritt, beim Zustand, fällt die Entscheidung. Derselbe Schwellenwert ist mit einem unvollständigen Zustand gefährlich. Ein umfassenderer Zustand macht die Filterung zugleich sicherer und aggressiver.

Isoliert betrachtet, für das Feld, das bei der Mahnaufgabe entscheidend ist:

Inhalt des Zustandsaccount.idmetadata.account_idBehalten
Anfrage + Tool + Argumente0.180.2051 / 124
+ die Richtlinien, denen der Agent folgt0.190.1850 / 124
+ die bisherigen Aktionen0.330.2540 / 124
+ die noch verfügbaren Tools0.730.7627 / 124

Die beiden mittleren Spalten zeigen die Werte für das Feld, von dem die Aufgabe tatsächlich abhängt. Die letzte Spalte gibt an, wie viele der 124 Felder den Schwellenwert von 0.35 überstehen.

Die Skills hinzuzufügen, ändert nichts. Der bisherige Verlauf hilft ein wenig. Entscheidend ist die Liste der noch möglichen Aktionen. Solange der Scorer nicht weiß, dass ein Aufruf von billing_set_account_state(account_id, …) ansteht, ist eine Konto-ID nur eine Zeichenfolge unter vielen.

Die allgemeine Form dieses Prinzips, die sich auch auf andere Setups übertragen lässt:

Ein Feld ist nicht an sich nützlich. Es ist nützlich im Hinblick darauf, was der Agent gleich damit tun wird. Diese Information steckt nicht in der Payload, sondern im Schema der weiterhin verfügbaren Tools.

Wo die Einsparungen entstehen und wo nicht

Die beiden Mechanismen erfassen völlig unterschiedliche Dinge. Für den eigenen Workload ist es wichtiger zu wissen, welcher davon greift, als den Durchschnitt zu kennen.

Darauf kommt es in der Praxis an. Betrachte für den einen deine Payloads, für den anderen die Struktur deiner Durchläufe.

Die Unterschiede sind groß. Bei der Aufgabe, für die sechs Hilfeartikel eingehen und nur updated_at wichtig ist, entfernt die Filterung 84% der Payload und 63% der Eingabetokens. Bei der Incident-Aufgabe, bei der fast jedes Feld verwendet wird, sind es 5%. Derselbe Agent, derselbe Schwellenwert, ein Unterschied um den Faktor 17.

Kosten pro Aufgabe mit Opus 5, einfacher Agent im Vergleich zu beiden Mechanismen:

AufgabeArtEinfachBeideEinsparung
veraltete Dokukurz · sehr dünne Payload$0.0639$0.0252−61%
Rückerstattungmittel · gemischt$0.0419$0.0249−41%
Incidentkurz · dicht$0.0340$0.0241−29%
Mahnwesenkurz · gemischt$0.0187$0.0135−28%
Abfrageein Aufruf · dünn$0.0083$0.0068−17%
DSGVOmittel · gemischt$0.0336$0.0282−16%
SLAlang · gemischt$0.0442$0.0378−15%
Postmortemsehr lang · gemischt$0.0906$0.0792−13%
Durchschnitt$0.0419$0.0299−29%

Ein Opus-5-Agent, der 10,000 Aufgaben pro Monat bearbeitet, kostet statt $419 nur noch $299. Davon entfallen $9 auf Jev.

Ob sich die Filterung lohnt, hängt vom Preis des Hauptmodells ab

Das ist das Ergebnis, das dein Vorgehen ändern sollte.

Das Filtern kostet bei jedem Tool-Aufruf Jev-Tokens. Diese Tokens haben einen festen Preis. Die eingesparten Tokens werden hingegen zum Preis deines Agentenmodells abgerechnet. Entscheidend ist also das Verhältnis, und das kann sich umkehren.

AgentenmodellPreis für EingabeAgent ohne FilterBeide Mechanismen
GPT-5.6 Luna$0.20/M$0.00182$0.00221+21%
Claude Sonnet 5$2.00/M$0.01676$0.01253−25%
Claude Opus 5$5.00/M$0.04191$0.02995−29%

Die Tokenzahlen bleiben gleich. Nur der Preis des Agentenmodells ändert sich. Beim günstigen Modell entfallen 42% der Kosten auf Jev, und das Filtern kostet mehr, als es einspart. Bei Opus 5 sind es 3% der Kosten.

Berechnet man den Kipppunkt anhand der gemessenen Tokenzahlen und der üblichen Preisstruktur, liegt er bei $0.55 pro Million Eingabe-Tokens mit aktivem Prompt-Caching und bei $0.37 ohne. Darunter solltest du nicht filtern, darüber schon.

Skills vorzuladen lohnt sich immer, auch beim günstigsten Modell, denn es kostet fast nichts: etwa 1,500 Jev-Tokens pro Durchlauf, also $0.00006, und spart dafür einen Gesprächsschritt.

Ein weiterer Effekt ist wissenswert: Caching halbiert die Kosten ungefähr und verringert den relativen Nutzen des Filterns, weil das meiste, was beim Filtern entfernt wird, ohnehin günstige Cache-Lesezugriffe gewesen wären. Filtern lohnt sich für einen Einsatz ohne Caching mehr als für einen mit Caching.

Der Fehlermodus

Der Schwellenwert von 0.35 ist nur dank des umfangreichen Zustands sicher. Eine frühere Version ohne diesen Zustand führte zum schlimmsten denkbaren Fehler.

Der Filter entfernte account.id aus einem Stripe-Abonnement und bewertete es mit 0.18. Außerdem entfernte er metadata.account_id, die zweite Kopie. Der Agent nahm den einzigen verbliebenen Bezeichner und tat Folgendes:

Aufruf:  billing_set_account_state(account_id="cus_PmT4k9WqLr2XbN", state="read_only")
                                              ↑ die Stripe-Kunden-ID, nicht das Konto

Bericht: „Ich habe das zugehörige Konto gemäß der Richtlinie für Tag 10 auf schreibgeschützt gesetzt.“

Der richtige Bezeichner war acct_borealis_4c77. Der Agent führte die Aktion am falschen Objekt aus und meldete das selbstbewusst.

Für jeden Einsatz müssen kritische Pfade festgelegt und der Schwellenwert darauf abgestimmt werden. Beim Routing entschieden zwei Hundertstel beim Schwellenwert darüber, ob ein Gesprächsschritt eingespart wurde oder nicht. Beim Filtern war der Unterschied noch deutlich größer.

Was ich daraus mitnehme

Es lohnt sich, an der Effizienz von KI zu arbeiten. Viel Potenzial liegt darin, Modelle unterschiedlicher Größe und Art zu kombinieren. Interessant ist hier, dass sich ein Modell, das überhaupt keinen Text verfassen kann, als guter Beurteiler dafür erweist, was ein textgenerierendes Modell sehen darf.

Hier wurden zwei Ansatzpunkte getestet. Dasselbe Muster könnte an vielen weiteren Stellen greifen: bei der Auswahl der Dateien, die ein Agent öffnet, bei der Entscheidung, wann ein Gespräch komprimiert werden sollte, bei der Bewertung, ob ein abgerufenes Dokument seine Tokens wert ist, oder beim Prüfen eines Schreibvorgangs, bevor er ausgeführt wird. Nichts davon wurde gemessen. Ich würde nicht davon ausgehen, dass es funktioniert, bevor es getestet wurde.

Weiter unten findest du die vollständige Dokumentation: den Testaufbau, jede Aufgabe, jeden Schwellenwert, alle Tabellen und auch, was diese Untersuchung nicht zeigt.


Alle Details

Alles ab hier ist das vollständige Experiment. Es ist absichtlich lang. Wenn du nur das Ergebnis wolltest, hast du es bereits.

Der Versuchsaufbau

Der Agent

Etwa 80 Zeilen. Kein Framework, kein Agent-SDK, keine Orchestrierungsbibliothek. Eine while-Schleife um fetch:

  1. Sende einen POST-Request an den Chat-Completions-Endpunkt von OpenRouter, mit der Nachrichtenliste und den Tool-Schemas im OpenAI-Format für Funktionsaufrufe.
  2. Enthält die Antwort tool_calls, führe jeden Aufruf lokal aus, füge das Ergebnis als Nachricht mit role: "tool" hinzu und starte die Schleife erneut.
  3. Enthält die Antwort keine tool_calls, ist dieser Text die endgültige Antwort und die Schleife endet.
ParameterWertHinweis
modelopenai/gpt-5.6-luna$0.20/M eingehend, $1.20/M ausgehend, Kontextfenster mit 1,050,000 Token
tools17 Funktions-Schemas
tool_choiceautoDer Agent entscheidet, ob und was aufgerufen wird
seed1000 + WiederholungsindexDas Einzige, was zwischen den Wiederholungen variiert
max_tokens2000Eine Obergrenze, kein Zielwert
reasoning / reasoning_effortnicht festgelegtBeim Standardwert des Anbieters belassen
temperature, top_pnicht festgelegtBeim Standardwert des Anbieters belassen

Zum Thema Reasoning: Es wurde nie ein reasoning-Parameter übergeben, das Modell lief also mit dem Standardwert des Anbieters. Ein späterer Kontrollaufruf gibt reasoning_tokens: 0 zurück. Es wurde somit kein separates Reasoning-Budget verbraucht, und keine der Tokenzahlen enthält verborgene Reasoning-Token. Bei einer Wiederholung mit höherem Reasoning-Aufwand wären die absoluten Werte anders.

Zwei Sicherheitsvorkehrungen, denn eine außer Kontrolle geratene Agentenschleife kostet Geld: maximal 8 Durchläufe pro Ausführung und höchstens 6 Tool-Aufrufe pro Durchlauf. Bei den 192 Ausführungen wurde keine der beiden Grenzen erreicht. Eine dritte Vorkehrung summiert die Kosten aller Aufrufe und bricht ab, sobald der festgelegte Grenzwert überschritten wird. Für die Kampagne lag er bei $2.60.

Die Welt

Ein fiktives B2B-SaaS-Unternehmen namens Northwind Analytics, für das der Agent als Betriebsassistent arbeitet.

17 Tools, deren Nutzdaten die tatsächliche Struktur von Stripe, Zendesk, HubSpot, Statuspage, PagerDuty, Slack, Linear und einem Help-Center-CMS nachbilden: gleiche Schlüsselnamen, gleiche Verschachtelung, gleicher Datenballast. Es handelt sich um lokale Funktionen, die Testdaten zurückgeben, daher verlässt nichts den Rechner. Schreibvorgänge werden zur Bewertung protokolliert und mit einer plausiblen Bestätigung quittiert.

ToolNachgebildet nachNutzdaten
kb_list_articlesListen-Endpunkt eines Help-Center-CMS28,128 Zeichen
stripe_list_chargesStripe GET /v1/charges6,993 Zeichen
kb_get_articleLese-Endpunkt eines Help-Center-CMS4,966 Zeichen
stripe_get_subscriptionStripe GET /v1/subscriptions/:id3,181 Zeichen
zendesk_get_ticketZendesk GET /api/v2/tickets/:id mit zusätzlichen eingebetteten Daten2,402 Zeichen
pagerduty_get_incidentPagerDuty GET /incidents/:id1,821 Zeichen
statuspage_get_incidentStatuspage-Vorfall + Verfügbarkeit1,711 Zeichen
crm_get_accountHubSpot-Unternehmensobjekt1,117 Zeichen
read_skillintern988 Zeichen
stripe_create_refundStripe POST /v1/refunds479 Zeichen
linear_create_issueLinear issueCreate202 Zeichen
billing_apply_creditinterne Abrechnungs-API147 Zeichen
zendesk_replyZendesk PUT /api/v2/tickets/:id144 Zeichen
billing_set_account_stateinterne Abrechnungs-API134 Zeichen
slack_post_messageSlack chat.postMessage124 Zeichen
billing_apply_discountinterne Abrechnungs-API98 Zeichen
pagerduty_escalatePagerDuty-Eskalation92 Zeichen

11 Skills: Markdown-Dateien mit einer einzeiligen description im Frontmatter und einem Textkörper, der die konkreten Grenzwerte, Zahlen und Formate enthält: churn-save-offers, docs-review-cadence, dunning-playbook, enterprise-contract-terms, escalation-matrix, gdpr-data-requests, incident-comms, oncall-handover, refund-policy, release-notes-format, slack-style-guide. Mehrere davon sind für keine der Aufgaben relevant. Sie dienen dem Router als Ablenkung.

8 Aufgaben, ausgewählt entlang zweier unabhängiger Dimensionen: Länge, von einem einzelnen Tool-Aufruf bis zu sieben Durchläufen, und Dichte der Nutzdaten, von „jedes Feld ist wichtig“ bis zu „76 % der Bytes sind Text, den man verwerfen kann“.

Die Aufgaben im Wortlaut

AufgabeAls Nutzernachricht gesendete Eingabe
T1-refundACME Analytics (Konto acct_acme_9f21) hat eine E-Mail geschickt: Dem Unternehmen zufolge wurde die November-Rechnung doppelt abgebucht. Prüfe das und erledige alles vollständig, einschließlich einer Benachrichtigung des Teams.
T2-slaDas Zendesk-Ticket 48213 ist ein Antrag auf SLA-Gutschrift von einem Unternehmenskunden wegen Oktober. Ermittle den zustehenden Betrag, verbuche die Gutschrift und antworte dem Kunden.
T3-dunningDas Abonnement sub_1QdRvT2eZvKYlo2CkW8pQm4L ist überfällig. Führe den nächsten Schritt gemäß unserem Prozess aus.
T4-gdprTicket 48377 ist gerade im Datenschutz-Postfach eingegangen. Übernimm den Fall und erledige alles, was der Prozess verlangt.
T5-incidentDer Vorfall PD-99213 wurde gerade ausgelöst. Kümmere dich um die Eskalation und die Kommunikation.
T6-stale-docsWelche unserer veröffentlichten Help-Center-Artikel sind zur Überprüfung überfällig? Erfasse die anstehenden Arbeiten.
T7-postmortemDer Vorfall INC-4471 ist behoben. Erledige die Nachbereitung: Wer war betroffen, was steht den Betroffenen zu, und informiere das Unternehmen über den aktuellen Stand.
T8-lookupWelchen Tarif hat acct_borealis_4c77, und wer ist der zuständige CSM?

Bewertung

Deterministisch. 59 Prüfungen über die acht Aufgaben hinweg, jede entweder ein Tool-Aufruf mit exakt vorgegebenen Argumenten, etwa stripe_create_refund(charge="ch_3QRk9X…", amount=14900, reason="duplicate"), oder eine Information, die nur in einem Skill-Dokument vorkommt: die SLA-Stufe von 25 %, die Regel für Tag 10, das Team PRIV und die Frist von 30 Tagen.

Es kommt nirgends ein LLM als Prüfer zum Einsatz. Öffnet eine Ausführung die Skills nicht, scheitert sie automatisch an der zweiten Art von Prüfung. Genau darum geht es: So lässt sich messen, „ob der Agent die Richtlinie tatsächlich vorliegen hatte“, statt darüber zu spekulieren.

Für jede Aufgabe sind außerdem kritische Nutzdatenpfade festgelegt, also die Felder, von denen die Antwort abhängt. Sie werden nie dazu verwendet, den Filter zu steuern. So wird ein übermotivierter Filter im Protokoll sichtbar, selbst wenn die Ausführung trotzdem erfolgreich ist.

Die Varianten

VarianteVorab geladene SkillsGefilterte Payload
0neinnein
Aja, Schwellenwert 0.55nein
Bneinja, Schwellenwert 0.35, umfangreicher Zustand
Dja, Schwellenwert 0.55ja, Schwellenwert 0.35, umfangreicher Zustand

8 Aufgaben × 4 Varianten × 6 Wiederholungen = 192 Durchläufe. Die Wiederholungen unterschieden sich nur durch seed.

Kalibrierung

Beide Schwellenwerte wurden offline getestet, bevor Agent-Tokens verbraucht wurden.

0.55 für das Routing ist der höchste Wert, bei dem der vollständige Recall für die Aufgaben erhalten bleibt, auf die der Wert kalibriert wurde. Bei 0.60 erzielt slack-style-guide bei der Rückerstattungsaufgabe einen Wert von 0.58, und die eingesparte Runde geht verloren. Zwei Hundertstel entscheiden darüber, ob die Zahl der Runden um 15 % sinkt oder gar nicht.

0.35 für die Filterung ist nur dank des oben beschriebenen umfangreichen Zustands vertretbar. Der Kalibrierungslauf kostet etwa $0.004, da dabei Router und Scorer ausgeführt werden, nicht aber der Agent.

Eine allgemeingültige Erkenntnis: Jede Formulierung einer Frage muss eigens kalibriert werden. Ein Schwellenwert lässt sich nicht von einer Formulierung auf eine andere übertragen, selbst wenn beide dieselbe Frage stellen. Für eine aufgabenspezifische und eine aufgabenunabhängige Formulierung wurden Verteilungen mit völlig unterschiedlichen Trägern gemessen. Bei jeder Umformulierung neu kalibrieren.

Summen der Testkampagne

MessgrößeGesamt
Durchläufe192
Agentenrunden775
Eingabe-Tokens des Agenten2,118,338, davon 1,685,860 (80%) aus dem Cache
Ausgabe-Tokens des Agenten130,003
Jev-Eingabe-Tokens2,065,975
Jev-Aufrufe96 Routing + 252 Filterung
Tatsächliche KostenAgent $0.2977 · Jev $0.0868
Gesamt, einschließlich Kalibrierung und verworfener Varianten$1.17

Gesamtübersicht nach Variante

VarianteFehlerfreie DurchläufeBestandenene PrüfungenRundenEingabe-TokensVerworfene kritische Pfade
092%99%4.4412,960n/a
A96%99%3.6911,809n/a
B94%99%4.319,9670
D94%99%3.719,3961

Keine der Techniken hat die Qualität verschlechtert. In allen vier Varianten werden 99% der Prüfungen bestanden. Bei 96 gefilterten Aufrufen in Variante D wurde genau ein als kritisch gekennzeichneter Pfad verworfen, und der betreffende Durchlauf wurde trotzdem bestanden. Die Unterschiede bei den „fehlerfreien“ Durchläufen pro Lauf zwischen 92% und 96% liegen bei n = 48 im Bereich des Zufalls. Belastbare Effekte zeigen sich bei Runden und Tokens.

Durchschnittliche Tokens pro Durchlauf, aufgeschlüsselt nach tatsächlicher Abrechnung:

VarianteNeue EingabeEingabe aus CacheAusgabeJev-Eingabe
02,94110,0207410
A2,7009,1096151,517
B1,8738,09372319,457
D1,4967,90062922,067

Variante D senkt die Zahl der neuen Eingabe-Tokens, der teuren Tokenart, um 49%.

Einsparung bei Eingabe-Tokens pro Technik, von geringster bis höchster

TechnikMinimumMaximumMedian
A Skills vorab laden−3% bei der SLA-Aufgabe+23% bei der DSGVO-Aufgabe10%
B Payload filtern+2% bei der DSGVO-Aufgabe+51% bei veralteten Dokumenten17%
D beides+9% beim Postmortem+63% bei veralteten Dokumenten26%

Der einzige negative Wert in der gesamten Matrix tritt bei A für die SLA-Aufgabe auf: Der Router lädt einen Skill zu viel, ohne eine Runde einzusparen. Der zusätzliche Skill wird in den System-Prompt aufgenommen und anschließend in jeder Runde erneut gesendet. Außerdem addieren sich die beiden Techniken nicht immer: Bei der SLA-Aufgabe und beim Postmortem spart D weniger Tokens als B allein, genau aus diesem Grund.

So hat der Router tatsächlich abgeschnitten

Mittlere Wahrscheinlichkeit pro Skill und Aufgabe. Als geladen gilt ein Skill ab 0.55.

AufgabeGeladene SkillsHöchste Werte
T1-refund2.0refund-policy 0.82 · slack-style-guide 0.60 · incident-comms 0.32
T2-sla2.0enterprise-contract-terms 0.95 · refund-policy 0.84 · churn-save-offers 0.13
T3-dunning1.0dunning-playbook 0.95 · churn-save-offers 0.32 · oncall-handover 0.13
T4-gdpr1.0gdpr-data-requests 0.87 · refund-policy 0.27 · escalation-matrix 0.22
T5-incident3.0escalation-matrix 0.93 · incident-comms 0.85 · slack-style-guide 0.69
T6-stale-docs1.0docs-review-cadence 0.93 · slack-style-guide 0.15 · oncall-handover 0.05
T7-postmortem3.0enterprise-contract-terms 0.92 · refund-policy 0.89 · incident-comms 0.58 · slack-style-guide 0.47
T8-lookup0.0slack-style-guide 0.07 · enterprise-contract-terms 0.06 · dunning-playbook 0.04

Recall: 132 der 144 benötigten Skills wurden geladen, also 92 %. Ein systematischer Fehltreffer und ein systematischer falsch positiver Treffer, die beide klar benannt werden sollten.

Beim Postmortem wurde slack-style-guide in allen 12 Durchläufen übersehen: Der Wert lag mit 0.47 unter dem Schwellenwert. In der Aufgabe heißt es „dem Unternehmen sagen, wo es steht“, und der Router erkennt darin keine Formatierungsfrage. Der Agent hat den Skill selbst abgerufen, als er ihn brauchte.

Der falsch positive Treffer ist refund-policy bei der SLA-Aufgabe mit 0.84 und beim Postmortem mit 0.89. Eine SLA-Gutschrift sieht wie eine Rückerstattung aus. Genau diese Verwechslung soll refund-policy verhindern, denn das Dokument stellt klar, dass ein Dienstausfall keine Rückerstattung ist. Der Router liegt bei der Form falsch, beim Inhalt aber richtig, und dem Agenten ist dadurch kein Schaden entstanden.

Bei der Lookup-Aufgabe wird richtigerweise nichts geladen. Kein Skill ist dafür relevant, und der höchste Wert liegt bei 0.07.

So hat der Filter tatsächlich funktioniert

Arm D, nach Tool, über 96 gefilterte Aufrufe:

ToolAufrufeZeichen vorher → nachherÄnderungBeibehaltene Schlüssel
kb_list_articles8225,024 → 24,834−89%605 / 1,808
stripe_list_charges641,958 → 12,819−69%405 / 1,584
stripe_get_subscription619,086 → 10,637−44%359 / 744
crm_get_account3029,400 → 16,723−43%384 / 1,002
zendesk_get_ticket1225,620 → 15,787−38%328 / 822
statuspage_get_incident915,399 → 10,734−30%311 / 540
pagerduty_get_incident1221,852 → 16,497−25%428 / 684
stripe_create_refund63,012 → 2,610−13%60 / 108
zendesk_reply128,685 → 9,489+9%24 / 84
linear_create_issue185,287 → 6,734+27%83 / 138
billing_apply_credit81,343 → 2,406+79%42 / 56

Bei den Lese-Tools liegt das größte Einsparpotenzial, und die Unterschiede sind enorm: von −89% bei einer Dokumentenliste bis zu −25% bei einem Vorfall, bei dem fast alles unverzichtbar ist.

Bei den Bestätigungen für Schreibvorgänge geht es in die falsche Richtung. billing_apply_credit gibt 147 Zeichen zurück, und der angehängte Marker _trimmed kostet mehr, als durch die entfernten Felder eingespart wird. Einen kleinen Payload zu filtern, bringt unterm Strich also Nachteile. Eine Implementierung für den Produktionseinsatz sollte alles unter ein paar hundert Zeichen ganz überspringen. Hier blieb es dabei, damit der Effekt in den Daten sichtbar ist.

Jede Aufgabe, jeder Arm

Die Preise zeigen die vollständigen Kosten eines Durchlaufs für Agent plus Jev und basieren auf der gemessenen Aufteilung in frische und zwischengespeicherte Daten. Die Spalten für Sonnet 5 und Opus 5 rechnen den gemessenen Traffic zu den jeweiligen Modellpreisen durch. Jevs Kosten sind in allen drei Spalten identisch.

T1-refund, mittel · gemischter Payload

ArmPerfektPrüfungenDurchläufeEingabetokensPayload gekürzt$ Luna$ Sonnet 5$ Opus 5vs. 0
0100%100%4.515,369n/a0.001800.01670.0419n/a
A100%100%4.014,247 (−7%)n/a0.001650.01500.0373−11%
B100%100%4.310,719 (−30%)65%0.002850.01410.0331−21%
D100%100%4.09,899 (−36%)66%0.002520.01080.0249−41%

T2-sla, lang · gemischter Payload

ArmPerfektPrüfungenDurchläufeEingabetokensPayload gekürzt$ Luna$ Sonnet 5$ Opus 5vs. 0
083%96%6.818,811n/a0.001920.01770.0442n/a
A100%100%6.219,359 (+3%)n/a0.001930.01740.0433−2%
B83%96%6.515,528 (−17%)30%0.002860.01730.0417−6%
D83%96%6.016,533 (−12%)72%0.003120.01600.0378−15%

T3-dunning, kurz · gemischter Payload

ArmPerfektPrüfungenDurchläufeEingabetokensPayload gekürzt$ Luna$ Sonnet 5$ Opus 5vs. 0
0100%100%4.08,084n/a0.000800.00750.0187n/a
A100%100%3.06,704 (−17%)n/a0.000790.00690.0171−9%
B100%100%4.07,384 (−9%)44%0.001290.00690.0163−13%
D100%100%3.06,002 (−26%)44%0.001230.00580.0135−28%

T4-gdpr, mittel · gemischter Payload

VariantePerfektPrüfungenDurchläufeEingabetokenPayload gekürzt$ Luna$ Sonnet 5$ Opus 5vs. 0
050%94%4.28,344n/a0.001500.01340.0336n/a
A100%100%3.06,467 (−23%)n/a0.001320.01140.0285−15%
B83%98%4.28,167 (−2%)14%0.001860.01290.0315−6%
D83%98%3.06,159 (−26%)16%0.001780.01160.0282−16%

T5-incident, kurz · dichter Payload

VariantePerfektPrüfungenDurchläufeEingabetokenPayload gekürzt$ Luna$ Sonnet 5$ Opus 5vs. 0
0100%100%3.88,647n/a0.001510.01360.0340n/a
A67%96%3.07,004 (−19%)n/a0.001210.01040.0259−24%
B83%98%3.78,153 (−6%)6%0.001680.01270.0313−8%
D83%98%3.06,935 (−20%)5%0.001430.00990.0241−29%

T6-stale-docs, kurz · sehr dünner Payload

VariantePerfektPrüfungenDurchläufeEingabetokenPayload gekürzt$ Luna$ Sonnet 5$ Opus 5vs. 0
0100%100%4.019,821n/a0.002650.02560.0639n/a
A100%100%3.018,468 (−7%)n/a0.002600.02460.0614−4%
B100%100%4.09,639 (−51%)78%0.002620.01390.0329−49%
D100%100%3.07,387 (−63%)84%0.002350.01090.0252−61%

T7-postmortem, sehr lang · gemischter Payload

VariantePerfektPrüfungenDurchläufeEingabetokenPayload gekürzt$ Luna$ Sonnet 5$ Opus 5vs. 0
0100%100%6.021,294n/a0.004060.03630.0906n/a
A100%100%5.319,224 (−10%)n/a0.003390.02970.0743−18%
B100%100%5.717,064 (−20%)34%0.004880.03430.0841−7%
D100%100%5.719,430 (−9%)33%0.004720.03240.0792−13%

T8-lookup, ein Aufruf · dünner Payload

VariantePerfektPrüfungenDurchläufeEingabetokenPayload gekürzt$ Luna$ Sonnet 5$ Opus 5vs. 0
0100%100%2.23,314n/a0.000360.00330.0083n/a
A100%100%2.03,004 (−9%)n/a0.000380.00300.0073−12%
B100%100%2.23,080 (−7%)62%0.000470.00260.0062−24%
D100%100%2.02,819 (−15%)62%0.000560.00290.0068−17%

So wurden die Preise berechnet

Einmal messen, dann neu berechnen. Die Tokenzahlen bilden die Grundlage; die Kosten für jedes Modell ergeben sich aus denselben Zahlen, multipliziert mit den jeweiligen Modellsätzen.

Die Abrechnungsformel wurde anhand der Daten rückerschlossen, nicht einfach angenommen. Über alle 192 Durchläufe hinweg entspricht der beobachtete Agentenpreis

fresh_input × $0.25/M  +  cached_input × $0.02/M  +  output × $1.20/M

einem medianen relativen Fehler von 0.04%. Daraus ergeben sich zwei Dinge. Prompt-Caching war die ganze Zeit automatisch aktiviert, ohne cache_control-Marker, und 80% der Eingabetoken waren Cache-Lesezugriffe. Außerdem wird jedes nicht gecachte Eingabetoken zum Schreibpreis abgerechnet, also zum 1.25-Fachen des nominalen Eingabepreises. In einer Schleife mit mehreren Durchläufen zahlt man daher praktisch nie den nominalen Satz von $0.20/M.

Ein früheres theoretisches Caching-Modell, bei dem die Lesezugriffe im Durchlauf t dem Präfix aus Durchlauf t−1 entsprechen, unterschätzte die tatsächlichen Cache-Lesezugriffe um 19%. Es wurde zugunsten der gemessenen Aufteilung pro Durchlauf verworfen.

ModellEingabeAusgabeCache-LesezugriffCache-Schreibzugriff
openai/gpt-5.6-luna$0.20/M$1.20/M$0.02/M$0.25/M
anthropic/claude-sonnet-5$2.00/M$10.00/M$0.20/M$2.50/M
anthropic/claude-opus-5$5.00/M$25.00/M$0.50/M$6.25/M
typesafe/jev-1.13$0.042/Mkostenlosn/an/a
VarianteLunaSonnet 5Opus 5Anteil von Jev, Opus 5
0$0.00182$0.01676$0.04191n/a
A$0.00166 (−9%)$0.01479 (−12%)$0.03688 (−12%)0%
B$0.00232 (+27%)$0.01435 (−14%)$0.03466 (−17%)2%
D$0.00221 (+21%)$0.01253 (−25%)$0.02995 (−29%)3%

Zum Vergleich: dieselben Durchläufe ganz ohne Caching:

VarianteLunaSonnet 5Opus 5
0$0.00348$0.03333$0.08332
A$0.00316$0.02984$0.07450
B$0.00368$0.02798$0.06874
D$0.00356$0.02601$0.06362

Eine Annahme ist bewusst konservativ statt neutral. OpenAI cached automatisch und berechnet jedes nicht gecachte Eingabetoken zum Schreibpreis, genau das wurde gemessen. Caching bei Anthropic muss ausdrücklich aktiviert werden: Nur Inhalte innerhalb eines cache_control-Breakpoints werden zum Schreibpreis abgerechnet, der Rest zum regulären Eingabepreis. Werden also alle nicht gecachten Token zum Schreibpreis berechnet, fallen die Anthropic-Werte etwas zu hoch aus. Bei einer Neuberechnung mit dem regulären Eingabepreis für nicht gecachte Token sinkt der Opus-5-Mittelwert von $0.04191 → $0.02995 (−29%) auf $0.03823 → $0.02808 (−27%); kein Wert pro Aufgabe verschiebt sich um mehr als 3 Punkte.

Was dies nicht zeigt

  • Ein Agentenmodell. Alles wird mit openai/gpt-5.6-luna bei standardmäßiger Denktiefe gemessen. Die Tokenzahlen sind das Ergebnis, die Preisspalten werden darauf aufbauend berechnet. Ein anderes Modell würde andere Tokenzahlen liefern, nicht nur andere Preise.
  • n = 6 pro Zelle. Das reicht für die Anzahl der Durchläufe und Tokenzahlen, die nahezu deterministisch sind. Es reicht nicht aus, um eine Qualität von 92 % von 96 % zu unterscheiden.
  • Test-Fixtures statt Live-APIs. Die Payload-Strukturen entsprechen den realen. Echte Endpunkte haben Paginierung, Teilausfälle und Ratenbegrenzungen, die dieser Testaufbau nicht abbildet.
  • Dieselben Personen haben die Aufgaben und die Skills verfasst. Die Bewertung ist deterministisch, aber die Testumgebung stellt keine adversarialen Bedingungen dar.
  • Jevs eigene Kalibrierung wurde nicht geprüft. Gemessen wurde, wie sich Jevs Bewertungen auf einen Agenten auswirken, nicht, ob sie statistisch gesehen gut kalibriert sind.
  • Ein Agentenaufbau. Eine while-Schleife mit Funktionsaufrufen. Unteragenten, parallele Tool-Aufrufe und lang laufende Sitzungen verändern die Berechnung.

Quellen