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)),
}