数据截至 (上游 commit 1eb2bb1ec895)
装载:从 DSL 到可运行的 Assistant
30 秒导读: Yao 里一个 "agent"(它内部叫 assistant)不是代码里 new 出来的对象,而是磁盘上一个目录:一份
package.yao描述它是谁、用哪个模型,几份prompts.yml给它系统提示,一个src/放它的 TypeScript 脚本。本章只讲一件事——这堆文件怎么被读进内存、变成一个可以跑的*Assistant对象。至于对象怎么真正处理一次请求(Stream),留给 02-pipeline。
这是整个货架最浅、最先该懂的一层:先知道"一个 agent 由哪些文件组成、怎么变成运行时对象",后面几章讲的执行、hook、工具循环才有落脚点。
1. 这是什么(零基础也能懂)
一句话: 装载 = 把"一个 agent 在磁盘上的定义"翻译成"内存里一个填好字段的 Go 结构体"。
Yao 用约定目录 + 声明式配置来定义 agent,而不是让你写 Go 代码。你想加一个新 agent,就在应用的 /assistants/ 下建个文件夹,丢一个 package.yao 进去。系统启动时扫这个目录,把每个文件夹读成一个 assistant。
用一个真实的最小 agent 感受一下——这是仓库自带的 "标题生成器",整个 agent 就这么点东西(yao/assistants/title/package.yao):
{
"name": "Title Generator",
"description": "Generate conversation titles",
"type": "worker",
"connector": "use::light",
"uses": { "search": "disabled" },
"options": {}
}
connector: "use::light"—— 不写死某个模型,而是说"用 light 角色对应的连接器"(轻量任务,如起标题)。- 没有
src/脚本、没有 MCP —— 它就是个纯 prompt agent。
心智模型: 把一个 assistant 目录当成一个"agent 的安装包"(名字就叫 package.yao 不是巧合)。装载 = 解压安装。装完你手上是一个 *Assistant 对象,揣着它的连接器、提示词、脚本、MCP 配置,随时能被叫起来干活。
本节到此不碰代码。记住三个词:目录 → package.yao → 内存对象。