@@ -400,28 +400,40 @@ def auth_callback(username: str, password: str):
400400 logger .warning (f"Login failed for user: { username } " )
401401 return None
402402
403- def _get_or_create_agent (model_name : str , tools_enabled : bool = True ):
403+ def _get_or_create_agent (model_name : str , tools_enabled : bool = True , external_agents_settings : dict = None ):
404404 """Get or create a reusable agent for the session."""
405405 Agent = _get_praisonai_agent ()
406406 if Agent is None :
407407 return None
408+ if external_agents_settings is None :
409+ external_agents_settings = {}
408410
409411 # Get cached agent from session
410412 cached_agent = cl .user_session .get ("_cached_agent" )
411413 cached_model = cl .user_session .get ("_cached_agent_model" )
414+ cached_external = cl .user_session .get ("_cached_agent_external" , {})
412415
413- # Reuse if model matches
414- if cached_agent is not None and cached_model == model_name :
416+ # Reuse if model and external settings match
417+ if (cached_agent is not None and cached_model == model_name
418+ and cached_external == external_agents_settings ):
415419 return cached_agent
416420
417421 # Create new agent with interactive tools
418422 _profile_start ("create_agent" )
419423 tools = []
420424 if tools_enabled :
421- tools = _get_interactive_tools ()
425+ tools = list ( _get_interactive_tools ()) # Copy to avoid mutating cache
422426 # Add Tavily if available
423427 if os .getenv ("TAVILY_API_KEY" ):
424428 tools .append (tavily_web_search )
429+ # Add external agent tools
430+ from praisonai .ui ._external_agents import external_agent_tools
431+ tools .extend (
432+ external_agent_tools (
433+ external_agents_settings ,
434+ workspace = os .environ .get ("PRAISONAI_WORKSPACE" , "." ),
435+ )
436+ )
425437
426438 agent = Agent (
427439 name = "PraisonAI Assistant" ,
@@ -443,10 +455,27 @@ def _get_or_create_agent(model_name: str, tools_enabled: bool = True):
443455 # Cache the agent
444456 cl .user_session .set ("_cached_agent" , agent )
445457 cl .user_session .set ("_cached_agent_model" , model_name )
458+ cl .user_session .set ("_cached_agent_external" , external_agents_settings )
446459 _profile_end ("create_agent" )
447460
448461 return agent
449462
463+
464+ def _parse_setting_bool (value ):
465+ if isinstance (value , bool ):
466+ return value
467+ if value is None :
468+ return False
469+ return str (value ).strip ().lower () in {"true" , "1" , "yes" , "on" }
470+
471+
472+ def _get_external_agent_settings_from_session () -> dict :
473+ from praisonai .ui ._external_agents import EXTERNAL_AGENTS
474+ return {
475+ toggle_id : _parse_setting_bool (cl .user_session .get (toggle_id , False ))
476+ for toggle_id in EXTERNAL_AGENTS
477+ }
478+
450479@cl .on_chat_start
451480async def start ():
452481 _profile_start ("on_chat_start" )
@@ -459,8 +488,12 @@ async def start():
459488 cl .user_session .set ("tools_enabled" , tools_enabled )
460489 logger .debug (f"Model name: { model_name } , Tools enabled: { tools_enabled } " )
461490
491+ # Load external agent settings
492+ from praisonai .ui ._external_agents import load_external_agent_settings_from_chainlit , chainlit_switches
493+ external_settings = load_external_agent_settings_from_chainlit (load_setting )
494+
462495 # Pre-create agent for faster first response
463- _get_or_create_agent (model_name , tools_enabled )
496+ _get_or_create_agent (model_name , tools_enabled , external_settings )
464497
465498 settings = cl .ChatSettings (
466499 [
@@ -474,7 +507,8 @@ async def start():
474507 id = "tools_enabled" ,
475508 label = "Enable Tools (ACP, LSP, Web Search)" ,
476509 initial = tools_enabled
477- )
510+ ),
511+ * chainlit_switches (external_settings )
478512 ]
479513 )
480514 cl .user_session .set ("settings" , settings )
@@ -508,14 +542,24 @@ async def setup_agent(settings):
508542 cl .user_session .set ("model_name" , model_name )
509543 cl .user_session .set ("tools_enabled" , tools_enabled )
510544
511- # Invalidate cached agent if model changed
545+ # Save external agent settings
546+ from praisonai .ui ._external_agents import save_external_agent_settings_to_chainlit , EXTERNAL_AGENTS
547+ external_agent_settings = {k : settings .get (k , False ) for k in EXTERNAL_AGENTS }
548+ save_external_agent_settings_to_chainlit (external_agent_settings )
549+
550+ # Invalidate cached agent if model changed or external agents changed
512551 cached_model = cl .user_session .get ("_cached_agent_model" )
513- if cached_model != model_name :
552+ cached_external = cl .user_session .get ("_cached_agent_external" , {})
553+ if cached_model != model_name or cached_external != external_agent_settings :
514554 cl .user_session .set ("_cached_agent" , None )
515555 cl .user_session .set ("_cached_agent_model" , None )
556+ cl .user_session .set ("_cached_agent_external" , None )
516557
517558 save_setting ("model_name" , model_name )
518559 save_setting ("tools_enabled" , str (tools_enabled ).lower ())
560+ # Save external agent settings to persistent storage
561+ for toggle_id , enabled in external_agent_settings .items ():
562+ save_setting (toggle_id , str (enabled ).lower ())
519563
520564 thread_id = cl .user_session .get ("thread_id" )
521565 if thread_id :
@@ -572,7 +616,8 @@ async def main(message: cl.Message):
572616 msg = cl .Message (content = "" )
573617
574618 # Try PraisonAI Agent first (faster, with tool reuse)
575- agent = _get_or_create_agent (model_name , tools_enabled ) if tools_enabled else None
619+ external_settings = _get_external_agent_settings_from_session ()
620+ agent = _get_or_create_agent (model_name , tools_enabled , external_settings ) if tools_enabled else None
576621
577622 if agent is not None :
578623 _profile_start ("agent_response" )
@@ -781,6 +826,11 @@ async def on_chat_resume(thread: ThreadDict):
781826 tools_enabled = (load_setting ("tools_enabled" ) or "true" ).lower () == "true"
782827
783828 logger .debug (f"Model name: { model_name } " )
829+
830+ # Load external agent settings for resume
831+ from praisonai .ui ._external_agents import load_external_agent_settings_from_chainlit , chainlit_switches
832+ external_settings = load_external_agent_settings_from_chainlit ()
833+
784834 settings = cl .ChatSettings (
785835 [
786836 TextInput (
@@ -793,7 +843,8 @@ async def on_chat_resume(thread: ThreadDict):
793843 id = "tools_enabled" ,
794844 label = "Enable Tools (ACP, LSP, Web Search)" ,
795845 initial = tools_enabled
796- )
846+ ),
847+ * chainlit_switches (external_settings ),
797848 ]
798849 )
799850 await settings .send ()
@@ -828,7 +879,8 @@ async def on_chat_resume(thread: ThreadDict):
828879 cl .user_session .set ("message_history" , message_history )
829880
830881 # Pre-create agent for faster first response
831- _get_or_create_agent (model_name , tools_enabled )
882+ external_settings = _get_external_agent_settings_from_session ()
883+ _get_or_create_agent (model_name , tools_enabled , external_settings )
832884
833885 image_data = metadata .get ("image" )
834886 if image_data :
0 commit comments