@@ -130,7 +130,20 @@ func (c *coordinator) Run(ctx context.Context, sessionID string, prompt string,
131 mergedOptions, temp, topP, topK, freqPenalty, presPenalty := mergeCallOptions(model, providerCfg)
131 mergedOptions, temp, topP, topK, freqPenalty, presPenalty := mergeCallOptions(model, providerCfg)
133+ if providerCfg.OAuthToken != nil && providerCfg.OAuthToken.IsExpired() {
134+ slog.Info("Detected expired OAuth token, attempting refresh", "provider", providerCfg.ID)
135+ if refreshErr := c.cfg.RefreshOAuthToken(ctx, providerCfg.ID); refreshErr != nil {
136+ slog.Error("Failed to refresh OAuth token", "provider", providerCfg.ID, "error", refreshErr)
137+ return nil, refreshErr
140+ // Rebuild models with refreshed token
141+ if updateErr := c.UpdateModels(ctx); updateErr != nil {
142+ slog.Error("Failed to update models after token refresh", "error", updateErr)
143+ return nil, updateErr
133− return c.currentAgent.Run(ctx, SessionAgentCall{
146+ result, err := c.currentAgent.Run(ctx, SessionAgentCall{
134 SessionID: sessionID,
147 SessionID: sessionID,
135 Prompt: prompt,
148 Prompt: prompt,
136 Attachments: attachments,
149 Attachments: attachments,
@@ -142,6 +155,7 @@ func (c *coordinator) Run(ctx context.Context, sessionID string, prompt string,
142 FrequencyPenalty: freqPenalty,
155 FrequencyPenalty: freqPenalty,
143 PresencePenalty: presPenalty,
156 PresencePenalty: presPenalty,
147func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.ProviderOptions {
161func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.ProviderOptions {