Skip to content

Armstrong-Asenavi-technical-writer-task3-auto-insurance-claims #93

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions auto-insurance-claims-agentic-RAG/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
GOOGLE_API_KEY="AI..."
LLAMA_CLOUD_API_KEY = "llx-..."
PROJECT_NAME ="..."
ORGANIZATION_ID="..."
2 changes: 2 additions & 0 deletions auto-insurance-claims-agentic-RAG/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.env
__pycache__
73 changes: 73 additions & 0 deletions auto-insurance-claims-agentic-RAG/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Auto Insurance Claim Processor

This application processes auto insurance claims using LlamaIndex and Gemini LLM. It can be run as a command-line tool or as a Streamlit web application.

## Setup

1. Clone this repository
2. Install the required dependencies:
```
pip install -r requirements.txt
```
3. Copy the `.env.example` file to `.env` and fill in your API keys:
```
cp .env.example .env
```
4. Edit the `.env` file with your actual API keys and configuration

## Required API Keys

- **Google API Key** for Gemini LLM
- **LlamaCloud API Key** for vector database access
- **Project Name** for your LlamaCloud project
- **Organization ID** for your LlamaCloud organization

## Directory Structure

Make sure you have a `data` directory with sample claim JSON files:

```
data/
john.json
alice.json
# ... other claim files
```

## Running the Command Line Tool

Test a claim from the command line:

```
python test_workflow.py --file data/john.json
```

## Running the Streamlit Web App

Start the Streamlit app:

```
streamlit run app.py
```

The app will be available at `http://localhost:8501`

## Features

- Process claims from JSON files
- Manual claim entry form
- View processing logs
- View claim decisions with coverage, deductible, and payout information

## Sample Claim JSON Format

```json
{
"claim_number": "CL1234567",
"policy_number": "POL987654",
"claimant_name": "John Doe",
"date_of_loss": "2023-11-15",
"loss_description": "Rear-end collision at stop light",
"estimated_repair_cost": 3500.00,
"vehicle_details": "2018 Honda Accord, VIN: 1HGCV1F34JA123456"
}
```
136 changes: 136 additions & 0 deletions auto-insurance-claims-agentic-RAG/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
import streamlit as st
import json
import os
from insurance_claim_processor import process_claim, ClaimInfo
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Remove unused import ClaimInfo to address the Ruff (F401) warning.

Since ClaimInfo is never used, it is safe to remove:

-from insurance_claim_processor import process_claim, ClaimInfo
+from insurance_claim_processor import process_claim
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
from insurance_claim_processor import process_claim, ClaimInfo
from insurance_claim_processor import process_claim
🧰 Tools
🪛 Ruff (0.8.2)

4-4: insurance_claim_processor.ClaimInfo imported but unused

Remove unused import: insurance_claim_processor.ClaimInfo

(F401)


st.set_page_config(page_title="Auto Insurance Claim Processor", layout="wide")

st.title("Auto Insurance Claim Processor")

# Create tabs for different ways to input claims
tab1, tab2 = st.tabs(["Process File", "Manual Entry"])

with tab1:
st.header("Process Claim from JSON File")

# File uploader
uploaded_file = st.file_uploader("Upload a claim JSON file", type=["json"])

# Sample files section
st.subheader("Or use a sample file:")
sample_files = []

# Check for sample files in the data directory
if os.path.exists("data"):
sample_files = [f for f in os.listdir("data") if f.endswith(".json")]

if sample_files:
selected_sample = st.selectbox("Select a sample claim", sample_files)
use_sample = st.button("Use Selected Sample")
else:
st.warning("No sample files found in 'data' directory.")
use_sample = False
selected_sample = None

# Process button
process_file = st.button("Process Claim", key="process_file")

# Handle file processing
if process_file and uploaded_file is not None:
# Save uploaded file temporarily
with open("temp_claim.json", "wb") as f:
f.write(uploaded_file.getbuffer())

with st.spinner("Processing claim..."):
decision, logs = process_claim(claim_json_path="temp_claim.json")

# Display results
st.success("Claim processed successfully!")

# Create two columns
col1, col2 = st.columns(2)

with col1:
st.subheader("Claim Decision")
st.json(json.loads(decision.model_dump_json()))

with col2:
st.subheader("Processing Logs")
for log in logs:
st.text(log)

# Clean up temp file
if os.path.exists("temp_claim.json"):
os.remove("temp_claim.json")

elif use_sample and selected_sample:
sample_path = os.path.join("data", selected_sample)

with st.spinner("Processing sample claim..."):
decision, logs = process_claim(claim_json_path=sample_path)

# Display results
st.success(f"Sample claim {selected_sample} processed successfully!")

# Create two columns
col1, col2 = st.columns(2)

with col1:
st.subheader("Claim Decision")
st.json(json.loads(decision.model_dump_json()))

with col2:
st.subheader("Processing Logs")
for log in logs:
st.text(log)

with tab2:
st.header("Enter Claim Details Manually")

