除了使用仪表板编辑器 UI 定义路由图外,你还可以使用 REST API 来完成。路由在内部使用简单的 JSON 结构表示:
{
"id": "<route id>",
"name": "<route name>",
"elements": [<array of elements>]
}动态路由支持多种元素类型,你可以组合它们创建复杂的路由流程。每个元素都有特定的输入、输出和配置选项。
标记路由的开始。每个路由必须以 Start 元素开始。
- Inputs(输入):无
- Outputs(输出):
next:将未更改的请求转发到下一个元素
{
"id": "<id>",
"type": "start",
"outputs": {
"next": { "elementId": "<id>" }
}
}基于请求参数评估条件并相应地路由请求。
- Inputs(输入):Request
- Outputs(输出):
true:如果条件评估为 true,将请求转发到提供的元素false:如果条件评估为 false,将请求转发到提供的元素
conditions 支持 MongoDB 风格的运算符,如 $eq、$ne、$in、$and 和 $or。
{
"id": "<id>",
"type": "conditional",
"properties": {
"conditions": {
"metadata.plan": { "$eq": "free" }
}
},
"outputs": {
"true": { "elementId": "<id>" },
"false": { "elementId": "<id>" }
}
}按概率将请求路由到多个输出,适用于 A/B 测试和逐步推出。
- Inputs(输入):Request
- Outputs(输出):最多 5 个命名百分比输出
- 每个输出键(例如
"10%")是该分支的概率,键的总和必须为 100%
- 每个输出键(例如
{
"id": "<id>",
"type": "percentage",
"outputs": {
"10%": { "elementId": "<id>" },
"40%": { "elementId": "<id>" },
"50%": { "elementId": "<id>" }
}
}基于请求元数据应用限制。支持基于计数和基于成本的限制。
- Inputs(输入):Request
- Outputs(输出):
success:如果请求未被速率限制,将请求转发到提供的元素fallback:被速率限制请求的可选输出(如果未提供,路由将终止)
Properties(属性):
limitType:"count" 或 "cost"key:用于速率限制的请求字段(例如 "metadata.user_id")limit:最大允许请求数/成本window:时间窗口(秒)
{
"id": "<id>",
"type": "rate",
"properties": {
"limitType": "count",
"key": "metadata.user_id",
"limit": 100,
"window": 3600
},
"outputs": {
"success": { "elementId": "node_model_workers_ai" },
"fallback": { "elementId": "node_model_openai_mini" }
}
}使用指定的模型和提供商执行推理,具有可配置的超时和重试设置。
- Inputs(输入):Request
- Outputs(输出):
success:如果模型成功开始流式响应,将请求转发到提供的元素fallback:如果模型在所有重试后失败或超时,可选输出
Properties(属性):
provider:AI 提供商(例如 "openai"、"anthropic")model:特定模型名称timeout:请求超时(毫秒)retries:重试次数
{
"id": "<id>",
"type": "model",
"properties": {
"provider": "openai",
"model": "gpt-4o-mini",
"timeout": 60000,
"retries": 4
},
"outputs": {
"success": { "elementId": "<id>" },
"fallback": { "elementId": "<id>" }
}
}标记路由的结束。返回最后一个成功的模型响应,如果没有生成模型响应则返回错误。
- Inputs(输入):Request
- Outputs(输出):无(提供空的
outputs对象)
{
"id": "<id>",
"type": "end",
"outputs": {}
}