@@ -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" )
@@ -154,6 +155,12 @@ class Agent(LlmAgent):
154155
155156 enable_ghostchar : bool = False
156157
158+ enable_dataset_gen : bool = False
159+
160+ enable_dynamic_load_skills : bool = False
161+ enable_skills_checklist : bool = False
162+ _skills_with_checklist : Dict [str , Any ] = {}
163+
157164 def model_post_init (self , __context : Any ) -> None :
158165 super ().model_post_init (None ) # for sub_agents init
159166
@@ -225,6 +232,8 @@ def model_post_init(self, __context: Any) -> None:
225232
226233 self ._prepare_tracers ()
227234
235+ self ._validate_tool_dependencies ()
236+
228237 if self .knowledgebase :
229238 from veadk .tools .builtin_tools .load_knowledgebase import (
230239 LoadKnowledgebaseTool ,
@@ -298,6 +307,23 @@ def model_post_init(self, __context: Any) -> None:
298307
299308 if self .skills :
300309 self .load_skills ()
310+ if self .enable_skills_checklist :
311+ logger .info ("Skills checklist enabled" )
312+ from veadk .skills .utils import create_init_skill_check_list_callback
313+
314+ init_callback = create_init_skill_check_list_callback (
315+ self ._skills_with_checklist
316+ )
317+ if self .before_tool_callback :
318+ if isinstance (self .before_tool_callback , list ):
319+ self .before_tool_callback .append (init_callback )
320+ else :
321+ self .before_tool_callback = [
322+ self .before_tool_callback ,
323+ init_callback ,
324+ ]
325+ else :
326+ self .before_tool_callback = init_callback
301327
302328 if self .example_store :
303329 from google .adk .tools .example_tool import ExampleTool
@@ -312,6 +338,22 @@ def model_post_init(self, __context: Any) -> None:
312338
313339 self .instruction += "Please add a character `< at the beginning of you each text-based response."
314340
341+ if self .enable_dataset_gen :
342+ from veadk .toolkits .dataset_auto_gen_callback import (
343+ dataset_auto_gen_callback ,
344+ )
345+
346+ if self .after_agent_callback :
347+ if isinstance (self .after_agent_callback , list ):
348+ self .after_agent_callback .append (dataset_auto_gen_callback )
349+ else :
350+ self .after_agent_callback = [
351+ self .after_agent_callback ,
352+ dataset_auto_gen_callback ,
353+ ]
354+ else :
355+ self .after_agent_callback = dataset_auto_gen_callback
356+
315357 logger .info (f"VeADK version: { VERSION } " )
316358
317359 logger .info (f"{ self .__class__ .__name__ } `{ self .name } ` init done." )
@@ -329,13 +371,14 @@ def load_skills(self):
329371 from pathlib import Path
330372
331373 from veadk .skills .skill import Skill
374+ from veadk .skills .check_skills_callback import check_skills
332375 from veadk .skills .utils import (
333376 load_skills_from_cloud ,
334377 load_skills_from_directory ,
335378 )
336379 from veadk .tools .skills_tools .skills_toolset import SkillsToolset
337380
338- skills : Dict [str , Skill ] = {}
381+ self . skills_dict : Dict [str , Skill ] = {}
339382
340383 # Determine skills_mode if not set
341384 if not self .skills_mode :
@@ -361,9 +404,19 @@ def load_skills(self):
361404 else :
362405 logger .debug ("Successfully get AK/SK from environment variables." )
363406
407+ provider = (os .getenv ("CLOUD_PROVIDER" ) or "" ).lower ()
408+ if provider == "byteplus" :
409+ sld = "byteplusapi"
410+ default_region = "ap-southeast-1"
411+ else :
412+ sld = "volcengineapi"
413+ default_region = "cn-beijing"
414+
364415 service = os .getenv ("AGENTKIT_TOOL_SERVICE_CODE" , "agentkit" )
365- region = os .getenv ("AGENTKIT_TOOL_REGION" , "cn-beijing" )
366- host = service + "." + region + ".volcengineapi.com"
416+ region = os .getenv ("AGENTKIT_TOOL_REGION" , default_region )
417+ host = os .getenv (
418+ "AGENTKIT_SKILL_HOST" , service + "." + region + f".{ sld } .com"
419+ )
367420
368421 res = ve_request (
369422 request_body = {"ToolId" : tool_id },
@@ -400,17 +453,28 @@ def load_skills(self):
400453 path = Path (item )
401454 if path .exists () and path .is_dir ():
402455 for skill in load_skills_from_directory (path ):
403- skills [skill .name ] = skill
456+ self . skills_dict [skill .name ] = skill
404457 else :
405458 for skill in load_skills_from_cloud (item ):
406- skills [skill .name ] = skill
407- if skills :
459+ self . skills_dict [skill .name ] = skill
460+ if self . skills_dict :
408461 self .instruction += "\n You have the following skills:\n "
409462
410- for skill in skills .values ():
463+ self ._skills_with_checklist = self .skills_dict
464+
465+ has_checklist = False
466+ for skill in self .skills_dict .values ():
411467 self .instruction += (
412468 f"- name: { skill .name } \n - description: { skill .description } \n \n "
413469 )
470+ if skill .checklist :
471+ has_checklist = True
472+
473+ if has_checklist :
474+ self .instruction += (
475+ "Some skills have a checklist that you must complete step by step. "
476+ "Use the `update_check_list` tool to mark each item as completed.\n \n "
477+ )
414478
415479 if self .skills_mode not in [
416480 "skills_sandbox" ,
@@ -431,10 +495,52 @@ def load_skills(self):
431495 "You can use the skills by calling the `skills_tool` tool.\n \n "
432496 )
433497
434- self .tools .append (SkillsToolset (skills , self .skills_mode ))
435498 else :
436499 logger .warning ("No skills loaded." )
437500
501+ self .tools .append (SkillsToolset (self .skills_dict , self .skills_mode ))
502+
503+ if self .enable_dynamic_load_skills :
504+ if self .before_agent_callback :
505+ if isinstance (self .before_agent_callback , list ):
506+ self .before_agent_callback .append (check_skills )
507+ else :
508+ self .before_agent_callback = [
509+ self .before_agent_callback ,
510+ check_skills ,
511+ ]
512+ else :
513+ self .before_agent_callback = check_skills
514+
515+ def _validate_tool_dependencies (self ):
516+ tool_names = set ()
517+ for tool in self .tools :
518+ if hasattr (tool , "__name__" ):
519+ tool_names .add (tool .__name__ )
520+ elif hasattr (tool , "name" ):
521+ tool_names .add (tool .name )
522+
523+ has_video_generate = "video_generate" in tool_names
524+ has_video_task_query = "video_task_query" in tool_names
525+
526+ if has_video_generate and not has_video_task_query :
527+ from veadk .tools .builtin_tools .video_generate import video_task_query
528+
529+ logger .warning (
530+ "video_generate tool is mounted but video_task_query is not. "
531+ "video_task_query is required for querying video generation status. "
532+ "Automatically adding video_task_query to tools."
533+ )
534+ self .tools .append (video_task_query )
535+ elif has_video_task_query and not has_video_generate :
536+ from veadk .tools .builtin_tools .video_generate import video_generate
537+
538+ logger .warning (
539+ "video_task_query tool is mounted but video_generate is not. "
540+ "Automatically adding video_generate to tools."
541+ )
542+ self .tools .append (video_generate )
543+
438544 def _prepare_tracers (self ):
439545 enable_apmplus_tracer = os .getenv ("ENABLE_APMPLUS" , "false" ).lower () == "true"
440546 enable_cozeloop_tracer = os .getenv ("ENABLE_COZELOOP" , "false" ).lower () == "true"
0 commit comments