@@ -56,6 +56,7 @@ type Service interface {
56 IsSessionBusy(sessionID string) bool
56 IsSessionBusy(sessionID string) bool
57 IsBusy() bool
57 IsBusy() bool
58 Summarize(ctx context.Context, sessionID string) error
58 Summarize(ctx context.Context, sessionID string) error
61type agent struct {
62type agent struct {
@@ -805,3 +806,100 @@ func (a *agent) CancelAll() {
805 return true
806 return true
810+func (a *agent) UpdateModel() error {
813+ // Get current provider configuration
814+ currentProviderCfg := config.GetAgentProvider(a.agentCfg.ID)
815+ if currentProviderCfg.ID == "" {
816+ return fmt.Errorf("provider for agent %s not found in config", a.agentCfg.Name)
819+ // Check if provider has changed
820+ if string(currentProviderCfg.ID) != a.providerID {
821+ // Provider changed, need to recreate the main provider
822+ model := config.GetAgentModel(a.agentCfg.ID)
824+ return fmt.Errorf("model not found for agent %s", a.agentCfg.Name)
827+ promptID := agentPromptMap[a.agentCfg.ID]
829+ promptID = prompt.PromptDefault
832+ opts := []provider.ProviderClientOption{
833+ provider.WithModel(a.agentCfg.Model),
834+ provider.WithSystemMessage(prompt.GetPrompt(promptID, currentProviderCfg.ID)),
835+ provider.WithMaxTokens(model.DefaultMaxTokens),
838+ newProvider, err := provider.NewProviderV2(currentProviderCfg, opts...)
840+ return fmt.Errorf("failed to create new provider: %w", err)
843+ // Update the provider and provider ID
844+ a.provider = newProvider
845+ a.providerID = string(currentProviderCfg.ID)
848+ // Check if small model provider has changed (affects title and summarize providers)
849+ smallModelCfg := cfg.Models.Small
850+ var smallModelProviderCfg config.ProviderConfig
852+ for _, p := range cfg.Providers {
853+ if p.ID == smallModelCfg.Provider {
854+ smallModelProviderCfg = p
859+ if smallModelProviderCfg.ID == "" {
860+ return fmt.Errorf("provider %s not found in config", smallModelCfg.Provider)
863+ // Check if summarize provider has changed
864+ if string(smallModelProviderCfg.ID) != a.summarizeProviderID {
865+ var smallModel config.Model
866+ for _, m := range smallModelProviderCfg.Models {
867+ if m.ID == smallModelCfg.ModelID {
872+ if smallModel.ID == "" {
873+ return fmt.Errorf("model %s not found in provider %s", smallModelCfg.ModelID, smallModelProviderCfg.ID)
876+ // Recreate title provider
877+ titleOpts := []provider.ProviderClientOption{
878+ provider.WithModel(config.SmallModel),
879+ provider.WithSystemMessage(prompt.GetPrompt(prompt.PromptTitle, smallModelProviderCfg.ID)),
880+ provider.WithMaxTokens(40),
882+ newTitleProvider, err := provider.NewProviderV2(smallModelProviderCfg, titleOpts...)
884+ return fmt.Errorf("failed to create new title provider: %w", err)
887+ // Recreate summarize provider
888+ summarizeOpts := []provider.ProviderClientOption{
889+ provider.WithModel(config.SmallModel),
890+ provider.WithSystemMessage(prompt.GetPrompt(prompt.PromptSummarizer, smallModelProviderCfg.ID)),
891+ provider.WithMaxTokens(smallModel.DefaultMaxTokens),
893+ newSummarizeProvider, err := provider.NewProviderV2(smallModelProviderCfg, summarizeOpts...)
895+ return fmt.Errorf("failed to create new summarize provider: %w", err)
898+ // Update the providers and provider ID
899+ a.titleProvider = newTitleProvider
900+ a.summarizeProvider = newSummarizeProvider
901+ a.summarizeProviderID = string(smallModelProviderCfg.ID)