(Yet Another) AI ChatGPT Coach

Hi @Clive_King , I actually love your tool and use it basically every day.
I mainly useit to get my activities data from Intervals, to dig deeper into them, but…

… some days ago it started to give me errors, like the following one:

I attempted to fetch your full activity data for yesterday, but the request failed due to payload size limits (ResponseTooLargeError).”

Sometimes (rarely) it works, most of the times it doesn’t anymore. It used to work like a breeze, now something changed…

Hints?

Thanks!

Riccardo

Hi Riccardo,

Thanks for the feedback, can you advise the following:

Are you using OPENAI (ChatGPT) model v5.3 instant?
Plus Subscriber or Free Plan?
Which report is this for e.g. Weekly?
Your ID i14235 ?

I have added some phase context back into the report for ADE v2 in the last day, this maybe the cause. Let me investigate, you can in the meanwhile ask for “lite” weekly or season report.

Clive

Update: I made some streamlining changes again to reduce payload size/token count.

Hi @Clive_King ,

Using ChatGPT 5.3 instant and thinking: same results;
Plus Subscriber;
Only yesterday and today activity and calendar data;
My Athlete ID is 5267177.

Thanks!

Riccardo

I’ve looked at logs and see tool requests for data (activities and wellness data), but no reports? Can you open a new chat in the GPT app and run a weekly report again please. Sometimes ChatGPT can hang onto old errors in the chat context.

Weekly report works as a breeze. Great stuff.
But the data set I’m trying to pull out fails, I get these messages:

I’m pulling the ride, wellness, and calendar data for the exact dates you specified, then I’ll format the brief strictly to your template with one section per ride if there were multiple.

Stopped talking to App

The day-level full activity pull came back too large, so I’m narrowing it by first identifying the activities on March 31, 2026 and then fetching each ride individually to keep the brief complete and accurate.

Stopped talking to App

The full per-ride payload is also exceeding the tool limit. I’m still completing the brief with the available activity summary plus the exact wellness and calendar records, and I’ll mark any fields I could not reliably resolve as missing.

Talked to intervalsicugptcoach.clive-a5a.workers.dev

Thanks!

Riccardo

Apologies, somehow, I managed to remove a fallback to basic data only for a range request when no fields are specified, this resulted in all data for each activity being retrieved. Now for a range of activities, it will only return basic set unless otherwise specified. This reduces the payload.

    const DEFAULT_LIGHT_FIELDS = [
      "id",
      "start_date_local",
      "type",
      "name",
      "icu_training_load",
      "moving_time",
      "average_heartrate",
      "icu_intensity",
      "icu_weighted_avg_watts"
    ];

Hopefully this resolves the issue you saw. Appreciate you letting me know.

Top tips to manage the payload are:

getlightactivities for a {date} or a range {start and end}; this allows ChatGPT to handle large 1 day payloads or Larger ranges.

I have now made a further change to getonedayfullactivity tool to reduce the overhead when a large number for intervals was present in a single activity, and the size returned to ChatGPT would exceed its limits, whilst this is an unusual case, the new changes also mean a faster response and faster render times. There should be no loss of function in an activity analysis. All intervals are preserved and it still supports multi-sport and those with CORE heat sensors.

As a reminder you can ask ChatGPT what tools are available show tools available and it will provide a full list.

# REPORTS

## Weekly Report
runWeeklyReportV2(
  test?: string,
  lite?: boolean,
  start?: string,        # YYYY-MM-DD
  athleteID?: string
)

## Season Report
runSeasonReportV2(
  lite?: boolean,
  athleteID?: string
)

## Wellness Report
runWellnessReportV2(
  athleteID?: string
)

## Summary Report
runSummaryReportV2(
  start?: string,        # YYYY-MM-DD
  end?: string,          # YYYY-MM-DD
  athleteID?: string
)


# CALENDAR

