Reconciler
Live SSE Stream
rss_feed settings

Now in public preview

Durable AI Reconciliation for Logistics Document Sets

Serverless TypeScript agent that extracts, cross-checks, and prepares resolution actions for shipment discrepancies through durable Inngest orchestration.

Choose an example Both use sample documents

The Live Orchestration Engine

Follow the fan-in extraction and discrepancy pipeline as each document becomes structured data, then a shipment-level reconciliation result.

Ready to start Choose an example, then run it to follow the document check.
0.0s Recorded example

Live Workflow

The highlighted stage shows the current durable step.

Stage 0

Receive documents

Place both files under the same shipment and confirm they are ready to read.

> POST /demo/runs
> emit document.uploaded
Stage 1

Extraction

Find parties, quantities, weights, dates, and item references using typed schemas.

> AI SDK generateObject
> persist extraction_run
Stage 2

Reconciliation

Fan in the document set, claim a set hash, and compare shared shipment facts.

> wait for N docs
> deterministic compare
Stage 3

Agent proposal

Clear the shipment or prepare a human-approved action for the discrepancy.

> propose action
> wait for approval

Shipment Documents

0 of 2 ready
Commercial invoice INV-DEMO-200 - Widget A - 1,200 units
Waiting
Packing list PL-DEMO-200 - Widget A - 1,150 units
Waiting

Active Discrepancies

Waiting for both documents
No discrepancy yet Once both documents are extracted, Reconciler compares the fields that must agree and prepares a review path only if one is needed.
Item quantities
Parties and addresses
Dates and weights

Serverless & Durable

Built on Vercel and Inngest so long-running LLM extraction, fan-in reconciliation, and human approval pauses never depend on one held request.

  • Automatic retries on transient provider failures
  • Durable fan-in of related documents before comparison
  • Content-hash and set-hash idempotency anchors
export const reconcileShipment = inngest.createFunction(
  { id: "reconcile-shipment", debounce: { period: "60s" } },
  { event: "document.extracted" },
  async ({ event, step }) => {
    const required = await step.run("expected-set", loadExpectedSet);
    const ready = await step.run("check-complete", checkComplete);
    if (!ready) return { status: "waiting" };

    const fresh = await step.run("dedupe", claimSetHash);
    if (!fresh) return { status: "already-done" };

    return step.run("compare", reconcile);
  }
);
Powered by
Vercel Inngest Drizzle ORM AI SDK

Experience the Durable Workflow

Run the sandboxed sample set to watch extraction, reconciliation, and the review proposal update in place.