@@ -14,7 +14,13 @@ type Provider interface {
1414
1515// NewProvider returns the provider selected by ITERATE_PROVIDER.
1616// Supported values: ollama, openai, anthropic, groq, gemini (default: gemini)
17- func NewProvider (providerName string ) (Provider , error ) {
17+ // If apiKey is provided, it takes priority over environment variables.
18+ func NewProvider (providerName string , apiKey ... string ) (Provider , error ) {
19+ providedKey := ""
20+ if len (apiKey ) > 0 {
21+ providedKey = apiKey [0 ]
22+ }
23+
1824 if providerName == "" {
1925 providerName = os .Getenv ("ITERATE_PROVIDER" )
2026 }
@@ -24,16 +30,23 @@ func NewProvider(providerName string) (Provider, error) {
2430
2531 switch providerName {
2632 case "ollama" :
33+ key := providedKey
34+ if key == "" {
35+ key = os .Getenv ("OPENAI_API_KEY" )
36+ }
2737 return NewOpenAICompat (OpenAICompatConfig {
2838 BaseURL : getEnvOr ("OLLAMA_BASE_URL" , "http://localhost:11434/v1" ),
2939 Model : getEnvOr ("ITERATE_MODEL" , "llama3" ),
30- APIKey : "ollama" ,
40+ APIKey : key ,
3141 }), nil
3242
3343 case "openai" :
34- key := os .Getenv ("OPENAI_API_KEY" )
44+ key := providedKey
45+ if key == "" {
46+ key = os .Getenv ("OPENAI_API_KEY" )
47+ }
3548 if key == "" {
36- return nil , fmt .Errorf ("OPENAI_API_KEY is required for openai provider" )
49+ return nil , fmt .Errorf ("OPENAI_API_KEY is required for openai provider (or use --api-key) " )
3750 }
3851 return NewOpenAICompat (OpenAICompatConfig {
3952 BaseURL : "https://api.openai.com/v1" ,
@@ -42,19 +55,25 @@ func NewProvider(providerName string) (Provider, error) {
4255 }), nil
4356
4457 case "anthropic" :
45- key := os .Getenv ("ANTHROPIC_API_KEY" )
58+ key := providedKey
59+ if key == "" {
60+ key = os .Getenv ("ANTHROPIC_API_KEY" )
61+ }
4662 if key == "" {
47- return nil , fmt .Errorf ("ANTHROPIC_API_KEY is required for anthropic provider" )
63+ return nil , fmt .Errorf ("ANTHROPIC_API_KEY is required for anthropic provider (or use --api-key) " )
4864 }
4965 return NewAnthropic (AnthropicConfig {
5066 Model : getEnvOr ("ITERATE_MODEL" , "claude-sonnet-4-6" ),
5167 APIKey : key ,
5268 }), nil
5369
5470 case "groq" :
55- key := os .Getenv ("GROQ_API_KEY" )
71+ key := providedKey
72+ if key == "" {
73+ key = os .Getenv ("GROQ_API_KEY" )
74+ }
5675 if key == "" {
57- return nil , fmt .Errorf ("GROQ_API_KEY is required for groq provider" )
76+ return nil , fmt .Errorf ("GROQ_API_KEY is required for groq provider (or use --api-key) " )
5877 }
5978 return NewOpenAICompat (OpenAICompatConfig {
6079 BaseURL : "https://api.groq.com/openai/v1" ,
@@ -63,9 +82,12 @@ func NewProvider(providerName string) (Provider, error) {
6382 }), nil
6483
6584 case "gemini" :
66- key := os .Getenv ("GEMINI_API_KEY" )
85+ key := providedKey
86+ if key == "" {
87+ key = os .Getenv ("GEMINI_API_KEY" )
88+ }
6789 if key == "" {
68- return nil , fmt .Errorf ("GEMINI_API_KEY is required for gemini provider" )
90+ return nil , fmt .Errorf ("GEMINI_API_KEY is required for gemini provider (or use --api-key) " )
6991 }
7092 return NewGemini (GeminiConfig {
7193 Model : getEnvOr ("ITERATE_MODEL" , "gemini-2.0-flash" ),
@@ -77,10 +99,14 @@ func NewProvider(providerName string) (Provider, error) {
7799 if baseURL == "" {
78100 return nil , fmt .Errorf ("unknown provider %q — set ITERATE_BASE_URL for custom endpoints" , providerName )
79101 }
102+ key := providedKey
103+ if key == "" {
104+ key = os .Getenv ("ITERATE_API_KEY" )
105+ }
80106 return NewOpenAICompat (OpenAICompatConfig {
81107 BaseURL : baseURL ,
82108 Model : getEnvOr ("ITERATE_MODEL" , "default" ),
83- APIKey : getEnvOr ( "ITERATE_API_KEY" , "none" ) ,
109+ APIKey : key ,
84110 }), nil
85111 }
86112}
0 commit comments