What You'll Build in 10 Minutes

By the end of this guide, every AI inference in your application will be:

WITNESSED — Cryptographic proof the inference happened
ANCHORED — SWT3 Witness Anchor in the immutable ledger
CLEARED — Raw prompts/responses purged from the wire
AUDITABLE — Mapped to EU AI Act & NIST AI RMF

Zero data retention. At Clearing Level 1+, your prompts and responses never leave your infrastructure. The witness endpoint is a "Blind Registrar" — it stores cryptographic proofs, not data.
1

Install the SDK

30 seconds

Python
TypeScript
pip install swt3-ai
npm install @tenova/swt3-ai

Zero dependencies. The SDK uses only Python/Node.js standard library + your existing AI client.

2

Get Your API Key

1 minute

Log in to your Axiom Dashboard → Settings → API Keys and create a new key.

Your key starts with axm_live_. You'll also need your Tenant ID (shown on the Settings page).

Keep your key safe. It's shown once and cannot be recovered. Store it in an environment variable, never in code.
3

Wrap Your AI Client

3 minutes — this is the only code change

Python + OpenAI
Python + Anthropic
TypeScript + OpenAI
Vercel AI SDK
from swt3_ai import Witness
from openai import OpenAI

# Initialize the witness (once, at startup)
witness = Witness(
    endpoint="https://sovereign.tenova.io",
    api_key=os.environ["SWT3_API_KEY"],
    tenant_id=os.environ["SWT3_TENANT_ID"],
)

# Wrap your client — this is the ONLY change
client = witness.wrap(OpenAI())

# Use it exactly as before. Every inference is now witnessed.
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Summarize this contract"}],
)
print(response.choices[0].message.content)
# ^ Untouched. Zero latency added. Witnessing happens in the background.
from swt3_ai import Witness
from anthropic import Anthropic

witness = Witness(
    endpoint="https://sovereign.tenova.io",
    api_key=os.environ["SWT3_API_KEY"],
    tenant_id=os.environ["SWT3_TENANT_ID"],
)

client = witness.wrap(Anthropic())

message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Draft a compliance memo"}],
)
import { Witness } from "@tenova/swt3-ai";
import OpenAI from "openai";

const witness = new Witness({
  endpoint: "https://sovereign.tenova.io",
  apiKey: process.env.SWT3_API_KEY,
  tenantId: process.env.SWT3_TENANT_ID,
});

const client = witness.wrap(new OpenAI()) as OpenAI;

// Works with streaming too
const stream = await client.chat.completions.create({
  model: "gpt-4o",
  messages: [{ role: "user", content: "Hello" }],
  stream: true,
});
for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
import { Witness } from "@tenova/swt3-ai";
import { streamText } from "ai";
import { openai } from "@ai-sdk/openai";

const witness = new Witness({ /* ... */ });
const prompt = "Summarize this contract for the board";

const result = await streamText({
  model: openai("gpt-4o"),
  prompt,
  onFinish: witness.vercelOnFinish({ promptText: prompt }),
});
// Works with any Vercel AI SDK provider — OpenAI, Anthropic, Google, custom
That's it. No decorators. No middleware. No configuration files. Your AI client works exactly as before — the witness observes silently in the background.
4

See the Green Dot

Immediate — check your dashboard

Open your Axiom Dashboard → AI Witness page. You'll see:

Every anchor maps to a specific regulatory requirement. Your auditor can verify each one mathematically.

What Gets Witnessed Per Inference

Each inference automatically produces anchors for these procedures:

ProcedureWhat It ProvesRegulation
AI-INF.1Inference provenance (prompt + response hashed)EU AI Act Art. 12
AI-INF.2Latency within threshold (detects model swaps)NIST AI RMF MANAGE 2.2
AI-MDL.1Model hash matches approved versionEU AI Act Art. 9
AI-MDL.2Model version identifier recordedEU AI Act Art. 72
AI-GRD.1Required safety filters were activeEU AI Act Art. 9(2)(a)
AI-GRD.2No content filter or refusal triggeredEU AI Act Art. 15(3)
AI-TOOL.1Agent tool/function call witnessed with outcomeEU AI Act Art. 12(1)
AI-ID.1Agent cryptographic identity assertedEU AI Act Art. 12(1)
AI-ACC.1Agent resource access witnessed with scopeEU AI Act Art. 9(4)(c)
AI-REV.1Previously-issued anchor revoked with reasonEU AI Act Art. 14(4)(d)
AI-EMRG.1Emergency override lifecycle: override reason, authorization chain, rollback plan, time-bounded scope, lifecycle stageEU AI Act Art. 14(4)
AI-DRIFT.2Consequence-mapped drift: threshold config, breach magnitude, affected populations, consequence severity, recommended actionsNIST AI RMF MANAGE 2.4
AI-ASSESS.1Champion-challenger assessment: baseline model, challenger model, evaluation criteria, sample size, statistical significanceNIST AI RMF MEASURE 2.6

