Skip to main content

LangGraph Adapter Example

This example shows a concrete LangGraph-style control-point layout for UAICP gating.

Graph State Contract

type GraphState = {
requestId: string;
traceId: string;
intent: string;
toolResults: Array<{ tool: string; output: unknown }>;
approvalToken?: string;
};

UAICP Control Nodes

function mapEnvelope(state: GraphState): UaicpEnvelope {
return {
uaicp_version: '0.1',
request_id: state.requestId,
trace_id: state.traceId,
message_type: state.intent,
timestamp: new Date().toISOString(),
identity: getRuntimeIdentity(),
};
}

function collectEvidence(state: GraphState): EvidenceObject[] {
return state.toolResults.map((r, i) => ({
evidence_id: `${state.requestId}-${i}`,
evidence_type: 'tool_output',
content_hash: hashResult(r.output),
source: r.tool,
}));
}

function verifyAndGate(state: GraphState): 'deliver' | 'fail_safe' | 'needs_review' {
const envelope = mapEnvelope(state);
const evidence = collectEvidence(state);
const verification = runVerifier(envelope, evidence);

if (!verification.required_checks_passed) return 'fail_safe';

const policy = runPolicyGate({
envelope,
writeRisk: 'write_high_risk',
approvalToken: state.approvalToken,
});

return policy.decision === 'allow' ? 'deliver' : policy.decision;
}

Node Wiring Pattern

planner -> tools -> uaicp_verify_and_policy_gate -> terminal

Only route to terminal delivery when gate output is deliver.

Failure Routing

  • verifier failed -> fail_safe (VERIFICATION_FAILED)
  • required evidence missing -> fail_safe (EVIDENCE_MISSING)
  • high-risk write without approval -> needs_review (APPROVAL_REQUIRED)

Reference Fixture

Compare outcomes against:

  • https://github.com/UAICP/uaicp-reference-impl/blob/main/src/examples/finance/workflow-comparison.ts