SDKs
SDKs de Python, TypeScript, CLI y Go
Attesto ofrece cuatro developer surfaces first-class: Python, TypeScript, Go y Attesto CLI. Comparten el mismo protocolo Proofstream, golden vectors, verifier matrix, production origin y reglas de secret-handling.
Package registries
Los identificadores oficiales de package son attesto
para Python y @attesto/sdk para TypeScript. Las
releases públicas actuales son attesto==0.4.0 y
@attesto/sdk==0.4.0. Go SDK y CLI reportan la misma
release version 0.4.0. Instale solo desde los
registries oficiales de PyPI y npm; no instale SDKs desde mirrors,
tarballs aleatorios ni source snapshots.
El release gate separa packages de surfaces: registry readiness
espera tres distribuciones package/module (attesto,
@attesto/sdk y el módulo Go) y cuatro production
developer surfaces porque la CLI attesto es una
verifier surface first-class respaldada por Go. El gate debe
reportar surfacesExpected=4,
surfacesReady=4, cliReady=true y
cliVersionMatches=true.
Los package artifacts son intencionalmente mínimos. Los artifacts
npm contienen solo runtime JavaScript, declaration files,
README.md y package metadata. Las releases de
producción en PyPI son wheel-only. Sourcemaps, raw TypeScript
source, tests, caches, source archives, frontend bundles, API keys,
private keys y material parecido a secrets están prohibidos.
Modelo de autenticación
Los clientes system-key se usan para event ingest, stream heads, receipts, proof objects públicos, bundles y remote verification. Los clientes tenant/operator usan un dashboard bearer token para tenant stream lists, connector installation, Local Vault installation, fork evidence inspection, proof-state views y tenant audit-pack creation. No coloque ninguna de estas credentials en código frontend.
Soporte Article 13 y evidencia Article 12 con una línea de integración
Para sistemas AI high-risk, Article 12 trata de capacidad técnica de logging y trazabilidad, mientras Article 13 trata transparencia e información útil para deployers y usuarios. En términos de Attesto, la línea exacta de integración es export OPENAI_BASE_URL=http://localhost:8765/v1: dirige las llamadas OpenAI-compatible al Attesto Gateway para que pueda comenzar la captura automática de evidencia. El Article 12 report determinista explica qué se registró y qué es verificable de forma independiente, y la misma traza receipt-backed puede apoyar documentación Article 13. Es soporte de evidencia, no una declaración de conformidad legal.
La integración gateway concreta de una línea que hace esto posible es:
export OPENAI_BASE_URL=http://localhost:8765/v1
En producción, sustituya localhost por el host gateway
desplegado y mantenga tanto la provider key como la Attesto system key
en almacenamiento de secretos server-side.
Use este patrón cuando controla un límite de función Python. El decorador registra commitments sobre argumentos, valor de retorno, timing, source reference y failures; el report resume coverage sin LLM.
from attesto import AttestoV2Client, attest, article12
import os
with AttestoV2Client(api_key=os.environ["ATTESTO_API_KEY"]) as capture:
@attest(capture, stream_id="str_...")
def score_case(case: dict) -> dict:
return {"decision": "manual_review", "policy_id": "policy-2026-01"}
score_case({"case_id": "case-2026-0001"})
with AttestoV2Client.with_bearer_token(os.environ["ATTESTO_TENANT_TOKEN"]) as operator:
print(article12(operator, "str_..."))
La ruta de captura usa una system API key; la ruta de report lee tenant stream events y por eso requiere un tenant/operator bearer token.
attesto --token-env ATTESTO_TENANT_TOKEN \
report article12 --stream str_... --output report.md
Qué gestiona el SDK
Los SDKs son clientes server-side deliberadamente delgados. No ocultan el evidence model, pero eliminan trabajo repetitivo de transporte para que su aplicación se centre en elegir la event shape correcta y en verificar la evidence devuelta.
| Área | Comportamiento del SDK | Responsabilidad del desarrollador |
|---|---|---|
| Base URL | Por defecto https://verify.attesto.eu. | Override solo para deployments privados/staging. |
| Authentication | Soporta modo system API-key y modo tenant bearer-token. | Use la credential más limitada necesaria para la tarea. |
| Idempotency | Crea idempotency keys para writes si no se proporcionan. | Reutilice la misma key al reintentar el mismo body desde su propio job system. |
| Retries | Reintenta errores transitorios 429, 5xx y de transporte con backoff. | No modifique payloads entre retries. |
| Proofstream helpers | Expone helpers de stream, receipt, checkpoint, anchor, IVC, bundle y verify. | Elija stream granularity y policy IDs deliberadamente. |
| Errors | Lanza errores tipados de auth, validation, rate-limit y server. | Registre categorías de error seguras, no API keys ni raw secret-bearing payloads. |
Capability matrix
| Capability | Python | TypeScript | Go | CLI |
|---|---|---|---|---|
| Streams/events/receipts | Sí | Sí | Sí | Sí |
| Windows/checkpoints/consistency | Sí | Sí | Sí | Sí |
| Remote verifier API | Sí | Sí | Sí | Sí |
| Offline receipt verification | Verifier helper/API | Verifier helper/API | Sí | Sí |
| Witness policy and fork evidence | Sí | Sí | Sí | Sí |
| Anchors and IVC epochs | Sí | Sí | Sí | Sí |
| Connectors | Sí | Sí | Sí | Sí |
| Local Vault relay/witness | Sí | Sí | Sí | Sí |
| Release readiness evidence | Via scripts | Via scripts | Via CLI/module tests | Sí |
Python
pip install attesto
import os
from datetime import UTC, datetime
from attesto import AttestoClient
attesto = AttestoClient(api_key=os.environ["ATTESTO_API_KEY"])
ack = attesto.log_event(
type="inference",
status="verified",
ts=datetime.now(UTC),
payload={
"model": "risk-service-v4",
"score": 0.91,
"policy_id": "policy-2026-01",
},
)
print(ack.id)
Python async
import os
from datetime import UTC, datetime
from attesto import AsyncAttestoClient
async with AsyncAttestoClient(api_key=os.environ["ATTESTO_API_KEY"]) as attesto:
ack = await attesto.log_event(
type="ai.decision",
status="verified",
ts=datetime.now(UTC),
payload={"decision": "manual_review", "score": 91},
)
print(ack.id)
TypeScript
npm install @attesto/sdk
import { AttestoClient } from "@attesto/sdk";
const attesto = new AttestoClient({
apiKey: process.env.ATTESTO_API_KEY!,
});
const ack = await attesto.logEvent({
type: "inference",
status: "verified",
ts: new Date(),
payload: {
model: "risk-service-v4",
score: 0.91,
policy_id: "policy-2026-01",
},
});
console.log(ack.id);
TypeScript attestedFetch
Use attestedFetch cuando un SDK o framework OpenAI-compatible acepta una custom fetch implementation. Registra solo commitments, nunca raw prompts ni completions. strict: true falla cerrado cuando no puede enviarse evidencia; el modo fail-open debe ser monitoreado.
import { AttestoV2Client, attestedFetch } from "@attesto/sdk";
const client = new AttestoV2Client({ apiKey: process.env.ATTESTO_API_KEY! });
const fetchWithEvidence = attestedFetch(client, {
streamId: "str_...",
capture: "commitments",
strict: true,
});
Cliente Proofstream v2
Use AttestoV2Client cuando necesite stream-level receipts,
checkpoint consistency, witness policy visibility, verifier bundles y
offline verification helpers.
from attesto import AttestoV2Client
from datetime import UTC, datetime
import os
with AttestoV2Client(api_key=os.environ["ATTESTO_API_KEY"]) as attesto:
stream = attesto.create_stream(
use_case="ai-decision-history",
policy_id="policy-2026-01",
)
receipt = attesto.log_event(
stream_id=stream.stream_id,
source_ref="source-event-001",
event_type="decision",
occurred_at=datetime.now(UTC),
payload={"decision": "review", "score": 91},
)
stored = attesto.get_receipt(receipt.stream_event_id)
report = attesto.verify_receipt(
receipt=stored.receipt,
public_key_hex=os.environ["ATTESTO_RECEIPT_SIGNER_PUBLIC_KEY_HEX"],
stream_event_id=receipt.stream_event_id,
)
assert report.ok
TypeScript Proofstream:
import { AttestoV2Client } from "@attesto/sdk";
const attesto = new AttestoV2Client({
apiKey: process.env.ATTESTO_API_KEY!,
});
const stream = await attesto.createStream({
useCase: "ai-decision-history",
policyId: "policy-2026-01",
});
const receipt = await attesto.logEvent(stream.streamId, {
sourceRef: "case-2026-0001:decision-1",
eventType: "ai.decision",
occurredAt: new Date(),
payload: { decision: "manual_review", score: 91 },
});
const report = await attesto.verifyReceipt({
receipt: receipt.receipt,
streamEventId: receipt.streamEventId,
publicKeyHex: process.env.ATTESTO_RECEIPT_SIGNER_PUBLIC_KEY_HEX!,
});
if (!report.ok) throw new Error(report.problems.join("; "));
Go
Use Go para infrastructure automation, security tooling, cloud workers y verifier services. El SDK Go actualmente usa solo la Go standard library y se resuelve desde el module path del repositorio Attesto.
go get go.attesto.eu/sdk
package main
import (
"context"
"fmt"
"log"
"os"
attesto "go.attesto.eu/sdk"
)
func main() {
client, err := attesto.NewClient(os.Getenv("ATTESTO_API_KEY"))
if err != nil {
log.Fatal(err)
}
stream, err := client.CreateStream(context.Background(), attesto.StreamCreateInput{
UseCase: "ai-decision-history",
PolicyID: "policy-2026-01",
})
if err != nil {
log.Fatal(err)
}
receipt, err := client.LogEvent(context.Background(), stream.StreamID, attesto.EventInput{
SourceRef: "case-2026-0001:decision-1",
EventType: "ai.decision",
Payload: attesto.M{"decision": "manual_review", "score": 91},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(receipt.StreamEventID, receipt.EventHash)
}
CLI
Attesto CLI es la operator y verifier surface para workflows scriptados. Soporta JSON output, local config, stream/event actions, receipt verification, bundle verification, fork evidence, quorum evidence, connectors, Local Vault y release-readiness evidence checks. Nunca imprime API keys almacenadas, tenant tokens ni connector secrets.
CLI command reference
| Command group | Subcommands | Uso |
|---|---|---|
version, config, login, logout | config get, config set | Inspeccionar versión y gestionar configuración local redacted. |
streams | create, get, head | Crear streams, inspeccionar tenant-visible stream metadata y obtener el append-only head. |
events | log, batch | Enviar un event o JSON event batch con source timestamps y payload files. |
receipts | get, verify | Obtener un receipt almacenado y verificarlo localmente o mediante /v2/verify/receipt. |
windows, checkpoints, anchors, ivc | get, verify, checkpoints consistency, ivc epochs get/verify | Obtener y verificar Proofstream windows, checkpoint roots, consistency proofs, anchor epochs e IVC epochs. |
witnesses, quorum, fork-evidence | policies, status, receipts, inspect, verify | Inspeccionar witness policy, proof state, quorum material y fork evidence. |
bundles, verify | build, get, verify, offline-verify, verify file, verify truth-package | Crear verifier bundles y verificar bundles, portable receipt files o Truth Package ZIPs. |
connector, connectors | connector init, connectors create, ingest, revoke, verify | Scaffold connector manifests, gestionar tenant connectors, ingerir events y verificar signed connector payloads. |
local-vault | install, relay, spool, status, witness, fork-evidence, revoke | Operar Local Vault installations, encrypted spool workflows, witness receipts, fork evidence y revocation. |
marketplace | init, validate, submit | Preparar publisher manifests, validarlos localmente y enviar assets a la review privada de Attesto. |
doctor, report, readiness | report article12, readiness lifecycle/fork-defense/quorum/assurance/connectors/local-vault/nova/production | Ejecutar install diagnostics, deterministic Article 12 reporting y release-readiness evidence checks. |
cd sdk/go
go run ./cmd/attesto --json version
go run ./cmd/attesto --json \
--api-key-env ATTESTO_API_KEY \
streams create \
--use-case ai-decision-history \
--policy-id policy-2026-01
Offline receipt verification:
go run ./cmd/attesto --json receipts verify \
--file receipt.json \
--public-key-hex "$ATTESTO_RECEIPT_SIGNER_PUBLIC_KEY_HEX"
Production readiness evidence check:
go run ./cmd/attesto --json readiness lifecycle
go run ./cmd/attesto --json readiness fork-defense
go run ./cmd/attesto --json readiness production
Marketplace publisher automation:
go run ./cmd/attesto --json marketplace init \
--output attesto.connector.json \
--slug signed-webhook-evidence \
--name "Generic Signed Webhook Evidence" \
--version 1.0.0 \
--category compliance \
--summary "Produces Attesto evidence for signed webhook events." \
--description "Produces verifiable Proofstream events for signed webhook payloads." \
--publisher-slug attesto \
--publisher-name Attesto \
--repository-url https://git.rotz.ai/rotzmediagroup/attesto-v1/src/branch/attesto-2.0/connectors/webhook \
--docs-url https://docs.attesto.eu/manuals/connectors.html#signed \
--provider-url https://docs.attesto.eu/manuals/connectors.html#signed \
--auth-mode signed-webhook \
--auth-scopes webhook:read \
--sync-modes webhook \
--event-types webhook.event.received \
--canary-ref release/attesto-2.0-connector-assurance-readiness/result.json \
--capabilities proofstream,offline-verification
go run ./cmd/attesto --json marketplace validate \
--manifest-file attesto.connector.json
go run ./cmd/attesto --json \
--token-env ATTESTO_TENANT_TOKEN \
marketplace submit \
--manifest-file attesto.connector.json \
--source-ref https://git.rotz.ai/rotzmediagroup/attesto-v1/src/branch/attesto-2.0/connectors/webhook \
--visibility public \
--pricing-model free
Endpoints de operador
Los endpoints tenant/operator requieren bearer-token mode. Use esto solo en trusted operator automation y nunca en clientes públicos.
from attesto import AttestoV2Client
operator = AttestoV2Client.with_bearer_token(
os.environ["ATTESTO_TENANT_TOKEN"],
)
streams = operator.list_tenant_streams()
forks = operator.list_fork_evidence(streams[0]["streamId"])
const operator = new AttestoV2Client({
apiKey: process.env.ATTESTO_TENANT_TOKEN!,
authMode: "bearer",
});
const streams = await operator.listTenantStreams();
const forks = await operator.listForkEvidence(String(streams[0].streamId));
operator, err := attesto.NewBearerClient(os.Getenv("ATTESTO_TENANT_TOKEN"))
if err != nil { log.Fatal(err) }
streams, err := operator.ListTenantStreams(context.Background(), "", 100, 0)
if err != nil { log.Fatal(err) }
Helpers de verify offline y online
Los métodos SDK de verification son útiles en servicios que reciben Attesto receipts o bundles y necesitan fallar cerrado antes de aceptarlos.
from attesto import AttestoV2Client
from datetime import UTC, datetime
import os
with AttestoV2Client(api_key=os.environ["ATTESTO_API_KEY"]) as attesto:
report = attesto.verify_object(
kind="bundle",
proof_object=bundle_object,
)
if not report.ok:
raise RuntimeError(report.problems)
const report = await attesto.verifyObject({
kind: "bundle",
object: bundleObject,
});
if (!report.ok) {
throw new Error(report.problems.join("; "));
}
MockAttesto para pruebas locales
attesto.testing.MockAttesto es un Python test harness
para CI local y pruebas de integración. Usa el mismo canonical hashing
y receipt shapes que el SDK, pero firma con una per-instance
throwaway mock key y marca los objetos como mock evidence. Úselo para
probar el application flow sin red ni cuenta de Attesto; no use mock
receipts en production evidence ni customer bundles.
MockAttesto es intencionalmente fail-closed frente a trust roots reales: la verificación con una production witness key debe rechazar mock evidence. Así las pruebas siguen siendo rápidas sin crear un camino para que synthetic evidence pase como production proof.
Packages complementarios y superficies edge
Los core SDKs permanecen pequeños. Packages separados cubren edge relay, MCP tooling, workflow nodes y el futuro independent witness node. Estos packages nunca deben convertirse en dependencias transitivas ocultas de los core SDKs.
| Superficie | Paquete | Uso | Regla de estado |
|---|---|---|---|
| Servidor MCP | attesto-mcp | Expone herramientas Attesto deterministas a hosts MCP. | Instalar solo desde release evidence de PyPI. |
| Local Vault | attesto-local-vault | Spool cifrado en el borde del cliente, relay y modo witness opcional. | Las claves permanecen locales; sin uso frontend. |
| Nodo n8n | n8n-nodes-attesto | Workflow receipts y verificacion de webhooks firmados. | Las credenciales permanecen en n8n credentials. |
| Independent witness node | attesto-witness, @attesto/witness, go.attesto.eu/witness | Observacion privacy-preserving de heads publicos o compartidos explicitamente. | Phase-gated; no es una dependencia core SDK. |
pip install attesto-mcp
pipx install attesto-local-vault
npm install n8n-nodes-attesto
Especificado como privacy-preserving observation node package. El comportamiento customer-operated witness actual está disponible mediante Local Vault witness mode; standalone attesto-witness, @attesto/witness y go.attesto.eu/witness solo deben instalarse cuando release evidence marque ese package en verde.
Reglas de seguridad
- Use SDKs solo desde código server-side.
- Guarde system keys en su secret manager e inyéctelas at runtime.
- No coloque system keys en frontend bundles, mobile apps, query strings ni logs.
- Use la production origin por defecto salvo que su tenant tenga una private deployment origin.
- Mantenga idempotency habilitada para cada write path.
