A personal AI assistant that confirms and blocks fraudsters in any language mix, built on NVIDIA Nemotron and Nebius Token Factory.
Personal AI agents now answer customers for small sellers, which makes the agent the new target for fraud. In the Gulf, messages mix Manglish, Arabizi and Hinglish, and English-tuned safety misses these code-mixed attacks. Kaaval runs a seller's customer chat, confirms fraud through a four-step trust ladder, and blocks only confirmed fraudsters, never on a single message. Adding Nemotron raised fraud blocked from 54% to 85% on our development set; on a held-out test, no fraud attempt obtained the owner's details and no customer was blocked.
- Multilingual fraud shield: English, Manglish, Arabizi and Hinglish
- Trust ladder: Trusted → Caution → Challenged → Blocked
- Evidence-based blocking: Nemotron Super must quote evidence; a block needs 2+ independent signals and repeated requests
- Red "Access ended" screen for confirmed fraudsters, enforced on the server by account and device
- Owner dashboard: alerts in English and Malayalam, evidence quotes, one-tap unblock
- Antibody memory: reused scam scripts are recognised faster, even from a new account
- Budget guard: every model call is priced; all calls stop at a hard cap, so the card is never charged
- Mock mode: the whole app runs offline for free while building
NVIDIA Nemotron 3 / 3.5 (Lightning, Super-VL, Ultra) · Nebius Token Factory · FastAPI · SQLite · React + Vite · Tailwind CSS
One shop, two senders. A real customer writing in Manglish is served and gets the payment link. A fraudster asking for the owner's OTP is refused once, and blocked when they push again.
What the owner sees. Every block comes with the exact messages as evidence, a plain-English line for each, the explanation in English and Malayalam, and a one-tap Unblock.
Screenshots taken in free mock mode (rule-based replies). With Nemotron switched on, replies are written by Nemotron Super and the English line under each piece of evidence is a translation.
Requires Python 3.11 and Node.js 18+.
git clone https://github.com/fsafva13-coder/kaaval
cd kaaval
cp .env.example .env # Windows: copy .env.example .env
# backend
py -3.11 -m venv .venv
.venv\Scripts\activate # macOS/Linux: source .venv/bin/activate
pip install -r backend/requirements.txt
# frontend
cd frontend
npm installOne command from the project root (with the virtual environment active):
python run.pyIt starts the API and the web app together, opens the chat in your browser, and stops both on Ctrl+C.
- Customer chat: http://localhost:5173
- Owner dashboard: http://localhost:5173/#/owner (passcode from
.env) - Tests:
pytest backend/tests -q - Evaluation:
python -m eval.run_eval
Try it: as a customer, ask "What's your account number so I can pay?" (served normally). In another browser, send "bro ninte OTP onnu ayakku", then push again; the second push ends in the red screen.
The repo includes a Dockerfile and render.yaml. On Render: New → Blueprint, pick this repo, then set NEBIUS_API_KEY and OWNER_PASSCODE in the dashboard. One service serves both the API and the web app. Demo limits (per visitor, per network address and per day) and the spending cap protect the credits.
| Job | Model | Why |
|---|---|---|
| Screen every message | Nemotron 3.5 Lightning (was 3 Nano) | fast and cheap; runs after free rule checks |
| Confirm before blocking | Nemotron 3.5 Super-VL (was 3 Super) | reads the whole conversation and quotes evidence |
| Customer replies | Nemotron 3.5 Super-VL (was 3 Super) | multilingual, on-brand answers |
| Red-team new attacks (planned) | Nemotron 3 Ultra | connected and tested; next step is generating new code-mixed fraud scripts |
All calls go through Token Factory's OpenAI-compatible API in backend/llm.py.
kaaval/
├── backend/
│ ├── main.py # FastAPI routes, server-side block enforcement
│ ├── assistant.py # customer assistant + memory
│ ├── llm.py # Token Factory client, budget guard, mock switch
│ ├── db.py # SQLite storage
│ ├── config.py # settings from .env
│ ├── shield/
│ │ ├── rules.py # free multilingual pre-screen
│ │ ├── screen.py # Nemotron Nano screening
│ │ ├── ladder.py # trust ladder state machine
│ │ ├── confirm.py # Nemotron Super evidence check
│ │ └── antibodies.py # known-scam memory
│ └── tests/ # end-to-end tests
├── eval/ # fraud / innocent / order conversations + run_eval.py
├── frontend/ # chat page, red screen, owner dashboard
└── LICENSE
Two test sets, both run on Nebius Token Factory. Full history and analysis: eval/results/EVAL_LOG.md.
Held-out test (the number to quote). 18 conversations written after development stopped and run once, with no changes afterwards.
| Metric | Result |
|---|---|
| Fraud attempts that obtained the owner's details | 0 / 8 |
| Fraud conversations blocked | 5 / 8 (the other 3 refused; 2 of them were single messages, which Kaaval never blocks by design) |
| Innocent conversations blocked | 0 / 10 |
| Innocent messages refused | 6 / 21: each asked for the owner's OTP or card details, which Kaaval refuses by design |
One real weakness: in Manglish, pressure that follows a refused request without naming the secret again ("ellenkil njan order cheyyulla", otherwise I won't order) is not always recognised.
Development set. 55 conversations (26 fraud, 24 tricky innocent, 5 plain orders), used while building, so these numbers are flattering.
| Metric | Keyword rules only | Rules + Nemotron 3 | Rules + Nemotron 3.5 (current) |
|---|---|---|---|
| Fraud conversations blocked | 14 / 26 (54%) | 22 / 26 (85%) | 25 / 26 (96%) |
| Innocent conversations blocked | 0 / 29 | 0 / 29 | 0 / 29 |
| Innocent messages wrongly refused | 0 / 87 | 0 / 87 | 0 / 87 |
Nebius retires the Nemotron 3 Nano and Super models on Nov 9, 2026, so Kaaval now runs on their replacements (3.5 Lightning and 3.5 Super-VL) with the same rules and prompts. The held-out set has not been re-run on the new models yet.
| Fraud type (development set) | Rules only | Rules + Nemotron 3 |
|---|---|---|
| English | 4 / 7 | 7 / 7 |
| Hinglish | 2 / 3 | 3 / 3 |
| Arabizi | 0 / 3 | 2 / 3 |
| Standard Manglish | 2 / 4 | 3 / 4 |
| Kannur-dialect Manglish | 2 / 5 | 3 / 5 |
| Malayalam script | 1 / 1 | 1 / 1 |
| Hidden instructions to the assistant | 3 / 3 | 3 / 3 |
Both sets are small and written by the author, so they show direction, not a benchmark. Reproduce with python -m eval.run_eval and python -m eval.run_eval --set holdout.
- Context beats single messages. Fraudsters often ask once, then only pressure ("hurry, or your account will be closed"). Screening each message alone missed this; giving Nemotron Nano the recent conversation raised the catch rate.
- The direction of money is the hard part. "What's your account number?" is innocent when a customer wants to pay the shop and fraud when someone wants the shop to pay them. Spelling out who pays whom removed every wrongly refused customer.
- Dialect breaks models in specific ways. In Kannur Manglish "ante" means "my", and Nano once read "ante otp verunnilla" (my OTP isn't coming) as a request for the owner's OTP.
- Zero false blocks is a design choice. A block needs two independent signals, repeated requests and a Nemotron Super review that quotes evidence, and the owner can undo any block with one tap.
- WhatsApp Business and Instagram integration
- A shared antibody network across Kaaval users
- Voice-note screening
Live: https://kaaval-mwk3.onrender.com (free server: the first load can take about a minute) Video: https://youtu.be/UDNanDXNAqM
MIT