## Read Calendar
readCalendarV1(
  start: string,         # ISO date
  end: string,           # ISO date
  lite?: boolean,
  athleteID?: string
)

## Write Calendar (Create / Update Workouts)
writeCalendarV1(
  planned_workouts: [
    {
      date: string,              # YYYY-MM-DD
      title: string,
      type: string,              # Run | Ride | Swim | etc.
      category: string,          # WORKOUT | RACE_A | NOTE | etc.
      description: string,       # STRICT interval format (- lines only)
      duration_minutes: number,
      tss?: number,
      carbs_per_hour?: number
    }
  ]
)

## Delete Calendar
deleteCalendarV1(
  id?: any,
  date?: string,
  dates?: string[]
)


# ACTIVITY

## Full Activity (by date or id)
getOneDayFullActivityV1(
  date?: string,         # YYYY-MM-DD
  activity_id?: string,
  athleteID?: string
)

## List Activities (Light)
listActivitiesLight(
  oldest?: string,
  newest?: string,
  fields?: string,       # comma-separated (note if not specified a default set is applied)
  athleteID?: string
)


# WELLNESS

## One Day Wellness
getOneDayWellnessV1(
  date: string,          # YYYY-MM-DD
  athleteID?: string
)


# PERFORMANCE MODELS

## Power Curves
getPowerCurvesExtV1(
  type: "Ride" | "Run" | "Swim",
  curves?: string,
  pmType?: "MS_2P" | "MORTON_3P" | "FFT_CURVES" | "ECP",
  athleteID?: string
)

## Pace Curves
getPaceCurvesExtV1(
  type: "Run" | "Swim",
  curves?: string,
  athleteID?: string
)

## HR Curves
getHRCurvesV1(
  curves?: string,
  type?: "Ride" | "Run" | "Swim",
  athleteID?: string
)

## Power-HR Curve
getPowerHRCurveV1(
  start: string,         # YYYY-MM-DD
  end: string,           # YYYY-MM-DD
  athleteID?: string
)

## MMP Model
getMMPModelV1(
  type?: "Ride" | "Run" | "Swim",
  athleteID?: string
)


# ATHLETE / DATA

## Training Plan
getAthleteTrainingPlanV1(
  athleteID?: string
)

## Athlete Profile
getAthleteProfileV1(
  athleteID?: string
)

## Sport Settings
getSportSettingsV1(
  athleteID?: string
)

## Coached Athletes
getCoachedAthletesV1()


# COMMUNICATION

## Send Message
sendChatMessageV1(
  content: string,
  chat_id?: string,
  to_athlete_id?: string,
  to_activity_id?: string
)

# DATA QUALITY

## Data Quality Report
runDataQualityReportV1(
  athleteID?: string
)

Br and a great Easter break all :rabbit_face:

Clive

2 Likes

Love it! Thank you for the update, comes in handy especially when you’re hitting those Ronnestad 40/20s multiple times ah ah.

One related question. For each interval, what data is exposed by intervals.icu that can be fetched by Montis? Is there a difference between intervals automatically defined by intervals and user-generated intervals?

Thank you!

Riccardo

1 Like

The intervals fetched are those created by Intervals and those additional ones you defined added/moved etc or just used ‘laps’. What you see is what you get :slight_smile:

Clive

Yes, very nicely done!
I meant, are there any other data you can fetch? Another interesting one could be decoupling for longer intervals, or VAM…

Thank you!

Decoupling is in there for interval and for the ride always. VAM is not a published API field in intervals, it would need to be calculated.

However a good tip for your Ronnestad 40/20s is to ask show W′bal (capacity state) vs Decoupling (physiological cost) per group

e.g.

