ganmoor-ai-labs/sms-shield
SMS-Shield — Indian SMS scam & inbox classifier (4B)
SMS-Shield reads one SMS (sender header + body) and returns a structured safety verdict as JSON. Built for Indian SMS traffic in English, Hindi (Devanagari), and romanized Hinglish, including DLT sender-header reasoning (the same bank alert is safe from JD-SBIINB and dangerous from a bare 10-digit mobile). Trained entirely on-device on an NVIDIA DGX Spark (GB10, 128 GB unified memory).
Two model variants in this repo
The Mini was trained on the same verified dataset plus a targeted cashback-boundary booster, and passes the same release gates (zero genuine OTPs/bank alerts flagged).
Output contract
Input:
sender: 9182736450
message: Dear customer aapka SBI account aaj band ho jayega. KYC turant update karein: sbi-kyc-renew.top/verify
Output:
{"verdict": "dangerous", "category": "scam", "scam_type": "kyc_fraud", "risk": 80,
"red_flags": ["account closure", "urgent update", "suspicious link"],
"explanation": "Yeh ek fraud message hai. SBI kabhi bhi SMS se aapka account band karne ki dhamki nahi deta. Link par click na karein."}verdict:safe|suspicious|dangerous(risk bands 0-39 / 40-69 / 70-100)category:otp|banking|delivery|bill_utility|govt|promo|personal|scamscam_type: 15 fraud patterns (kycfraud, digitalarrest, upifraud, jobscam, fakedelivery, investmentscam, lotteryprize, utilityscam, loanapp, phishinggeneric, refundcashback, impersonation, apkmalware, sextortionthreat, otherscam) — null unless flaggedexplanation: one sentence in the language/script of the input message
Results (held-out test set, n=1,390 — included in this repo)
*The baseline almost never predicts safe — it over-flags legitimate traffic, including 22 genuine OTPs/bank alerts. Over-flagging is the deployment killer for SMS safety apps; SMS-Shield was explicitly trained against it with ~40% hard negatives (scary-but-legitimate messages).
Training
- Base: Qwen3-4B-Instruct-2507, LoRA (r=16, bf16), 3 epochs + 1 calibration epoch
- Data: 12.5k synthetic Indian SMS, two-teacher pipeline run fully locally: gemma3:27b generated labeled candidates → 20+ deterministic validators (script/language checks, risk-band consistency, sender-format, fuzzy dedup) → gpt-oss-safeguard:120b independently re-judged every sample blind; label disagreements dropped (~24% rejection). Includes counterfactual sender-flip pairs and a deliberately generated ambiguous "suspicious" tier. The training corpus is not published; the full 1,390-row eval set is.
Known limitations
- Sender-counterfactual calibration: on paired sender-flip tests, 100% of flipped messages are flagged (none pass as safe), but 18% land one severity band off (
suspiciousvsdangerous) against the reference labels. - Languages: EN/HI/Hinglish only in v1. Kannada, Tamil, Telugu, Bengali, Marathi planned.
- Single-message classification; no thread context in v1.
- Trained on synthetic data; real-world distribution shift is expected. Evaluate on your own traffic before relying on it.
- This model assists judgment; it is not a guarantee. Never treat
safeas proof of legitimacy for financial actions.
Usage
Ollama:
ollama run santosh07401/sms-shieldTransformers (adapter in this repo):
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
tok = AutoTokenizer.from_pretrained("Qwen/Qwen3-4B-Instruct-2507")
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-4B-Instruct-2507", dtype="bfloat16", device_map="auto")
model = PeftModel.from_pretrained(model, "ganmoor-ai-labs/sms-shield")GGUF: sms-shield-q4_k_m.gguf (2.4 GB) — llama.cpp/Ollama ready; use a ChatML template (no <think> block).
Intended use
Defensive scam protection for Indian mobile users: on-device SMS filtering, inbox categorization, and fraud warnings. Not for generating scam content.
