跳转到内容

AI SDK v6 协议

AI SDK v6 适配层会把 Awaken 的 AgentEvent 流转换成 Vercel AI SDK v6 UI Message Stream 格式。这样 useChatuseAssistant 等前端无需自定义解析器或自定义 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"
}
字段类型必填说明
messagesUIMessage[]AI SDK v6 UI messages。textfile parts 会转成 runtime content;tool/data/source parts 是 UI 状态,不会发给模型。
threadIdstring继续已有 thread。省略时会创建新 thread。
agentIdstring指定 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/runsPOST在指定 thread 上启动 run
/v1/ai-sdk/agents/:agent_id/runsPOST在指定 agent 上启动 run
/v1/ai-sdk/agent-previews/runsPOST使用当前 registries 运行草稿 AgentSpec,不会持久化该 agent
/v1/ai-sdk/chat/:thread_id/streamGET按 thread ID 续接 SSE
/v1/ai-sdk/threads/:thread_id/streamGET同上,thread 路由别名
/v1/ai-sdk/threads/:thread_id/replayGET回放指定 thread 的持久协议 frame
/v1/ai-sdk/chat/:thread_id/replayGET持久协议回放别名
/v1/ai-sdk/threads/:thread_id/messagesGET读取 thread 消息历史
/v1/ai-sdk/threads/:thread_id/cancelPOST取消 thread
/v1/ai-sdk/threads/:thread_id/interruptPOST中断 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

AgentEventUIStreamEvent
RunStartMessageStart + Data("run-info", ...)
TextDeltaTextStart(如果 block 未打开)+ TextDelta
ReasoningDeltaReasoningStart(如果 block 未打开)+ ReasoningDelta
ReasoningEncryptedValueReasoningStart(如果未打开)+ ReasoningDelta
ToolCallStart关闭当前 text/reasoning block,然后发 ToolCallStart
ToolCallDeltaToolCallDelta
ToolCallDoneToolCallEnd
StepStart(无直接映射)
StepEnd(无直接映射)
InferenceCompleteData("inference-complete", ...)
MessagesSnapshotData("messages-snapshot", ...)
StateSnapshotData("state-snapshot", ...)
StateDeltaData("state-delta", ...)
ActivitySnapshotData("activity-snapshot", ...)
ActivityDeltaData("activity-delta", ...)
RunFinish关闭当前 block,然后发 Data("finish", ...)Finish
  • start
  • text-start / text-delta / text-end
  • reasoning-start / reasoning-delta / reasoning-end
  • tool-call-start / tool-call-delta / tool-call-end
  • data
  • finish

编码器会自动管理文本块边界:

  1. 第一个 TextDelta 会打开一个 text block。
  2. 后续 delta 追加到同一个 block。
  3. 遇到 ToolCallStart 会先关闭当前 block。
  4. 工具结束后的新文本会重新开一个新 block。