Skip to content

skills

Class info

Classes

Name Children Inherits
AgentContext
llmling_agent.agent.context
Runtime context for agent execution.
    ResourceProvider
    llmling_agent.resource_providers.base
    Base class for resource providers.
    SkillsRegistry
    llmling_agent.skills.registry
    Registry for Claude Code Skills with auto-discovery.
      SkillsResourceProvider
      llmling_agent.resource_providers.skills
      Resource provider for Claude Code Skills.
        Tool
        llmling_agent.tools.base
        Information about a registered tool.

          🛈 DocStrings

          Skills resource provider implementation.

          SkillsResourceProvider

          Bases: ResourceProvider

          Resource provider for Claude Code Skills.

          Source code in src/llmling_agent/resource_providers/skills.py
           75
           76
           77
           78
           79
           80
           81
           82
           83
           84
           85
           86
           87
           88
           89
           90
           91
           92
           93
           94
           95
           96
           97
           98
           99
          100
          101
          102
          103
          104
          105
          106
          107
          108
          109
          110
          111
          112
          113
          114
          115
          116
          117
          118
          119
          120
          121
          122
          123
          124
          125
          126
          127
          128
          129
          130
          131
          132
          class SkillsResourceProvider(ResourceProvider):
              """Resource provider for Claude Code Skills."""
          
              def __init__(
                  self,
                  registry: SkillsRegistry | None = None,
                  skills_dirs: Sequence[JoinablePathLike] | None = None,
                  name: str = "skills",
                  owner: str | None = None,
              ) -> None:
                  """Initialize the skills provider.
          
                  Args:
                      registry: Existing skills registry to use
                      skills_dirs: Directories to search for skills (if no registry provided)
                      name: Name for this provider
                      owner: Owner of this provider
                  """
                  super().__init__(name, owner)
                  self.registry = registry or SkillsRegistry(skills_dirs)
          
              async def __aenter__(self) -> Self:
                  """Initialize skills provider and discover skills."""
                  await self.registry.discover_skills()
                  return self
          
              async def __aexit__(self, *args: object) -> None:
                  """Cleanup skills provider resources."""
                  # Skills are file-based, no persistent connections to clean up
          
              async def get_skills(self) -> list[Skill]:
                  """Get all available skills (already discovered in __aenter__)."""
                  return [self.registry.get(name) for name in self.registry.list_items()]
          
              async def get_skill_instructions(self, skill_name: str) -> str:
                  """Get full instructions for a specific skill."""
                  return self.registry.get_skill_instructions(skill_name)
          
              async def get_tools(self) -> list[Tool]:
                  """Get skills loading tool with dynamic description."""
                  skills = await self.get_skills()
          
                  if not skills:
                      return []
          
                  skills_list = [f"- {s.name}: {s.description}" for s in skills]
                  return [
                      Tool.from_callable(
                          load_skill,
                          source="skills",
                          category="read",
                          description_override=BASE_DESC + "\n" + "\n".join(skills_list),
                      )
                  ]
          
              async def refresh(self) -> None:
                  """Force rediscovery of skills."""
                  await self.registry.discover_skills()
          

          __aenter__ async

          __aenter__() -> Self
          

          Initialize skills provider and discover skills.

          Source code in src/llmling_agent/resource_providers/skills.py
          96
          97
          98
          99
          async def __aenter__(self) -> Self:
              """Initialize skills provider and discover skills."""
              await self.registry.discover_skills()
              return self
          

          __aexit__ async

          __aexit__(*args: object) -> None
          

          Cleanup skills provider resources.

          Source code in src/llmling_agent/resource_providers/skills.py
          101
          102
          async def __aexit__(self, *args: object) -> None:
              """Cleanup skills provider resources."""
          

          __init__

          __init__(
              registry: SkillsRegistry | None = None,
              skills_dirs: Sequence[JoinablePathLike] | None = None,
              name: str = "skills",
              owner: str | None = None,
          ) -> None
          

          Initialize the skills provider.

          Parameters:

          Name Type Description Default
          registry SkillsRegistry | None

          Existing skills registry to use

          None
          skills_dirs Sequence[JoinablePathLike] | None

          Directories to search for skills (if no registry provided)

          None
          name str

          Name for this provider

          'skills'
          owner str | None

          Owner of this provider

          None
          Source code in src/llmling_agent/resource_providers/skills.py
          78
          79
          80
          81
          82
          83
          84
          85
          86
          87
          88
          89
          90
          91
          92
          93
          94
          def __init__(
              self,
              registry: SkillsRegistry | None = None,
              skills_dirs: Sequence[JoinablePathLike] | None = None,
              name: str = "skills",
              owner: str | None = None,
          ) -> None:
              """Initialize the skills provider.
          
              Args:
                  registry: Existing skills registry to use
                  skills_dirs: Directories to search for skills (if no registry provided)
                  name: Name for this provider
                  owner: Owner of this provider
              """
              super().__init__(name, owner)
              self.registry = registry or SkillsRegistry(skills_dirs)
          

          get_skill_instructions async

          get_skill_instructions(skill_name: str) -> str
          

          Get full instructions for a specific skill.

          Source code in src/llmling_agent/resource_providers/skills.py
          109
          110
          111
          async def get_skill_instructions(self, skill_name: str) -> str:
              """Get full instructions for a specific skill."""
              return self.registry.get_skill_instructions(skill_name)
          

          get_skills async

          get_skills() -> list[Skill]
          

          Get all available skills (already discovered in aenter).

          Source code in src/llmling_agent/resource_providers/skills.py
          105
          106
          107
          async def get_skills(self) -> list[Skill]:
              """Get all available skills (already discovered in __aenter__)."""
              return [self.registry.get(name) for name in self.registry.list_items()]
          

          get_tools async

          get_tools() -> list[Tool]
          

          Get skills loading tool with dynamic description.

          Source code in src/llmling_agent/resource_providers/skills.py
          113
          114
          115
          116
          117
          118
          119
          120
          121
          122
          123
          124
          125
          126
          127
          128
          async def get_tools(self) -> list[Tool]:
              """Get skills loading tool with dynamic description."""
              skills = await self.get_skills()
          
              if not skills:
                  return []
          
              skills_list = [f"- {s.name}: {s.description}" for s in skills]
              return [
                  Tool.from_callable(
                      load_skill,
                      source="skills",
                      category="read",
                      description_override=BASE_DESC + "\n" + "\n".join(skills_list),
                  )
              ]
          

          refresh async

          refresh() -> None
          

          Force rediscovery of skills.

          Source code in src/llmling_agent/resource_providers/skills.py
          130
          131
          132
          async def refresh(self) -> None:
              """Force rediscovery of skills."""
              await self.registry.discover_skills()
          

          load_skill async

          load_skill(ctx: AgentContext, skill_name: str) -> str
          

          Load a Claude Code Skill and return its instructions.

          Parameters:

          Name Type Description Default
          skill_name str

          Name of the skill to load

          required

          Returns:

          Type Description
          str

          The full skill instructions for execution

          Source code in src/llmling_agent/resource_providers/skills.py
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          53
          54
          55
          56
          57
          58
          59
          60
          61
          62
          63
          64
          65
          66
          67
          68
          69
          70
          71
          72
          async def load_skill(ctx: AgentContext, skill_name: str) -> str:  # noqa: D417
              """Load a Claude Code Skill and return its instructions.
          
              Args:
                  skill_name: Name of the skill to load
          
              Returns:
                  The full skill instructions for execution
              """
              # Get skills provider from agent's resource providers
              skills_provider = None
              for provider in ctx.agent.tools.providers:
                  if isinstance(provider, SkillsResourceProvider):
                      skills_provider = provider
                      break
          
              if not skills_provider:
                  return "No skills provider found in agent configuration"
          
              try:
                  instructions = await skills_provider.get_skill_instructions(skill_name)
                  skill = next(
                      (s for s in await skills_provider.get_skills() if s.name == skill_name),
                      None,
                  )
          
                  if not skill:
                      return f"Skill {skill_name!r} not found"
          
                  # Format the skill content for Claude to follow
                  return f"""
          # {skill.name}
          
          {instructions}
          
          ---
          Skill directory: {skill.skill_path}
          """  # noqa: TRY300
              except Exception as e:  # noqa: BLE001
                  return f"Failed to load skill {skill_name!r}: {e}"