How it works
Saathi would rather ask than guess
Every answer someone speaks gets up to four tries, cheapest first. A model only gets called on the third try. When nothing is sure enough even then, Saathi asks the question again instead of filling in something that merely sounds right.
One answer, four tries
Each try is more expensive than the one above it, so a field only reaches a model once nothing free could read it. Once a field is read confidently it is locked, and nobody is asked for it twice.
- 1
Match it against a known list
Districts, taluks, Bengaluru areas, whether to leave a parcel at the gate, before or after food. Saathi puts the words into Roman script first, so a Kannada or Hindi answer can be matched against the list.
Freehow sure 0.95–0.99
- 2
Read it with a rule
Aadhaar numbers, mobile numbers, rupee amounts, dates, times, doses, flat numbers, cross and main. These are patterns, so a pattern reads them. No model is asked.
Freehow sure 0.82–0.97
- 3
Ask the model
Whatever free text nothing else can read: a person's name, a village, a building, an occupation. One call handles every remaining field in the turn at once.
Paidhow sure 0.80
- 4
Ask the person again
If the answer is still weak, Saathi says the field back in their language and asks once more. The correction is remembered, so the next time that word is heard it matches straight away.
Freehow sure 1.00
Those four numbers are constants someone picked, not measurements from an experiment. What they encode is an order: a remembered correction outranks a list match, a list match outranks a model guess. Nothing more is claimed for them.
A real turn, field by field
A customer in Bengaluru says her address in one breath, in Kannada, to a delivery workflow. This is the transcript that comes back — numbers left as digits, which is what makes the rules in try 2 work at all.
ಇಂದಿರಾನಗರ, 12ನೇ ಮೈನ್ 5ನೇ ಕ್ರಾಸ್, ಶಾಂತಿ ನಿವಾಸ ಅಪಾರ್ಟ್ಮೆಂಟ್, ಫ್ಲಾಟ್ 302, 9845012345, ಗೇಟ್ ಹತ್ತಿರ ಇಡಿ
| Field | What Saathi took | Which try |
|---|---|---|
| Area | Indiranagar | 1 · known list |
| Cross and main | 12th Main, 5th Cross | 2 · rule |
| Building | Shanti Nivasa Apartment | 3 · model |
| Flat number | 302 | 2 · rule |
| Their number | 9845012345 | 2 · rule |
| Hand over how | Leave it at the gate | 1 · known list |
Five of the six fields cost nothing. One call went to the model, for the one thing no rule could read: the name of the building. Which try handles which field is written into the workflow file, so each workflow decides for itself what is worth paying for.
When it is not sure, it leaves a blank
The sentence the delivery partner hears is a fixed template filled with checked values. It is never written by a model. If the flat number did not come through clearly, this is what goes out:
इंदिरानगर में Shanti Nivasa Apartment जाना है। 12th Main 5th Cross पर है। फ़्लैट नंबर 302। गेट पर छोड़ दीजिए।
इंदिरानगर में Shanti Nivasa Apartment जाना है। 12th Main 5th Cross पर है। फ़्लैट नंबर —। गेट पर छोड़ दीजिए।
The blank gets counted and shown on screen, never smoothed over. A fluent sentence about the wrong flat is worse than an obvious hole in it: the delivery partner knows to ask about a hole, but has no way to doubt a confident wrong number.
The same reason an Aadhaar number is never a model call
An Aadhaar number carries its own check digit. Saathi does the arithmetic and gets a yes or a no. A model would give you a confident sentence instead, and a confident sentence is exactly the wrong output for a number that gets an application rejected three weeks later.
Corrections this device has learned
When Saathi hears a name wrong and the person corrects it, the pair is kept. Every later turn checks these first, before anything else.
The Sarvam models doing the work
Four of them, each doing one job. Remove any one and a specific part of the cascade stops working. The API key stays on the server; no credential reaches the browser.
- saaras:v3
Turns speech into text.
Run with mode = codemix, which leaves numbers as digits instead of spelling them out in words. Every rule in try 2 is a pattern over digits. Turn that setting off and they all stop matching, and a form is mostly numbers.
- sarvam-105b-conversations
Reads the free text nothing else could, and routes a spoken request to the right workflow.
It also writes a whole workflow when someone describes one out loud. Whatever it writes is checked before it can run.
- bulbul:v3
Speaks every question, every read-back, and the handover sentence.
A different voice per language: Priya for English, Shreya for Hindi, Kavya for Kannada.
- transliterate
Converts Kannada or Devanagari script into Roman letters. Meaning is not the point.
This is what lets try 1 match a spoken answer against a list. It is called one word at a time and cached, because the endpoint drifts on long unpunctuated input.
What we did not build
Stated before anyone has to find it.
There is no eval harness
We compared settings while building this, in throwaway scripts that never made it into the repo. So no numbers are quoted here — without the scripts to check them, they would just be claims.
Corrections stay on one device
A correction is kept in this browser and travels with every later turn, so it survives a refresh and a restarted server. It does not reach anyone else's phone. Sharing them needs a database we did not set up.
Nothing is submitted anywhere
A form ends as a printable sheet and a list of papers to carry. Nothing gets submitted by Saathi. What it removes are the preparation trips — the one in-person visit the law requires still has to happen.
Saathi does not place calls
The handover plays on one phone held out to the other person. The daily medicine check-in produces a card and a number instead of dialling out. Telephony would change where the audio comes from — the engine underneath stays the same.