# Form for manual entry
with st.form("claim_form"):
claim_number = st.text_input("Claim Number")
policy_number = st.text_input("Policy Number")
claimant_name = st.text_input("Claimant Name")
date_of_loss = st.date_input("Date of Loss")
loss_description = st.text_area("Loss Description")
estimated_repair_cost = st.number_input("Estimated Repair Cost", min_value=0.0, format="%.2f")
vehicle_details = st.text_input("Vehicle Details (Optional)")

submit_form = st.form_submit_button("Submit Claim")

if submit_form:
# Create claim data dictionary
claim_data = {
"claim_number": claim_number,
"policy_number": policy_number,
"claimant_name": claimant_name,
"date_of_loss": date_of_loss.strftime("%Y-%m-%d"),
"loss_description": loss_description,
"estimated_repair_cost": estimated_repair_cost
}

if vehicle_details:
claim_data["vehicle_details"] = vehicle_details

with st.spinner("Processing claim..."):
decision, logs = process_claim(claim_data=claim_data)

# Display results
st.success("Claim processed successfully!")

# Create two columns
col1, col2 = st.columns(2)

with col1:
st.subheader("Claim Decision")
st.json(json.loads(decision.model_dump_json()))

with col2:
st.subheader("Processing Logs")
for log in logs:
st.text(log)

Comment on lines +105 to +136
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add input validation and error handling for manual claim entry.

The manual entry form lacks input validation and error handling. Consider validating required fields and adding a try-except block around the process_claim call.

    if submit_form:
+        # Validate required fields
+        required_fields = [claim_number, policy_number, claimant_name, loss_description]
+        if any(not field for field in required_fields):
+            st.error("Please fill in all required fields.")
+            return
+
        # Create claim data dictionary
        claim_data = {
            "claim_number": claim_number,
            "policy_number": policy_number,
            "claimant_name": claimant_name,
            "date_of_loss": date_of_loss.strftime("%Y-%m-%d"),
            "loss_description": loss_description,
            "estimated_repair_cost": estimated_repair_cost
        }
        
        if vehicle_details:
            claim_data["vehicle_details"] = vehicle_details
        
        with st.spinner("Processing claim..."):
-            decision, logs = process_claim(claim_data=claim_data)
-            
-            # Display results
-            st.success("Claim processed successfully!")
-            
-            # Create two columns
-            col1, col2 = st.columns(2)
-            
-            with col1:
-                st.subheader("Claim Decision")
-                st.json(json.loads(decision.model_dump_json()))
-            
-            with col2:
-                st.subheader("Processing Logs")
-                for log in logs:
-                    st.text(log)
+            try:
+                decision, logs = process_claim(claim_data=claim_data)
+                
+                # Display results
+                st.success("Claim processed successfully!")
+                
+                # Create two columns
+                col1, col2 = st.columns(2)
+                
+                with col1:
+                    st.subheader("Claim Decision")
+                    st.json(json.loads(decision.model_dump_json()))
+                
+                with col2:
+                    st.subheader("Processing Logs")
+                    for log in logs:
+                        st.text(log)
+            except Exception as e:
+                st.error(f"Error processing claim: {str(e)}")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if submit_form:
# Create claim data dictionary
claim_data = {
"claim_number": claim_number,
"policy_number": policy_number,
"claimant_name": claimant_name,
"date_of_loss": date_of_loss.strftime("%Y-%m-%d"),
"loss_description": loss_description,
"estimated_repair_cost": estimated_repair_cost
}
if vehicle_details:
claim_data["vehicle_details"] = vehicle_details
with st.spinner("Processing claim..."):
decision, logs = process_claim(claim_data=claim_data)
# Display results
st.success("Claim processed successfully!")
# Create two columns
col1, col2 = st.columns(2)
with col1:
st.subheader("Claim Decision")
st.json(json.loads(decision.model_dump_json()))
with col2:
st.subheader("Processing Logs")
for log in logs:
st.text(log)
if submit_form:
# Validate required fields
required_fields = [claim_number, policy_number, claimant_name, loss_description]
if any(not field for field in required_fields):
st.error("Please fill in all required fields.")
return
# Create claim data dictionary
claim_data = {
"claim_number": claim_number,
"policy_number": policy_number,
"claimant_name": claimant_name,
"date_of_loss": date_of_loss.strftime("%Y-%m-%d"),
"loss_description": loss_description,
"estimated_repair_cost": estimated_repair_cost
}
if vehicle_details:
claim_data["vehicle_details"] = vehicle_details
with st.spinner("Processing claim..."):
try:
decision, logs = process_claim(claim_data=claim_data)
# Display results
st.success("Claim processed successfully!")
# Create two columns
col1, col2 = st.columns(2)
with col1:
st.subheader("Claim Decision")
st.json(json.loads(decision.model_dump_json()))
with col2:
st.subheader("Processing Logs")
for log in logs:
st.text(log)
except Exception as e:
st.error(f"Error processing claim: {str(e)}")

# Add footer with information
st.markdown("---")
st.markdown("Insurance Claim Processor | Powered by LlamaIndex and Gemini")
Loading