Attesto

SDKs

SDKs Python, TypeScript, CLI et Go

Attesto expose quatre developer surfaces first-class: Python, TypeScript, Go et l'Attesto CLI. Elles partagent le même protocole Proofstream, les mêmes golden vectors, la verifier matrix, la production origin et les règles de gestion des secrets.

Package registries

Les identifiants officiels sont attesto pour Python et @attesto/sdk pour TypeScript. Les releases publiques actuelles sont attesto==0.4.0 et @attesto/sdk==0.4.0. Le SDK Go et la CLI déclarent la même release version 0.4.0. Installez uniquement depuis les registries officiels PyPI et npm; n'installez pas de SDKs depuis des mirrors, des tarballs aléatoires ou des source snapshots.

Le release gate sépare packages et surfaces: registry readiness attend trois distributions package/module (attesto, @attesto/sdk et le module Go) et quatre production developer surfaces parce que la CLI attesto est une surface verifier first-class Go-backed. Le gate doit indiquer surfacesExpected=4, surfacesReady=4, cliReady=true et cliVersionMatches=true.

Les package artifacts sont volontairement minimaux. Les artifacts npm contiennent uniquement le JavaScript runtime, les declaration files, README.md et les package metadata. Les releases PyPI de production sont wheel-only. Sourcemaps, raw TypeScript source, tests, caches, source archives, frontend bundles, API keys, private keys et matériel ressemblant à des secrets sont interdits.

Modèle d'authentification

Les clients system-key servent à l'event ingest, aux stream heads, receipts, proof objects publics, bundles et remote verification. Les clients tenant/operator utilisent un dashboard bearer token pour tenant stream lists, connector installation, Local Vault installation, fork evidence inspection, proof-state views et tenant audit-pack creation. Ne placez aucune de ces credentials dans le code frontend.

Support Article 13 et preuve Article 12 avec une seule ligne d'intégration

Pour les systèmes AI high-risk, l'Article 12 concerne la capacité technique de journalisation et la traçabilité, tandis que l'Article 13 concerne la transparence et les informations utiles pour les deployers et les utilisateurs. En termes Attesto, la ligne d'intégration exacte est export OPENAI_BASE_URL=http://localhost:8765/v1 : elle dirige les appels OpenAI-compatible vers l'Attesto Gateway afin que la capture automatique de preuve puisse démarrer. Le rapport Article 12 déterministe explique ce qui a été enregistré et vérifiable indépendamment, et la même trace receipt-backed peut soutenir la documentation Article 13. C'est un support de preuve, pas une déclaration de conformité juridique.

La ligne d'intégration gateway concrète qui rend cela possible est :

export OPENAI_BASE_URL=http://localhost:8765/v1

En production, remplacez localhost par l'hôte gateway déployé et gardez la provider key ainsi que la system key Attesto dans un secret storage server-side.

Utilisez ce modèle lorsque vous contrôlez une frontière de fonction Python. Le décorateur enregistre des commitments sur les arguments, la valeur de retour, le timing, la source reference et les failures; le rapport résume la couverture sans 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_..."))

Le chemin de capture utilise une system API key; le chemin de rapport lit les tenant stream events et nécessite donc un tenant/operator bearer token.

attesto --token-env ATTESTO_TENANT_TOKEN \
  report article12 --stream str_... --output report.md

Ce que le SDK prend en charge

Les SDKs sont volontairement des clients server-side fins. Ils ne cachent pas le modèle de preuve, mais retirent le transport répétitif afin que votre application puisse se concentrer sur le bon event shape et sur la vérification de l'evidence retournée.

SujetComportement SDKResponsabilité développeur
Base URLPar défaut https://verify.attesto.eu.À surcharger uniquement pour des déploiements privés/staging.
AuthenticationPrend en charge le mode system API-key et le mode tenant bearer-token.Utilisez la credential la plus limitée nécessaire.
IdempotencyCrée des idempotency keys pour les writes si elles ne sont pas fournies.Réutilisez la même key lors du retry du même body depuis votre propre job system.
RetriesRetry les erreurs transitoires 429, 5xx et transport avec backoff.Ne modifiez pas les payloads entre retries.
Proofstream helpersExpose des helpers stream, receipt, checkpoint, anchor, IVC, bundle et verify.Choisissez délibérément la stream granularity et les policy IDs.
ErrorsLève des erreurs typées auth, validation, rate-limit et server.Journalisez des catégories d'erreur sûres, pas des API keys ni des payloads raw portant des secrets.

Capability matrix

CapabilityPythonTypeScriptGoCLI
Streams/events/receiptsOuiOuiOuiOui
Windows/checkpoints/consistencyOuiOuiOuiOui
Remote verifier APIOuiOuiOuiOui
Offline receipt verificationVerifier helper/APIVerifier helper/APIOuiOui
Witness policy and fork evidenceOuiOuiOuiOui
Anchors and IVC epochsOuiOuiOuiOui
ConnectorsOuiOuiOuiOui
Local Vault relay/witnessOuiOuiOuiOui
Release readiness evidenceVia scriptsVia scriptsVia CLI/module testsOui

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

