Skip to main content
当开发者希望在智能体服务中长期保存一份标准作业流程,并反复发起运行时,可以使用服务层的 SOP 能力。流程以数据的形式保存,每次运行都在普通会话中逐步推进,前端通过会话事件流即可实时观看。 服务层的 SOP 提供以下能力:
SOP 服务处于实验阶段,接口与存储结构可能在后续版本调整。自定义的存储后端需要实现 StorageBase 中的 SOP 相关方法,未实现时调用这些接口会抛出 NotImplementedError,不影响服务的其他功能。

定义流程

服务中的流程用 SOPData 描述。与 SDK 中直接持有智能体对象不同,这里的每一步通过智能体 ID 与会话键引用执行者和验证者。SOPData 的字段如下: 每个步骤(SOPStepDataV1)的字段如下:

会话键

session_key 决定一个智能体在哪个会话里工作。两处引用使用同一个会话键,就共用同一个会话,也就共享同一段上下文;使用不同的会话键,即便是同一个智能体也会分处两个会话,互不可见。例如让写作智能体在两步之间延续上下文,两步的执行者使用同一个会话键即可;让审稿智能体每次都从空白上下文开始验收,给它一个独立的会话键。 一个会话键只能属于一个智能体。会话的模型与权限模式也按会话键配置在 session_settings 中,每个用到的会话键都必须配置,字段如下:

验证者

验证者有两种类型,通过 type 字段区分:

工作区

一次运行的会话在创建时就分配好工作区,工作区专属于这次运行,不与其他运行共享。workspace_grain 的取值如下: 以下请求体创建一个两步流程:写作智能体产出初稿并由审稿智能体验收,定稿后交给人工确认:
创建流程
以下几类流程在创建或修改时就会被拒绝,返回 422,避免等到运行时才失败:

接口列表

SOP 相关接口都挂在 /sop 下,按资源分为流程与运行两组:
GET /sop/runs?phase=awaiting 可以列出所有正在等人处理的运行,包括等待人工验收和等待工具授权两种情况。

运行流程

发起运行时,服务先把当前的流程内容复制一份保存在运行记录里,之后修改流程不会影响已发起的运行。随后为每个会话键各创建一个会话,会话名为「流程名 / 会话键」,然后立即返回运行记录,运行本身在后台推进:
发起运行
返回的 SOPRunRecord 中,sessions 字段记录了每个会话键对应的会话 ID,state 字段是运行状态,其 phase 表示运行整体所处的阶段。开发者可以订阅这些会话的事件流 GET /sessions/{session_id}/stream 实时观看,并轮询 GET /sop/runs/{sop_run_id} 查看进度。

提交成果

每一步都作为一次普通的对话轮次交给对应会话中的智能体。这一轮次会额外装配一个提交工具,智能体通过它把结果直接写入运行状态: 智能体的回复结束时如果还没有调用提交工具,会被提醒调用;提醒三次仍未提交,这次回复以错误结束,并记为一次驳回。执行者没有交付、验证者没有结论,都会消耗这一步的 max_attempts。
只有运行派发的轮次才装配提交工具。开发者或用户直接在某一步的会话里发消息,只是普通对话,既不会被要求提交,也不会推动运行。

人工验收

验证者为 HumanVerifier 时,执行者交付后这一步进入 awaiting,运行随即停下。任何时候通过以下接口提交结论,运行都会在后台继续:
提交人工结论
请求体的字段如下: 接口在结论记录后立即返回更新后的运行记录。运行或步骤不存在时返回 404;该步骤不由人验收,或当前并未等待验收时返回 409。

处理工具授权

步骤中的智能体请求工具授权时,这一步同样进入 awaiting。授权与普通会话完全一致:向该会话发送 POST /chat,请求体为 UserConfirmResultEvent 或 ExternalExecutionResultEvent。续接的这一轮仍然装配提交工具,结束后运行在后台自动继续,无需额外调用。续接的回复如果被中断,运行保持原地不动。

删除流程与运行

删除操作会级联清理运行创建的资源: 这些会话由运行创建,运行删除后留着它们没有意义,还可能被后台工具的完成事件再次唤醒,因此一并删除。

当前限制

SOP 服务目前还有以下限制: