@@ -50,12 +50,42 @@ type Resolved struct {
5050 SearchAPIKey string
5151}
5252
53+ // providerEnvVars maps provider names to their standard environment variable names.
54+ var providerEnvVars = map [string ]struct { key , base string }{
55+ "anthropic" : {"ANTHROPIC_API_KEY" , "" },
56+ "openai" : {"OPENAI_API_KEY" , "OPENAI_BASE_URL" },
57+ "gemini" : {"GEMINI_API_KEY" , "" },
58+ }
59+
5360// ProviderCredentials returns API key and base URL for the given provider.
61+ // It checks the providers map first, then falls back to standard environment variables.
5462func (r Resolved ) ProviderCredentials (prov string ) (apiKey , baseURL string ) {
55- if pc , ok := r .Providers [prov ]; ok {
63+ if pc , ok := r .Providers [prov ]; ok && pc . APIKey != "" {
5664 return pc .APIKey , pc .BaseURL
5765 }
58- return "" , ""
66+ return EnvCredentials (prov )
67+ }
68+
69+ // ProviderEnvKey returns the standard environment variable name for a provider's API key.
70+ func ProviderEnvKey (prov string ) string {
71+ if ev , ok := providerEnvVars [prov ]; ok {
72+ return ev .key
73+ }
74+ return strings .ToUpper (prov ) + "_API_KEY"
75+ }
76+
77+ // EnvCredentials returns API key and base URL from standard environment variables
78+ // for the given provider (e.g. ANTHROPIC_API_KEY, OPENAI_API_KEY).
79+ func EnvCredentials (prov string ) (apiKey , baseURL string ) {
80+ envVars , ok := providerEnvVars [prov ]
81+ if ! ok {
82+ return "" , ""
83+ }
84+ apiKey = os .Getenv (envVars .key )
85+ if envVars .base != "" {
86+ baseURL = os .Getenv (envVars .base )
87+ }
88+ return apiKey , baseURL
5989}
6090
6191// ParseModelID splits "provider/model" into (provider, model).
0 commit comments