Clearing Levels — You Control What Leaves

The Clearing Engine controls what data travels on the wire to the witness endpoint. Your code always gets the full response.

LevelNameWhat's on the WireUse Case
0AnalyticsHashes + factors + model + providerInternal analytics
1StandardHashes + factors + modelProduction apps (default)
2SensitiveHashes + factors + model onlyHealthcare, legal, PII
3ClassifiedNumeric factors only, model hashedDefense, air-gapped
# Set clearing level at initialization
witness = Witness(
    endpoint="https://sovereign.tenova.io",
    api_key="axm_live_...",
    tenant_id="YOUR_ENCLAVE",
    clearing_level=2,  # Sensitive — no provider names on the wire
)
At Level 1+, raw prompts and responses never leave your infrastructure. The witness endpoint stores cryptographic proofs, not data. Your liability is near zero.

Single-Line Configuration (DSN)

For containerized and infrastructure deployments, configure the witness with a single environment variable:

# Set one env var. Done.
export SWT3_DSN="https://axm_live_xxx@sovereign.tenova.io/YOUR_ENCLAVE"

# SDK auto-parses: endpoint, api_key, tenant_id
witness = Witness.from_dsn()
client = witness.wrap(OpenAI())

The DSN format: https://{api_key}@{endpoint}/{tenant_id}. Works with Docker, Kubernetes, Terraform, and any env-var-based config system. The NVIDIA Dynamo adapter uses this exclusively.

Sovereign Cloud — Any Model, Any Infrastructure

The SDK works with any OpenAI-compatible endpoint. Run Llama 3 on vLLM, Mistral on Ollama, or any model behind your own API:

# vLLM on your GPU cluster
client = witness.wrap(OpenAI(base_url="http://gpu-cluster:8000/v1"))

# Ollama (local development)
client = witness.wrap(OpenAI(base_url="http://localhost:11434/v1"))

# Same SWT3 anchors, same ledger, same audit trail
# Regardless of where the model runs

Lifecycle Chains (v0.6.0)

Some compliance events are not single moments. Emergency overrides, model replacements, and champion-challenger evaluations unfold over time. Lifecycle chains link multiple SWT3 Witness Anchors into a single auditable sequence, connected by a shared cycle ID.

Each anchor in the chain records a stage (INITIATED, MONITORING, RESOLVED) so auditors can trace the full progression of an operational governance event.

Python

from swt3_ai import SWT3Witness

witness = SWT3Witness(api_key="your-key", tenant="your-tenant")

# Start a lifecycle chain (e.g., emergency override)
chain = witness.start_chain("AI-EMRG.1", reason="model_recall", stage="INITIATED")

# Add monitoring anchors as the override progresses
witness.add_to_chain(chain.cycle_id, "AI-EMRG.1", stage="MONITORING",
    observations={"status": "rollback_in_progress"})

# Close the lifecycle
witness.add_to_chain(chain.cycle_id, "AI-EMRG.1", stage="RESOLVED",
    observations={"resolution": "rollback_complete", "duration_minutes": 45})

TypeScript

import { SWT3Witness } from "@tenova/swt3-ai";

const witness = new SWT3Witness({ apiKey: "your-key", tenant: "your-tenant" });

// Start a lifecycle chain
const chain = await witness.startChain("AI-EMRG.1", {
  reason: "model_recall", stage: "INITIATED"
});

// Add monitoring anchors
await witness.addToChain(chain.cycleId, "AI-EMRG.1", {
  stage: "MONITORING",
  observations: { status: "rollback_in_progress" }
});

// Close the lifecycle
await witness.addToChain(chain.cycleId, "AI-EMRG.1", {
  stage: "RESOLVED",
  observations: { resolution: "rollback_complete", durationMinutes: 45 }
});
Chain verification. Every anchor in a lifecycle chain can be independently verified on the Verify page. The chain context shows all related anchors, their stages, and the shared cycle ID linking them together.

What's Next

You're witnessing. Here's what to explore next:

Full SDK reference: Developer Documentation

Start Witnessing →
This guide is provided for informational purposes only and does not constitute legal, regulatory, or compliance advice. Regulatory mappings and crosswalk interpretations reflect the publisher's analysis and may not address all obligations applicable to your organization. Consult qualified legal counsel before making compliance decisions based on this content.