说实话,第一次看到 nanobot 的 Skills 系统,我的第一印象就是:这也太简洁直观了吧?传统的 AI 框架里,要让 Agent 学会一个新工具——比如查询天气、操作 GitHub——通常需要编写复杂的 Python 类、定义 JSON Schema,还要处理各种回调逻辑。但在 nanobot 中,你只需要创建一个 Markdown 文件。
没错,就是 Markdown。今天我们就来深入解析一下这个系统的设计理念,看看它如何实现“Markdown 即代码”的巧妙机制。
1. 技能的本质:提示词工程
在 nanobot 中,一个技能就是一个文件夹,核心文件是 SKILL.md。内置技能存放在 project_path/nanobot/skills 下,用户自定义的技能则位于 workspace/.nanobot/skills。以 weather 技能为例:路径是 nanobot/skills/weather/SKILL.md,里面的内容并非复杂的 Python 逻辑,而是直接告诉 AI:“想查天气?运行 curl wttr.in/城市名”。
这个设计思路非常巧妙:既然大模型已经能够理解文档、编写代码,那为什么不直接给它一份操作手册,让它自主执行呢?这正是 Skills 系统最核心的哲学——将技能定义为文本,让 AI 通过阅读来掌握能力。
2. 核心机制:渐进式加载
如果把所有技能的详细说明一股脑儿塞进 Prompt,上下文窗口很快就会耗尽。nanobot 采用了渐进式加载策略,分为两个阶段执行。
第一阶段:技能索引
Agent 启动时,SkillsLoader 会扫描所有技能,提取 SKILL.md 顶部的 YAML 元数据(由前后两个 --- 包裹的部分),其中两个字段最为关键:name(技能名称)和 description(技能描述,简要说明技能的功能)。随后,工作区技能和内置技能的元数据会被合并,生成一个技能索引(采用 XML 语法表示),并插入到系统提示词中。主 Agent 在思考时仅能看到这个索引——它知道有哪些技能可用,但看不到具体内容。
第二阶段:按需读取
当用户询问天气问题时,Agent 会从索引中发现 weather 技能,并调用 read_file 工具读取完整的 SKILL.md。读完它便学会了如何用 curl 查询天气,然后立即执行。下面是一段实际运行日志:

2026-03-17 15:06:44.196 | INFO | nanobot.agent.loop:_process_message:357 - Processing message from cli:user: 上海今天天气
2026-03-17 15:14:27.222 | INFO | nanobot.agent.loop:_run_agent_loop:230 - Tool call: list_dir({"path": "/Users/chaoxu.ren/PycharmProjects/nanobot/nanobot/skills/weather"})
2026-03-17 15:18:53.296 | INFO | nanobot.agent.loop:_run_agent_loop:230 - Tool call: read_file({"path": "/Users/chaoxu.ren/PycharmProjects/nanobot/nanobot/skills/weather/SKILL.md"})
2026-03-17 15:22:42.715 | INFO | nanobot.agent.loop:_run_agent_loop:230 - Tool call: exec({"command": "curl -s "wttr.in/Shanghai?format=3""})
2026-03-17 15:27:02.195 | INFO | nanobot.agent.loop:_run_agent_loop:230 - Tool call: exec({"command": "curl -s "https://api.open-meteo.com/v1/forecast?latitude=31.23&longitude=121.47¤t_weather=true""})
2026-03-17 15:36:59.862 | INFO | nanobot.agent.loop:_process_message:449 - Response to cli:user: 上海今天的天气目前气温约为 10.6°C,天气状况显示为小雨(WMO 代码 61)。风速约为 10.8 km/h。
看到了吧?Agent 先列出天气技能目录,然后读取 SKILL.md,再执行两个 curl 命令获取数据,最后整理回答。整个过程既清晰又高效。
3. 技能的“门槛”:依赖检查
有些技能需要特定的运行环境——比如 github 技能需要安装 gh 命令行工具。nanobot 在元数据中定义了相关依赖:
# SKILL.md 顶部
metadata: {"nanobot":{"requires":{"bins":["curl"]}}}
SkillsLoader 会在加载前自动检查系统路径中是否包含 curl。如果缺失,该技能会被标记为“不可用”,并明确告知 AI 缺少什么依赖。这种自愈式的设计极大降低了配置错误的概率。当然,某些 Agent 也可以自行执行命令去安装依赖,但框架至少保证了错误不会莫名其妙地发生。
4. skills 的这种设计真的很高级
- 极低的学习成本:任何会写 Markdown 和简单脚本的人,都能为 nanobot 开发新技能。
- 极致的灵活性:你随时可以在
~/.nanobot/workspace/skills下新建文件夹,放入一个SKILL.md,Agent 瞬间就获得了新能力,无需重启。 - 跨语言能力:由于技能本质上是通过指令教导 AI 运行命令,因此你可以教它执行 Python、Node.js、Go 甚至一段复杂的 Shell 脚本。大语言模型本身与语言无关,只要它会写命令,什么都能做。
5. 开发者视角:如何创造一个新技能?
如果你希望让 nanobot 掌握某项新本领,只需三步:
- 在
skills目录下创建一个文件夹。 - 编写一个
SKILL.md,在顶部写好name和description。 - 在正文部分用 Markdown 告诉 AI 如何操作——最好附带代码示例。
⚠️ 如果不确定怎么写,可以利用内置的 skill-creator 技能辅助生成新技能,形成“技能写技能”的闭环。
6. 获取和分享技能:Skills 社区与资源
如果想从零开始,社区里已经有不少现成的技能可供参考:
- ClawHub:主要的公开 Agent 技能注册中心,支持自然语言搜索,可以轻松为 Agent 查找并安装各种实用工具。
- SkillsMP:一个技能市场平台,提供丰富的技能供选择和使用。
- GitHub:GitHub 上有很多开源技能项目,可以根据需求自行选用。
总结
nanobot 的 Skills 系统再次体现了其“以文档为中心”的设计哲学。它充分信任大模型的理解能力,将复杂的逻辑抽象为简单的文档阅读与命令执行。开发者不需要成为框架专家,只要会写 Markdown 和脚本,就能扩展 Agent 的能力。这种极简但强大的思路,值得很多工具链学习借鉴。
