Platform Developers Tools Testnet Community
Developer Sections Quick Starts Documentation Hub Infinite Sandbox Digital Seals ZK Proofs TEE Attestation Wallets & Signing Glossary Comparison Smart Contracts Stablecoin Infrastructure Precompiles API SDK Modules Foundation

Developer Hub

Developer Documentation

Everything you need to build, test, and ship verifiable AI applications on Aethelred with production-grade APIs and SDKs. Follow an implementation path that starts with local iteration, extends through the developer tools stack, validates against the testnet configuration, and continues into the builder community for support and governance feedback.

SDK Quickstarts EVM Precompiles REST + WebSocket API Framework Integrations

Coverage

SDK quick starts, smart contract precompiles, API docs, and framework integrations.

Languages

Python, TypeScript, Rust, and Go with consistent abstractions for job, seal, and verification flows.

Build Path

From local devnet simulation to testnet deployment and production-grade observability patterns.

Quick Start Guides

Run your first verifiable AI workflow

Get up and running quickly in your preferred language.

python quick start
# Install: pip install aethelred-sdk
import hashlib

from aethelred import AethelredClient, ProofType

client = AethelredClient("https://rpc.testnet.aethelred.org")
prompt = b'{"prompt":"Hello AI"}'

submit = client.jobs.submit(
    model_hash=bytes.fromhex("09f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3"),
    input_hash=hashlib.sha256(prompt).digest(),
    proof_type=ProofType.HYBRID,
    priority=5,
    max_gas=1_000_000,
    timeout_blocks=120,
    metadata={"source": "developers-quickstart"},
)
print(f"job id: {submit.job_id}")

job = client.jobs.wait_for_completion(submit.job_id, poll_interval=2.0, timeout=120.0)
if job.status.value != "JOB_STATUS_COMPLETED":
    raise RuntimeError(f"job failed with status={job.status.value}")

seals = client.seals.list(model_hash="09f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3")
seal = next((item for item in seals if item.job_id == job.id), None)
if seal is None:
    raise RuntimeError(f"no seal found for job {job.id}")

verification = client.seals.verify(seal.id)
print(f"seal valid: {verification.valid}")
typescript quick start
// Install: npm install @aethelred/sdk
import { AethelredClient, JobStatus, Network, ProofType } from '@aethelred/sdk';

async function sha256Hex(value) {
  const bytes = new TextEncoder().encode(value);
  const digest = await crypto.subtle.digest('SHA-256', bytes);
  return Array.from(new Uint8Array(digest))
    .map((b) => b.toString(16).padStart(2, '0'))
    .join('');
}

async function main() {
  const modelHash = '09f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3';
  const client = new AethelredClient({ network: Network.TESTNET });

  const submit = await client.jobs.submit({
    modelHash,
    inputHash: await sha256Hex(JSON.stringify({ prompt: 'Hello AI' })),
    proofType: ProofType.HYBRID,
    priority: 5,
    maxGas: '1000000',
    timeoutBlocks: 120,
    metadata: { source: 'developers-quickstart' },
  });
  console.log(`job id: ${submit.jobId}`);

  const job = await client.jobs.waitForCompletion(submit.jobId, {
    pollInterval: 2000,
    timeout: 120000,
  });
  if (job.status !== JobStatus.COMPLETED) {
    throw new Error(`job failed with status=${job.status}`);
  }

  const seals = await client.seals.list();
  const seal = seals.find((item) => item.jobId === job.id);
  if (!seal) {
    throw new Error(`no seal found for job ${job.id}`);
  }

  const verification = await client.seals.verify(seal.id);
  console.log(`seal valid: ${verification.valid}`);
}

