Просмотр исходного кода

fix: tweak the logic in config to ensure that env vs file configurations merge properly (#115)

Aiden Cline 9 месяцев назад
Родитель
Сommit
69ade34c2c
2 измененных файлов с 20 добавлено и 14 удалено
  1. 13 9
      internal/config/config.go
  2. 7 5
      internal/llm/models/models.go

+ 13 - 9
internal/config/config.go

@@ -130,7 +130,6 @@ func Load(workingDir string, debug bool) (*Config, error) {
 
 	configureViper()
 	setDefaults(debug)
-	setProviderDefaults()
 
 	// Read global config
 	if err := readConfig(viper.ReadInConfig()); err != nil {
@@ -140,6 +139,8 @@ func Load(workingDir string, debug bool) (*Config, error) {
 	// Load and merge local config
 	mergeLocalConfig(workingDir)
 
+	setProviderDefaults()
+
 	// Apply configuration to the struct
 	if err := viper.Unmarshal(cfg); err != nil {
 		return cfg, fmt.Errorf("failed to unmarshal config: %w", err)
@@ -223,7 +224,8 @@ func setDefaults(debug bool) {
 	}
 }
 
-// setProviderDefaults configures LLM provider defaults based on environment variables.
+// setProviderDefaults configures LLM provider defaults based on provider provided by
+// environment variables and configuration file.
 func setProviderDefaults() {
 	// Set all API keys we can find in the environment
 	if apiKey := os.Getenv("ANTHROPIC_API_KEY"); apiKey != "" {
@@ -247,9 +249,12 @@ func setProviderDefaults() {
 	// 2. OpenAI
 	// 3. Google Gemini
 	// 4. Groq
-	// 5. AWS Bedrock
+	// 5. OpenRouter
+	// 6. AWS Bedrock
+	// 7. Azure
+
 	// Anthropic configuration
-	if apiKey := os.Getenv("ANTHROPIC_API_KEY"); apiKey != "" {
+	if viper.Get("providers.anthropic.apiKey") != "" {
 		viper.SetDefault("agents.coder.model", models.Claude37Sonnet)
 		viper.SetDefault("agents.task.model", models.Claude37Sonnet)
 		viper.SetDefault("agents.title.model", models.Claude37Sonnet)
@@ -257,7 +262,7 @@ func setProviderDefaults() {
 	}
 
 	// OpenAI configuration
-	if apiKey := os.Getenv("OPENAI_API_KEY"); apiKey != "" {
+	if viper.Get("providers.openai.apiKey") != "" {
 		viper.SetDefault("agents.coder.model", models.GPT41)
 		viper.SetDefault("agents.task.model", models.GPT41Mini)
 		viper.SetDefault("agents.title.model", models.GPT41Mini)
@@ -265,7 +270,7 @@ func setProviderDefaults() {
 	}
 
 	// Google Gemini configuration
-	if apiKey := os.Getenv("GEMINI_API_KEY"); apiKey != "" {
+	if viper.Get("providers.google.gemini.apiKey") != "" {
 		viper.SetDefault("agents.coder.model", models.Gemini25)
 		viper.SetDefault("agents.task.model", models.Gemini25Flash)
 		viper.SetDefault("agents.title.model", models.Gemini25Flash)
@@ -273,7 +278,7 @@ func setProviderDefaults() {
 	}
 
 	// Groq configuration
-	if apiKey := os.Getenv("GROQ_API_KEY"); apiKey != "" {
+	if viper.Get("providers.groq.apiKey") != "" {
 		viper.SetDefault("agents.coder.model", models.QWENQwq)
 		viper.SetDefault("agents.task.model", models.QWENQwq)
 		viper.SetDefault("agents.title.model", models.QWENQwq)
@@ -281,8 +286,7 @@ func setProviderDefaults() {
 	}
 
 	// OpenRouter configuration
-	if apiKey := os.Getenv("OPENROUTER_API_KEY"); apiKey != "" {
-		viper.SetDefault("providers.openrouter.apiKey", apiKey)
+	if viper.Get("providers.openrouter.apiKey") != "" {
 		viper.SetDefault("agents.coder.model", models.OpenRouterClaude37Sonnet)
 		viper.SetDefault("agents.task.model", models.OpenRouterClaude37Sonnet)
 		viper.SetDefault("agents.title.model", models.OpenRouterClaude35Haiku)

+ 7 - 5
internal/llm/models/models.go

@@ -35,11 +35,13 @@ const (
 
 // Providers in order of popularity
 var ProviderPopularity = map[ModelProvider]int{
-	ProviderAnthropic: 1,
-	ProviderOpenAI:    2,
-	ProviderGemini:    3,
-	ProviderGROQ:      4,
-	ProviderBedrock:   5,
+	ProviderAnthropic:  1,
+	ProviderOpenAI:     2,
+	ProviderGemini:     3,
+	ProviderGROQ:       4,
+	ProviderOpenRouter: 5,
+	ProviderBedrock:    6,
+	ProviderAzure:      7,
 }
 
 var SupportedModels = map[ModelID]Model{