박달냥 (14.♡.102.132)
2025년 12월 14일 PM 10:41 · 수정됨(12. 18. 04:43)
안녕하세요. 정말 오랜만에 글씁니다. 주제가 라이딩이 아니라 워크아웃 추천 프로그램 개발기입니다.
배경은 즈위프트가 이번주에 만료가 되었습니다. 혹시나 재갱신을 취소하면 해지방어팀이 나타나 3개월 무료이용권을 줄까 싶어서 해지하고 며칠을 버텨봤는데 안주더라구요. 내가 3년을썼는데..ㅠ
그런데 요즘엔 사실 거의 워크아웃만 슬렁슬렁 수행하면서 넷플을 보는터라. 이럴꺼면 굳이 즈위프트까지..싶더라구요. 재갱신하려니 연간계약이 거의 30만원..하흙..
그래서 제가가지고있는 bolt2의 자체 키커연동기능으로 워크아웃을 수행했습니다.


원래는 이렇게 그냥 설정파워만 놓는기능이 있는줄알았는데 오늘 만져보니 플랜기능이있고 워크아웃을 수행할 수 있더라구요. 그동안 즈위프트만 하느라 볼트를 키커에 연동한게 거의 2년만인것 같습니다.

이걸 보니 문득, intervals에서 워크아웃을 커스텀으로 만들수있고 코치들 플랜도 있으니 그걸 여기다 넣을 방법은 없을까? 하고 오전 로라를 타고 난뒤에 인터벌스를 조금 만지작 거렸습니다. 커스텀 라이브러리에 워크아웃을 만들거나 추가하고 워크아웃을 수행하고자 하는 날짜에 드래그앤드랍을 하면 원래 추가가 되야하는데... 안됩니다? 제가 워크아웃을 잘못 만든건가 해서 계속해서 이래저래 시도해봤지 안됩니다.

503에러로 튕기더군요. 잼민이의 도움으로 이런저런 시도를 하는데, 계속 안됩니다. 그러다 무슨에러이지 싶어서 콘솔창을 열어서 확인해보니 paser 서버에서 문제가 있는걸 발견했습니다. 보니까 워크아웃 프로파일 구성을 대충 아래처럼 집어 넣으면 paser 가 이걸 json으로 변환해서 다시 넘겨주는 것 같더라구요. (이 파서서버는 저녁이 되어서 다시 정상적으로 복구된 것 같더라구요)
Warmup
- 10m 60%
Main Set
- 30m 70%
Cooldown
- 10m 50%
이 과정에서 intervals api 공식문서 를 찾게 됩니다. https://intervals.icu/api-docs.html
여기있구요. 여기를 살펴보니 파서를 거치지 않고 json으로 직접 workout을 등록하는 api를 발견해서 이걸로 브라우저에서 바로 쏴봤습니다.

그랬더니 짜잔..오.. 뭔가 프로파일이 어설프지만 어쨌든 워크아웃이 등록이 되었습니다.
여기서 문득 생각이 들었습니다.
"내 훈련이나 라이딩 데이터를 분석해서 매일 매일 아침에 오늘의 최적화된 워크아웃이 내 와후 볼트로 배달된다면...?
나는 그냥 해당 워크아웃을 시작만 한다면?"
솔직히 요즘은 좀 게을러진 마당에 즈위프트에서 워크아웃 고를때도 은근 결정장애가오고 (운동은 하고 싶지만 힘들고 싶지는 않다..) ,그 다음으로는 맵 고르는것도 결정장애가 오더라구요.(뻥마일리지라도 많이 벌어야한다..).
그리고 이벤트를 할까 뒤적뒤적. 아 힘들것같아. 다시 워크아웃..
차라리 서브웨이 BLT처럼 프리셋 같은거 있으면 좋을텐데. 적당한 시간으로 적당한 강도로 적당히 사람많은 맵에 바로 들어가버리게..
그런 프리셋 다이렉트 버튼은 없더라구요. 전 솔직히 저 결정장애 구간에서 10분씩넘게 헤메는 경우도 있었습니다..ㅎ
그래서 내 볼트에 그냥 바로 오늘 이거해. 하고 워크아웃이 대안없이 바로 꼿혔으면 좋겠는데...그게 나의 어제 상태까지 다 반영이 되었으면 좋겠는거죠. 가민이 주는 wellness 정보까지 함께 받아서 hrv 까지 연동되어 나온 워크아웃이요.
그래서 이런걸 머릿속에 그려봤습니다.

