bpHigh's picture
inital_mvp
76d67c5
import base64
from io import BytesIO
from PIL import Image
from markitdown import MarkItDown
def encode_image_to_base64(image):
"""Encodes a PIL Image to a base64 string."""
if isinstance(image, str):
# If it's a file path
with open(image, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
elif isinstance(image, Image.Image):
buffered = BytesIO()
image.save(buffered, format="JPEG")
return base64.b64encode(buffered.getvalue()).decode('utf-8')
return None
def convert_doc_to_markdown(file_path):
"""Converts a document (PDF, Docx, etc.) to markdown."""
if not file_path:
return ""
try:
md = MarkItDown()
result = md.convert(file_path)
return result.text_content
except Exception as e:
return f"Error converting document: {str(e)}"
def get_mock_claims():
"""Returns a list of mock claims for the dashboard."""
return [
{
"id": "CLM-1001",
"submitter": "John Doe",
"date": "2023-10-25",
"vehicle": "2018 Toyota Camry",
"status": "New",
"ai_analysis": {
"damage_estimate": "£820",
"fraud_risk": "Low",
"adjuster_classification": "Junior Adjuster",
"recommendation": "Auto-approve payment",
"summary": "Minor rear bumper damage. Policy active. No suspicious indicators."
}
},
{
"id": "CLM-1002",
"submitter": "Jane Smith",
"date": "2023-10-24",
"vehicle": "2022 Tesla Model 3",
"status": "Under Review",
"ai_analysis": {
"damage_estimate": "£15,000",
"fraud_risk": "High",
"adjuster_classification": "Senior Adjuster",
"recommendation": "Escalate to SIU",
"summary": "Severe front-end collision. Multiple vehicles involved. Discrepancy in accident location report."
}
},
{
"id": "CLM-1003",
"submitter": "Robert Brown",
"date": "2023-10-26",
"vehicle": "2015 Ford Focus",
"status": "New",
"ai_analysis": {
"damage_estimate": "£1,200",
"fraud_risk": "Low",
"adjuster_classification": "Junior Adjuster",
"recommendation": "Review Further",
"summary": "Side panel scratch and dent. consistent with description. Higher than average repair cost for model."
}
}
]
def extract_claim_data(text):
"""
Extracts structured data from the AI's markdown response.
Returns a dictionary with keys: vehicle, damage_estimate, fraud_risk, adjuster_classification, summary, recommendation.
"""
import re
data = {
"submitter": "Anonymous",
"vehicle": "Unknown",
"damage_estimate": "N/A",
"fraud_risk": "Unknown",
"adjuster_classification": "Junior Adjuster",
"recommendation": "Review",
"summary": "Auto-generated summary from intake."
}
# Simple regex extraction based on the prompt format
# * **Submitter Name:** [Name]
name_match = re.search(r"\*\*Submitter Name:\*\*\s*(.*)", text)
if name_match:
data["submitter"] = name_match.group(1).strip()
# * **Vehicle:** [Vehicle Make/Model/Year if identifiable, else 'Unknown']
vehicle_match = re.search(r"\*\*Vehicle:\*\*\s*(.*)", text)
if vehicle_match:
data["vehicle"] = vehicle_match.group(1).strip()
estimate_match = re.search(r"\*\*Estimated Repair Cost:\*\*\s*(.*)", text)
if estimate_match:
data["damage_estimate"] = estimate_match.group(1).strip()
fraud_match = re.search(r"\*\*Fraud Risk:\*\*\s*(.*)", text)
if fraud_match:
data["fraud_risk"] = fraud_match.group(1).strip()
class_match = re.search(r"\*\*Adjuster Classification:\*\*\s*(.*)", text)
if class_match:
data["adjuster_classification"] = class_match.group(1).strip()
summary_match = re.search(r"\*\*Summary:\*\*\s*(.*)", text)
if summary_match:
data["summary"] = summary_match.group(1).strip()
else:
# Fallback: use the first few lines or the whole text if summary not found explicitly
data["summary"] = text[:200] + "..."
# Infer recommendation based on classification/risk if not explicitly parsed (or add prompt for it)
# For now, let's look for "Next Steps" or just default based on risk
if "High" in data["fraud_risk"]:
data["recommendation"] = "Escalate to SIU"
elif "Low" in data["fraud_risk"] and "Junior" in data["adjuster_classification"]:
data["recommendation"] = "Auto-approve payment"
return data