|
|
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): |
|
|
|
|
|
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." |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
name_match = re.search(r"\*\*Submitter Name:\*\*\s*(.*)", text) |
|
|
if name_match: |
|
|
data["submitter"] = name_match.group(1).strip() |
|
|
|
|
|
|
|
|
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: |
|
|
|
|
|
data["summary"] = text[:200] + "..." |
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|