Removed formatting from LLM response

This commit is contained in:
Shiva Pochampally
2025-09-28 07:07:27 -04:00
parent b5efec5a60
commit 1e55b9aa48
4 changed files with 91 additions and 44 deletions

View File

@@ -148,14 +148,21 @@ def analyze_crashes_endpoint():
crashes, lat, lon, radius_km, weather_summary
)
# Clean up safety analysis text but preserve bullet points
# Clean up safety analysis text - remove ALL markdown formatting
if safety_analysis:
# Remove markdown headers (### or **)
# Remove markdown headers (### ** ##)
safety_analysis = re.sub(r'#+\s*', '', safety_analysis)
# Remove bold formatting (**) but preserve content
# Remove bold formatting (**text**)
safety_analysis = re.sub(r'\*\*([^*]+)\*\*', r'\1', safety_analysis)
# Preserve bullet points (• or *) but clean up spacing
safety_analysis = re.sub(r'^\s*[\*]\s*', '', safety_analysis, flags=re.MULTILINE)
# Remove italic formatting (*text*)
safety_analysis = re.sub(r'\*([^*]+)\*', r'\1', safety_analysis)
# Convert markdown bullet points to clean bullets
safety_analysis = re.sub(r'^\s*[-*+]\s*', '', safety_analysis, flags=re.MULTILINE)
# Remove markdown code blocks
safety_analysis = re.sub(r'```[^`]*```', '', safety_analysis)
safety_analysis = re.sub(r'`([^`]+)`', r'\1', safety_analysis)
# Remove markdown links [text](url)
safety_analysis = re.sub(r'\[([^\]]+)\]\([^)]+\)', r'\1', safety_analysis)
# Clean up multiple newlines but preserve structure
safety_analysis = re.sub(r'\n\s*\n\s*\n', '\n\n', safety_analysis)
# Clean up extra spaces within lines

View File

