跳转至

DAG 编排

任务包含并行工作和明确依赖时,可以使用有向无环图(DAG)。Raven 校验图、把节点派给 可用 Agent,并记录结果。这是 Raven 宿主内的编排,不是持久化的分布式工作流服务。

选择委派形式

形式 适用场景 共享内容
直接执行轮次 无需委派的任务 当前对话
spawn 单个聚焦的子 Agent 任务 明确任务与可选 instance
run_subagent_dag 多个有依赖的任务 节点输出、引用、运行状态
Playbook 反复使用的已审阅工作流 已保存的过程、参数及随附配置

本地 roster 可包含 ACP、CLI、内置和兼容 OpenAI 的后端。A2A peer 独立于它: a2a_send 调用远程宿主,不是名为 a2a 的 DAG 节点后端。详见Agent 协议。

动态 Worker 与任务 Charter

普通 roster 列出已注册 Agent。显式启用生成模式后,可以为当前轮次准备 Worker Table:每个 worker 有 label、底层 Agent 和本任务的职责 brief。 两个 worker 可以使用同一 Agent 承担不同职责,不等于安装了两个新 Agent。

将此片段合并到宿主配置,并 reload/restart 宿主,让后续轮次使用它:

{
  "playbooks": {
    "agentHarness": "generate"
  }
}

默认是 "default",不生成表。生成会在委派前增加模型工作;失败时记录警告, 按未生成 Worker Table 的配置继续本轮。它不会自行决定任务图,也不移除主 Agent 工具; 模型仍自行决定委派什么。

层次 生命周期 含义
Roster Agent 注册配置 哪个后端能执行工作
Worker Table 行 一个宿主轮次 本任务的 label 和职责
Charter 一个被委派 worker 轮次 收窄的指令、工具、检查与可选期限
保存的 Playbook 可复用文件 已编写的图/指导与参数

生成模式中的 spawn、DAG 和 replan 参数应使用当前工具的 worker label。 保存的 Playbook 私有 DAG 则使用底层 registry 名称,避免同名临时 label 改写已保存流程。

Charter 通过 _meta["raven.playbook"] 发送给支持它的 Raven ACP worker, 内置 worker 则在本地绑定。它与 worker 已有权限取交集:可收窄工具集或期限, 不能恢复已禁用工具或延长配置的 deadline。任意外部 ACP Agent 不一定理解该元数据。

声明式检查与可选生成 judge 代码是不同机制。代码通过 AST allowlist 准入; 不合规代码会被丢弃并记录警告,评估器异常也不会自动变成拒绝。 Charter 不是操作系统沙箱,也不是 fail-closed 安全边界;应独立配置 权限和后端隔离。

实例追问和 steer 的操作见与子 Agent 协作。 实现位于 raven/agent/subagent/delegate.py、charter.py、charter_code.py 以及 raven/playbook/agent_generator.py。

第一张图

先配置所需 Agent 并选择对话工作目录。让 Raven 分别检查项目的两个独立方面,再综合 发现,不修改文件。模型可以提交以下工具参数;它不是 Shell 命令或独立配置文件:

{
  "task_summary": "Review project readiness",
  "background": false,
  "nodes": [
    {
      "id": "api_audit",
      "subagent": "Raven-Code",
      "node_summary": "Inspect API contracts",
      "prompt_template": "Read the public API and report compatibility risks with file references. Do not edit files."
    },
    {
      "id": "test_audit",
      "subagent": "Raven-Code",
      "node_summary": "Inspect test coverage",
      "prompt_template": "Read the tests and report missing coverage with file references. Do not edit files."
    },
    {
      "id": "readiness_summary",
      "subagent": "Raven",
      "node_summary": "Synthesize readiness findings",
      "depends_on": ["api_audit", "test_audit"],
      "prompt_template": "Combine these findings into a prioritized review. Do not edit files. API: {{ api_audit.output }} Tests: {{ test_audit.output }}"
    }
  ]
}

前两个节点可以并发,最后一个等待两者完成。名称应替换为当前工具公布的 roster 名称; 宿主生成 worker table 时,使用 worker label,而不是底层 Agent 名。再次向同一对话 提交图时,要选择新的节点 id。

写入任务应划分文件所有权或使用不同工作副本;并行节点不代表自动拥有独立 worktree 或文件排他锁。

节点契约与数据流

字段 含义
id 整个对话内唯一的任务地址,包括早先 DAG 和 spawn 调用
subagent 当前工具声明的 Agent 名或 worker label
node_summary 展示给用户的简短步骤标题
prompt_template 任务指令和输入占位符
depends_on 前置节点 id
inputs 字符串字面值、{"file": "path"} 或 {"node": "id"}
skills 省略:Agent 自身菜单;[]:无技能;列表:在支持时收窄菜单
mcps 省略:配置行默认值;[]:不附加 MCP;列表:替换选择
instance 复用子 Agent 会话,不是节点输出地址

图要求 task_summary 和 nodes。background 是工具调用参数;confirm 是整图 确认开关,默认 false。面向模型的 schema 使用 snake_case,保存的 playbook 也接受 camelCase 节点字段。未知节点字段会被拒绝,不会静默成为指令。

