Anbinden · Weg D
Eigene Zahlen (Ingest)
Wenn ein anderes System die Aufrufe macht und Ihnen nur die Zählwerte liefert, schicken Sie diese an die Ingest-Schnittstelle. Tokenwacht rechnet Kosten aus dem Preiskatalog, bildet Läufe und erkennt die Befunde D2, D3, D4 und D6.
Aufruf
POST https://tokenwacht.de/v1/ereignisse
Authorization: Bearer tw_live_…
Idempotency-Key: <uuid je Stapel>
Content-Type: application/json
{"ereignisse": [{
"ereignis_id": "8d2c9c0a-1c8b-4c7e-9d7f-4a5b6c7d8e9f", "zeitpunkt": "2026-09-06T10:00:00Z",
"anbieter": "anthropic", "modell": "claude-sonnet-5",
"agent": "nils-icp-research", "lauf_id": "RL-0815", "schritt_nr": 3,
"eingabe_token": 1200, "ausgabe_token": 57, "cache_lese_token": 800, "cache_schreib_token": 0, "denk_token": 0,
"werkzeugaufrufe": 1, "latenz_ms": 2140, "status": "erfolgreich",
"endkunde_ref": "kunde-4711", "funktion_ref": "leadliste_erzeugen", "quelle": "ingest"
}]}
Antwort 202 mit {"angenommen": 1, "doppelt": 0, "unvollstaendig": 0}. Bis 500 Ereignisse je Stapel.
Felder
| Feld | Pflicht | Bedeutung |
|---|---|---|
ereignis_id | empfohlen | UUID. Gleiche Kennung = gleiches Ereignis, wird nicht doppelt gezählt. Fehlt sie, bildet Tokenwacht eine aus Zeitpunkt, Agent und Zählwerten. |
zeitpunkt | ja | ISO 8601 mit Zeitzone. |
anbieter, modell | ja | anthropic, openai, google, bedrock; Modellname wie beim Anbieter. Unbekannte Modelle werden angenommen und ohne Preis (0 €) geführt, bis der Katalog sie kennt. |
agent | ja | Dauerhafte Einheit, an der Kosten und Befunde hängen. |
lauf_id, schritt_nr | empfohlen | Lauf-Kennung (UUID oder Text) und Schritt im Lauf. Ohne Lauf-Kennung automatische Lauf-Bildung wie beim Proxy. |
eingabe_token … denk_token | ja (mindestens Eingabe und Ausgabe) | Zählwerte aus dem Nutzungsobjekt des Anbieters. Cache-Felder und Denk-Token optional. |
status, fehlercode | optional | erfolgreich, fehler, abgewiesen. Fehler zählen als verbranntes Geld. |
werkzeugaufrufe, werkzeug_fingerabdruck, prompt_fingerabdruck | optional | Anzahl Werkzeugaufrufe; 16 Hex-Zeichen SimHash für Leerschleifen- und Cache-Erkennung. Kein Inhalt. |
endkunde_ref, funktion_ref, benutzer_ref | optional | Zuordnung für Weiterbelastung und Auswertung. |
geschaetzt | optional | true, wenn die Zählwerte geschätzt sind (z. B. Zeichen ÷ 4). Wird im Cockpit gekennzeichnet. |
Grundsätze
- Datenannahme scheitert nie. Unvollständige Ereignisse werden angenommen und als solche gekennzeichnet; die Antwort nennt die Gründe.
- Mehrfach senden ist sicher. Idempotenz über
ereignis_idund denIdempotency-Keydes Stapels. - Der Schlüssel braucht den Bereich „Ingest“ (oder keine Einschränkung).
Beispiel · Python mit dem SDK
from tokenwacht_sdk import Wacht
wacht = Wacht(schluessel=TW_KEY, agent="batch-klassifizierer")
with wacht.lauf("nacht-2026-09-06"):
wacht.melden([{"anbieter": "openai", "modell": "gpt-5-mini", "eingabe_token": u.prompt_tokens, "ausgabe_token": u.completion_tokens}
for u in nutzungen])
Beispiel · LangChain-Callback
from langchain_core.callbacks import BaseCallbackHandler
class TokenwachtCallback(BaseCallbackHandler):
def on_llm_end(self, antwort, **kw):
u = antwort.llm_output.get("usage") or antwort.llm_output.get("token_usage") or {}
wacht.melden({"anbieter": "anthropic", "modell": antwort.llm_output.get("model_name", "?"),
"eingabe_token": u.get("input_tokens", u.get("prompt_tokens", 0)),
"ausgabe_token": u.get("output_tokens", u.get("completion_tokens", 0))})
Prüfen:
curl https://tokenwacht.de/v1/anbindung/pruefen -H "Authorization: Bearer $TOKENWACHT_KEY" — letztes_ereignis.quelle ist ingest.