概览
工作流是存储在网关中、按请求匹配的不可变工作流策略版本。 目前,它们控制由网关负责的行为,例如:- 缓存
- 预算
- 审计日志
- 用量追踪
- 护栏:运行哪些 插件实例、在哪个阶段运行、以什么顺序运行
- 翻译路由的故障转移
作用域字段
工作流的作用域由以下字段定义:scope_provider_namescope_modelscope_user_path
scope_provider_name 是已配置的提供商实例名称,而不是提供商类型。
示例:
- 提供商类型:
openai - 提供商名称:
openai_primary
匹配优先级
工作流匹配以用户路径优先。 对于user_path=/team/team1/user 的请求,网关会先从最深层到根路径依次检查限定了路径的候选项:
provider_name + model + /team/team1/userprovider_name + /team/team1/user/team/team1/userprovider_name + model + /team/team1provider_name + /team/team1/team/team1provider_name + model + /teamprovider_name + /team/teamprovider_name + model + /provider_name + //provider_name + modelprovider_nameglobal
- 更深层的
user_path工作流优先于范围更广的仅提供商或提供商+模型工作流 - 在相同路径深度下,提供商+模型比仅提供商更具体
- 如果没有匹配的路径作用域工作流,网关会依次回退到提供商+模型、提供商,最后是全局
护栏步骤
工作流负载以steps 列出要运行的护栏实例。每个步骤指定一个实例(ref)、其运行的阶段以及位置:
phase为prompt(省略时的默认值)、response或stream。实例的插件必须实现该阶段;GET /admin/workflows/guardrails会列出每个实例及其phases。- 在同一阶段内,步骤按
step(非负整数)升序运行;step值相同的步骤并行运行。共用同一个step的内容编辑型实例最多只能有一个。 - 同一个
ref在每个阶段中最多出现一次。 features.guardrails: false会禁用该工作流的所有步骤。
"schema_version": 1 加上 "guardrails": [{"ref", "step"}])仍被接受,并编译为 prompt 阶段的步骤。已存储的版本 1
工作流会原样返回;控制台始终写入版本 2。
工作流视图(GET /admin/workflows、GET /admin/workflows/:id)以 chain_hashes({"prompt": "...", "response": "...", "stream": "..."})的形式公开每条已编译链的哈希值。
已编译链的标识是两种响应缓存键的组成部分,因此修改任一阶段中的护栏,都会使在旧规则下产生的缓存回答失效,而链不同的两个工作流也永远不会共享缓存回答。
示例
路径继承
如果您有:- 工作流 A:
scope_user_path=/team - 工作流 B:
scope_user_path=/team/team1
user_path=/team/team1/user,则工作流 B 胜出。
如果工作流 B 不存在,则工作流 A 胜出。
按提供商名称限定作用域
如果您有两个 OpenAI 提供商:openai_primaryopenai_backup
scope_provider_name=openai_primaryscope_provider_name=openai_backup
openai,它们仍属于不同的工作流作用域。
API 示例
创建一个限定到某个已配置提供商名称、某个模型和某个用户路径子树的工作流:说明
scope_model需要同时设置scope_provider_namescope_user_path会被规范化为标准的斜杠形式- 托管 API 密钥可以覆盖请求的用户路径请求头;工作流匹配使用的是请求实际生效的用户路径
- 只有当全局预算功能和所匹配工作流的
budget功能都启用时,才会执行预算控制;参见 预算 - 每个
ref都必须指向一个已存在的护栏实例;被活动工作流引用的护栏无法删除