@@ -86,6 +86,7 @@ class Agent(LlmAgent):
8686 skills (list[str]): List of skills that equip the agent with specific capabilities.
8787 example_store (Optional[BaseExampleProvider]): Example store for providing example Q/A.
8888 enable_shadowchar (bool): Whether to enable shadow character for the agent.
89+ enable_dynamic_load_skills (bool): Whether to enable dynamic loading of skills.
8990 """
9091
9192 model_config = ConfigDict (arbitrary_types_allowed = True , extra = "allow" )
@@ -156,6 +157,8 @@ class Agent(LlmAgent):
156157
157158 enable_dataset_gen : bool = False
158159
160+ enable_dynamic_load_skills : bool = False
161+
159162 def model_post_init (self , __context : Any ) -> None :
160163 super ().model_post_init (None ) # for sub_agents init
161164
@@ -347,13 +350,14 @@ def load_skills(self):
347350 from pathlib import Path
348351
349352 from veadk .skills .skill import Skill
353+ from veadk .skills .check_skills_callback import check_skills
350354 from veadk .skills .utils import (
351355 load_skills_from_cloud ,
352356 load_skills_from_directory ,
353357 )
354358 from veadk .tools .skills_tools .skills_toolset import SkillsToolset
355359
356- skills : Dict [str , Skill ] = {}
360+ self . skills_dict : Dict [str , Skill ] = {}
357361
358362 # Determine skills_mode if not set
359363 if not self .skills_mode :
@@ -428,14 +432,14 @@ def load_skills(self):
428432 path = Path (item )
429433 if path .exists () and path .is_dir ():
430434 for skill in load_skills_from_directory (path ):
431- skills [skill .name ] = skill
435+ self . skills_dict [skill .name ] = skill
432436 else :
433437 for skill in load_skills_from_cloud (item ):
434- skills [skill .name ] = skill
435- if skills :
438+ self . skills_dict [skill .name ] = skill
439+ if self . skills_dict :
436440 self .instruction += "\n You have the following skills:\n "
437441
438- for skill in skills .values ():
442+ for skill in self . skills_dict .values ():
439443 self .instruction += (
440444 f"- name: { skill .name } \n - description: { skill .description } \n \n "
441445 )
@@ -459,10 +463,22 @@ def load_skills(self):
459463 "You can use the skills by calling the `skills_tool` tool.\n \n "
460464 )
461465
462- self .tools .append (SkillsToolset (skills , self .skills_mode ))
466+ self .tools .append (SkillsToolset (self . skills_dict , self .skills_mode ))
463467 else :
464468 logger .warning ("No skills loaded." )
465469
470+ if self .enable_dynamic_load_skills and self .skills_dict :
471+ if self .before_agent_callback :
472+ if isinstance (self .before_agent_callback , list ):
473+ self .before_agent_callback .append (check_skills )
474+ else :
475+ self .before_agent_callback = [
476+ self .before_agent_callback ,
477+ check_skills ,
478+ ]
479+ else :
480+ self .before_agent_callback = check_skills
481+
466482 def _prepare_tracers (self ):
467483 enable_apmplus_tracer = os .getenv ("ENABLE_APMPLUS" , "false" ).lower () == "true"
468484 enable_cozeloop_tracer = os .getenv ("ENABLE_COZELOOP" , "false" ).lower () == "true"
0 commit comments