
Sellers in Tunisia take orders in chat and are paid in cash on delivery. A refused parcel is a wasted courier trip. Customers write in Darija (Arabic script or Arabizi), French or a mix, and give addresses like "near the mosque". Wasel reads the conversation, extracts the order and scores the refusal risk from 0 to 100, with reasons quoted from the customer's own words. It drafts the one question that would lower the risk: confirm, complete the address, or pay first. When the customer answers, the order is rescored and the page shows which reasons changed. Order #2601 goes from High 87 to Low 16 once a full address arrives. A person approves what is sent. The language model never picks a number. It fills a 12-field schema, code checks every quote against the original text, and an XGBoost model plus the rules in config/scoring.yaml compute the score. Drafts come from approved templates; any model rewrite must pass a prefilter, a classifier and a judge. Injected text in a message is flagged. Business value: in a simulation on 2,001 held-out orders, confirmation and prepayment questions cut refusals from 30.0 % to 23.6 %, worth 464 TND per 1,000 orders (labels simulated, assumptions shown in the app). Tested on every change: 279 extraction cases, 165 outbound drafts, 32 injection attempts and 737 tests that run without keys. AMD: the model call goes through a configurable route: AMD Token Factory (Gemma-4-31B-IT) first, hosted Groq (gpt-oss-120b) as a fast backup, then rules. On 40 extraction cases, Token Factory recognised 92.5 % of orders against 87.5 % for Groq (one run, synthetic data). It takes 7 to 13 s per call, so the route allows 16 s before falling back. We make no claim about the GPU. The demo uses synthetic data. Open source under the MIT licence.
18 Oct 2026