From one sentence to a verified application
Every customer message goes through the same five steps. The model reads the message and words the next question; everything else is code, which is instant, exact and covered by tests.
-
Read the message
One model call reads the customer's latest reply, with only the question it answers as context, and returns a forced tool call: the facts stated, the ones that were vague (“about a dozen”), and the ones the customer said they don't know. It is told never to fill in a typical value.
-
Check it in code
Pydantic validates every value: real US states (“Texas” becomes TX), sensible numbers, known industries. Then the no-guess rules: “don't know” counts only for the question just asked, a saved answer changes only when we asked about it, and a business name or description must be made of words the customer actually typed.
-
Pick the next question
A fixed priority order, plus typed follow-ups for each industry: a roofer is asked roof height and torch-down work, a daycare its licensed capacity and pool. Anything answered, unknown or not applicable is skipped, so most owners answer about seven questions. A second model call only words the chosen question naturally.
-
Confirm before saving
Vague numbers are held back and read back to the customer to confirm. When nothing is left to ask, code writes the summary from the validated answers, so it can't misstate anything. The customer approves it or corrects it.
-
Coverage and flags by rule
Suggested policies and hard-to-place flags (roofs over 40 ft, torch-down work, alcohol over half of sales, two or more recent claims) come from plain Python rules a broker can read and disagree with, never from the model.
Measured, not guessed
50 simulated owners, each with known true facts and 1–2 facts they don't know, talk to the same agent this site runs. Every field it records is scored against the truth. Latest full run: 2026-11-08.
Field accuracy
99.3%
every field that applies to the business
Invented values
0
fields filled that the owner couldn't have stated
Conversations finished
90%
within 25 customer messages
Questions asked
7.5
on average, instead of a 25-field form
Cost per conversation
$0.0029
gpt-5-nano, with per-session and daily spend caps
Built with
- FastAPI, Jinja2, vanilla JS
- one Python app for the pages and the API
- OpenAI gpt-5-nano
- forced tool calls for extraction, low reasoning effort to keep it fast
- Pydantic v2
- every value validated in code, the ACORD 125-style application schema
- SQLite with SQLModel
- chat sessions, a cost log of every LLM call, eval runs
- pytest
- unit tests with a fake model, no live API calls
- Own Ubuntu server
- nginx with Let's Encrypt HTTPS in front, uvicorn kept running by systemd
The code, the tests and every eval report are in the repository on GitHub.