File size: 2,099 Bytes
5dbdf6e
 
 
 
 
b87bd2d
 
5dbdf6e
 
 
b87bd2d
5dbdf6e
b87bd2d
 
 
 
5dbdf6e
b87bd2d
 
5dbdf6e
b87bd2d
 
5dbdf6e
b87bd2d
5dbdf6e
b87bd2d
 
23b8fad
 
 
 
 
 
 
 
 
b87bd2d
 
 
5dbdf6e
b87bd2d
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# Tech Stack Rationale

| Field | Value |
| --- | --- |
| Project | Insurance Sales Portfolio Expert |
| Date | 2026-05-17 |
| Status | **Superseded as a present-state map — see below** |

---

## This document has been superseded

The earlier version listed pre-rewrite picks that are no longer accurate:
Next.js 14, Vercel + Render hosting, a Streamlit→Next migration note, a
3-tier Gemini-2.0/2.5 + NIM-judge chain, a DuckDB 62-field structured hot
path. The system was rebuilt around a single brain since then.

The **current, accurate stack and the reasoning behind it** now lives in one
place so it cannot drift again:

> **→ [`README.md`](../../README.md) §7 "Tech stack & key decisions"** (the
> what + the one-line why), with §4 for how the pieces fit together.

## Current stack (authoritative summary)

- **Frontend:** Next.js 16 (App Router), React 19, Tailwind v4, static export.
- **Backend:** FastAPI + Pydantic; `uvicorn`, port 7860 on the HF Space.
- **Brain:** Google **Gemini `gemini-2.5-flash`** + function-calling tools
  (`save_profile_field` / `retrieve_policies` / `mark_recommendation`), one
  call/turn handling fact-find, retrieval, QA, and recommendation. On a
  transient Gemini error → small **NVIDIA NIM** fallback
  (`backend/nim_fallback.py`) so the turn completes; fail-loud otherwise. No
  separate judge model, no orchestrator, no sales/QA-brain split (all
  retired in the single-LLM-with-tools consolidation).
- **Retrieval:** structured + vector over Chroma + BGE-small-en-v1.5 (local
  CPU, 384-d) with a profile-tuned scorecard.
- **Voice:** Sarvam Saarika (STT) + Bulbul (TTS) + Sarvam-M (Indic).
- **Hosting:** Hugging Face Space (Docker) + companion HF dataset for
  corpus/vectors; **not** Vercel/Render (that was the old plan).

The *why* (alternatives considered, trade-offs) is in the README §7 and in the
ADRs under `60-decisions/` — ADRs are point-in-time decision records: read
each one's **Status** line (Accepted / Superseded / Reversed) rather than
assuming it describes the system today. The README is the present-state
authority.