A voice-first insurance claim intake app that lets a claimant talk naturally while the agent builds a structured claim packet in real time. The UI shows the live conversation, extracted claim facts, operator guidance, missing items, and an adjuster-ready handoff.
This is designed as a realistic first notice of loss (FNOL) workflow: the claimant does not need to fill out a rigid form, and the operator does not need to manually translate a messy conversation into claim fields.
- Native voice conversation with the claim intake agent
- Real-time transcript for claimant and agent turns
- Text input fallback for typed claim details
- Live audio responses from the agent
- Automatically extracts claimant name, contact method, policy number, loss type, date, location, description, safety details, evidence, and report numbers
- Updates the claim state as the conversation progresses
- Highlights missing or uncertain information
- Builds an adjuster handoff packet while the call is still happening
- Shows the current claim disposition
- Suggests the next best question or confirmation
- Lists blocking items before handoff
- Separates the operator-facing summary from the lower-level audit trail
- Handles home water damage, auto collision, theft/property loss, travel claims, medical reimbursement examples, and unclear claims
- Applies deterministic evidence and document checks
- Flags injury, safety, habitability, timing, SIU, and escalation signals
- Avoids promising coverage, payment, or liability
The app combines live voice, an ADK graph, structured extraction, and deterministic insurance rules:
| Layer | Model / Engine | Purpose |
|---|---|---|
| Live voice | gemini-3.1-flash-live-preview |
Voice-to-voice conversation, audio responses, and transcription |
| ADK graph | root_agent in agent.py |
Source of truth for claim normalization, classification, validation, routing, and packet generation |
| Structured extraction | gemini-3-flash-preview |
Converts messy claim language into structured claim facts inside the ADK graph |
| Business rules | Python FunctionNodes + Pydantic | Deterministic missing-field checks, evidence gates, safety routing, SIU signals, and handoff packet output |
| App backend | FastAPI | Serves the frontend, manages WebSocket audio, and calls run_claim_workflow() from agent.py after each claimant turn |
| Frontend | HTML, CSS, JavaScript | Dark professional live cockpit for voice, transcript, claim state, and handoff |
agent.py owns the production claim workflow. It exposes the ADK root_agent and a run_claim_workflow() helper that runs the graph programmatically for the live app.
server.py owns the live web transport. It manages the browser session, Gemini Live audio stream, transcripts, and FastAPI routes. It does not duplicate extraction, classification, evidence, routing, or packet logic.
The live app flow is:
Claimant speaks or types
|
v
server.py captures the turn
|
v
run_claim_workflow() executes root_agent
|
v
ADK graph runs LLM nodes + deterministic FunctionNodes
|
v
server.py renders the returned claim state in the UI
agentic-fnol-engine/
|-- agent.py
|-- schemas.py
|-- policies.py
|-- examples.py
|-- requirements.txt
|-- .env.example
|-- assets/
| `-- agentic-fnol-engine-architecture.png
|-- live_demo/
| |-- index.html
| |-- styles.css
| |-- app.js
| `-- server.py
`-- README.md
From the app directory:
cd agentic-fnol-engine
python -m venv myenv
source ./myenv/Scripts/Activate.ps1
pip install -r requirements.txtEdit .env and set your Google API key:
GOOGLE_GENAI_USE_VERTEXAI=False
GOOGLE_API_KEY=your-google-api-keyStart the backend and frontend server:
python -m uvicorn live_demo.server:app --reload --host 127.0.0.1 --port 4177Open the app:
[http://127.0.0.1:4177/index.html](http://127.0.0.1:4177/index.html)
Use the microphone button to start a live claim conversation, or type into the text box if microphone access is unavailable.
