File size: 1,748 Bytes
90b4eb9 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | """End-to-end smoke test of the whole pipeline:
Strava -> analyze -> render -> coach (Modal/vLLM)
Run against your real Strava data:
uv run python scripts/run_coach.py
Run against built-in demo data (no Strava account needed):
uv run python scripts/run_coach.py --demo
Requires in your .env:
LLM_BASE_URL (your Modal endpoint + /v1)
LLM_MODEL (e.g. Qwen/Qwen3-1.7B)
STRAVA_CLIENT_ID / STRAVA_CLIENT_SECRET / STRAVA_REFRESH_TOKEN (real mode only)
"""
import sys
from datetime import datetime, timedelta
from dotenv import load_dotenv
from rate_my_run.client import StravaClient
from rate_my_run.analytics import analyze
from rate_my_run.render import summary_to_text
from rate_my_run.coach import generate_report
from rate_my_run.samples import demo_activities
GOAL = "Build consistency: run 3 times per week"
def main():
load_dotenv()
# 1. Get activities — demo data or real Strava
if "--demo" in sys.argv:
activities = demo_activities()
print(f"Using {len(activities)} demo activities.\n")
else:
client = StravaClient._from_env()
after = int((datetime.now() - timedelta(weeks=8)).timestamp())
activities = client.get_activities(after=after, per_page=200)
print(f"Fetched {len(activities)} activities from Strava.\n")
# 2. Analyze + 3. render
summary = analyze(activities)
summary_text = summary_to_text(summary, goal=GOAL)
print("=== TRAINING SUMMARY (this is what the model sees) ===")
print(summary_text)
# 4. Coach
print("\n=== COACH REPORT (Sports Scientist) ===")
report = generate_report(summary_text, personality="Sports Scientist")
print(report)
if __name__ == "__main__":
main()
|