@@ -1,6 +1,8 @@
11package models
22
33import (
4+ "slices"
5+
46 "github.com/charmbracelet/bubbles/v2/help"
57 "github.com/charmbracelet/bubbles/v2/key"
68 tea "github.com/charmbracelet/bubbletea/v2"
@@ -228,7 +230,75 @@ func (m *modelDialogCmp) SetModelType(modelType int) tea.Cmd {
228230 currentModel = cfg.Models.Small
229231 }
230232
233+ // Create a map to track which providers we've already added
234+ addedProviders := make(map[provider.InferenceProvider]bool)
235+
236+ // First, add any configured providers that are not in the known providers list
237+ // These should appear at the top of the list
238+ knownProviders := provider.KnownProviders()
239+ for providerID, providerConfig := range cfg.Providers {
240+ if providerConfig.Disabled {
241+ continue
242+ }
243+
244+ // Check if this provider is not in the known providers list
245+ if !slices.Contains(knownProviders, providerID) {
246+ // Convert config provider to provider.Provider format
247+ configProvider := provider.Provider{
248+ Name: string(providerID), // Use provider ID as name for unknown providers
249+ ID: providerID,
250+ Models: make([]provider.Model, len(providerConfig.Models)),
251+ }
252+
253+ // Convert models
254+ for i, model := range providerConfig.Models {
255+ configProvider.Models[i] = provider.Model{
256+ ID: model.ID,
257+ Name: model.Name,
258+ CostPer1MIn: model.CostPer1MIn,
259+ CostPer1MOut: model.CostPer1MOut,
260+ CostPer1MInCached: model.CostPer1MInCached,
261+ CostPer1MOutCached: model.CostPer1MOutCached,
262+ ContextWindow: model.ContextWindow,
263+ DefaultMaxTokens: model.DefaultMaxTokens,
264+ CanReason: model.CanReason,
265+ HasReasoningEffort: model.HasReasoningEffort,
266+ DefaultReasoningEffort: model.ReasoningEffort,
267+ SupportsImages: model.SupportsImages,
268+ }
269+ }
270+
271+ // Add this unknown provider to the list
272+ name := configProvider.Name
273+ if name == "" {
274+ name = string(configProvider.ID)
275+ }
276+ modelItems = append(modelItems, commands.NewItemSection(name))
277+ for _, model := range configProvider.Models {
278+ modelItems = append(modelItems, completions.NewCompletionItem(model.Name, ModelOption{
279+ Provider: configProvider,
280+ Model: model,
281+ }))
282+ if model.ID == currentModel.ModelID && configProvider.ID == currentModel.Provider {
283+ selectIndex = len(modelItems) - 1 // Set the selected index to the current model
284+ }
285+ }
286+ addedProviders[providerID] = true
287+ }
288+ }
289+
290+ // Then add the known providers from the predefined list
231291 for _, provider := range providers {
292+ // Skip if we already added this provider as an unknown provider
293+ if addedProviders[provider.ID] {
294+ continue
295+ }
296+
297+ // Check if this provider is configured and not disabled
298+ if providerConfig, exists := cfg.Providers[provider.ID]; exists && providerConfig.Disabled {
299+ continue
300+ }
301+
232302 name := provider.Name
233303 if name == "" {
234304 name = string(provider.ID)