编写你的第一个工厂
按步骤编写属于你自己的 you-agent-factory 工厂,可选用声明式的图格式,也可选用 JavaScript 编排器格式。
它是什么
一份工厂定义要指明三样东西。工作类型(work type)是流经工厂的工作类别,每种都有初始状态、终止状态和失败状态。工作单元(worker)是真正执行的运行时——智能体、脚本或一次推理调用。工作站(workstation)是处理步骤:取走处于某个状态的工作,派发给工作单元,再把它送入下一个状态。其余的一切——重试、评审循环、守卫、扇出、共享资源——都是后来加在这副骨架上的。何时使用
当某个打包工厂做的事已经接近你的需求但还不够时,就该自己写了。从能完整跑通的最小定义开始,然后慢慢长大。跑不起来的工厂什么也教不了你;跑得不好的工厂会准确告诉你下一步该修什么。选择格式
orchestrator 字段决定用哪个引擎运行你的工厂,而这个选择又决定了你怎么写它。图工厂描述一张拓扑,让引擎推动工作在其中流转。JavaScript 工厂描述一段过程,直接调用运行时。两者互不包含:图形式免费给你按条目持久化的状态和并发,JavaScript 形式则给你普通的控制流。| 问题 | 图工厂 | JavaScript 工厂 |
|---|---|---|
| 你写的是什么? | 用 JSON 或 YAML 写工作类型、工作单元和工作站。 | 一个 JavaScript 函数加一个 orchestrator 块。 |
| 控制流如何流转? | 工作在状态之间移动;输入状态里有工作的工作站就会运行。 | 自上而下,使用普通的 await、循环和条件判断。 |
| 状态存在哪里? | 存在工作条目自身之中,持久保存,每条一份。 | 存在脚本变量里;需要恢复时用显式检查点。 |
| 必须声明什么? | 工作条目可能处于的每一个状态。 | 一份参数模式和一份执行策略。 |
从一个能跑的例子开始
最快且稳妥的起点,是你已经运行过的打包工厂。把它装进项目本地的根目录,你就得到一份已知能通过校验、已知能运行、且小到可以一口气读完的定义。@you/subagent 是其中最小的:一个工作类型、一个工作单元、一个工作站。编写图工厂
按引擎读取的顺序来搭建定义:先声明工作,再声明做事的人,最后声明用到他们的步骤。下面每一步都会向文件里加入一个顶层数组。第 1 步 — 为工厂命名
给工厂起个名字。这是唯一必填的顶层字段,也是后续具名工厂命令所引用的对象。第 2 步 — 声明工作类型及其状态
声明一个带三种状态的工作类型:提交的工作抵达的 INITIAL 状态、表示完成的 TERMINAL 状态,以及图无法完成时使用的 FAILED 状态。给它标上 handlingBehavior DEFAULT,可移植运行才知道该把调用输入放在哪里。第 3 步 — 声明一个工作单元
声明一个工作单元。type 决定它允许哪些字段:AGENT_WORKER 接受智能体工具和权限设置,SCRIPT_WORKER 接受命令与参数,INFERENCE_WORKER 接受操作与模型位置。把 model 和 provider 留空,即可继承你在安装时配置的运维默认值。第 4 步 — 声明一个工作站
声明一个工作站。inputs 指明它消费的工作类型与状态,outputs 指明成功时送出的状态,onFailure 指明工作单元失败时送出的状态。body 就是提示词:它可以插入调用参数,也可以引用正在处理的工作条目。第 5 步 — 声明调用签名
声明调用签名,让调用方知道该传什么。每个参数都有内部名称、命令行上使用的外部名称,以及它接受的绑定方式——位置文本、管道 stdin,或具名参数。完整文件
编写 JavaScript 工厂
JavaScript 工厂用一段脚本取代了工作站构成的图。没有工作类型、工作单元或工作站需要声明——orchestrator 块承载源代码、参数模式和安全策略,脚本本身按你写的顺序调用智能体。第 1 步 — 声明编排器种类
把 orchestrator.kind 设为 JAVASCRIPT。不设的话,定义会按兼容默认值当作图工厂加载,引擎就会去找根本不存在的工作站。第 2 步 — 指向工作流源代码
指向工作流源代码。脚本与定义放在一起时用 sourceRef 写相对于工厂的路径;想让定义直接携带脚本文本时用 inlineSource。随附的 JavaScript 工厂都用内联形式,以便作为单个文件发布。第 3 步 — 声明参数模式
把 argsSchema 声明为一个 JSON Schema 对象。它在脚本启动前校验参数,也是脚本中 args 绑定取值的来源。第 4 步 — 设置默认策略
设置 defaultPolicy。它限定在没有运行时覆盖时该工作流被允许做什么:总共可发起多少次智能体调用、可同时运行多少、子派发可嵌套多深、是否允许联网、哪些根目录可写。READ_ONLY 加一个空的可写根列表是安全的起点。工作流源代码
加载它的定义
校验并运行
校验与运行是两个独立步骤,而且值得先做:它用与 HTTP 工厂校验端点相同的约定检查载荷,而不启动任何运行时。通过之后,就把这个文件当作可移植工厂直接运行。运行前先校验
作为可移植工厂运行
或者用一个名字安装它,然后在任何地方运行