AI SDK v6 协议
AI SDK v6 适配层会把 Awaken 的 AgentEvent 流转换成 Vercel AI SDK v6 UI Message Stream 格式。这样 useChat、useAssistant 等前端无需自定义解析器或自定义 transport adapter 就能直接消费 Awaken 的输出。Awaken 自带的 data-* parts 是增强控制台使用的可选 metadata;普通聊天 UI 可以忽略。
POST /v1/ai-sdk/chat{ "messages": [ { "id": "msg-1", "role": "user", "parts": [{ "type": "text", "text": "Hello" }] } ], "threadId": "optional-thread-id", "agentId": "optional-agent-id"}| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
messages | UIMessage[] | 是 | AI SDK v6 UI messages。text 和 file parts 会转成 runtime content;tool/data/source parts 是 UI 状态,不会发给模型。 |
threadId | string | 否 | 继续已有 thread。省略时会创建新 thread。 |
agentId | string | 否 | 指定 agent。省略时使用默认 agent。 |
file parts 可以使用 hosted URL 或 Data URL。Image、audio、video、PDF 和
text-like document 会转成 runtime ContentBlock。如果启用了 modalities
校验,所选模型必须声明兼容的 input modalities。
SSE 流(text/event-stream),每一行是一个 JSON 编码的 UIStreamEvent。
| 路由 | 方法 | 说明 |
|---|---|---|
/v1/ai-sdk/threads/:thread_id/runs | POST | 在指定 thread 上启动 run |
/v1/ai-sdk/agents/:agent_id/runs | POST | 在指定 agent 上启动 run |
/v1/ai-sdk/agent-previews/runs | POST | 使用当前 registries 运行草稿 AgentSpec,不会持久化该 agent |
/v1/ai-sdk/chat/:thread_id/stream | GET | 按 thread ID 续接 SSE |
/v1/ai-sdk/threads/:thread_id/stream | GET | 同上,thread 路由别名 |
/v1/ai-sdk/threads/:thread_id/replay | GET | 回放指定 thread 的持久协议 frame |
/v1/ai-sdk/chat/:thread_id/replay | GET | 持久协议回放别名 |
/v1/ai-sdk/threads/:thread_id/messages | GET | 读取 thread 消息历史 |
/v1/ai-sdk/threads/:thread_id/cancel | POST | 取消 thread |
/v1/ai-sdk/threads/:thread_id/interrupt | POST | 中断 thread |
Replay 路由要求配置 ProtocolReplayLog。请求可带 ?cursor= 或
Last-Event-ID,以及 ?limit=(默认 100,最大 500);响应是 SSE,
并使用 protocol replay cursor 作为 SSE id。未配置 replay 存储返回 503,
非法 cursor 返回 400,过期 cursor 返回 410 Gone。
AiSdkEncoder 会把 AgentEvent 映射到 UIStreamEvent:
| AgentEvent | UIStreamEvent |
|---|---|
RunStart | MessageStart + Data("run-info", ...) |
TextDelta | TextStart(如果 block 未打开)+ TextDelta |
ReasoningDelta | ReasoningStart(如果 block 未打开)+ ReasoningDelta |
ReasoningEncryptedValue | ReasoningStart(如果未打开)+ ReasoningDelta |
ToolCallStart | 关闭当前 text/reasoning block,然后发 ToolCallStart |
ToolCallDelta | ToolCallDelta |
ToolCallDone | ToolCallEnd |
StepStart | (无直接映射) |
StepEnd | (无直接映射) |
InferenceComplete | Data("inference-complete", ...) |
MessagesSnapshot | Data("messages-snapshot", ...) |
StateSnapshot | Data("state-snapshot", ...) |
StateDelta | Data("state-delta", ...) |
ActivitySnapshot | Data("activity-snapshot", ...) |
ActivityDelta | Data("activity-delta", ...) |
RunFinish | 关闭当前 block,然后发 Data("finish", ...) 和 Finish |
UIStreamEvent 类型
Section titled “UIStreamEvent 类型”starttext-start/text-delta/text-endreasoning-start/reasoning-delta/reasoning-endtool-call-start/tool-call-delta/tool-call-enddatafinish
文本块生命周期
Section titled “文本块生命周期”编码器会自动管理文本块边界:
- 第一个
TextDelta会打开一个 text block。 - 后续 delta 追加到同一个 block。
- 遇到
ToolCallStart会先关闭当前 block。 - 工具结束后的新文本会重新开一个新 block。