Docs navigation

Python SDK

proofledger — Python 3.9+, stdlib-only core. Install proofledger[signing] for Ed25519 signed events (adds the cryptography package).

Configuration

import os
from proofledger import enable

enable(
    api_key=os.environ["PROOFLEDGER_API_KEY"],  # omit → local dev mode
    base_url="https://www.proofledger.dev",
    environment="production",

    # Trust-platform defaults
    agent_name="support-agent",
    owner="customer-success",
    framework="langchain",
    model="gpt-4.1",
    version="1.0.0",

    # monitor (default) or enforce
    policy_mode="enforce",
    approval_interval_ms=2000,
    approval_timeout_ms=300_000,
)

Trust platform functions

from proofledger import (
    register_agent, identify_agent,
    log_decision, log_tool_call, log_api_call, log_workflow_step, log_trust_event,
    record_model_execution, record_outcome, record_agent_version,
    evaluate_policy, require_approval, get_trust_score, flush,
    create_agent_identity, sign_event, verify_event,
)

# Identity
result = register_agent()             # generates Ed25519 keys server-side
identify_agent("support-agent", stored_private_key)

# Logging — each returns {"event": …, "policy": …, "trust": …}
log_decision(action="Chose refund path", workflow_id="wf_1")
log_tool_call("refund_lookup", workflow_id="wf_1",
              input_summary="orderId=ORD-123")
log_api_call("/v1/refunds", workflow_id="wf_1")
log_workflow_step("wf_1", status="completed", action="Done")

# Model provenance (0.5.0) — which model actually executed
record_model_execution(provider="anthropic", model_name="claude-x",
                       input_tokens=812, output_tokens=214,
                       estimated_cost_usd=0.012, latency_ms=2100)
record_agent_version(version="1.1.0", system_prompt_version="sp-3")

# Outcomes (0.5.0) — verification_method is REQUIRED, never self-declared
record_outcome(task_type="refund-request", status="success",
               verification_method="deterministic",
               business_value_estimate=49)

# Governance
evaluation = evaluate_policy(tool_name="wire_transfer", sensitive_action=True)
require_approval(agent_id="support-agent", title="Refund $500")

# Signals
print(get_trust_score())

Errors (enforce mode)

from proofledger import PolicyBlockedError, ApprovalDeniedError

try:
    log_tool_call("wire_transfer", sensitive_action=True)
except PolicyBlockedError as e:
    print("blocked:", e.evaluation["reason"])
except ApprovalDeniedError as e:
    print("not approved:", e.status)   # "denied" | "pending" (timed out)

Note

The Python client is synchronous — every call completes before returning, so flush() is a no-op kept for API parity with TypeScript.

LLM run tracing & adapters

from proofledger import track, with_run, wrap_openai, wrap_anthropic, create_langchain_handler

# One-shot run capture
track(agent_id="support-agent", input="Hello", output="Hi!",
      model="gpt-4.1", provider="openai")

# Wrap a unit of work
def work(run):
    run.record_tool_call(tool_name="search", input={"q": "refund policy"})
    return my_agent.run("Resolve ticket #4821")

with_run({"agent_id": "support-agent", "model": "gpt-4.1"}, work)

# Adapters
openai = wrap_openai(OpenAI(), agent_id="support-agent")
anthropic = wrap_anthropic(Anthropic(), agent_id="support-agent")
#           ^ records a model execution per call (provenance by default)
handler = create_langchain_handler(agent_id="support-agent")