mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-05-07 02:02:35 +00:00
fix: preserve metadata-only agent skills
Co-authored-by: Greyson LaLonde <greyson.r.lalonde@gmail.com>
This commit is contained in:
@@ -394,15 +394,17 @@ class Agent(BaseAgent):
|
|||||||
self,
|
self,
|
||||||
resolved_crew_skills: list[SkillModel] | None = None,
|
resolved_crew_skills: list[SkillModel] | None = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Resolve skill paths and activate skills to INSTRUCTIONS level.
|
"""Resolve skill paths while preserving explicit disclosure levels.
|
||||||
|
|
||||||
Path entries trigger discovery and activation. Pre-loaded Skill objects
|
Path entries trigger discovery and activation because directory-based
|
||||||
below INSTRUCTIONS level are activated. Crew-level skills are merged in
|
skills opt into eager loading. Pre-loaded Skill objects keep their
|
||||||
with event emission so observability is consistent regardless of origin.
|
current disclosure level so callers can attach METADATA-only skills and
|
||||||
|
progressively activate them later. Crew-level skills are merged in with
|
||||||
|
event emission so observability is consistent regardless of origin.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
resolved_crew_skills: Pre-resolved crew skills (already discovered
|
resolved_crew_skills: Pre-resolved crew skills. When provided,
|
||||||
and activated). When provided, avoids redundant discovery per agent.
|
avoids redundant discovery per agent.
|
||||||
"""
|
"""
|
||||||
from crewai.crew import Crew
|
from crewai.crew import Crew
|
||||||
|
|
||||||
@@ -443,8 +445,7 @@ class Agent(BaseAgent):
|
|||||||
elif isinstance(item, SkillModel):
|
elif isinstance(item, SkillModel):
|
||||||
if item.name not in seen:
|
if item.name not in seen:
|
||||||
seen.add(item.name)
|
seen.add(item.name)
|
||||||
activated = activate_skill(item, source=self)
|
if item.disclosure_level >= INSTRUCTIONS:
|
||||||
if activated is item and item.disclosure_level >= INSTRUCTIONS:
|
|
||||||
crewai_event_bus.emit(
|
crewai_event_bus.emit(
|
||||||
self,
|
self,
|
||||||
event=SkillActivatedEvent(
|
event=SkillActivatedEvent(
|
||||||
@@ -454,7 +455,7 @@ class Agent(BaseAgent):
|
|||||||
disclosure_level=item.disclosure_level,
|
disclosure_level=item.disclosure_level,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
resolved.append(activated)
|
resolved.append(item)
|
||||||
|
|
||||||
self.skills = resolved if resolved else None
|
self.skills = resolved if resolved else None
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ from pathlib import Path
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from crewai import Agent
|
||||||
|
from crewai.agent.utils import append_skill_context
|
||||||
from crewai.skills.loader import activate_skill, discover_skills, format_skill_context
|
from crewai.skills.loader import activate_skill, discover_skills, format_skill_context
|
||||||
from crewai.skills.models import INSTRUCTIONS, METADATA
|
from crewai.skills.models import INSTRUCTIONS, METADATA
|
||||||
|
|
||||||
@@ -76,3 +78,23 @@ class TestSkillDiscoveryAndActivation:
|
|||||||
all_skills.extend(discover_skills(search_path))
|
all_skills.extend(discover_skills(search_path))
|
||||||
names = {s.name for s in all_skills}
|
names = {s.name for s in all_skills}
|
||||||
assert names == {"skill-a", "skill-b"}
|
assert names == {"skill-a", "skill-b"}
|
||||||
|
|
||||||
|
def test_agent_preserves_metadata_for_discovered_skills(self, tmp_path: Path) -> None:
|
||||||
|
_create_skill_dir(tmp_path, "travel", body="Use this skill for travel planning.")
|
||||||
|
discovered = discover_skills(tmp_path)
|
||||||
|
|
||||||
|
agent = Agent(
|
||||||
|
role="Travel Advisor",
|
||||||
|
goal="Provide personalized travel suggestions.",
|
||||||
|
backstory="An experienced travel consultant.",
|
||||||
|
skills=discovered,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert agent.skills is not None
|
||||||
|
assert agent.skills[0].disclosure_level == METADATA
|
||||||
|
assert agent.skills[0].instructions is None
|
||||||
|
|
||||||
|
prompt = append_skill_context(agent, "Plan a 10-day Japan itinerary.")
|
||||||
|
assert "## Skill: travel" in prompt
|
||||||
|
assert "Skill travel" in prompt
|
||||||
|
assert "Use this skill for travel planning." not in prompt
|
||||||
|
|||||||
Reference in New Issue
Block a user