|
|
@@ -280,6 +280,39 @@ func (a *App) SwitchAgentReverse() (*App, tea.Cmd) {
|
|
|
return a.cycleMode(false)
|
|
|
}
|
|
|
|
|
|
+func (a *App) CycleRecentModel() (*App, tea.Cmd) {
|
|
|
+ recentModels := a.State.RecentlyUsedModels
|
|
|
+ if len(recentModels) > 5 {
|
|
|
+ recentModels = recentModels[:5]
|
|
|
+ }
|
|
|
+ if len(recentModels) < 2 {
|
|
|
+ return a, toast.NewInfoToast("Need at least 2 recent models to cycle")
|
|
|
+ }
|
|
|
+ nextIndex := 0
|
|
|
+ for i, recentModel := range recentModels {
|
|
|
+ if a.Provider != nil && a.Model != nil && recentModel.ProviderID == a.Provider.ID && recentModel.ModelID == a.Model.ID {
|
|
|
+ nextIndex = (i + 1) % len(recentModels)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for range recentModels {
|
|
|
+ currentRecentModel := recentModels[nextIndex%len(recentModels)]
|
|
|
+ provider, model := findModelByProviderAndModelID(a.Providers, currentRecentModel.ProviderID, currentRecentModel.ModelID)
|
|
|
+ if provider != nil && model != nil {
|
|
|
+ a.Provider, a.Model = provider, model
|
|
|
+ a.State.AgentModel[a.Agent().Name] = AgentModel{ProviderID: provider.ID, ModelID: model.ID}
|
|
|
+ return a, tea.Sequence(a.SaveState(), toast.NewSuccessToast(fmt.Sprintf("Switched to %s (%s)", model.Name, provider.Name)))
|
|
|
+ }
|
|
|
+ recentModels = append(recentModels[:nextIndex%len(recentModels)], recentModels[nextIndex%len(recentModels)+1:]...)
|
|
|
+ if len(recentModels) < 2 {
|
|
|
+ a.State.RecentlyUsedModels = recentModels
|
|
|
+ return a, tea.Sequence(a.SaveState(), toast.NewInfoToast("Not enough valid recent models to cycle"))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ a.State.RecentlyUsedModels = recentModels
|
|
|
+ return a, toast.NewErrorToast("Recent model not found")
|
|
|
+}
|
|
|
+
|
|
|
// findModelByFullID finds a model by its full ID in the format "provider/model"
|
|
|
func findModelByFullID(
|
|
|
providers []opencode.Provider,
|