Utilisez attestedFetch lorsqu’un SDK ou framework OpenAI-compatible accepte une custom fetch implementation. Il enregistre uniquement des commitments, jamais les raw prompts ni completions. strict: true échoue fermé lorsque la preuve ne peut pas être envoyée; le mode fail-open doit être surveillé.

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,
});

Client Proofstream v2

Utilisez AttestoV2Client lorsque vous avez besoin de stream-level receipts, checkpoint consistency, witness policy visibility, verifier bundles et 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

Utilisez Go pour l'infrastructure automation, le security tooling, les cloud workers et les verifier services. Le SDK Go utilise actuellement uniquement la Go standard library et se résout depuis le module public go.attesto.eu/sdk.

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

L'Attesto CLI est la surface opérateur et verifier pour les workflows scriptés. Elle prend en charge JSON output, local config, stream/event actions, receipt verification, bundle verification, fork evidence, quorum evidence, connectors, Local Vault et release-readiness evidence checks. Elle n'affiche jamais les API keys stockées, tenant tokens ou connector secrets.

CLI command reference

Command groupSubcommandsUtilisation
version, config, login, logoutconfig get, config setInspecter la version et gérer la configuration locale redacted.
streamscreate, get, headCréer des streams, inspecter les tenant-visible stream metadata et récupérer le append-only head.
eventslog, batchEnvoyer un event ou un JSON event batch avec source timestamps et payload files.
receiptsget, verifyRécupérer un receipt stocké et le vérifier localement ou via /v2/verify/receipt.
windows, checkpoints, anchors, ivcget, verify, checkpoints consistency, ivc epochs get/verifyRécupérer et vérifier Proofstream windows, checkpoint roots, consistency proofs, anchor epochs et IVC epochs.
witnesses, quorum, fork-evidencepolicies, status, receipts, inspect, verifyInspecter witness policy, proof state, quorum material et fork evidence.
bundles, verifybuild, get, verify, offline-verify, verify file, verify truth-packageConstruire verifier bundles et vérifier bundles, portable receipt files ou Truth Package ZIPs.
connector, connectorsconnector init, connectors create, ingest, revoke, verifyScaffolder connector manifests, gérer tenant connectors, ingérer events et vérifier signed connector payloads.
local-vaultinstall, relay, spool, status, witness, fork-evidence, revokeOpérer Local Vault installations, encrypted spool workflows, witness receipts, fork evidence et revocation.
marketplaceinit, validate, submitPréparer les publisher manifests, les valider localement et soumettre les assets à la review privée Attesto.
doctor, report, readinessreport article12, readiness lifecycle/fork-defense/quorum/assurance/connectors/local-vault/nova/productionExécuter install diagnostics, deterministic Article 12 reporting et 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 opérateur

Les endpoints tenant/operator exigent le mode bearer-token. Utilisez cela uniquement dans une operator automation fiable et jamais dans des clients publics.

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 verify offline et online

Les méthodes de vérification SDK sont utiles dans les services qui reçoivent des receipts ou bundles Attesto et doivent fail-closed avant de les accepter.

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 pour les tests locaux

attesto.testing.MockAttesto est un Python test harness pour CI locale et tests d'intégration. Il utilise les mêmes canonical hashing et receipt shapes que le SDK, mais signe avec une per-instance throwaway mock key et marque les objets comme mock evidence. Utilisez-le pour tester votre application flow sans accès réseau ni compte Attesto; n'utilisez jamais de mock receipts dans production evidence ou customer bundles.

MockAttesto est volontairement fail-closed contre les vrais trust roots: la vérification avec une production witness key doit rejeter mock evidence. Les tests restent rapides sans créer de chemin où synthetic evidence passerait pour production proof.

Packages compagnons et surfaces edge

Les core SDKs restent petits. Des packages séparés couvrent edge relay, MCP tooling, workflow nodes et le futur independent witness node. Ces packages ne doivent jamais devenir des dépendances transitives cachées des core SDKs.

SurfacePackageUsageRegle de statut
Serveur MCPattesto-mcpExpose des outils Attesto deterministes aux hosts MCP.Installer uniquement depuis la release evidence PyPI.
Local Vaultattesto-local-vaultSpool chiffre cote client, relay et mode witness optionnel.Les cles restent locales; aucun usage frontend.
Node n8nn8n-nodes-attestoWorkflow receipts et verification de webhooks signes.Les credentials restent dans les credentials n8n.
Independent witness nodeattesto-witness, @attesto/witness, go.attesto.eu/witnessObservation privacy-preserving de heads publics ou explicitement partages.Phase-gated; pas une dependance core SDK.
pip install attesto-mcp
pipx install attesto-local-vault
npm install n8n-nodes-attesto

Spécifié comme privacy-preserving observation node package. Le comportement customer-operated witness actuel est disponible via Local Vault witness mode; les packages standalone attesto-witness, @attesto/witness et go.attesto.eu/witness ne doivent être installés qu’après que la release evidence marque ce package vert.

Règles de sécurité