@@ -20,9 +20,45 @@ def __init__(self):
2020 self .azure_openai_client = None
2121 self .anthropic_client = None
2222 self .deepseek_api_key = None
23- self .deepseek_base_url = "https://api.deepseek.com/v1"
24- self .ollama_base_url = "http://localhost:11434"
25- self .ollama_timeout = 120
23+ self .deepseek_base_url = None
24+ self .ollama_base_url = None
25+ self .ollama_timeout = None
26+
27+ def _get_setting (self , args : Namespace , arg_name : str , env_var : str = None ,
28+ config_provider : str = None , config_key : str = None , default : any = None ) -> any :
29+ """Generic helper to get a setting from CLI args, env var, config, or default.
30+
31+ Args:
32+ args: Command line arguments
33+ arg_name: Attribute name in args (e.g., 'ollama_base_url')
34+ env_var: Environment variable name (optional)
35+ config_provider: Provider name for config lookup (optional)
36+ config_key: Config key name (optional)
37+ default: Default value
38+
39+ Returns:
40+ Setting value from first available source
41+ """
42+ # Priority 1: CLI argument
43+ if hasattr (args , arg_name ) and getattr (args , arg_name ):
44+ return getattr (args , arg_name )
45+
46+ # Priority 2: Environment variable
47+ if env_var :
48+ env_value = os .getenv (env_var )
49+ if env_value :
50+ return env_value
51+
52+ # Priority 3: Config file
53+ if config_provider and config_key :
54+ from ..utils .config_loader import ConfigLoader
55+ folder_path = args .folder if hasattr (args , 'folder' ) else None
56+ config_value = ConfigLoader .get_provider_setting (config_provider , config_key , None , folder_path )
57+ if config_value is not None :
58+ return config_value
59+
60+ # Priority 4: Default
61+ return default
2662
2763 def initialize_clients (self , args : Namespace ) -> Dict [str , str ]:
2864 """Initialize API clients for all providers with available keys.
@@ -32,17 +68,29 @@ def initialize_clients(self, args: Namespace) -> Dict[str, str]:
3268 Returns:
3369 Dict[str, str]: Dictionary of API keys for each provider
3470 """
35- openai_key = args .openai_key or args .api_key or os .getenv ("OPENAI_API_KEY" , "" )
71+ # OpenAI
72+ openai_key = self ._get_setting (args , 'openai_key' , 'OPENAI_API_KEY' , 'openai' , 'api_key' , '' )
73+ if not openai_key and hasattr (args , 'api_key' ):
74+ openai_key = args .api_key
3675 if openai_key :
3776 self .openai_client = OpenAI (api_key = openai_key )
3877
39- azure_openai_key = args .azure_openai_key or os .getenv ("AZURE_OPENAI_API_KEY" , "" )
78+ # Azure OpenAI
79+ azure_openai_key = self ._get_setting (
80+ args , 'azure_openai_key' , 'AZURE_OPENAI_API_KEY' , 'azure_openai' , 'api_key' , ''
81+ )
4082 if azure_openai_key :
41- endpoint = args .azure_openai_endpoint or os .getenv ("AZURE_OPENAI_ENDPOINT" )
83+ endpoint = self ._get_setting (
84+ args , 'azure_openai_endpoint' , 'AZURE_OPENAI_ENDPOINT' ,
85+ 'azure_openai' , 'endpoint' , None
86+ )
4287 if not endpoint :
4388 raise ValueError ("Missing Azure OpenAI endpoint." )
4489
45- api_version = args .azure_openai_api_version or os .getenv ("AZURE_OPENAI_API_VERSION" )
90+ api_version = self ._get_setting (
91+ args , 'azure_openai_api_version' , 'AZURE_OPENAI_API_VERSION' ,
92+ 'azure_openai' , 'api_version' , None
93+ )
4694 if not api_version :
4795 raise ValueError ("Missing Azure OpenAI API version." )
4896
@@ -52,19 +100,34 @@ def initialize_clients(self, args: Namespace) -> Dict[str, str]:
52100 api_version = api_version
53101 )
54102
55- antropic_key = args .anthropic_key or os .getenv ("ANTHROPIC_API_KEY" , "" )
103+ # Anthropic
104+ antropic_key = self ._get_setting (
105+ args , 'anthropic_key' , 'ANTHROPIC_API_KEY' , 'anthropic' , 'api_key' , ''
106+ )
56107 if antropic_key :
57108 self .anthropic_client = Anthropic (api_key = antropic_key )
58109
59- deepseek_key = args .deepseek_key or os .getenv ("DEEPSEEK_API_KEY" , "" )
110+ # DeepSeek
111+ deepseek_key = self ._get_setting (
112+ args , 'deepseek_key' , 'DEEPSEEK_API_KEY' , 'deepseek' , 'api_key' , ''
113+ )
60114 if deepseek_key :
61115 self .deepseek_api_key = deepseek_key
62116
63- # Ollama configuration (no API key needed)
64- if hasattr (args , 'ollama_base_url' ) and args .ollama_base_url :
65- self .ollama_base_url = args .ollama_base_url
66- if hasattr (args , 'ollama_timeout' ) and args .ollama_timeout :
67- self .ollama_timeout = args .ollama_timeout
117+ self .deepseek_base_url = self ._get_setting (
118+ args , 'deepseek_base_url' , 'DEEPSEEK_BASE_URL' ,
119+ 'deepseek' , 'base_url' , 'https://api.deepseek.com/v1'
120+ )
121+
122+ # Ollama
123+ self .ollama_base_url = self ._get_setting (
124+ args , 'ollama_base_url' , 'OLLAMA_BASE_URL' ,
125+ 'ollama' , 'base_url' , 'http://localhost:11434'
126+ )
127+ self .ollama_timeout = self ._get_setting (
128+ args , 'ollama_timeout' , None ,
129+ 'ollama' , 'timeout' , 120
130+ )
68131
69132 return {
70133 ModelProvider .OPENAI .value : openai_key ,
0 commit comments