Skip to content

Commit 969e3db

Browse files
committed
feat: automatically detect changes of skills
1 parent 22f4599 commit 969e3db

2 files changed

Lines changed: 375 additions & 6 deletions

File tree

veadk/agent.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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 += "\nYou 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

Comments
 (0)