端点
描述
将新任务提交给 Shannon 以供执行。任务立即排队,由 Temporal 工作流引擎异步处理。身份验证
必需:是 在请求头中包含 API 密钥:请求
请求头
| 请求头 | 必需 | 描述 | 示例 |
|---|---|---|---|
X-API-Key | 是 | 身份验证密钥 | sk_test_123456 |
Content-Type | 是 | 必须是 application/json | application/json |
Idempotency-Key | 否 | 幂等性的唯一密钥 | 550e8400-e29b-41d4-a716-446655440000 |
traceparent | 否 | W3C 追踪上下文 | 00-4bf92f... |
请求体参数
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
query | string | 是 | 自然语言任务描述 |
session_id | string | 否 | 多轮对话的会话标识符 |
context | object | 否 | 作为键值对的附加上下文数据 |
mode | string | 否 | 工作流路由:simple、standard、complex 或 supervisor |
model_tier | string | 否 | 模型层级:small、medium、large |
model_override | string | 否 | 指定模型名称(规范 ID;例如 gpt-5、claude-sonnet-4-5-20250929) |
provider_override | string | 否 | 强制指定提供商(如 openai、anthropic、google) |
请求体架构
示例 1:通用 AI 驱动执行避免参数冲突:
- 不要同时使用
template和template_name(它们是别名 - 仅使用template) - 不要将
disable_ai: true与模型控制参数组合使用 - 网关检测到冲突时会返回 400 错误:disable_ai: true+model_tier→ 400disable_ai: true+model_override→ 400disable_ai: true+provider_override→ 400
- 顶层参数会覆盖上下文中的等效参数:
- 顶层
model_tier会覆盖context.model_tier - 顶层
model_override会覆盖context.model_override - 顶层
provider_override会覆盖context.provider_override
- 顶层
上下文参数 (context.*)
支持的键:
role— 角色预设(如analysis、research、writer)system_prompt— 覆盖角色提示;支持从prompt_params引用${var}prompt_params— 提示/工具的自定义参数model_tier— 当顶层未提供时作为回退model_override— 指定具体模型(规范 ID;例如gpt-5、claude-sonnet-4-5-20250929)provider_override— 强制指定提供商(如openai、anthropic、google)template— 模板名称(别名:template_name)template_version— 模板版本disable_ai— 仅模板模式(不回退到 AI)- 不能与模型控制参数组合使用- 窗口控制:
history_window_size、use_case_preset、primers_count、recents_count、compression_trigger_ratio、compression_target_ratio
- 顶层参数会覆盖上下文中的等效参数:
model_tier、model_override、provider_override mode支持:simple|standard|complex|supervisor(默认:自动检测)model_tier支持:small|medium|large- 冲突验证:
disable_ai: true不能与model_tier、model_override或provider_override组合使用(返回 400)
响应
成功响应
状态:200 OK
响应头:
X-Workflow-ID:Temporal 工作流标识符X-Session-ID:会话标识符(如果未提供则自动生成)
响应字段
| 字段 | 类型 | 描述 |
|---|---|---|
task_id | string | 唯一任务标识符(也是工作流 ID) |
status | string | 提交状态(例如 STATUS_CODE_OK) |
message | string | 可选的状态消息 |
created_at | timestamp | 任务创建时间(ISO 8601) |
示例
基本任务提交
带会话 ID 的任务(多轮对话)
带上下文的任务
强制层级(顶层)
仅模板执行
监督者模式(Supervisor)
带幂等性
带分布式追踪
错误响应
400 错误的请求
缺少查询:401 未授权
缺少 API 密钥:429 请求过多
X-RateLimit-Limit: 100X-RateLimit-Remaining: 0X-RateLimit-Reset: 1609459200Retry-After: 60
500 内部服务器错误
代码示例
Python with httpx
Python with requests
JavaScript/Node.js
cURL with 幂等性
Go
实现详情
工作流创建
提交任务时:- 网关接收请求 → 验证身份验证、速率限制
- 生成会话 ID → 如果未提供,自动生成 UUID
- 调用 Orchestrator gRPC →
SubmitTask(metadata, query, context) - Orchestrator 启动 Temporal 工作流 → 持久执行
- 返回响应 → 任务 ID、初始状态
- 任务异步执行 → 独立于 HTTP 连接
幂等性行为
幂等性密钥用于确保网络重试或重复调用不会生成重复任务。-
首次请求(携带
Idempotency-Key):- Shannon 创建任务
- 将响应缓存到 Redis,TTL 默认为 24 小时
- 返回任务 ID 和状态
-
重复请求(相同
Idempotency-Key,请求体完全一致):- Shannon 命中缓存
- 返回与首次请求相同的任务 ID
- 响应内容完全一致
-
24 小时后:
- 缓存过期
- 再次提交同一密钥会创建一个全新的任务
- 存储:Redis
- TTL:24 小时(86400 秒)
- 键格式:
idempotency:<16-char-hash>(对幂等性密钥、用户 ID、请求路径及请求体进行 SHA-256 计算后取前 16 位) - 作用域:按用户隔离(哈希包含用户 ID;关闭鉴权时则退化为基于头部、路径和请求体的哈希)
- 缓存条件:仅缓存 2xx 成功响应;命中缓存时会额外返回
X-Idempotency-Cached: true和X-Idempotency-Key: <your-key>头部
会话管理
- 无 session_id:自动生成 UUID、新鲜上下文
- 带 session_id:从 Redis 加载以前的对话历史
- 会话持久性:默认 TTL 30 天
- 多轮对话:具有相同
session_id的所有任务共享上下文
上下文对象
context 对象存储为元数据并传递给:
- 代理执行环境
- 工具调用(可通过
ctx.get("key")访问) - 会话内存(供将来轮次参考)
- 用户偏好:
{"language": "spanish", "format": "markdown"} - 业务上下文:
{"company_id": "acme", "department": "sales"} - 约束:
{"max_length": 500, "tone": "formal"}
最佳实践
1. 始终为关键任务使用幂等性密钥
2. 对对话使用会话
3. 提供丰富的上下文
4. 妥善处理错误
5. 存储任务 ID 以供追踪
一次调用提交 + 流式传输
需要实时更新? 使用
POST /api/v1/tasks/stream 在一次调用中提交任务并获取流 URL。非常适合需要立即进度更新的前端应用。查看统一提交 + 流式传输以获取示例。