@@ -228,15 +228,37 @@ def resolve_provider(
228228 """
229229 from repowise .core .providers import get_provider
230230
231+ cfg : dict [str , Any ] = {}
232+ if repo_path is not None :
233+ cfg = load_config (repo_path )
234+
231235 if provider_name is None :
232236 provider_name = os .environ .get ("REPOWISE_PROVIDER" )
233237
234- if provider_name is None and repo_path is not None :
235- cfg = load_config (repo_path )
236- if cfg .get ("provider" ):
237- provider_name = cfg ["provider" ]
238- if model is None and cfg .get ("model" ):
239- model = cfg ["model" ]
238+ if provider_name is None and cfg .get ("provider" ):
239+ provider_name = cfg ["provider" ]
240+ if model is None and cfg .get ("model" ):
241+ model = cfg ["model" ]
242+
243+ def _resolve_base_url (name : str ) -> str | None :
244+ """Return base_url from env or repo config for the provider."""
245+ env_vars = {
246+ "anthropic" : ["ANTHROPIC_BASE_URL" ],
247+ "openai" : ["OPENAI_BASE_URL" ],
248+ "gemini" : ["GEMINI_BASE_URL" ],
249+ "ollama" : ["OLLAMA_BASE_URL" ],
250+ "litellm" : ["LITELLM_BASE_URL" , "LITELLM_API_BASE" ],
251+ }
252+ for var in env_vars .get (name , []):
253+ val = os .environ .get (var )
254+ if val :
255+ return val
256+ section = cfg .get (name )
257+ if isinstance (section , dict ):
258+ base_url = section .get ("base_url" )
259+ if base_url :
260+ return base_url
261+ return None
240262
241263 if provider_name is not None :
242264 # Validate configuration before attempting to create provider
@@ -250,6 +272,9 @@ def resolve_provider(
250272 kwargs : dict [str , Any ] = {}
251273 if model :
252274 kwargs ["model" ] = model
275+ base_url = _resolve_base_url (provider_name )
276+ if base_url :
277+ kwargs ["base_url" ] = base_url
253278
254279 # Pass API key from environment if available
255280 if provider_name == "anthropic" and os .environ .get ("ANTHROPIC_API_KEY" ):
@@ -274,13 +299,19 @@ def resolve_provider(
274299 if model
275300 else {"api_key" : os .environ ["ANTHROPIC_API_KEY" ]}
276301 )
302+ base_url = _resolve_base_url ("anthropic" )
303+ if base_url :
304+ kwargs ["base_url" ] = base_url
277305 return get_provider ("anthropic" , ** kwargs )
278306 if os .environ .get ("OPENAI_API_KEY" ) and os .environ ["OPENAI_API_KEY" ].strip ():
279307 kwargs = (
280308 {"model" : model , "api_key" : os .environ ["OPENAI_API_KEY" ]}
281309 if model
282310 else {"api_key" : os .environ ["OPENAI_API_KEY" ]}
283311 )
312+ base_url = _resolve_base_url ("openai" )
313+ if base_url :
314+ kwargs ["base_url" ] = base_url
284315 return get_provider ("openai" , ** kwargs )
285316 if os .environ .get ("OPENROUTER_API_KEY" ) and os .environ ["OPENROUTER_API_KEY" ].strip ():
286317 kwargs = (
@@ -301,6 +332,9 @@ def resolve_provider(
301332 ):
302333 api_key = os .environ .get ("GEMINI_API_KEY" ) or os .environ .get ("GOOGLE_API_KEY" )
303334 kwargs = {"model" : model , "api_key" : api_key } if model else {"api_key" : api_key }
335+ base_url = _resolve_base_url ("gemini" )
336+ if base_url :
337+ kwargs ["base_url" ] = base_url
304338 return get_provider ("gemini" , ** kwargs )
305339
306340 raise click .ClickException (
0 commit comments