| 1 | from typing import Any |
| 2 | |
| 3 | from helpers.extension import Extension, extensible |
| 4 | from helpers import skills as skills_helper, tool_policy |
| 5 | from agent import Agent, LoopData |
| 6 | |
| 7 | |
| 8 | class SkillsPrompt(Extension): |
| 9 | |
| 10 | async def execute( |
| 11 | self, |
| 12 | system_prompt: list[str] = [], |
| 13 | loop_data: LoopData = LoopData(), |
| 14 | **kwargs: Any, |
| 15 | ): |
| 16 | if not self.agent: |
| 17 | return |
| 18 | prompt = await build_prompt(self.agent) |
| 19 | if prompt: |
| 20 | system_prompt.append(prompt) |
| 21 | |
| 22 | |
| 23 | @extensible |
| 24 | async def build_prompt(agent: Agent) -> str: |
| 25 | if not tool_policy.resolve_tool(agent, "skills_tool").allowed: |
| 26 | return "" |
| 27 | |
| 28 | available = skills_helper.list_skills(agent=agent) |
| 29 | result: list[str] = [] |
| 30 | for skill in available: |
| 31 | name = skill.name.strip().replace("\n", " ")[:100] |
| 32 | descr = skill.description.replace("\n", " ").strip() |
| 33 | if len(descr) > 100: |
| 34 | descr = descr[:100].rstrip() + "..." |
| 35 | result.append(f"- {name}: {descr}" if descr else f"- {name}") |
| 36 | |
| 37 | if not result: |
| 38 | return "" |
| 39 | |
| 40 | return agent.read_prompt("agent.system.skills.md", skills="\n".join(result)) |