Skip to content
Quick Guides
Quick Guides

Cryptographic receipts for every AI decision

Every reasoner execution produces a signed, offline-verifiable W3C Verifiable Credential with SHA-256 hashes of input and output.

Turn every AI call into a tamper-evident record. The agent gets a did:key identity, every reasoner produces a signed Verifiable Credential, and anyone with the issuer's public key can verify it offline.

from agentfield import Agent

app = Agent(
    node_id="claims-processor",
    enable_did=True,    # did:key + Ed25519 keystore
    vc_enabled=True,    # signed VC per execution
)

@app.reasoner()
async def process_claim(claim: dict) -> dict:
    return await app.ai(
        system="Assess this insurance claim.",
        user=str(claim),
    )
    # Behind the scenes the control plane writes a VC with:
    #   - issuer DID  (the agent)
    #   - input_hash  (SHA-256 of claim)
    #   - output_hash (SHA-256 of result)
    #   - Ed25519 signature

app.run()
import { Agent } from '@agentfield/sdk';

const agent = new Agent({
  nodeId: 'claims-processor',
  didEnabled: true, // did:key + Ed25519 — VCs require DID
});

agent.reasoner('processClaim', async (ctx) => {
  return await ctx.ai(
    `Assess this insurance claim: ${JSON.stringify(ctx.input.claim)}`,
    { system: 'You are an insurance claim assessor.' },
  );
  // Behind the scenes the control plane writes a VC with:
  //   - issuer DID  (the agent)
  //   - input_hash  (SHA-256 of claim)
  //   - output_hash (SHA-256 of result)
  //   - Ed25519 signature
});

agent.serve();
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/Agent-Field/agentfield/sdk/go/agent"
	"github.com/Agent-Field/agentfield/sdk/go/ai"
)

func main() {
	a, err := agent.New(agent.Config{
		NodeID:    "claims-processor",
		Version:   "1.0.0",
		EnableDID: true, // did:key + Ed25519 keystore
		VCEnabled: true, // signed VC per execution
	})
	if err != nil {
		log.Fatal(err)
	}

	a.RegisterReasoner("process_claim", func(ctx context.Context, input map[string]any) (any, error) {
		// The control plane writes a VC with issuer DID, input_hash,
		// output_hash (both SHA-256), and an Ed25519 signature.
		result, err := a.AI(ctx, fmt.Sprintf("Assess this insurance claim: %v", input["claim"]),
			ai.WithSystem("Assess this insurance claim."),
		)
		if err != nil {
			return nil, err
		}
		return result, nil
	})

	a.Serve(context.Background())
}

Pull the receipt back when you need it — from the API or by clicking Export provenance on any run page:

# Get the signed VC for one execution
curl http://localhost:8080/api/ui/v1/executions/<execution_id>/vc

# Verify offline — no network needed
af vc verify audit.json
Run detail page showing Export provenance dropdown with VC chain preview, download, and offline audit options

The control plane ships a Provenance page where you can drag any exported VC (or VC chain) and verify it offline against the issuer's bundled DID data:

Provenance verification page — drag a VC JSON file to audit it offline

What this gives you

  • Every reasoner action is signed by the agent that ran it. Logs can lie; signatures cannot.
  • The VC contains hashes of input and output, so you can prove a result without exposing the data.
  • Verification works offline with just the issuer's public key.

Next