Detailed changes
  
  
    
    @@ -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.
  
  
  
    
    @@ -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 {
  
  
  
    
    @@ -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) {
  
  
  
    
    @@ -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)),
 			}