main().catch((error) => {
  console.error(error);
});
rust quick start
// Cargo.toml: aethelred-sdk = "1"
use aethelred_sdk::{
    jobs::SubmitJobRequest, AethelredClient, JobStatus, Network, ProofType,
};
use std::time::Duration;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = AethelredClient::new(Network::Testnet).await?;

    let submit = client
        .jobs()
        .submit(SubmitJobRequest {
            model_hash: "09f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3".into(),
            input_hash: "f4d3a381d89f9f7a35bfa48d9b5f9d7c6c18d2a8b431c1d6a2d2d413c3e7ed09".into(),
            proof_type: Some(ProofType::ProofTypeHybrid),
            priority: Some(5),
            max_gas: Some("1000000".into()),
            timeout_blocks: Some(120),
        })
        .await?;
    println!("job id: {}", submit.job_id);

    let job = client
        .jobs()
        .wait_for_completion(
            &submit.job_id,
            Duration::from_secs(2),
            Duration::from_secs(120),
        )
        .await?;
    if job.status != JobStatus::JobStatusCompleted {
        return Err(format!("job failed with status {:?}", job.status).into());
    }

    let seals = client.seals().list(None).await?;
    let seal = seals
        .into_iter()
        .find(|item| item.job_id == job.id)
        .ok_or_else(|| format!("no seal found for job {}", job.id))?;

    let verification = client.seals().verify(&seal.id).await?;
    println!("seal valid: {}", verification.valid);
    Ok(())
}
go quick start
// Install: go get github.com/aethelred/sdk-go
package main

import (
    "context"
    "fmt"
    "time"

    "github.com/aethelred/sdk-go/client"
    "github.com/aethelred/sdk-go/jobs"
    "github.com/aethelred/sdk-go/types"
)

func main() {
    ctx := context.Background()

    c, err := client.NewClient(client.Testnet)
    if err != nil {
        panic(err)
    }

    submit, err := c.Jobs.Submit(ctx, jobs.SubmitRequest{
        ModelHash: "09f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3",
        InputHash: "f4d3a381d89f9f7a35bfa48d9b5f9d7c6c18d2a8b431c1d6a2d2d413c3e7ed09",
        ProofType: types.ProofTypeHybrid,
        Priority:  5,
        MaxGas:    "1000000",
        TimeoutBlocks: 120,
        Metadata:  map[string]string{"source": "developers-quickstart"},
    })
    if err != nil {
        panic(err)
    }
    fmt.Printf("job id: %s\n", submit.JobID)

    job, err := c.Jobs.WaitForCompletion(ctx, submit.JobID, 2*time.Second, 120*time.Second)
    if err != nil {
        panic(err)
    }
    if job.Status != types.JobStatusCompleted {
        panic(fmt.Sprintf("job failed with status %s", job.Status))
    }

    seals, err := c.Seals.List(ctx, nil)
    if err != nil {
        panic(err)
    }

    var sealID string
    for _, seal := range seals {
        if seal.JobID == job.ID {
            sealID = seal.ID
            break
        }
    }
    if sealID == "" {
        panic(fmt.Sprintf("no seal found for job %s", job.ID))
    }

    verification, err := c.Seals.Verify(ctx, sealID)
    if err != nil {
        panic(err)
    }
    fmt.Printf("seal valid: %t\n", verification.Valid)
}

Smart Contracts

EVM precompiles for AI verification

Native on-chain primitives for TEE attestation and zero-knowledge ML proof verification.

0x0400

TEE Precompile

Submit and verify hardware-backed attestations directly from Solidity contracts.

solidity
interface ITEEPrecompile {
  function submitInference(
    bytes32 modelHash,
    bytes calldata inputData,
    uint8 enclaveType
  ) external returns (bytes32 jobId);

  function verifyAttestation(
    bytes32 jobId,
    bytes calldata attestationQuote
  ) external view returns (bool valid);
}

contract VerifiableInference {
  ITEEPrecompile constant TEE = ITEEPrecompile(address(0x0400));

  function submit(bytes32 modelHash, bytes calldata inputData)
    external
    returns (bytes32 jobId)
  {
    jobId = TEE.submitInference(modelHash, inputData, 0);
  }
}
0x0300

