构建 Agent¶
需要在共享 runtime 上拥有独立身份、工具配置和执行策略时,构建 Raven Agent。 接入已有外部产品则见Agent 集成。
先生成骨架再定制¶
先配置宿主模型服务商,预览文件后再创建:
raven agents new example-agent --dry-run
raven agents new example-agent
第二条命令在 $RAVEN_HOME/agents/example-agent 写入新目录,校验 manifest、
编译生成的 Python、扫描 discovery,并默认启动 ACP initialize smoke check。
检查会启动 runtime、可能写运行状态,但不是完整模型任务。
名称采用小写 kebab-case,不能与已发布或已发现 Agent 身份冲突。--display 修改
显示名,--here 写入 ./agents/,--no-smoke 跳过启动检查,--register 显式
固定配置条目。虽然运行时支持其他后端,scaffold 当前只支持 --kind acp。
不要对已有目录重复执行创建命令来升级。应阅读生成 README 并修改定义。缺少 provider 凭据导致的拒绝,与协议或插件加载失败不同。
理解生成文件¶
| 文件 | 职责 |
|---|---|
subagent.json |
委派身份、描述、所有权和启动命令 |
run.py |
渲染配置并启动已安装的 Raven ACP server |
config.json |
基于共享 runtime 的 Agent 设置 |
.env.example |
记录 secret slot 和存储覆盖项 |
install.py |
自定义位置或固定 Agent 名册条目的可选注册 |
plugins/<id>/raven-plugin.toml |
声明 Agent 的运行时贡献 |
| 插件 Python package | 实现工具和 hook 工厂 |
README.md |
针对生成 Agent 的说明 |
Discovery 替换 manifest 中的 {PYTHON} 和 {SUBAGENT_DIR}。保留可移植占位符,
不要写死当前机器的源码路径。填写描述和 ownership 的 TODO;委派模型据此决定何时选择 Agent。
不要仅为修改 UI 标签就变更 name 或 memory identity,已有会话和调用记录引用这些身份。
配置与状态¶
Launcher 在 state root 下渲染私有配置。公开定义不能含秘密,应使用文档中的环境或
.env slot,并把私有文件排除在 git 外。没有 Agent 自有 key 时可继承宿主 provider
配置;自有 key 模式还要配置 provider/model 端点,key 本身不是完整模型绑定。
区分三个位置:
- Working directory: 调用方提供的任务文件。
- State root: 渲染配置和产品工作状态。
- ACP home: 子引擎身份、会话和 skill pool。
默认存储在定义目录之外。子 Agent ACP home 不能被宿主传入的工作目录包含; 使用生成的存储覆盖项前应检查边界。
插件专用值位于 plugins.config["<plugin-id>"]。Launcher 会注入插件根目录,不要
猜一个相对路径再添加第二套 discovery。可选 ACP modes 是未来轮次的配置档位,
不能替代工具权限配置。
实现案例:Raven-Code¶
Raven-Code 不复制核心 loop 就实现专用行为。Launcher 渲染配置并发现
agents/raven-code/plugins/code-flow/。插件通过构建插件
中的契约提供工具、loop hook 和 session observer。
| 职责 | 插件 code_flow/ 包内位置 |
边界 |
|---|---|---|
| 项目指令 | flow.py iteration hook |
绑定工作目录文件和剩余 prompt 预算 |
| 读取版本跟踪 | tools/read_state.py、tools/filesystem.py |
Session ledger,不是全局读取授权 |
| 持久清单 | tools/todo.py 与 flow/session 生命周期 |
保存记录是事实来源;绑定实际 session |
| 并发提醒 | sessions.py 与 iteration hook |
共享目录证据,不是排他所有权 |
| Git 报告 | manifest.py 输出 raven.harnessManifest 元数据 |
未知/共享事实不能变成“可集成” |
| Session 清理 | Manifest 的 session observer | 只移除受影响 session 的状态 |
Manifest 有意替换 read_file、edit_file 等名称。
应公布实际替换工具的参数 schema,不能沿用旧工具面的说明。
两个配置开关独立:plugins.config["code-flow"].enabled 控制提醒/报告;
同一个 slice 中的 tools.enabled 控制替换工具。插件模型中两者默认 false,
Raven-Code launcher 为自身渲染启用。即使提醒关闭,只要工具启用,
checklist/read-ledger 仍需要正确绑定。
Flow 追加项目指令,不替换宿主身份,也不重写用户原始文本。
Launcher 的 CODE_PROJECT_FILES 选择项目文件,off 表示不读取。
可信指令加载不能变成越过绑定项目的任意访问。
新 coding Agent 从 scaffold 和小型已审核工具集开始,复用契约而不是复制产品。 应测试:
- 未读即编辑,以及其他写入者修改后的编辑;
- 两个 session 共享目录;
- 后续轮次或上下文裁剪后恢复 checklist;
- Session 删除与 runtime replacement;
- Git 信息不可用和非 Git 目录;
- 使用沙箱时,宿主 exec 替换应拒绝接管。
相关测试包括 tests/test_agents_code_flow_read_state.py、
test_agents_code_flow_todo.py、test_agents_code_flow_project_files.py、
test_agents_code_flow_manifest.py 和 test_agents_code_tools_plugin.py。
使用说明介绍操作者能从这些机制推断什么。
增加工具与行为¶
从生成的 greeting tool 和 hook 工厂开始。工具实现 name、description、
parameters、async execute;在 manifest 声明,并先独立测试,再暴露给模型。
生成 hook 展示 loop timing 契约。当前随 Raven 发布的 Agent 也使用较窄的 AgentParticipant
契约表达逐轮判断,应按行为选接口,不要复制整个 Agent Loop。详见构建插件。
贡献应限制在该 Agent 的配置内。宿主导入插件不能意外在无关会话启用专用工具。 不要为使 discovery 生效而向共享 runtime 添加产品专有导入;Raven 将定义目录视为 数据,通过插件接口加载贡献。
需要时打包 engine¶
独立发行 harness 时,可以预览 wheel 形式:
raven agents new example-engine-agent --engine-wheel --dry-run
去掉 --dry-run 会创建 Agent 定义与 engine project。Engine manifest 放在 Python
package 内,并加入 raven.plugins entry-point group。Agent 声明 engine package
和发行包;子解释器能导入之前,readiness 保持 false。
在目标项目/环境中使用 uv 管理依赖。Raven 应解析到已验证的源码树或发行包;
公共索引上不带限定的 raven 名称可能是另一个项目。不要照搬旧设计记录中的裸安装
命令。仓库环境设置见开发。
验证、发现与运行¶
- 使用实际启动解释器校验生成 manifest 并导入各工厂。
- 检查 ACP initialize 和预期工具 roster,不只看进程退出。
- 运行有界只读任务,再验证所需修改、输出或会话续接。
- 测试缺少凭据/engine、权限拒绝、取消和插件激活失败。
- 修改定义后重启常驻宿主,验证能选择并调用该 Agent。
Home tree 内定义无需 pin 即可发现。树外定义应有意使用 scaffold 注册选项或生成的 installer。移动后固定的名册条目可能仍指向旧目录,应更新固定配置,不能假定自动发现会修复它。
仓库依据位于 agents/BUILDING.md、raven/cli/agents_commands.py 及 schemas/
中的 schema 导出。维护者可运行:
uv run pytest tests/test_cli_agents_commands.py tests/test_subagent_registry.py -q
这些测试覆盖 scaffold 与 registry,不替代新 Agent 的真实验收任务。