@@ -174,13 +174,18 @@ def __init__(self, agent_file, framework, config_list, log_level=None, agent_cal
174174 self .agent_yaml = agent_yaml
175175 self .tools = tools or [] # Store tool class names as a list
176176 self .cli_config = cli_config or {} # Store CLI configuration overrides
177- self . log_level = log_level or logging . getLogger (). getEffectiveLevel ()
178- if self . log_level == logging . NOTSET :
179- self .log_level = os . environ . get ( 'LOGLEVEL' , 'INFO' ). upper ( )
177+ # Use namespaced logger - no hot-path basicConfig calls
178+ from . _logging import get_logger
179+ self .logger = get_logger ( "agents_generator" )
180180
181- logging .basicConfig (level = self .log_level , format = '%(asctime)s - %(levelname)s - %(message)s' )
182- self .logger = logging .getLogger (__name__ )
183- self .logger .setLevel (self .log_level )
181+ # Set level if provided, but don't mutate root logger
182+ if log_level :
183+ if isinstance (log_level , str ):
184+ self .logger .setLevel (getattr (logging , log_level .upper (), logging .INFO ))
185+ else :
186+ self .logger .setLevel (log_level )
187+ elif os .environ .get ('LOGLEVEL' ):
188+ self .logger .setLevel (getattr (logging , os .environ .get ('LOGLEVEL' , 'INFO' ).upper (), logging .INFO ))
184189
185190 # Initialize tool registry (replaces globals() pattern)
186191 self .tool_registry = ToolRegistry ()
@@ -238,26 +243,29 @@ def _merge_cli_config(self, config, cli_config):
238243 config ['config' ]['lsp' ] = cli_config ['lsp' ]
239244 self .logger .debug (f"CLI override: lsp = { cli_config ['lsp' ]} " )
240245
241- # Handle agent-level overrides (trust, tool_timeout, planning_tools, autonomy, guardrail, approval)
242- agent_level_fields = ['trust' , ' tool_timeout' , 'planning_tools' , 'autonomy' , 'guardrail' , 'approval' , 'approve_all_tools' , 'approval_timeout ' ]
246+ # Handle agent-level overrides using unified approach
247+ agent_level_fields = ['tool_timeout' , 'planning_tools' , 'autonomy' ]
243248 agent_overrides = {k : v for k , v in cli_config .items () if k in agent_level_fields }
244249
245- # Map CLI field names to YAML field names
246- field_mappings = {
247- 'guardrail' : 'guardrails' , # CLI uses --guardrail, YAML uses guardrails
248- 'trust' : 'approval' # --trust maps to approval=True
249- }
250-
251- # Apply field mappings and special handling
252- for cli_field in field_mappings :
253- if cli_field in agent_overrides :
254- value = agent_overrides .pop (cli_field )
255- if cli_field == 'trust' and value :
256- # --trust flag maps to approval=True for auto-approval
257- agent_overrides ['approval' ] = True
258- elif cli_field == 'guardrail' :
259- # --guardrail "description" maps to guardrails config
260- agent_overrides ['guardrails' ] = value
250+ # Handle approval configuration using unified spec
251+ approval_fields = ['trust' , 'approval' , 'approve_all_tools' , 'approval_timeout' , 'approve_level' ]
252+ if any (field in cli_config for field in approval_fields ):
253+ from ._approval_spec import ApprovalSpec
254+
255+ # Create a mock args object for CLI parsing
256+ class MockArgs :
257+ def __init__ (self , cli_config ):
258+ for field in approval_fields :
259+ setattr (self , field , cli_config .get (field ))
260+ self .guardrail = cli_config .get ('guardrail' )
261+
262+ spec = ApprovalSpec .from_cli (MockArgs (cli_config ))
263+ if spec .enabled :
264+ agent_overrides ['approval' ] = spec .to_dict ()
265+
266+ # Handle guardrail separately
267+ if 'guardrail' in cli_config :
268+ agent_overrides ['guardrails' ] = cli_config ['guardrail' ]
261269
262270 if agent_overrides :
263271 # Apply to all agents in the config
@@ -761,9 +769,10 @@ async def run_autogen_v4_async():
761769 # Close the model client
762770 await model_client .close ()
763771
764- # Run the async function
772+ # Run the async function using safe bridge
773+ from ._async_bridge import run_sync
765774 try :
766- return asyncio . run (run_autogen_v4_async ())
775+ return run_sync (run_autogen_v4_async ())
767776 except Exception as e :
768777 self .logger .error (f"Error running AutoGen v0.4: { str (e )} " )
769778 return f"### AutoGen v0.4 Error ###\n { str (e )} "
@@ -1192,30 +1201,18 @@ def _run_praisonai(self, config, topic, tools_dict):
11921201 stream_enabled = cli_config .get ('stream' , False )
11931202 stream_metrics = cli_config .get ('stream_metrics' , False )
11941203
1195- # Reconstruct approval config from potentially scattered settings
1196- approval_val = details .get ('approval' )
1197- approve_all = details .get ('approve_all_tools' )
1198- approval_timeout = details .get ('approval_timeout' )
1199-
1204+ # Use unified approval specification
12001205 approval_config = None
1201- if approval_val is not None or approve_all is not None or approval_timeout is not None :
1202- if isinstance (approval_val , dict ):
1203- approval_dict = approval_val
1204- else :
1205- approval_dict = {'backend' : approval_val }
1206-
1207- if approve_all is not None :
1208- approval_dict ['approve_all_tools' ] = approve_all
1209- if approval_timeout is not None :
1210- approval_dict ['approval_timeout' ] = approval_timeout
1211-
1206+ if 'approval' in details :
1207+ from ._approval_spec import ApprovalSpec
12121208 try :
1213- from .cli .features .approval import resolve_approval_config
1214- # Map common YAML fields to resolve_approval_config parameters
1215- approval_config = resolve_approval_config (
1216- backend_name = approval_dict .get ('backend' ) or approval_dict .get ('backend_name' ),
1217- all_tools = approval_dict .get ('approve_all_tools' ) or approval_dict .get ('all_tools' , False ),
1218- timeout = approval_dict .get ('approval_timeout' ) or approval_dict .get ('timeout' )
1209+ spec = ApprovalSpec .from_yaml (details .get ('approval' ))
1210+ if spec .enabled :
1211+ from .cli .features .approval import resolve_approval_config
1212+ approval_config = resolve_approval_config (
1213+ backend_name = spec .backend ,
1214+ all_tools = spec .approve_all_tools ,
1215+ timeout = spec .timeout
12191216 )
12201217 except ImportError :
12211218 # Fallback: Create ApprovalConfig directly if resolve_approval_config isn't available
0 commit comments