SDKs
SDK Python, TypeScript, CLI i Go
Attesto udostępnia cztery first-class developer surfaces: Python, TypeScript, Go oraz Attesto CLI. Współdzielą ten sam Proofstream protocol, golden vectors, verifier matrix, production origin oraz zasady secret-handling.
Package registries
Oficjalne package identifiers to attesto dla Python
oraz @attesto/sdk dla TypeScript. Aktualne publiczne
releases to attesto==0.4.0 oraz
@attesto/sdk==0.4.0. Go SDK i CLI raportują tę samą
release version 0.4.0. Instaluj wyłącznie z oficjalnych
rejestrów PyPI i npm; nie instaluj SDKs z mirrors, losowych tarballs
ani source snapshots.
Release gate rozdziela packages od surfaces: registry readiness
oczekuje trzech package/module distributions (attesto,
@attesto/sdk i modułu Go) oraz czterech production
developer surfaces, ponieważ CLI attesto jest
first-class Go-backed verifier surface. Gate musi raportować
surfacesExpected=4, surfacesReady=4,
cliReady=true oraz cliVersionMatches=true.
Package artifacts są celowo minimalne. npm artifacts zawierają tylko
runtime JavaScript, declaration files, README.md i
package metadata. Produkcyjne releases PyPI są wheel-only.
Sourcemaps, raw TypeScript source, tests, caches, source archives,
frontend bundles, API keys, private keys i secret-like material są
zabronione.
Authentication model
System-key clients są używane do event ingest, stream heads, receipts, public proof objects, bundles i remote verification. Tenant/operator clients używają dashboard bearer token dla tenant stream lists, connector installation, Local Vault installation, fork evidence inspection, proof-state views i tenant audit-pack creation. Nie umieszczaj żadnych tych credentials w frontend code.
Wsparcie Article 13 i evidence Article 12 jedną linią integracji
Dla systemów AI high-risk Article 12 dotyczy technicznej zdolności loggingu i traceability, a Article 13 dotyczy transparentności oraz użytecznych informacji dla deployers i użytkowników. W terminach Attesto dokładna linia integracji to export OPENAI_BASE_URL=http://localhost:8765/v1: kieruje wywołania OpenAI-compatible do Attesto Gateway, aby automatyczne zbieranie evidence mogło się rozpocząć. Deterministyczny Article 12 report wyjaśnia, co zostało zapisane i co jest niezależnie weryfikowalne, a ten sam receipt-backed trail może wspierać dokumentację Article 13. To wsparcie dowodowe, nie deklaracja zgodności prawnej.
Konkretna jednowierszowa integracja gateway, która to umożliwia, to:
export OPENAI_BASE_URL=http://localhost:8765/v1
W produkcji zastąp localhost wdrożonym hostem gateway i
trzymaj zarówno provider key, jak i Attesto system key w server-side
secret storage.
Użyj tego wzorca, gdy kontrolujesz granicę funkcji Python. Dekorator zapisuje commitments dla argumentów, wartości zwrotnej, timingu, source reference i failures; report podsumowuje coverage bez 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_..."))
Capture path używa system API key; report path czyta tenant stream events i dlatego wymaga tenant/operator bearer token.
attesto --token-env ATTESTO_TENANT_TOKEN \
report article12 --stream str_... --output report.md
Co obsługuje SDK
SDKs są celowo cienkimi server-side clients. Nie ukrywają evidence model, ale usuwają powtarzalną pracę transportową, aby aplikacja mogła skupić się na wyborze właściwego event shape i weryfikacji zwróconej evidence.
| Obszar | Zachowanie SDK | Odpowiedzialność developera |
|---|---|---|
| Base URL | Domyślnie https://verify.attesto.eu. | Nadpisuj tylko dla private/staging deployments. |
| Authentication | Obsługuje system API-key mode i tenant bearer-token mode. | Użyj najwęższej credential potrzebnej do zadania. |
| Idempotency | Tworzy idempotency keys dla writes, jeśli nie zostały dostarczone. | Użyj tej samej key przy ponownym retry tego samego body z własnego job system. |
| Retries | Retry dla przejściowych błędów 429, 5xx i transport errors z backoff. | Nie zmieniaj payloads między retries. |
| Proofstream helpers | Udostępnia helpers dla stream, receipt, checkpoint, anchor, IVC, bundle i verify. | Świadomie wybierz stream granularity i policy IDs. |
| Errors | Zwraca typed auth, validation, rate-limit i server errors. | Loguj bezpieczne error categories, nie API keys ani raw secret-bearing payloads. |
Capability matrix
| Capability | Python | TypeScript | Go | CLI |
|---|---|---|---|---|
| Streams/events/receipts | Tak | Tak | Tak | Tak |
| Windows/checkpoints/consistency | Tak | Tak | Tak | Tak |
| Remote verifier API | Tak | Tak | Tak | Tak |
| Offline receipt verification | Verifier helper/API | Verifier helper/API | Tak | Tak |
| Witness policy and fork evidence | Tak | Tak | Tak | Tak |
| Anchors and IVC epochs | Tak | Tak | Tak | Tak |
| Connectors | Tak | Tak | Tak | Tak |
| Local Vault relay/witness | Tak | Tak | Tak | Tak |
| Release readiness evidence | Via scripts | Via scripts | Via CLI/module tests | Tak |
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
Użyj attestedFetch, gdy SDK lub framework OpenAI-compatible akceptuje custom fetch implementation. Rejestruje tylko commitments, nigdy raw prompts ani completions. strict: true failuje zamknięcie, gdy evidence nie może zostać wysłane; tryb fail-open musi być monitorowany.
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,
});
Proofstream v2 client
Użyj AttestoV2Client, gdy potrzebujesz stream-level
receipts, checkpoint consistency, witness policy visibility, verifier
bundles i 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
Użyj Go do infrastructure automation, security tooling, cloud workers i verifier services. Go SDK używa obecnie wyłącznie Go standard library i jest rozwiązywany z module path repozytorium 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 to operator i verifier surface dla scripted workflows. Obsługuje JSON output, local config, stream/event actions, receipt verification, bundle verification, fork evidence, quorum evidence, connectors, Local Vault i release-readiness evidence checks. Nigdy nie wypisuje zapisanych API keys, tenant tokens ani connector secrets.
CLI command reference
| Command group | Subcommands | Użycie |
|---|---|---|
version, config, login, logout | config get, config set | Sprawdź wersję i zarządzaj lokalną redacted configuration. |
streams | create, get, head | Twórz streams, inspect tenant-visible stream metadata i pobieraj append-only head. |
events | log, batch | Wyślij jeden event albo JSON event batch z source timestamps i payload files. |
receipts | get, verify | Pobierz stored receipt i zweryfikuj lokalnie albo przez /v2/verify/receipt. |
windows, checkpoints, anchors, ivc | get, verify, checkpoints consistency, ivc epochs get/verify | Pobieraj i weryfikuj Proofstream windows, checkpoint roots, consistency proofs, anchor epochs i IVC epochs. |
witnesses, quorum, fork-evidence | policies, status, receipts, inspect, verify | Inspect witness policy, proof state, quorum material i fork evidence. |
bundles, verify | build, get, verify, offline-verify, verify file, verify truth-package | Buduj verifier bundles i weryfikuj bundles, portable receipt files albo Truth Package ZIPs. |
connector, connectors | connector init, connectors create, ingest, revoke, verify | Scaffold connector manifests, zarządzaj tenant connectors, ingest events i weryfikuj signed connector payloads. |
local-vault | install, relay, spool, status, witness, fork-evidence, revoke | Obsługuj Local Vault installations, encrypted spool workflows, witness receipts, fork evidence i revocation. |
marketplace | init, validate, submit | Przygotuj publisher manifests, waliduj je lokalnie i submit assets do prywatnej review Attesto. |
doctor, report, readiness | report article12, readiness lifecycle/fork-defense/quorum/assurance/connectors/local-vault/nova/production | Uruchamiaj install diagnostics, deterministic Article 12 reporting i 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
Operator endpoints
Tenant/operator endpoints wymagają bearer-token mode. Używaj tego tylko w trusted operator automation i nigdy w public clients.
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) }
Offline i online verify helpers
SDK verification methods są użyteczne w usługach, które otrzymują Attesto receipts lub bundles i muszą fail-closed przed ich akceptacją.
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 do testów lokalnych
attesto.testing.MockAttesto to Python test harness dla
lokalnego CI i testów integracyjnych. Używa tego samego canonical
hashing i receipt shapes co SDK, ale podpisuje per-instance throwaway
mock key i oznacza obiekty jako mock evidence. Używaj go do testowania
application flow bez sieci i bez konta Attesto; nie używaj mock
receipts w production evidence ani customer bundles.
MockAttesto celowo fail-closed wobec prawdziwych trust roots: verification z production witness key musi odrzucić mock evidence. Dzięki temu testy są szybkie, ale synthetic evidence nie może przejść jako production proof.
Pakiety companion i powierzchnie edge
Core SDKs pozostają małe. Osobne pakiety pokrywają edge relay, MCP tooling, workflow nodes i przyszły independent witness node. Te pakiety nigdy nie mogą stać się ukrytymi zależnościami transitive core SDKs.
| Powierzchnia | Package | Uzycie | Regula statusu |
|---|---|---|---|
| Serwer MCP | attesto-mcp | Udostepnia deterministyczne narzedzia Attesto hostom MCP. | Instalowac tylko z PyPI release evidence. |
| Local Vault | attesto-local-vault | Szyfrowany customer-edge spool, relay i opcjonalny witness mode. | Klucze zostaja lokalnie; bez uzycia frontend. |
| Node n8n | n8n-nodes-attesto | Workflow receipts i weryfikacja signed webhook. | Credentials zostaja w n8n credentials. |
| Independent witness node | attesto-witness, @attesto/witness, go.attesto.eu/witness | Privacy-preserving obserwacja publicznych albo jawnie udostepnionych heads. | Phase-gated; nie jest core SDK dependency. |
pip install attesto-mcp
pipx install attesto-local-vault
npm install n8n-nodes-attesto
Określony jako privacy-preserving observation node package. Obecne customer-operated witness behavior jest dostępne przez Local Vault witness mode; standalone attesto-witness, @attesto/witness i go.attesto.eu/witness powinny być instalowane tylko po tym, jak release evidence oznaczy ten package jako zielony.
Security rules
- Używaj SDKs tylko z kodu server-side.
- Przechowuj system keys w swoim secret manager i wstrzykuj je at runtime.
- Nie umieszczaj system keys w frontend bundles, mobile apps, query strings ani logs.
- Używaj domyślnego production origin, chyba że twój tenant ma private deployment origin.
- Utrzymuj idempotency włączone dla każdego write path.