간단한 개념도이구요. 로직은 intervals부터 데이터를 받아 aI야 "나 이런 상태이고 이런 훈련을 지난주에 했는데, 이걸로 오늘 할 워크아웃을 만들어줘" 라는 프롬프트를 만들게해서 ai에게 넘기면 ai는 workout을 던져주고 이걸 가공해서 intervals에 업로드!
하는 과정입니다.

intervals 에서 upload planned workouts 을 체크하면 해당주차에 계획된 workout 들이 기기와 동기화가 됩니다. 그리고 intervals, gemini ai 에 가서 모두 api키를 받아두면 위 구조에서 connectivity 는 완료가 됩니다.
<자자 구상은 되었으니 개발을 해봅니다..!>
그리고 요즘 열려버린 진정한 입코딩의 시대. 일일이 타이핑하는 능력을 잃어버린지 꽤 되었습니다. 요구사항 프롬프트를 만들고, 최근 구글에서 출시한 antigravity와 함께 작업했습니다.
이거 만들어줘 하고 던지는거죠. 그리고 될때까지 "바까죠" 이 말을 무한 반복해서 외치는 겁니다. AI가 좀 헤멘다 싶으면 문서 링크 던져주고 혼냅니다. 자세히 좀 보라고.. 아닙니다.응원 해줍니다.!! 포기하지 마라고.

저는 구현해줘 한 마디만...

한단계씩 되는지 점검하는거죠. 각 서비스들에 연결해보고

이렇게 데이터들도 한번 불러와 봅니다.
몇가지가 빠지는듯 하지만 그런건 나중에 채워넣으면 되므로! 데이터들이 잘 불러와짐을 확인했습니다.
자자 진도를 빼봅니다. 이제 워크아웃을 만들어서 넣어봅니다. ai generated 말고 우선 샘플 워크아웃 포맷으로 만들어서 넣어봅니다.

이런저런 시행착오가 있었지만 열심히 포기하지 마라고 응원한 덕에 이렇게 워크아웃이 intervals에 성공적으로 등록이 되었습니다. intervals워크아웃만 등록되면 bolt2 까지도 잘나오는것을 확인했습니다.

쨔잔...!! 둘의 동기화가 순조롭게 잘 됩니다!
이제 ai model과 연동해서 ai가 생성해주는 workout을 등록할 차례입니다, 생각 보다 쉽게 되더라구요.
내일 날짜로 기본 스윗스팟이 만들어져서 들어가는것이 확인되었구요.

자동을 밀어넣어주는것을 그냥 할것인지 아니면 파라메터를 조금 조정 하는 옵션도 추가하면 좋겠다 싶어서 워크아웃을 변경하는 옵션도 추가 했습니다. 대에충 이렇게요.

나쁘지 않네요. 알아서 잘해주는 세상.
테스트도 해봤습니다. "오늘은 다리가 무거워" 를 넣고 강도를 'easy' 로 바꿨더니

가벼운 회복 라이딩을 생성해줍니다.

