Invoice decision workflow with Jev
Pixels never go to System One. An OCR or vendor extractor turns the PDF into strings; Jev then asks whether that text packet looks like a duplicate, a PO mismatch, or a complete AP file. Code posts to the ERP. Jev does not key invoices.
This unofficial page is the decision workflow slice of the invoice AP decisions pack. Intent: apply the Jev (TypeSafe System One) decision model to invoice AP decisions decision workflow. Primary search language: Invoice Jev decision workflow. Confirm patterns on docs.typesafe.ai. This site does not sell, issue, or proxy TypeSafe keys. Use a credential you already have from the console or a documented gateway.
Independent angle (cover ≠ clone): OCR extracts; Jev judges already-extracted text (duplicate/vendor/PO language). Amounts and dates stay in code — not a clone of invoice-OCR IA or a rival AP-recipe page. Fan-out extra atoms on one request; open a second HTTP call only for a new artifact, not the same state.
Invoice use-case context
Invoice AP decisions is a workflow, not a chat. Assemble a narrow state, ask the primitives below, and let the AP router branch. TypeSafe’s docs say a good question is a snap decision a knowledgeable person could make in a few seconds — not an open-ended analysis of the extracted invoice packet + PO text.
Hub: Use cases. Compare, when the other tool is the real job: invoice OCR.
Decision Workflow inputs
Keep only fields the questions name:
{
"invoice": { "id": "INV-1044", "vendor_name": "Northwind Paper LLC", "memo": "Q3 copier paper — matches PO 88." },
"po": { "id": "PO-88", "vendor_name": "Northwind Paper" },
"extract": { "amount_cents": 128500, "invoice_date": "2026-03-12" },
"policy": { "duplicate": "Same vendor + same amount_cents within 14 days is a duplicate suspect." }
}
Point instructions at invoice.memo, invoice.vendor_name, po.vendor_name, policy.duplicate. Drop the PDF / TIFF bytes (not accepted); full GL history novels.
Decision signals and actions
| Id | Type | Job |
|---|---|---|
same_vendor |
Noul | Do invoice.vendor_name and po.vendor_name look like the same entity? |
packet_complete |
Score | How complete is the AP narrative vs policy (missing PO / missing memo)? |
disposition |
Choice | route_match / hold_mismatch / duplicate_suspect / other |
All of these share state and run in parallel. Code owns the graph:
def invoice_route(ans, extract, prior_cents):
# arithmetic in code — do not ask Jev if 128500 == 128500
if extract["amount_cents"] != prior_cents and prior_cents is not None:
return "hold_amount" # your matcher, not Jev
if ans["same_vendor"].noul < T_VENDOR:
return "hold_mismatch"
if ans["disposition"].confidence < FLOOR or ans["disposition"].choice == "other":
return "ap_review"
return ans["disposition"].choice
Do not treat a Noul of 0.5 as a “medium” invoice AP decisions score — it means yes and no are equally likely. Conjunctions stay in your code.
Guardrails and escalation
TypeSafe’s confidence-gated examples use a lower bar for recoverable reads than for irreversible actions. Those numbers are illustrations. For invoice AP decisions, treat post_to_erp as the high bar (posting an invoice to the ERP). Tune on labels — see offline evaluation.
Low confidence, or a policy miss → human or safe default; do not post the invoice.
Evaluation and rollout notes
Shadow: ERP posts as today; log Jev disposition beside the clerk action.
Canary: Auto-route only low-cent, same-vendor, high-confidence matches for one vendor family.
Pin jev-1.13.0 (the versioned id) after you fit thresholds. jev-latest and the marketing line jev-1.13 can move. Log the response model. TypeSafe’s published list price for jev-1.13 is $0.042 per million input tokens (vendor claim — confirm on the models page); output tokens are free on that same page. Unused distractors still bill as input.
Official Python and JavaScript SDKs read TYPESAFE_API_KEY and retry documented 429/529. This site does not sell, issue, or proxy TypeSafe keys. Use a credential you already have from the console or a documented gateway.
Pack map
| Slice | Page |
|---|---|
| Graph and primitives | you are here |
What may enter state |
input contracts |
| What to gather first | evidence collection |
| Atomic rules | policy checks |
| Act / review / abstain | confidence thresholds |
| Reviewer payload | human handoff |
| What to persist | audit trail |
| How it breaks | failure modes |
| Labeled replay | evaluation |
| Shadow → canary | production rollout |
FAQ
Does Jev execute the AP router action? No. It returns typed answers. Your AP router code calls queues, models, or humans.
Why several questions in one request? TypeSafe’s fan-out pattern: extra questions are cheap versus another HTTP call. same_vendor + packet_complete + disposition in one call (TypeSafe fan-out). A second trip is for a new artifact (credit memo), not for re-asking the same extract.
Where is the rest of the Invoice pack? Start with Invoice input contracts and Invoice confidence thresholds. Cluster hub: Use cases.
Can we skip OCR and send the PDF? No. Official models page: no image input. Extract first. See Jev vs invoice OCR.
Should Jev decide if $1,285.00 matches the PO? No. Compare cents in code. Jev judges leftover language (vendor strings, memos).
What this page does not claim
- Not an OCR, ERP, or AP product.
- No invented extraction F1 or cycle-time lifts.
- Not official TypeSafe.
- Official TypeSafe status, or that jev.pro issues API keys.
- That a schema-constrained answer is automatically factually correct.
Disclaimer
This is an independent unofficial site and is not affiliated with TypeSafe AI; official documentation is available at https://docs.typesafe.ai.
Primary documentation: https://docs.typesafe.ai. Hub: Use cases.
Sources
Public TypeSafe or adjacent documentation only. No private claims.