Skip to content

Commit eba1bc1

Browse files
committed
v1.0.5: Add --api-key support
1 parent 3769d63 commit eba1bc1

1 file changed

Lines changed: 37 additions & 11 deletions

File tree

provider.go

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)