51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
"""
|
|
Skill system — each skill is a piece of domain knowledge or a capability
|
|
that can be attached to an agent to shape its behavior and system prompt.
|
|
|
|
A Skill is a lightweight object with:
|
|
- name : short identifier (e.g. "media_info")
|
|
- description : human-readable summary
|
|
- prompt_fragment : extra text injected into the agent's system prompt
|
|
"""
|
|
|
|
from dataclasses import dataclass, field
|
|
from typing import Dict
|
|
|
|
|
|
@dataclass
|
|
class Skill:
|
|
name: str
|
|
description: str
|
|
prompt_fragment: str = ""
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Global skill registry — populated at startup / import time
|
|
# ---------------------------------------------------------------------------
|
|
_skill_registry: Dict[str, Skill] = {}
|
|
|
|
|
|
def register(skill: Skill) -> None:
|
|
"""Register a skill so agents can look it up by name."""
|
|
_skill_registry[skill.name] = skill
|
|
|
|
|
|
def get(name: str) -> Skill | None:
|
|
"""Return a registered skill by name, or None."""
|
|
return _skill_registry.get(name)
|
|
|
|
|
|
def list_all() -> Dict[str, Skill]:
|
|
"""Return a shallow copy of the registry."""
|
|
return dict(_skill_registry)
|
|
|
|
|
|
def get_combined_prompt(skill_names: list[str], base_prompt: str = "") -> str:
|
|
"""Build a system prompt from a base prompt + requested skill fragments."""
|
|
parts = [base_prompt] if base_prompt else []
|
|
for name in skill_names:
|
|
s = get(name)
|
|
if s and s.prompt_fragment:
|
|
parts.append(s.prompt_fragment)
|
|
return "\n\n".join(parts)
|