POST /api/v1/forward/schedules
Schedule 绑定一个 Identity、一个 Template、初始事件、触发策略和执行策略。每次触发都会生成独立 Schedule Run。
请求头
| Header | 是否必填 | 说明 |
|---|---|---|
| Authorization | 是 | Bearer <PAT 或 SAT> |
| Content-Type | 是 | application/json |
| Idempotency-Key | 否 | 有副作用请求可选的幂等键。 |
请求体参数
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| identity_id | string | 是 | Schedule 所属 Forward Identity ID。 |
| template_id | string | 是 | 要执行的 Forward Template ID。 |
| name | string | 是 | Schedule 名称。 |
| description | string | 否 | Schedule 描述。 |
| initial_events | array | 是 | 每次执行注入的初始事件,当前支持 user.message。 |
| execution | object | 否 | 执行策略;省略时使用服务端默认值。 |
| trigger_policy | object |null | 否 | 触发策略;省略或 null 时按 manual 处理。 |
| environment_id | string | 是 | 执行环境。 |
| sinks | array |null | 否 | 执行结果推送目标;为兼容性保留数组形式,当前最多允许一个元素。 |
| metadata | object | 否 | 业务元数据,仅用于标签或透传。 |
触发策略
trigger_policy 是按 type 分发的对象。创建和更新请求只接收配置字段:type、expression、timezone。upcoming_runs_at、last_run_at 是服务端计算出的响应字段。
| 字段 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| type | string | 是 | cron、once、interval 或 manual。 |
| expression | string | 条件必填 | 触发表达式;cron、once、interval 必填,manual 不需要。 |
| timezone | string | 条件必填 | IANA timezone,例如 Asia/Shanghai;cron 必填,once 在表达式不带时区时必填,interval 和 manual 可省略。 |
| upcoming_runs_at | array | 响应返回 | 后续触发时间,UTC ISO 8601。当前实现返回 [] 或最多一个下一次计划触发时间。 |
| last_run_at | string |null | 响应返回 | 最近一次触发时间。 |
| type | 创建/更新入参 | 说明 |
|---|---|---|
cron | type、expression、timezone | 使用 5 字段 cron 表达式按指定 IANA timezone 重复触发。 |
once | type、expression、可选 timezone | 按 ISO 8601 时间触发一次;表达式不带 offset 时必须提供 timezone。 |
interval | type、expression | 按 ISO 8601 duration 重复触发,例如 PT15M。 |
manual | type | 不自动触发,只能通过 Run Schedule 接口手动执行。 |
| type | expression 格式 | 示例 | 说明 |
|---|---|---|---|
cron | 标准 5 字段 cron | 0 9 * * * | 分钟级日历规则;不支持秒字段和 6 字段 cron。 |
once | ISO 8601 绝对时间 | 2026-06-23T09:00:00 或 2026-06-23T01:00:00Z | 目标时间必须至少晚于服务端当前时间 1 分钟。 |
interval | ISO 8601 duration | PT15M、PT1H、P1D | 固定间隔触发,最小粒度 1 分钟。 |
manual | 省略或空字符串 | - | 不产生计划触发时间。 |
执行策略
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| session_mode | string | new_session | Session 使用方式,取值 new_session 或 reuse_session。 |
| max_concurrent_runs | integer | 1 | 同一个 Schedule 最大并发 Run 数。 |
| max_attempts | integer | 1 | 单个 Run 的实际尝试次数上限,允许值为 1 或 2;小于 1 或大于 2 会被拒绝。 |
| timeout_ms | integer | 300000 | 单次尝试超时时间。 |
| session_mode | 说明 |
|---|---|
new_session | 每次触发都创建新的执行 Session,不延续历史上下文。 |
reuse_session | Forward 为该 Schedule 管理一个固定执行 Session,并在多次触发间持续使用;调用方不能指定任意已有 session_id。 |
max_attempts=2 表示同一个 Schedule Run 在首次执行失败后,最多由服务端自动再尝试一次。是否重试由服务端根据失败类型判断;参数错误、权限错误、并发限制、超时或连接中断等场景不会保证重试。客户端可通过 Schedule Run 的 attempt 字段查看实际执行到第几次。
创建时省略 execution.max_attempts 使用默认值 1;显式传入时只接受整数 1 或 2。
推送目标
sinks 为兼容性保留数组形式。省略、传入 null 或 [] 都会创建不带推送目标的 Schedule;传入一个有效元素会配置投递;传入两个或更多元素会返回 HTTP 400 unsupported_sinks_input。每个元素只能是以下公开格式之一:
identity_resolution.mode=fixed、已启用并绑定,并与 Schedule 的 Identity 和 Template 匹配。
external_id 是渠道原生的、不可透视的用户或群组 ID,创建时不会探测其可达性。target.type=group 仅支持根群组,不支持 thread 或 topic。
在渠道 IM 会话中发送 /target,可获取当前会话的 target 配置。
运行时的投递可达性错误会记录在对应 Run 的 push_status=failed,不会改变 Agent Run 状态。
示例请求
示例响应
HTTP 200 OK
响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
| 返回值 | object | 创建后的完整 Schedule 对象。 |
错误
| HTTP | Type | Code | 触发条件 |
|---|---|---|---|
| 400 | invalid_request_error | invalid_trigger_policy | 触发策略类型或表达式不合法。 |
| 400 | invalid_request_error | trigger_policy_too_frequent | 触发粒度小于 1 分钟。 |
| 400 | invalid_request_error | trigger_policy_time_too_soon | once 目标时间过近。 |
| 400 | invalid_request_error | invalid_request | execution.max_attempts 不在 1..2 范围内。 |
| 400 | invalid_request_error | unsupported_sinks_input | sinks 数量、类型或字段非法,或固定 Channel 不可用、归属不符或执行上下文不匹配。 |
| 404 | not_found_error | identity_not_found | Identity 不存在。 |
| 404 | not_found_error | template_not_found | Template 不存在。 |
| 401 | authentication_error | authentication_required | PAT 或 SAT 无效或已过期。 |
备注
- 省略
sinks、传入null或[]时,创建的 Schedule 都返回sinks: []。 manualSchedule 只能通过 Run Schedule 接口触发。onceSchedule 的首次计划 Run 进入终态后会自动归档。

