My dad sells and rents medical equipment in Kolkata mostly oxygen concentrators and CPAP machines. Orders reach him on WhatsApp in a mix of Bengali, Hindi and English. He reads each one and copies it into a notebook. I built Orderkhata to sort those orders with Gemma on my own laptop.
What I built
Orderkhata reads one customer message and returns the items and quantities, any rental days and the delivery time the customer asked for. The total comes from his own price list. When a message is unclear it says what to ask the customer and stops there.
Who would pay
Any small shop that takes orders on chat. A wrong item costs money and for equipment it can mean a patient waiting for the wrong machine.
Why open mattered
Customers write their names, addresses and the device they need. A local Gemma model through Ollama keeps all of that on his computer. There is no per-message fee and I can swap the model with one flag.
How it checks the model
Gemma proposes and code decides. Every quantity must appear in words copied from the message and rental days must come from the message too. Prices and totals never come from the model. A failed answer gets one retry with the exact problems listed. After that the message goes back to my dad untouched.
The numbers
I ran 25 test messages through three prompt versions with Gemma 3 4B. v1 and v2 ran once. v3 ran twice.
12 of the 25 messages are not orders or are too unclear to act on, such as questions and thank-yous. In every version and run none of those 12 printed an order. Of the 13 real orders, v3 run 1 printed 6 right, 1 wrong and sent 6 back to my dad. Run 2 printed 7 right, 0 wrong and sent 6 back.
After run 1, I added a check for items the customer named that the answer left out. I replayed it on the saved run 1 logs. It flagged 6 of the 8 wrong printed answers and blocked no correct ones. Run 2 used that check. I did not re-run v1 and v2.
What went wrong
Gemma invented orders. For “Thank you bhaiya, machine ta bhalo cholche” and “Do you deliver to Salt Lake?”, it answered one Philips Everflo concentrator. The code blocked it because the quoted words did not name the item.
More rules made it worse. With the long v3 prompt, Gemma returned an empty {} as its first answer in 14 of 25 messages in run 1 and 19 of 25 in run 2, with the same settings. The retry recovered 4 of the empties in run 1 and 5 in run 2. A single run of this model is not stable.
It dropped items, and the first checker could not see that. “3 nasal cannula 1 connector tube lagbe kal sokale” printed only the cannulas in all three versions. Other versions also dropped oxygen masks and CPAP masks. Every wrong printed answer in run 1 was a dropped item, because the check verified what Gemma said and not what it left out. That is why I added the dropped-item check.
It rarely picked the rental item. For “ek CPAP machine rent pe chahiye 15 din ke liye” and “3 oxygen concentrator on rent for 1 week”, Gemma chose the purchase item with days attached, and the checker refused it. Rentals are most of my dad’s business, so this is the biggest weakness.
It made up products and numbers. It returned “Oxygen Cylinder Rental”, “walker” and “wheelchair”, which are not in the price list, and wrote a quantity as the word “dui” instead of a number. All were rejected.
What I can’t claim
The 25 test messages were written with AI help to imitate how customers write. They are not real customers. The prices come from my dad’s public IndiaMART listing, and he confirmed them. The web demo uses fixed rules, because a browser page cannot run a model under its privacy settings, and its customer names are sample data. The model runs in the Python script. With 25 messages, a difference of one or two is noise. “0 wrong” means 0 of 8 printed answers in one run.
First user
My dad checked and confirmed the prices in the price list.
Repo: https://github.com/triixdev/Orderkhata
Demo: https://triixdev.github.io/Orderkhata/
Prize Categories: Best Use of Gemma



Top comments (0)