Group W′bal Behavior Decoupling Relationship
:fire: VO2 (30s ~360W) :red_triangle_pointed_down: Large repeated depletion (down to ~5–7 kJ) ~0% to +10% High depletion but controlled physiology
:recycling_symbol: Recovery (30s ~178W) :red_triangle_pointed_up: Partial recharge (never full) ~-5% to -25% Recharging, but inefficient (HR stays high)
:brick: Z2 (~160W) :upwards_button: Mostly restored / stable ~-15% to -17% Capacity ok, physiology drifting
:brick: Endurance (~135W) :upwards_button: Fully restored (near max W′bal) up to +26% No depletion, but major drift

Clive

Wow! Super nice! Thank you!

1 Like

Hi @Clive_King , just wanted to let you know that, after the latest updates you made, the system works like a breeze! Don’t know what you did, but… great!

One question about the overall day to day use. In your opinion, since CustomGPTs don’t have persistent memory by themselves, does it make sense to pin one Montis chat and always use that as a daily coaching advisor? Otherwise it has to rebuild its evaluations every new chat, right? Or am I wrong?

Thank you for the advice and keep up the great work!

1 Like

Hi RM, glad the changes are working. Lots of backend improvements this week along with additional security protection of the services. Will release a new change note soon.

I would try and keep a pinned chat to a week maximum depending on how much its used, ChatGPT handles long chat conversations in the mobile app better than desktop which builds a lot of context and can get slow. I use a new GPT daily as a driver, but Im asking a lot of questions to make sure coaching output is valid!

As far as historical context needed, the weekly and season report both provide the last 7 days rolling (unless you ask for iso Week) and 90 day context. Season evaluates a longer phased timeline and chronic performance intelligence over 90 days not just acute 7 days).

In practice, during breakfast if I ask for a weekly report (and sometimes wellness) then ask for planned events, then ask can I ride longer today as the sun is out! It gives me a solid adaptation response (given I should be in a recovery week to consolidate recent weeks of build and overreach). For example:

Ah — this changes things :grinning_face_with_smiling_eyes:
Now we’re not in a physiology-only decision anymore… this is life + training integration.

And honestly? This is where good athletes make smart adjustments — not rigid ones.


:compass: Updated Strategy (Given Weather + Bank Holiday)

:backhand_index_pointing_right: Yes — you can extend today
…but we need to rebalance the week, not just add load blindly.


:repeat_button: Two Smart Options

:green_circle: Option A — “Make Today the Big Day” (Recommended)

Today (Sun):

  • Extend to 3–4h aerobic
  • Keep it strict Z2 (discipline!)

Then adjust:

  • :cross_mark: Skip or downgrade Monday VO2

  • Replace with:

    • Easy endurance OR
    • OFF / café spin

:backhand_index_pointing_right: Why:

  • You shift load to today (better weather, enjoyment)
  • You protect recovery + quality later in week

:blue_circle: Option B — “Keep Structure, Just Add a Bit”

Today:

  • Extend +30–60 min only

Keep Monday VO2

:backhand_index_pointing_right: Why:

  • Maintains plan integrity
  • Lower risk if you really want that VO2 session

:warning: What NOT to do

:cross_mark: Long ride today AND full VO2 tomorrow

That creates:

  • HRV suppression → deeper fatigue
  • Poor VO2 execution
  • Net worse adaptation

:brain: Coaching Insight

You’re in a rare sweet spot:

  • Good weather :sun:
  • High fitness
  • Flexible schedule

:backhand_index_pointing_right: The best athletes move load to when life is best, not just when the plan says so.


:bullseye: My Recommendation (Clear Call)

:backhand_index_pointing_right: Go long today (3–4h)
:backhand_index_pointing_right: Convert tomorrow to easy / recovery

This gives you:

  • Better enjoyment
  • Same (or better) training effect
  • Lower fatigue risk
  • Better quality for Wed/Thu sessions

:fire: Execution Rules for Today

  • Stay <70% FTP no matter what

  • Fuel properly (80–90g carbs/hr)

  • Finish feeling:

    “That was great — not destroyed”


Closing Thought

This isn’t “breaking the plan” —
this is coaching the plan in real life.

