| 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 |
|
|