Jedes SDK erfasst KI-Agenten-Aktivität in-process und liefert sie an die Ledger API aus, sodass Ihr Agenten-Code ansonsten unverändert bleibt. Sie folgen alle demselben Vertrag, unabhängig von der Sprache:
on_error-Callback, statt sich zu propagieren.| Sprache | Paket | Abdeckung |
|---|---|---|
| TypeScript | sdk/typescript | Vollständige Parität — manuelle API + Anthropic/OpenAI-Auto-Instrumentierung (die Referenzimplementierung) |
| Python | sdk/python | Vollständige Parität — manuelle API + Anthropic/OpenAI-Auto-Instrumentierung |
| Go | sdk/go | Manuelle API |
| Java | sdk/java | Manuelle API |
| C# | sdk/csharp | Manuelle API |
!NOTE Keines davon ist bisher in einer Paket-Registry veröffentlicht (npm, PyPI, Maven, NuGet) — das ist eine Launch-Gate-Entscheidung, die noch aussteht. Jede Sprachseite unten beschreibt, wie Sie das SDK derzeit einbinden.
Für OTel-instrumentierte Apps in Go, Java oder C# richten Sie Ihren bestehenden Exporter auf den OTLP-Receiver des Ledgers (/v1/otlp/v1/traces), statt einen sprachspezifischen Span-Prozessor zu suchen — jede gen_ai.*-Span wird automatisch, serverseitig, zu einem Ledger-Event.
Diese gelten für jede Sprache:
endpoint — die Basis-URL der Ledger API (http://127.0.0.1:4010 für einen lokalen Entwicklungs-Stack — siehe Hosting mit Docker).ingest_key — ein Key pro Team; die Mandantenzuordnung wird serverseitig daraus aufgelöst. Einen erhalten Sie über npm run seed:demo (Entwicklung, gibt einen Demo-Key aus) oder über das Dashboard, sobald Sie eine echte Organisation eingerichtet haben.agent_id — eine URI, die das handelnde KI-System benennt, z. B. urn:agent:research-assistant.record(...) — erfasst eine KI-Aktion: einen LLM-Aufruf, Tool-Aufruf, eine Suche oder ein Daten-Read/-Write. Synchron und nicht blockierend; gibt eine Span-ID zurück.flush() — liefert gepufferte Events sofort aus. Läuft ebenfalls automatisch per Timer (standardmäßig alle 2 s).(org, span_id), sodass Wiederholungen nach einer fehlgeschlagenen Zustellung immer sicher sind.record()| Feld | Werte |
|---|---|
action_type | llm_call, tool_call, search, data_read, data_write, model_inference, lifecycle, error |
status | success, failure, timeout, denied, escalated |
trigger.type | human, system, schedule — wer/was dies ausgelöst hat |
trigger_category | Standardisiertes Trigger-Vokabular (ISO 24970 / prEN 18229-1) — gesetzt bei durch Monitoring erkannten Events (Drift, Bias, adversariale Eingaben) und bei Oversight-/Konfigurationsänderungs-Events |
payloads[].kind | prompt, response, artifact |
retrievals[].source_type | database, document, web, api |
Jedes Event kann über parent_ref (eine Span-ID) auf das Event verweisen, das es verursacht hat, sodass eine Kette wie Suche → LLM-Aufruf, der sie verwendet hat → Tool-Aufruf, der auf dem Ergebnis gehandelt hat rekonstruierbar ist. Jedes SDK bietet außerdem einen ambienten "current span"-Helfer (within() / with()), sodass verschachtelte Aufrufe den richtigen Parent automatisch erben, ohne eine ID von Hand durch jede Funktionssignatur reichen zu müssen.
Binärinhalte (Bilder, PDFs, Audio) können nicht als Text inline in record() mitfahren. Laden Sie sie zuerst hoch — dies ist der einzige Aufruf in jedem SDK, der blockiert, da der Blob serverseitig existieren muss, bevor ein Event darauf verweisen kann — und übergeben Sie dann die zurückgegebene Blob-ID als blob_ref eines Payloads oder Retrievals. Uploads sind content-addressed: Das erneute Hochladen identischer Bytes gibt dieselbe Blob-ID zurück.
Die Zustellung erfolgt at-least-once. Ein fehlgeschlagener Flush (Netzwerkfehler, 5xx, 429) belässt den Batch gepuffert für den nächsten Timer-Tick — bei einem vorübergehenden Fehler geht nichts verloren. Ein 401 bedeutet, dass der Ingest-Key falsch ist; das wird über on_error gemeldet, und der Batch bleibt gepuffert, statt verworfen zu werden. Wenn der Buffer selbst voll läuft (Standard-Obergrenze: 10.000 Events), werden die ältesten Events verworfen, um Platz zu schaffen — dieser Drop ist jedoch nie stillschweigend: Ein gezähltes Lücken-lifecycle-Event wird vor dem nächsten Batch versiegelt, sodass die Lücke selbst Teil des Audit-Trails ist.
Hosting auf Kubernetes
Deployen Sie das Sannvit Ledger mit dem Helm-Chart auf den Kubernetes-Cluster eines Kunden, für horizontale Skalierung über einen einzelnen Host hinaus.
TypeScript SDK
Installieren und verwenden Sie das TypeScript-SDK des Ledgers — die Referenzimplementierung, mit manueller Erfassung und Ein-Zeilen-Auto-Instrumentierung für Anthropic/OpenAI.