Have a great day!

Clive

1 Like

@Clive_King thank you for the hints. My experience with mobile and desktop versions, long context etc. totally matches what you described. Current limitations of Projects also don’t help, unless you work outside CustomGPTs… Your architecture sure makes sense, I’ll give it a try. Thank you!

Hi @Clive_King ! I totally missed that CustomGPT chats cannot be pinned… So, just for inspiration, what are the “lot of questions” like for you to make some context daily? Thank you!

todays driver.

  • run weekly to see overview and next steps
  • show planned events (current 7 day plan)
  • show full performance intelligence, looking at my load state and future decisions
  • show full actions, checking to ensure no plateau and what to do next
  • show full physiology, im cross checking wellness for recovery projection
  • show montis intelligence stack, this brings it all together again
  • discussed todays plan
  • realigned the weekly schedule as I’ve loaded up a recovery week (weather is just perfect right now)

Have a great day

Clive

1 Like

Thanks! I’ll try that!

Hi all — as summer approaches in the Northern Hemisphere, I’ve added new signals to account for heat and how it impacts performance (prompted by getting unexpectedly sunburnt this weekend!).

Why this matters

Heat starts affecting endurance performance earlier than most people think especially for those not acclimatised:

  • Around 18–20°C → rising cardiovascular strain
  • Above ~23°C → clear performance decline (and the need for acclimatisation)

(Shown in research by Samuel N. Cheuvront and Robert W. Kenefick)

What happens in your body :

  • Heart rate rises at the same effort
  • Blood is diverted to cooling (less to muscles)
  • Effort feels harder sooner

:backhand_index_pointing_right: You don’t need extreme heat — even moderate warmth makes training harder.


What’s new in Montis

Weekly Performance Intelligence

  • Heat is now tracked as a real stressor

  • We measure:

    • Accumulated heat strain (7 days)
    • Peak exposure (your hardest hot session)
  • We flag when heat likely caused extra cardiovascular strain

:backhand_index_pointing_right: In simple terms:
Your training may have been harder than it looked.


What this means for you

  • Readiness:
    You’ll see when heat made sessions more stressful

  • Training state (sometimes):
    You may be flagged as more fatigued than expected

  • Next session (most important):
    We adjust your training:

    • More recovery if you’re tired
    • Keep it aerobic instead of pushing
    • Be more conservative even when things look “good”

If it’s warm, your body worked harder than the numbers suggest, and the fatigue you feel is also induced more as much by the weather. So Montis flags your training state accordingly.

I hope that makes sense, I’m certainly feeling the effects of the sunshine this last Easter weekend (previous weekend was near <4c and I was riding in snow, this weekend 23c+). Your feedback is welcome as always.


Source hierarchy:

  1. Direct heat strain from your device (e.g. CORE → HeatTrainingLoad) → highest accuracy
  2. If not available, we estimate from ambient temperature (e.g. Garmin head unit → average_temp)

Physiology output example

External Load Context

  • Heat Load: moderate (0.58)
  • Cardiovascular drift: heat-influenced

Environmental heat is amplifying fatigue, especially during longer rides.


Clive

1 Like

Change Note Week 14

Hi All,

Apologies for the late post of last week change note, it’s been a long weekend of stress loading outdoors :slight_smile:

Change Note Week 14 · Issue #37 · revo2wheels/intervalsicugptcoach-public

:wrench: Summary (Key Changes)

Fixes

  • Smart delete now respects activity type (no more deleting wrong Ride/Run)
  • Structured workouts now correctly respect sport type (Run/Ride)

Additions

  • ADE upgraded → training phases now align with operational state (clearer “can vs should” logic)
  • Rate limiting + security added to protect backend services
  • Heat stress detection added to Performance Intelligence

Refactoring

  • Reduced report payload size (faster, fewer tokens)
  • Optimised activity endpoints to handle large datasets without breaking responses

Clive

1 Like