Cada SDK captura la actividad de agentes de IA en proceso y la entrega a la API del ledger, de modo que el código de su agente permanece por lo demás sin modificar. Todos siguen el mismo contrato, sin importar el lenguaje:
on_error en lugar de propagarse.| Lenguaje | Paquete | Cobertura |
|---|---|---|
| TypeScript | sdk/typescript | Paridad completa — API manual + auto-instrumentación de Anthropic/OpenAI (la implementación de referencia) |
| Python | sdk/python | Paridad completa — API manual + auto-instrumentación de Anthropic/OpenAI |
| Go | sdk/go | API manual |
| Java | sdk/java | API manual |
| C# | sdk/csharp | API manual |
!NOTE Ninguno de estos SDKs está aún publicado en un registro de paquetes (npm, PyPI, Maven, NuGet) — esa es una decisión de puerta de lanzamiento todavía pendiente. Cada página de lenguaje de abajo explica cómo incorporar el SDK tal como está hoy.
Para aplicaciones instrumentadas con OTel en Go, Java o C#, apunte su exportador ya existente al receptor OTLP del ledger (/v1/otlp/v1/traces) en lugar de recurrir a un procesador de spans por lenguaje — cada span gen_ai.* se convierte automáticamente en un evento del ledger, del lado del servidor.
Estos aplican en todos los lenguajes:
endpoint — la URL base de la API del ledger (http://127.0.0.1:4010 para una pila de desarrollo local — vea Alojamiento con Docker).ingest_key — una clave por equipo; la tenancy se resuelve del lado del servidor a partir de ella. Obtenga una con npm run seed:demo (desarrollo, imprime una clave de demo) o desde el dashboard una vez que tenga una org real configurada.agent_id — una URI que nombra al sistema de IA actuante, por ejemplo urn:agent:research-assistant.record(...) — captura una acción de IA: una llamada a un LLM, una llamada a una herramienta, una búsqueda, o una lectura/escritura de datos. Síncrono y no bloqueante; devuelve un id de span.flush() — entrega ahora los eventos en buffer. También se ejecuta automáticamente con un temporizador (cada 2s por defecto).(org, span_id), así que los reintentos tras una entrega fallida siempre son seguros.record()| Campo | Valores |
|---|---|
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én o qué inició esto |
trigger_category | Vocabulario de disparadores de los estándares (ISO 24970 / prEN 18229-1) — se establece en eventos detectados por monitorización (deriva, sesgo, entrada adversarial) y en eventos de supervisión/cambio de configuración |
payloads[].kind | prompt, response, artifact |
retrievals[].source_type | database, document, web, api |
Cada evento puede referenciar al evento que lo causó mediante parent_ref (un id de span), de modo que una cadena como búsqueda → llamada a un LLM que la usó → llamada a herramienta que actuó sobre el resultado es reconstruible. Cada SDK también expone un helper de "span actual" ambiental (within() / with()) para que las llamadas anidadas hereden el padre correcto automáticamente, sin tener que pasar un id a mano por cada firma de función.
El contenido binario (imágenes, PDFs, audio) no puede viajar en línea dentro de record() como texto. Súbalo primero — esta es la única llamada en cada SDK que bloquea, ya que el blob debe existir del lado del servidor antes de que un evento pueda referenciarlo — y luego pase el id de blob devuelto como blob_ref de un payload o una recuperación. Las subidas están direccionadas por contenido: volver a subir los mismos bytes devuelve el mismo id de blob.
La entrega es al-menos-una-vez. Un flush fallido (error de red, 5xx, 429) deja el lote en buffer para el siguiente tick del temporizador — nada se descarta ante un fallo transitorio. Un 401 significa que la clave de ingesta es incorrecta; eso se reporta vía on_error y el lote se deja en buffer en lugar de descartarse. Si el propio buffer se llena (tope por defecto: 10.000 eventos), se descartan los eventos más antiguos para hacer sitio, pero ese descarte nunca es silencioso — se sella un evento de lifecycle con el hueco contabilizado antes del siguiente lote, de modo que el propio hueco forma parte del rastro de auditoría.
Alojamiento en Kubernetes
Despliegue Sannvit Ledger en el clúster de Kubernetes de un cliente con el chart de Helm, para escalado horizontal más allá de un único host.
SDK de TypeScript
Instale y use el SDK de TypeScript del ledger — la implementación de referencia, con captura manual y auto-instrumentación de Anthropic/OpenAI en una línea.