AI-assisted back-office tools for insurance claims workflows. Concept demo using UNIQA-style branding. Not affiliated with or endorsed by UNIQA Insurance Group — used illustratively for portfolio purposes.
🟢 Live demo: https://document-intelligence-poc.onrender.com
First load may take ~30 seconds — Render free tier sleeps the container after 15 minutes of inactivity.
A typical claims adjuster in an insurance back-office spends 5–15 minutes per case re-typing data from incoming PDFs and emails into the internal claims system (TIA, Guidewire, custom systems). At 25 cases per day across a 30-person team, that's ~75 hours of manual data entry daily — done by qualified domain experts who could instead be reviewing complex claims, talking to customers, or training junior staff.
This demo shows three AI-assisted tools that move that bottleneck:
| Tool | Input | Output | Time saved per case |
|---|---|---|---|
| Extract | PDF claim form / invoice | Structured JSON, fields verified against PDF | ~8 minutes |
| Classify | Incoming email / message | Category + priority + routing team + actions | ~3 minutes |
| Summarize | Long narrative / email thread | Executive summary + key facts + action + reply draft | ~10 minutes |
The adjuster stays in the loop on every case: the AI proposes, the adjuster confirms (or corrects) before the result is pushed downstream. Missing or low-confidence fields are surfaced for review in amber.
Open the live demo and try:
- Click "Sample claim form" — a Slovak car-insurance claim form loads. Watch the PDF preview render on the left while structured fields auto-populate on the right.
- Click any field on the right (e.g. Policy number, Total, Bank) — on the PDF preview, the source word(s) get highlighted in yellow. Every extracted value can be traced back to its origin on the original document.
- Switch to Classify mode (header nav) and click Payment complaint — a customer threatening to escalate to the Slovak National Bank loads.
- Click Classify case — notice the 🔴 High priority badge (the model recognises the regulatory escalation language) and the routing to the Billing & Reimbursement team with concrete suggested actions.
- Click Approve & route — a success card shows the case ID, the team mailbox, the audit log, and (if a webhook is configured) confirmation that the payload was actually delivered to a downstream system.
- Switch to Summarize mode and click Disputed claim thread — a multi-message email argument loads. Click Summarize to get a 2-3 sentence executive summary, the key facts, a detected sentiment (😠 angry), a suggested action, and a ready-to-edit customer reply.
- Watch the Time saved counter in the header grow with each action.
flowchart LR
A["📄 PDF (Extract)"] --> B["pdfplumber<br/>text + word bboxes"]
A2["📧 text (Classify)"] --> C
A3["📝 long text (Summarize)"] --> C
B --> C{"ANTHROPIC_API_KEY<br/>configured?"}
C -- "yes" --> D["Claude Opus 4.7<br/>structured outputs"]
C -- "no" --> E["Regex / keyword<br/>heuristic fallback"]
D --> F["Pydantic validation"]
E --> F
F --> G["Review UI<br/>(form / cards / preview)"]
G -- "approve" --> H["POST /integrate"]
H --> I{"INTEGRATION_<br/>WEBHOOK_URL<br/>set?"}
I -- "yes" --> J["📡 Live POST<br/>to webhook"]
I -- "no" --> K["Mock success card<br/>(case ID + email + audit)"]
| Mode | When | Visual indicator |
|---|---|---|
LLM (claude-opus-4-7) |
ANTHROPIC_API_KEY is set |
Green "claude-opus-4-7 extraction" badge |
| Heuristic (regex) | No API key | Amber "Heuristic extraction (no API key)" badge |
The heuristic fallback means the demo works end-to-end without any API credentials — anyone can clone the repo and see the full flow. Recruiters clicking the live URL see the heuristic mode by default; the LLM mode unlocks when an API key is added.
| Mode | When | Visual indicator |
|---|---|---|
| Live webhook | INTEGRATION_WEBHOOK_URL is set |
Green "LIVE WEBHOOK" badge + HTTP status |
| Mock | No webhook URL | Amber "MOCK" badge — case ID + email are fake |
- Click-to-highlight source verification —
pdfplumberexposes per-word bounding boxes; the frontend renders the PDF viapdf.jsand overlays a highlight canvas. Clicking a field in the form finds the matching words on the page and draws yellow boxes around them. This is the "decision-support" loop in a single interaction. - Strict-schema structured outputs from Claude — uses
output_config.format: json_schemaso the model is constrained to the exact Pydantic model the rest of the pipeline expects. No prompt-engineering hacks to "please return JSON" — the API enforces it. - Graceful degradation — every AI call has a deterministic regex fallback. The product works without external dependencies and the UI is honest about which mode is active.
- Three tools, one workspace — header nav switches between Extract,
Classify, and Summarize via URL hash (
#extract/#classify/#summarize). Same backend, same styling, shared time-saved counter, shared/integratedownstream path. - Real vs mock integration toggle — toggling
INTEGRATION_WEBHOOK_URLmoves the same Approve flow from mock to live POST without code change. Lets you demo the same UI as either "works without setup" or "production-style pipeline".
# 1. Install deps (once)
python -m pip install -r requirements.txt
# 2. (Optional) Add API key for the LLM path
copy .env.example .env
# edit .env and set ANTHROPIC_API_KEY=sk-ant-...
# 3. Start the server
.\run.ps1
# or:
python -m uvicorn app.main:app --reload --app-dir .Open http://127.0.0.1:8000.
The repo ships with a Dockerfile and a render.yaml blueprint. To deploy
your own copy on Render's free tier:
- Fork this repo on GitHub.
- On https://render.com, New → Blueprint and point at the fork.
- Render reads
render.yaml. AddANTHROPIC_API_KEYas a secret env var if you want the LLM path — leave empty to deploy in heuristic mode. - (Optional) Add
INTEGRATION_WEBHOOK_URLfor the live downstream integration demo — see next section. - First deploy takes ~3 minutes.
The Docker image runs unchanged on Fly.io, Railway, Google Cloud Run, or any container host.
For interviews it's powerful to show data actually flowing somewhere — not just appearing on screen. Set this up once:
- Open https://webhook.site in a new tab. It auto-generates a unique URL.
- In Render → service → Environment, add
INTEGRATION_WEBHOOK_URLwith that webhook.site URL as the value. Save. - Render redeploys automatically (~30s).
- Open the demo and the webhook.site tab side by side. Click Approve & route or Save & export — the payload appears in webhook.site in real time, the result card shows a green "LIVE WEBHOOK" badge with the HTTP status code.
When the env var is not set, both buttons still work — they just show a "MOCK" badge instead.
app/
main.py FastAPI app, routes, static serving
extractor.py Extract orchestration (PDF → LLM or heuristic)
pdf_reader.py pdfplumber wrapper, text + per-word bounding boxes
llm.py Claude client, JSON schema, heuristic fallback
classifier.py Classify orchestration (text → LLM or heuristic)
summarizer.py Summarize orchestration (text → LLM or extractive heuristic)
integration.py Mock + real downstream integration (webhook POST)
samples.py Built-in sample messages + claim narratives
schemas.py Pydantic models
static/
index.html UI shell with mode nav (Extract / Classify / Summarize)
app.js Frontend logic + PDF.js + click-to-highlight
favicon.svg Document-mark favicon
style.css Custom styling
sample-data/
invoice.pdf Generic invoice
claim-form.pdf Slovak car-insurance claim form (generated)
scripts/
generate_claim_sample.py fpdf2 generator for the claim form
generate_banner.py README banner generator
generate_og_image.py Social-share card generator
smoke_test.py End-to-end smoke test against a running server
tests/
test_extraction.py Heuristic extraction + sample-PDF assertions
test_classification.py Category / priority / routing assertions
test_summarization.py Summary / sentiment / draft assertions
test_integration.py Downstream routing + case-ID format
.github/workflows/ci.yml Runs the test suite on every push
Dockerfile · render.yaml · run.ps1
The pure-Python logic (heuristic extraction, classification, summarization,
routing) is covered by a pytest suite that needs no API key:
pip install -r requirements-dev.txt
python -m pytest tests/ -qGitHub Actions runs it on every push — see the CI badge at the top.
What this demo deliberately does not include — and what would need to be added for a real deployment:
- Authentication (SSO / OIDC against the company directory) and per-adjuster audit log
- Persisted extractions + reviewer corrections — corrections are high-quality training data for fine-tuning
- LLM-returned per-field confidence scores (not just a binary missing flag) — needed for "auto-approve if all fields >95%" workflows
- Batch processing via the Claude Batches API for end-of-day bulk runs
- Real downstream integration with a specific claims system (TIA, Guidewire, custom) — currently demonstrated via a configurable webhook URL
- Replace heuristic fallback with a model-distilled small classifier so the no-API-key mode has higher fidelity
- Multi-page PDF support is implemented; multi-document batch upload UI would be ~1 day
MIT — see LICENSE. The UNIQA name, logo, and brand colours are property of UNIQA Insurance Group. This is an independent portfolio project not affiliated with UNIQA.