常用内容形式为 {{ inputs.brief }}、{{ api_audit.output }} 和 {{ ref:brief.md }}; {{ inputs.brief.path }}、{{ api_audit.output_path }}、{{ ref_path:brief.md }} 则把路径交给能读本地文件的后端。宿主路径不等于远程文件传输;后端没有本地文件访问 能力时,优先使用内容形式。

引用同一张图中的节点时必须声明依赖。可以直接引用同一对话中早先完成的节点,无需 重跑,但其保存输出必须存在。失败、跳过、取消、中断或仍在运行的节点不是有效输入。 Id 的唯一性比较忽略大小写,失败后也不会释放 id。

文件引用只允许落在工作目录和当前对话的子 Agent 历史内,不暴露整个 Agent home、 记忆、技能或其他对话。@nodes/ 表示当前对话的扁平节点产物目录。

调度与共享限制

调度前 Raven 检查必填字段、id、依赖、循环、输入契约、路径边界和后端能力。已就绪的 独立节点可并发,并与 spawn 和其他 DAG 共享宿主信号量。 agents.defaults.maxConcurrentSubagents 默认 8; agents.defaults.maxSubagentSpawnsPerHour 默认每会话 30,也限制重复提交 DAG。

共享 instance 的节点串行执行。顺序重要时仍要声明依赖;共享 instance 本身不保证 确定的顺序。不支持会话续接的后端不会因为传入 instance 就获得状态。可选的技能/MCP 收窄不受支持时会报告降级,应先检查通知,再判断限制是否生效。

前台、后台与审批

background 默认 true:工具先返回 run id,稍后将结果送回原对话。主 Agent 必须 等待输出时设为 false。前台调用返回最终结果或节点异常报告;通过 resolve_dag_node 回答后继续等待。

原轮次仍活动时,前台运行处于 bound(绑定) 状态。轮次结束后运行被 released(释放),后续报告走后台路径。绑定时的异常等待没有裁决期限;释放后或 后台等待有期限。“后台”不意味着进程终止后任务仍会继续。

希望用户在任何节点运行前批准整图时,设置 confirm: true,尤其是发送、发布或付费 任务。未接入 ask channel 时,当前实现记录提示并在未经确认的情况下执行。已接入时, 拒绝或投递错误会阻止调度。因此该开关不是无人值守安全门。整图批准不会绕过单工具策略;但 ACP 委派可能自动 批准子 Agent 的协议请求。执行有外部影响的图前,请阅读权限与安全。

失败处理与重新规划

状态 含义
pending 尚未调度,可能等待依赖或执行额度
running 节点活动中
completed 已由配置的完成判断路径接受
exception 工作未成功,等待继续、放弃或重新规划
failed 该节点最终失败
skipped 前置失败,或调度前执行已停止
cancelled 活动节点被取消
interrupted 历史读取发现未完成记录,但已无活动运行

默认情况下,模型 verdict(裁决) 根据输出、transcript 尾部及可用的传输 stop reason 判断节点是否真正完成 prompt 的任务;进程正常返回本身不足以证明成功。但 verdict 是质量检查,不是安全门:关闭 judge,或 judge 失败/超时时,会退回接受正常 后端返回的行为。

进入 exception 后,resolve_dag_node 可以提供修正指令继续、放弃节点,或重新规划。 重新规划会结束旧运行并启动新运行;按引用复用已完成输出,为替代节点分配新 id。 前置节点最终失败会使依赖节点跳过,不必丢弃独立分支。

subagentDag 默认启用 verdict,judge 超时为 180 秒,后台裁决窗口 600 秒,每节点 最多两次继续。这些设置限制额外模型调用和等待,不证明外部动作可安全重试。继续有 副作用的节点前,应检查是否已创建文件、发送消息或启动远程任务。

检查与恢复

可让 Raven 用 dag_status 查看运行,用 cancel_dag 停止运行。这些是模型工具, 不是 raven dag Shell 命令。TUI 与 WebUI 接收实时进度并可读取已保存的图;RPC 提供 dag.get 和 dag.node。

历史归会话管理器所有,与用户交付文件分开:

<session directory>/subagents/
  mas_dag/<run_id>/graph.json
  mas_dag/<run_id>/manifest.json
  nodes/<node_id>.prompt.md
  nodes/<node_id>.out.md
  nodes/<node_id>.error.md
  nodes/<node_id>.meta.json
  nodes/<node_id>.memory.json

并非所有结果都会产生每种文件;未结束运行可能没有最终 manifest。重载 UI 会重建 记录状态,而不是重放全部实时事件。宿主重启后,未完成节点可能显示 interrupted: 恢复历史不等于自动恢复执行。检查已完成输出和副作用后,为剩余工作提交新图。

使用 raven tracing 查看运行时 span,使用 raven trajectory --help 查保存的 轨迹工作流。故障报告不要公开原始 prompt、凭据或私有文件。核心实现位于 raven/agent/subagent/dag_graph.py 及同目录下的 dag_runner.py、dag_tool.py、 dag_control_tools.py 和 dag_resume.py。