Chaque SDK capture l'activité des agents IA directement dans le processus et la transmet à l'API du registre, de sorte que le code de votre agent reste par ailleurs inchangé. Ils suivent tous le même contrat, quel que soit le langage :
on_error plutôt que de se propager.| Langage | Package | Couverture |
|---|---|---|
| TypeScript | sdk/typescript | Parité complète — API manuelle + auto-instrumentation Anthropic/OpenAI (l'implémentation de référence) |
| Python | sdk/python | Parité complète — API manuelle + auto-instrumentation Anthropic/OpenAI |
| Go | sdk/go | API manuelle |
| Java | sdk/java | API manuelle |
| C# | sdk/csharp | API manuelle |
!NOTE Aucun de ces SDK n'est encore publié sur un registre de paquets (npm, PyPI, Maven, NuGet) — c'est une décision de blocage de lancement encore en attente. Chaque page de langage ci-dessous explique comment intégrer le SDK tel qu'il se présente aujourd'hui.
Pour les applications instrumentées avec OTel en Go, Java ou C#, faites pointer votre exportateur existant vers le récepteur OTLP du registre (/v1/otlp/v1/traces) plutôt que de recourir à un processeur de spans propre à chaque langage — chaque span gen_ai.* devient automatiquement un événement du registre, côté serveur.
Ceux-ci s'appliquent à tous les langages :
endpoint — l'URL de base de l'API du registre (http://127.0.0.1:4010 pour une pile de développement locale — voir Hébergement avec Docker).ingest_key — une clé par équipe ; la tenancy est résolue côté serveur à partir de celle-ci. Obtenez-en une via npm run seed:demo (développement, affiche une clé de démo) ou depuis le tableau de bord une fois une véritable organisation configurée.agent_id — une URI nommant le système IA agissant, par exemple urn:agent:research-assistant.record(...) — capture une action IA : un appel LLM, un appel d'outil, une recherche, ou une lecture/écriture de données. Synchrone et non bloquant ; retourne un identifiant de span.flush() — livre immédiatement les événements en tampon. S'exécute aussi automatiquement sur une minuterie (toutes les 2s par défaut).(org, span_id), donc les nouvelles tentatives après une livraison échouée sont toujours sûres.record()| Champ | Valeurs |
|---|---|
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 — qui/quoi a initié ceci |
trigger_category | Vocabulaire de déclencheur normalisé (ISO 24970 / prEN 18229-1) — défini sur les événements détectés par surveillance (dérive, biais, entrée adversariale) et les événements de supervision/changement de configuration |
payloads[].kind | prompt, response, artifact |
retrievals[].source_type | database, document, web, api |
Chaque événement peut référencer l'événement qui l'a provoqué via parent_ref (un identifiant de span), de sorte qu'une chaîne comme recherche → appel LLM ayant utilisé cette recherche → appel d'outil ayant agi sur le résultat soit reconstituable. Chaque SDK expose également un assistant de « span courant » ambiant (within() / with()) afin que les appels imbriqués héritent automatiquement du bon parent, sans avoir à faire transiter un identifiant manuellement à travers chaque signature de fonction.
Le contenu binaire (images, PDF, audio) ne peut pas être transmis en ligne dans record() sous forme de texte. Envoyez-le d'abord — c'est le seul appel bloquant de chaque SDK, puisque le blob doit exister côté serveur avant qu'un événement puisse le référencer — puis passez l'identifiant de blob retourné comme blob_ref d'un payload ou d'une récupération. Les envois sont adressés par contenu : renvoyer des octets identiques retourne le même identifiant de blob.
La livraison se fait au moins une fois (at-least-once). Un flush échoué (erreur réseau, 5xx, 429) laisse le lot en tampon pour le prochain cycle de la minuterie — rien n'est perdu lors d'un échec transitoire. Un 401 signifie que la clé d'ingestion est incorrecte ; cela est signalé via on_error et le lot est laissé en tampon plutôt que d'être abandonné. Si le tampon lui-même se remplit (plafond par défaut : 10 000 événements), les événements les plus anciens sont supprimés pour faire de la place, mais cette suppression n'est jamais silencieuse — un événement lifecycle comptabilisant l'écart est scellé avant le lot suivant, de sorte que l'écart lui-même fasse partie de la piste d'audit.
Hébergement sur Kubernetes
Déployez le Registre Sannvit sur le cluster Kubernetes d'un client à l'aide du chart Helm, pour une mise à l'échelle horizontale au-delà d'un seul hôte.
SDK TypeScript
Installez et utilisez le SDK TypeScript du registre — l'implémentation de référence, avec capture manuelle et auto-instrumentation Anthropic/OpenAI en une ligne.