zkML Precompile

Verify model execution proofs on-chain with pluggable proof system support.

solidity
interface IZkMLPrecompile {
  function verifyProof(
    bytes32 modelHash,
    bytes calldata proof,
    bytes calldata publicInputs
  ) external view returns (bool valid);
}
EZKL RISC Zero Groth16 Halo2 Plonky2

Frameworks

Connect your AI stack

Drop-in integrations for mainstream model and orchestration frameworks.

PyTorch

Sovereign decorators for verifiable training and inference flows.

python
from aethelred.integrations import VerificationRecorder, wrap_pytorch_model

class FraudModel:
    def __call__(self, features, threshold: float = 0.5):
        score = sum(features) / max(len(features), 1)
        return {"score": score, "fraud": score >= threshold}

recorder = VerificationRecorder()
model = wrap_pytorch_model(FraudModel(), recorder=recorder, component_name="FraudScorerV1")
print(model([0.2, 0.8, 0.9], threshold=0.6))

LangChain

Custom Aethelred LLM provider with digital seal verification.

python
from aethelred.integrations import VerificationRecorder, wrap_langchain_runnable

class Chain:
    def invoke(self, payload, config=None):
        return {"answer": payload["question"].upper(), "trace": config}

recorder = VerificationRecorder()
verified_chain = wrap_langchain_runnable(Chain(), recorder=recorder)
print(verified_chain.invoke({"question": "aml screening status?"}, config={"tenant": "fab"}))

Hugging Face

Model registry integration for verifiable execution routing.

python
from aethelred.integrations import VerificationRecorder, wrap_transformers_pipeline

class FakePipeline:
    task = "text-classification"

    def __call__(self, text: str):
        return [{"label": "APPROVE", "score": 0.97, "text": text}]

recorder = VerificationRecorder()
pipeline = wrap_transformers_pipeline(FakePipeline(), recorder=recorder)
print(pipeline("Approve payment for vendor INV-2381"))

API

REST and WebSocket API

Full programmatic access to jobs, seals, models, and validator telemetry.

Mainnet

api.mainnet.aethelred.org

Testnet

api.testnet.aethelred.org

Local

localhost:1317

Method Endpoint Description
POST /aethelred/pouw/v1/jobs Submit compute job
GET /aethelred/pouw/v1/jobs/{job_id} Query job status
GET /aethelred/seal/v1/seals/{seal_id} Get digital seal
POST /aethelred/pouw/v1/models Register AI model
GET /aethelred/pouw/v1/validators List validators
WS /websocket WebSocket subscriptions

Anonymous

30 rpm

Authenticated

300 rpm

Enterprise

3,000 rpm

curl
# Submit a compute job
curl -X POST https://api.testnet.aethelred.org/aethelred/pouw/v1/jobs \
  -H "Content-Type: application/json" \
  -H "X-API-Key: ${AETHELRED_API_KEY}" \
  -d '{
    "model_hash": "09f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3c5d6a1f9f7e2b3",
    "input_hash": "f4d3a381d89f9f7a35bfa48d9b5f9d7c6c18d2a8b431c1d6a2d2d413c3e7ed09",
    "proof_type": "PROOF_TYPE_HYBRID",
    "priority": 5,
    "max_gas": "1000000",
    "timeout_blocks": 120,
    "metadata": {"source": "developers-api"}
  }'

SDK Modules

Consistent API surface across languages

Each official SDK keeps parity for job submission, seal verification, and core network primitives.

Module Description Languages
client.jobs Submit jobs, query status, wait for completion
client.seals Query digital seals, verify proofs
client.models Model registration and metadata queries
client.validators Validator stats and capability discovery
client.verification ZK proof and verification utilities
client.get_node_info() Health checks and node metadata

Implementation next steps

Need implementation examples next?

Use the tools page for CLI workflows, VS Code integration, and local devnet setup patterns, then validate against the testnet plan or join the community channels.

Open Tools →