“用到什么知识, 临时加载什么知识” – 通过 tool_result 注入, 不塞 system prompt。
第一层: 系统提示中放技能名称 (低成本)。第二层: tool_result 中按需放完整内容。
1 2 3 4 5 6 7 8 9
| SYSTEM = f"""You are a coding agent at {WORKDIR}. Skills available: {SKILL_LOADER.get_descriptions()}""" TOOL_HANDLERS = { "load_skill": lambda **kw: SKILL_LOADER.get_content(kw["name"]), } TOOLS = [ {"name": "load_skill", "description": "Load specialized knowledge by name.","input_schema": {"type": "object", "properties": {"name": {"type": "string", "description": "Skill name to load"}}, "required": ["name"]}},]
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class SkillLoader: def __init__(self, skills_dir: Path): self.skills = {} for f in sorted(skills_dir.rglob("SKILL.md")): text = f.read_text() meta, body = self._parse_frontmatter(text) name = meta.get("name", f.parent.name) self.skills[name] = {"meta": meta, "body": body} def get_descriptions(self) -> str: lines = [] for name, skill in self.skills.items(): desc = skill["meta"].get("description", "") lines.append(f" - {name}: {desc}") return "\n".join(lines) def get_content(self, name: str) -> str: skill = self.skills.get(name) if not skill: return f"Error: Unknown skill '{name}'." return f"<skill name=\"{name}\">\n{skill['body']}\n</skill>"
|
代码
- 每个技能是一个目录, 包含
SKILL.md 文件和 YAML frontmatter。
- SkillLoader 递归扫描
SKILL.md 文件, 用目录名作为技能标识。
- 第一层: 系统提示中放技能名称 (低成本)。第二层: tool_result 中按需放完整内容。