diff --git a/internal/agent/coordinator.go b/internal/agent/coordinator.go index 860db8b36cb67c43667a0f4a0dfa0a8b1d2e3992..1006fe2551f60e4b3c8b46f130296750057e5e88 100644 --- a/internal/agent/coordinator.go +++ b/internal/agent/coordinator.go @@ -1170,18 +1170,31 @@ func (c *coordinator) runSubAgent(ctx context.Context, params subAgentParams) (f } // Run the agent - result, err := params.Agent.Run(ctx, SessionAgentCall{ - SessionID: session.ID, - Prompt: params.Prompt, - MaxOutputTokens: maxTokens, - ProviderOptions: getProviderOptions(model, providerCfg), - Temperature: model.ModelCfg.Temperature, - TopP: model.ModelCfg.TopP, - TopK: model.ModelCfg.TopK, - FrequencyPenalty: model.ModelCfg.FrequencyPenalty, - PresencePenalty: model.ModelCfg.PresencePenalty, - NonInteractive: true, - }) + run := func() (*fantasy.AgentResult, error) { + return params.Agent.Run(ctx, SessionAgentCall{ + SessionID: session.ID, + Prompt: params.Prompt, + MaxOutputTokens: maxTokens, + ProviderOptions: getProviderOptions(model, providerCfg), + Temperature: model.ModelCfg.Temperature, + TopP: model.ModelCfg.TopP, + TopK: model.ModelCfg.TopK, + FrequencyPenalty: model.ModelCfg.FrequencyPenalty, + PresencePenalty: model.ModelCfg.PresencePenalty, + NonInteractive: true, + }) + } + result, err := run() + if err != nil && c.isUnauthorized(err) { + if retryErr := c.retryAfterUnauthorized(ctx, providerCfg); retryErr == nil { + result, err = run() + } else if c.notify != nil && model.ModelCfg.Provider == hyper.Name { + c.notify.Publish(pubsub.CreatedEvent, notify.Notification{ + Type: notify.TypeReAuthenticate, + ProviderID: model.ModelCfg.Provider, + }) + } + } if err != nil { return fantasy.NewTextErrorResponse(fmt.Sprintf("Failed to generate response: %s", err)), nil }