消息结构
花卷智能体 API 支持两种消息格式,服务端会自动将简化格式转换为 AI SDK 标准格式。1. 简化格式(推荐用于简单场景)
适合纯文本对话,无需手动管理消息 ID:简化格式示例
使用简化格式时,服务端会自动:
- 生成唯一的消息 ID(使用
crypto.randomUUID()) - 将
content转换为parts: [{ type: "text", text: content }]
2. AI SDK 格式(推荐用于复杂场景)
完整的 AI SDK UIMessage 结构,支持多种消息部分类型:AI SDK 格式示例
UIMessage 完整结构
根据 AI SDK v5 规范,UIMessage 的完整类型定义为:UIMessage 类型定义
必需字段
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 消息的唯一标识符。使用简化格式时自动生成,使用 AI SDK 格式时必须手动提供 |
role | 'user' | 'assistant' | 'system' | 消息的角色类型 |
parts | UIMessagePart[] | 消息内容数组,至少包含一个 part |
可选字段
| 字段 | 类型 | 说明 |
|---|---|---|
metadata | unknown | 自定义元数据,可用于存储业务相关信息 |
status | 'submitted' | 'streaming' | 'ready' | 'error' | 消息状态,通常由客户端管理 |
角色类型
| 角色 | 说明 | 使用场景 |
|---|---|---|
user | 用户消息 | 用户的问题或指令 |
assistant | AI 助手消息 | AI 的回复内容 |
system | 系统消息 | 系统级指令(通常通过 systemPrompt 参数传递,而非 messages 数组) |
多轮对话
通过messages 数组传递完整的对话历史:
多轮对话示例
数组中的消息会按顺序处理,AI 能够理解完整的对话上下文。
Parts 类型详解
parts 数组支持多种类型的消息部分(UIMessagePart):
text - 文本内容
text - 文本内容
最常用的消息类型,包含纯文本:
text part 示例
file - 文件附件
file - 文件附件
包含文件信息(如图片、文档等):
file part 示例
dynamic-tool - 工具调用
dynamic-tool - 工具调用
由服务端自动生成,包含工具调用的输入和输出:字段说明:
dynamic-tool part 示例
type:固定值"dynamic-tool"toolName:工具名称toolCallId:AI 生成的唯一调用 IDstate:工具状态("output-available"表示已完成,"input-available"表示仅输入)input:工具输入参数(使用 snake_case 命名)output:工具输出结果(仅当state: "output-available"时存在)
混合消息示例
一个消息可以包含多个 parts:混合类型消息
一个消息可以包含多个 parts,如文本 + 工具调用、多个工具调用等。
格式验证
简化格式要求
简化格式验证规则
AI SDK 格式要求
AI SDK 格式验证规则
常见错误
错误:缺少 id 字段
错误:缺少 id 字段
问题:使用 AI SDK 格式但未提供 解决方案:添加唯一的 或者使用简化格式(会自动生成 id):
id错误示例
id 字段正确示例
简化格式(推荐)
错误:parts 数组为空
错误:parts 数组为空
问题:解决方案:至少包含一个 part
parts 数组不能为空错误示例
正确示例
工具调用响应中的消息结构
工具调用响应中的消息结构
说明:启用工具调用时,非流式响应或流式响应完成后,API 返回的
data.messages 数组中会包含 dynamic-tool 类型的 parts流式 vs 非流式的区别:
- 流式响应:工具调用以独立的 SSE 事件返回(
tool-input-available和tool-output-available) - 非流式响应:工具调用包含在 messages 数组的
dynamic-toolpart 中 - 详见工具调用功能文档的流式响应部分
完整请求示例
- 简单文本对话
- 多轮对话(AI SDK 格式)
- 混合格式(自动归一化)
简单文本对话

