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")