trial / app.py
DeepakKolhe1995's picture
Added feature
0d96fd8
import os
import json
import gradio as gr
import boto3
from datetime import datetime
# Load secrets from environment
AWS_REGION = os.getenv("AWS_REGION")
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
# Initialize Bedrock client
bedrock_runtime = boto3.client(
service_name='bedrock-runtime',
region_name=AWS_REGION,
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY
)
# Global state to store claim data
claim_data = {
"policy_number": None,
"claimant_name": None,
"dob": None,
"treatment_date": None,
"reason": None,
"amount": None,
"pending_dob_confirmation": None # Track DOB confirmation
}
# Function to validate date format (YYYY-MM-DD)
def is_valid_date(date_str):
try:
datetime.strptime(date_str, "%Y-%m-%d")
return True
except ValueError:
return False
# Function to check if all fields are filled
def all_fields_filled():
return all(value is not None for key, value in claim_data.items() if key != "pending_dob_confirmation")
# Function to reset claim data for a new claim
def reset_claim_data():
global claim_data
claim_data = {
"policy_number": None,
"claimant_name": None,
"dob": None,
"treatment_date": None,
"reason": None,
"amount": None,
"pending_dob_confirmation": None
}
# Chat function with Claude
def chat_with_claude(message, history):
global claim_data
# Base prompt for Claude
base_prompt = """
You are an Insurance Claim Form Assistant. Your task is to collect and validate: policy number, claimant's name, date of birth, date of treatment, reason for claim, and amount claimed. Current data: {current_data}
Follow these steps:
1. **Parse Input**: Extract fields from the user's message: "{user_message}".
2. **Handle DOB Confirmation**:
- If pending_dob_confirmation is set (e.g., "{pending_dob_confirmation}"), check if the user confirms (e.g., "Yes, the date of birth is correct"). If confirmed, save the DOB and clear pending_dob_confirmation. If not, ask for a new DOB.
3. **Validate Input**:
- Policy number: Must be non-empty.
- Claimant's name: Must be non-empty.
- Date of birth: Must be a valid date in any reasonable format (e.g., "2025-05-20", "May 20, 2025"). Convert to YYYY-MM-DD. If age > 80 years (based on current year 2025), set pending_dob_confirmation to the parsed DOB and ask for confirmation.
- Date of treatment: Must be a valid date in any reasonable format. Convert to YYYY-MM-DD.
- Reason for claim: Must be non-empty.
- Amount claimed: Must be a positive number.
4. **Update Data**: Save valid fields only if not already set, unless the user provides a new value. Do not overwrite existing fields unnecessarily. Update pending_dob_confirmation as needed.
5. **Handle Missing/Invalid Fields**: List only missing fields or request corrections for invalid ones. If DOB needs confirmation, prioritize that.
6. **Generate Claim Form**: If all fields are valid (policy_number, claimant_name, dob, treatment_date, reason, amount) and pending_dob_confirmation is None, generate a markdown table claim form. Reset data afterward.
Example interaction:
- User: "My name is John Doe, born January 1, 1930"
- Response: "The date of birth (1930-01-01) indicates an age over 80 years. Please confirm this is correct (e.g., 'Yes, the date of birth is correct') or provide a new date of birth."
- User: "Yes, the date of birth is correct"
- Response: "Thank you, John. I have saved your name and date of birth. Please provide your policy number, date of treatment, reason for claim, and amount claimed."
Example claim form:
```markdown
# Insurance Claim Form
| Field | Details |
|---------------------|-------------------|
| Policy Number | ABC12345 |
| Claimant's Name | John Doe |
| Date of Birth | 1980-05-15 |
| Date of Treatment | 2025-04-10 |
| Reason for Claim | Knee surgery |
| Amount Claimed | $5000.00 |
```
Process the user's message: "{user_message}"
"""
# Update current data with any previously collected fields
prompt = base_prompt.format(
current_data=json.dumps(claim_data, indent=2),
user_message=message,
pending_dob_confirmation=claim_data.get("pending_dob_confirmation", None)
)
# Prepare messages for Claude
messages = []
for user_input, bot_response in history:
messages.append({"role": "user", "content": user_input})
messages.append({"role": "assistant", "content": bot_response})
messages.append({"role": "user", "content": prompt})
request_body = {
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1000,
"temperature": 0.7,
"messages": messages
}
try:
response = bedrock_runtime.invoke_model(
modelId="anthropic.claude-3-5-sonnet-20240620-v1:0",
body=json.dumps(request_body)
)
response_body = json.loads(response['body'].read())
reply = response_body['content'][0]['text']
# Parse Claude's response to update claim_data
lines = reply.split('\n')
for line in lines:
line = line.strip()
if 'Policy Number' in line and '|' in line:
claim_data['policy_number'] = line.split('|')[2].strip()
elif 'Claimant\'s Name' in line and '|' in line:
claim_data['claimant_name'] = line.split('|')[2].strip()
elif 'Date of Birth' in line and '|' in line:
dob = line.split('|')[2].strip()
if is_valid_date(dob):
claim_data['dob'] = dob
claim_data['pending_dob_confirmation'] = None
elif 'Date of Treatment' in line and '|' in line:
treatment_date = line.split('|')[2].strip()
if is_valid_date(treatment_date):
claim_data['treatment_date'] = treatment_date
elif 'Reason for Claim' in line and '|' in line:
claim_data['reason'] = line.split('|')[2].strip()
elif 'Amount Claimed' in line and '|' in line:
amount_str = line.split('|')[2].strip().replace('$', '')
try:
amount = float(amount_str)
if amount > 0:
claim_data['amount'] = amount
except ValueError:
pass
elif 'Please confirm this is correct' in line and 'date of birth' in line.lower():
# Extract DOB from Claude's response for confirmation
dob_match = next((l for l in lines if 'Date of Birth' in l and '|' in l), None)
if dob_match:
dob = dob_match.split('|')[2].strip()
if is_valid_date(dob):
claim_data['pending_dob_confirmation'] = dob
elif 'yes, the date of birth is correct' in message.lower():
if claim_data['pending_dob_confirmation']:
claim_data['dob'] = claim_data['pending_dob_confirmation']
claim_data['pending_dob_confirmation'] = None
# If Claude indicates the form is complete, reset claim_data
if '# Insurance Claim Form' in reply:
reset_claim_data()
return reply
except Exception as e:
return f"❌ Error: {str(e)}"
# Create Gradio ChatInterface
iface = gr.ChatInterface(
fn=chat_with_claude,
title="🤖 Insurance Claim Form Assistant",
description="Provide your insurance claim details (policy number, name, date of birth, date of treatment, reason for claim, amount claimed). I'll validate them and generate a claim form!",
theme="soft",
)
if __name__ == "__main__":
iface.launch()