fix
This commit is contained in:
62
backend/app/services/ai_summary.py
Normal file
62
backend/app/services/ai_summary.py
Normal file
@@ -0,0 +1,62 @@
|
||||
"""Generate AI activity summaries using Gemini."""
|
||||
|
||||
from backend.app.models.activity import Activity, ActivityMetrics
|
||||
from backend.app.services.gemini_client import chat_async
|
||||
|
||||
SYSTEM_PROMPT = """You are VeloBrain, an AI cycling coach.
|
||||
Analyze the cycling activity data and provide a concise, insightful summary in 3-5 sentences.
|
||||
Focus on: performance highlights, pacing strategy, areas for improvement, and training effect.
|
||||
Be specific with numbers. Use a friendly, coaching tone.
|
||||
Respond in Russian.
|
||||
Use a HTML text formatting."""
|
||||
|
||||
|
||||
def _build_activity_prompt(activity: Activity, rider_ftp: float | None = None) -> str:
|
||||
m: ActivityMetrics | None = activity.metrics
|
||||
lines = [
|
||||
f"Activity: {activity.name or 'Ride'}",
|
||||
f"Type: {activity.activity_type}",
|
||||
f"Duration: {activity.duration // 3600}h {(activity.duration % 3600) // 60}m",
|
||||
]
|
||||
|
||||
if activity.distance:
|
||||
lines.append(f"Distance: {activity.distance / 1000:.1f} km")
|
||||
if activity.elevation_gain:
|
||||
lines.append(f"Elevation: {activity.elevation_gain:.0f} m")
|
||||
|
||||
if m:
|
||||
if m.avg_power:
|
||||
lines.append(f"Avg Power: {m.avg_power:.0f} W")
|
||||
if m.normalized_power:
|
||||
lines.append(f"Normalized Power: {m.normalized_power:.0f} W")
|
||||
if m.tss:
|
||||
lines.append(f"TSS: {m.tss:.0f}")
|
||||
if m.intensity_factor:
|
||||
lines.append(f"IF: {m.intensity_factor:.2f}")
|
||||
if m.variability_index:
|
||||
lines.append(f"VI: {m.variability_index:.2f}")
|
||||
if m.avg_hr:
|
||||
lines.append(f"Avg HR: {m.avg_hr} bpm")
|
||||
if m.max_hr:
|
||||
lines.append(f"Max HR: {m.max_hr} bpm")
|
||||
if m.avg_cadence:
|
||||
lines.append(f"Avg Cadence: {m.avg_cadence} rpm")
|
||||
|
||||
if rider_ftp:
|
||||
lines.append(f"Rider FTP: {rider_ftp:.0f} W")
|
||||
|
||||
intervals = activity.intervals or []
|
||||
work_intervals = [i for i in intervals if i.interval_type == "work"]
|
||||
if work_intervals:
|
||||
lines.append(f"Work intervals: {len(work_intervals)}")
|
||||
powers = [i.avg_power for i in work_intervals if i.avg_power]
|
||||
if powers:
|
||||
lines.append(f"Interval avg powers: {', '.join(f'{p:.0f}W' for p in powers)}")
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
async def generate_summary(activity: Activity, rider_ftp: float | None = None) -> str:
|
||||
prompt = _build_activity_prompt(activity, rider_ftp)
|
||||
messages = [{"role": "user", "text": prompt}]
|
||||
return await chat_async(messages, system_instruction=SYSTEM_PROMPT, temperature=0.5)
|
||||
Reference in New Issue
Block a user