이렇게 생성된 워크아웃이 잘 들어가네요. ㅎ
이제 이거를 무료호스팅서비스에 넣어서 스켸쥴을 돌려서 매일 오전 5시에 새로운 워크아웃이 생성되어서 자동으로 인터벌스에 들어오도록 세팅하면 됩니다. 매주 일요일 밤 12시에는 주간 계획이 세워지도록 하면 되구요. 주간계획을 따르되 매일아침 어제 상황을 보고 주간계획을 그대로 갈지, 어제 빼먹거나, 예상보다 더 많은 TSS를 쌓거나, 워크아웃무시하고 고강도 필드라이딩을 했다거나하면 다시 조정해주는거죠. 또 HRV를 보고 술마신것 같으면 오늘은 다시 쉬운걸로 바꿔주면 좋겠죠. 기존 플랜 워크아웃을 override 하는 형식으로 추가 구현을 하려고합니다. 그때는 자당분들도 써보실수있게 링크공개도 드리겠습니다.
참고로 소요시간은 3시간 조금 넘게 걸린 것 같습니다. 놀랍죠..?
저녁밥 먹으면서 옆에서 계속 지시질했네요. 아 거북목..
------
덧1. 즈위프트 레이스, 캣마, 각종 이벤트들, 로보페이서들의 기능을 따라갈수는 없지만..
또한 이런 유사 서비스들도 존재합니다 트레이닝픽스, 데이트레이너 같은 서비스들이 이미 있습니다. 즈위프트도 유료회원는 플랜 기능이 있죠. 근데 뭔가 유료구독 유도가 심하고, 저의 어제까지 데이터를 반영해주지는 않더라구요. 유명코치들 플랜을 구독해서 넣어주는 거지, 완벽하게 데이바이데이 개인화가 되어있지는 않은것 같아요.
2. ai model은 openai, gemini 등의 무료모델을 썼는데 하다가 gemini pro 모델의 토큰을 다써버려 fresh 모델로 내렸네요. 모델에 요청은 매번 실행때만 호출하는것이 아니라 모든 준비가 완료되었을때 호출하도록 변경했습니다. auto model routing 기능도 추가해야겠어요.
3. 이거 하면서 알게 된 건데 intervals는 strava 로 부터 받은 data는 api로 전송시켜주지 못합니다. 자체적으로만 저장하지 다른 서비스에 재전송은 막혀있더라구요. 사실 폰트라바가 아닌 이상에야 원본데이터가 스트라바인 경우는 없어서, wahoo, gamin, zwift 부터 raw date를 받도록 변경했습니다.


자기네들도 데이터생산자가 아니라 가공유통자면서 엄청 뭐 있게구나 봅니다.
4. 아무튼 zwift 갱신취소가 이런 전개를 가져올지는 몰랐는데 덕분에 일요일 하루 재미지게 보냈습니다 :) Frontend 추가해서 dashboard 만드는 기능도 지금 추가 중에 있습니다. 글쓰는동안 뒤에서 ai 선생이 열심히 만들고 있네요.
https://github.com/cyanluna-git/ai.cycling.workout.planner
요기 가면 각종 문서와 코드를 구경하실 수 있습니다. 기능들이 더 추가되고 완성도가 더 올라가면 또 업뎃 하겠습니다!
좋은 제안 있으시면 말씀해주세요!
댓글 (21)
- U
uhehe
25.12.14 · 112.♡.180.185
와우!! 도대체 못하는게 없는 달냥님은. 대단합니다!! -
박박달냥
→ uhehe 작성자
25.12.14 · 14.♡.102.132
못하는게 너무 많은 닝겐....;; 요즘 AI괴롭히는 재미에 좀 빠졌습니다 ㅋㅋ -
Eex610
25.12.14 · 74.♡.187.3
우와 너무 멋있어요! -
박박달냥
→ ex610 작성자
25.12.14 · 14.♡.102.132
크으 감사합니다. 북미 서비스 출시할까요? - 해
해인두밀
25.12.14 · 49.♡.250.33
와 정말 신기하네요 ㅋㅋㅋㅋ 기대가 됩니다. -
박박달냥
→ 해인두밀 작성자
25.12.14 · 14.♡.102.132
다 있는걸로 짜집기 한것일뿐입니다 ㅎㅎ -
꼴꼴뚜기삼촌
25.12.15 · 116.♡.77.50
자…. 가민 사용자를 위한 다음버전을 기대해봅니다. 와후파만 되는거면… - _-;;;; -
박박달냥
→ 꼴뚜기삼촌 작성자
25.12.15 · 14.♡.102.132
[https://s3.damoang.net/data/editor/2512/be5a54f.png]
가민 사용자도 여기만 체크하면 동일하게 될듯하네요.. 가민이 없어서 테스트는 안되지만... ㅎㅎ -
고고네이
25.12.15 · 106.♡.11.196
역사적으로(...) IT계열 종사자분들이 득시글대는(...) 다모앙다운 글입니다.
사실 중간부터 잘 이해가 안되는 문과(...)출신🙄 -
박박달냥
→ 고네이 작성자
25.12.15 · 14.♡.102.132
성격에 맞는 글을 쓴건지 안맞는 글을쓴건지 모르겠네요 ㅋㅋㅋ
댓글을 작성하려면 이 필요합니다.