@@ -294,43 +294,63 @@ class SafeRouteAnalyzer:
if casualties.get('bicyclists', {}).get('total', 0) > 0:
risk_factors['bicyclist'] += 1
weather_info = f"\n\nCURRENT WEATHER CONDITIONS:\n{weather_summary}" if weather_summary else ""
# Determine safety level
total_crashes = route_safety_data.get('total_crashes_near_route', 0)
avg_score = route_safety_data.get('average_safety_score', 0)
prompt = f"""You are an expert traffic safety analyst and route planning specialist. Analyze this route's safety profile and provide recommendations.
if avg_score == 0:
safety_level = "SAFE"
elif avg_score <= 2:
safety_level = "LOW RISK"
elif avg_score <= 5:
safety_level = "MODERATE RISK"
elif avg_score <= 10:
safety_level = "HIGH RISK"
else:
safety_level = "DANGEROUS"
ROUTE INFORMATION:
- Distance: {route_info.get('distance_km', 0):.1f} km
- Estimated duration: {route_info.get('duration_min', 0):.0f} minutes
- Analysis points along route: {len(safety_points)}
weather_info = f" Current weather: {weather_summary}." if weather_summary else ""
SAFETY ANALYSIS (2020+ crash data):
- Total crashes near route: {route_safety_data.get('total_crashes_near_route', 0)}
- Average safety score: {route_safety_data.get('average_safety_score', 0):.2f}
- Maximum danger score: {route_safety_data.get('max_danger_score', 0):.2f}
prompt = f"""Analyze this route's safety and provide a concise summary with bullet points.
CRASH BREAKDOWN:
- Severity distribution: {severity_counts}
- Casualties: {casualty_summary['fatal']} fatal, {casualty_summary['major']} major injuries, {casualty_summary['minor']} minor injuries
- Risk factors: {risk_factors['speeding']} speeding-related, {risk_factors['impairment']} impairment-related
- Vulnerable users: {risk_factors['pedestrian']} pedestrian crashes, {risk_factors['bicyclist']} bicyclist crashes
ROUTE: {route_info.get('distance_km', 0):.1f}km, {route_info.get('duration_min', 0):.0f}min
CRASHES: {total_crashes} crashes nearby (2020+), safety score {avg_score:.1f}
CASUALTIES: {casualty_summary['fatal']} fatal, {casualty_summary['major']} major, {casualty_summary['minor']} minor
RISK FACTORS: {risk_factors['speeding']} speeding, {risk_factors['impairment']} impairment, {risk_factors['pedestrian']} pedestrian, {risk_factors['bicyclist']} bicyclist{weather_info}
MOST DANGEROUS SECTIONS:
{chr(10).join([f"Point {p['point_index']}: {p['crashes_count']} crashes nearby, safety score {p['safety_score']:.1f}" for p in dangerous_points[:3]])}
{weather_info}
Provide a brief summary with:
• Safety Assessment: {safety_level}
• Key Risks (2-3 bullet points max)
• Driving Tips (2-3 bullet points max)
• Weather Considerations (if applicable)
Please provide:
1. Overall route safety assessment (SAFE/MODERATE RISK/HIGH RISK/DANGEROUS)
2. Specific dangerous sections to watch out for
3. Driving recommendations for this route considering current conditions
4. Whether an alternative route should be recommended
5. Time-of-day considerations if applicable
6. Weather-specific precautions based on crash patterns
Be specific and actionable in your recommendations."""
Keep it concise and actionable."""
try:
response = llm.invoke(prompt)
return response.content
result = response.content
# Clean up AI response - remove all markdown formatting
if result:
import re
# Remove markdown headers (### ** ##)
result = re.sub(r'#+\s*', '', result)
# Remove bold formatting (**text**)
result = re.sub(r'\*\*([^*]+)\*\*', r'\1', result)
# Remove italic formatting (*text*)
result = re.sub(r'\*([^*]+)\*', r'\1', result)
# Convert markdown bullet points to clean bullets
result = re.sub(r'^\s*[-*+]\s*', '', result, flags=re.MULTILINE)
# Remove markdown code blocks
result = re.sub(r'```[^`]*```', '', result)
result = re.sub(r'`([^`]+)`', r'\1', result)
# Clean up multiple newlines but preserve structure
result = re.sub(r'\n\s*\n\s*\n', '\n\n', result)
# Clean up extra spaces within lines
result = re.sub(r'[ \t]+', ' ', result)
result = result.strip()
return result
except Exception as e:
return f"Error generating safety analysis: {e}"
@@ -415,24 +435,44 @@ Be specific and actionable in your recommendations."""
'max_danger_score': safety_data.get('max_danger_score', 0)
})
weather_info = f"\nCurrent weather: {weather_summary}" if weather_summary else ""
prompt = f"""Compare these route options for safety and provide a recommendation:
weather_info = f" Weather: {weather_summary}." if weather_summary else ""
ROUTE OPTIONS:
{chr(10).join([f"Route {r['route_num']}: {r['distance_km']:.1f}km, {r['duration_min']:.0f}min, {r['crashes_near_route']} nearby crashes, safety score {r['safety_score']:.2f}" for r in comparison_data])}{weather_info}
prompt = f"""Compare these routes briefly:
{chr(10).join([f"Route {r['route_num']}: {r['distance_km']:.1f}km, {r['duration_min']:.0f}min, {r['crashes_near_route']} crashes, score {r['safety_score']:.1f}" for r in comparison_data])}{weather_info}
Provide:
1. Which route is safest and why
2. Trade-offs between routes (safety vs. time/distance)
3. Clear recommendation with reasoning
4. Any weather-related considerations
• Recommended route and why (1-2 sentences)
• Key trade-offs (safety vs time/distance)
• Final recommendation
Keep it concise and actionable."""
Keep it brief and clear."""
try:
response = llm.invoke(prompt)
return response.content
result = response.content
# Clean up AI response - remove all markdown formatting
if result:
import re
# Remove markdown headers (### ** ##)
result = re.sub(r'#+\s*', '', result)
# Remove bold formatting (**text**)
result = re.sub(r'\*\*([^*]+)\*\*', r'\1', result)
# Remove italic formatting (*text*)
result = re.sub(r'\*([^*]+)\*', r'\1', result)
# Convert markdown bullet points to clean bullets
result = re.sub(r'^\s*[-*+]\s*', '', result, flags=re.MULTILINE)
# Remove markdown code blocks
result = re.sub(r'```[^`]*```', '', result)
result = re.sub(r'`([^`]+)`', r'\1', result)
# Clean up multiple newlines but preserve structure
result = re.sub(r'\n\s*\n\s*\n', '\n\n', result)
# Clean up extra spaces within lines
result = re.sub(r'[ \t]+', ' ', result)
result = result.strip()
return result
except Exception as e:
return f"Error comparing routes: {e}"