diff --git a/internal/config/config.go b/internal/config/config.go index bbf619e96ae8f6a9d96c8bcb29cbb92c717326b4..6ae26bfb0892623fd37c92f6226d7ac8b2db418f 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -60,6 +60,8 @@ type SelectedModel struct { type ProviderConfig struct { // The provider's id. ID string `json:"id,omitempty"` + // The provider's name, used for display purposes. + Name string `json:"name,omitempty"` // The provider's API endpoint. BaseURL string `json:"base_url,omitempty"` // The provider type, e.g. "openai", "anthropic", etc. if empty it defaults to openai. diff --git a/internal/config/load.go b/internal/config/load.go index 96006c4415237cf802c10b08ab401e42bdd73fc6..8722a05260f94994064a69493e448154c9b57847 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -162,6 +162,7 @@ func (cfg *Config) configureProviders(env env.Env, resolver VariableResolver, kn } prepared := ProviderConfig{ ID: string(p.ID), + Name: p.Name, BaseURL: p.APIEndpoint, APIKey: p.APIKey, Type: p.Type, @@ -218,6 +219,9 @@ func (cfg *Config) configureProviders(env env.Env, resolver VariableResolver, kn // Make sure the provider ID is set providerConfig.ID = id + if providerConfig.Name == "" { + providerConfig.Name = id // Use ID as name if not set + } // default to OpenAI if not set if providerConfig.Type == "" { providerConfig.Type = provider.TypeOpenAI @@ -229,9 +233,7 @@ func (cfg *Config) configureProviders(env env.Env, resolver VariableResolver, kn continue } if providerConfig.APIKey == "" { - slog.Warn("Skipping custom provider due to missing API key", "provider", id) - delete(cfg.Providers, id) - continue + slog.Warn("Provider is missing API key, this might be OK for local providers", "provider", id) } if providerConfig.BaseURL == "" { slog.Warn("Skipping custom provider due to missing API endpoint", "provider", id) @@ -251,9 +253,7 @@ func (cfg *Config) configureProviders(env env.Env, resolver VariableResolver, kn apiKey, err := resolver.ResolveValue(providerConfig.APIKey) if apiKey == "" || err != nil { - slog.Warn("Skipping custom provider due to missing API key", "provider", id, "error", err) - delete(cfg.Providers, id) - continue + slog.Warn("Provider is missing API key, this might be OK for local providers", "provider", id) } baseURL, err := resolver.ResolveValue(providerConfig.BaseURL) if baseURL == "" || err != nil { diff --git a/internal/config/load_test.go b/internal/config/load_test.go index ba1a5a7f1c52d5cd123750f93032e56939ce2cd5..0688317398108fad298d58ab9ca1db5fc7002df0 100644 --- a/internal/config/load_test.go +++ b/internal/config/load_test.go @@ -483,7 +483,7 @@ func TestConfig_configureProvidersWithDisabledProvider(t *testing.T) { } func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) { - t.Run("custom provider with missing API key is removed", func(t *testing.T) { + t.Run("custom provider with missing API key is allowed, but not known providers", func(t *testing.T) { cfg := &Config{ Providers: map[string]ProviderConfig{ "custom": { @@ -492,6 +492,9 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) { ID: "test-model", }}, }, + "openai": { + APIKey: "$MISSING", + }, }, } cfg.setDefaults("/tmp") @@ -501,9 +504,9 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) { err := cfg.configureProviders(env, resolver, []provider.Provider{}) assert.NoError(t, err) - assert.Len(t, cfg.Providers, 0) + assert.Len(t, cfg.Providers, 1) _, exists := cfg.Providers["custom"] - assert.False(t, exists) + assert.True(t, exists) }) t.Run("custom provider with missing BaseURL is removed", func(t *testing.T) { diff --git a/internal/tui/components/dialogs/models/list.go b/internal/tui/components/dialogs/models/list.go index 4a4eeb300dfb97c1db2145fcec24a81cda2fd124..0c3ddeec39c30b85c2ad4d820517ab446de7a52b 100644 --- a/internal/tui/components/dialogs/models/list.go +++ b/internal/tui/components/dialogs/models/list.go @@ -104,7 +104,7 @@ func (m *ModelListComponent) SetModelType(modelType int) tea.Cmd { if !slices.Contains(knownProviders, provider.InferenceProvider(providerID)) { // Convert config provider to provider.Provider format configProvider := provider.Provider{ - Name: string(providerID), // Use provider ID as name for unknown providers + Name: providerConfig.Name, ID: provider.InferenceProvider(providerID), Models: make([]provider.Model, len(providerConfig.Models)), }