什么是结构化输出?
智能体不再返回自由格式的文本响应,而是使用工具调用来返回符合预定义 schema 的结构化对象。这为你提供了:- 类型安全的数据:将响应解析为已知的 TypeScript 类型
- 精确的渲染控制:用各自的 UI 处理方式渲染每个字段
- 一致的格式:无论底层模型如何,每个响应都遵循相同的结构
用例
- 产品对比:功能表格、优缺点列表、评分
- 数据分析:带有指标、细分和亮点的摘要
- 分步指南:带描述和代码片段的有序指令
- 食谱:食材、步骤、时间和营养信息
- 数学和科学:用 LaTeX 渲染公式、逐步推导
- 旅行规划:带日期、地点和费用估算的行程
定义 schema
为智能体返回的结构化数据定义 TypeScript 类型。此 schema 的形状决定了你如何渲染 UI。 以下是食谱助手的示例:
你的 schema 可以是任何形式。无论形状如何,模式的工作方式相同。
从消息中提取结构化输出
结构化输出存在于最后一条AIMessage 的 tool_calls 数组中。通过找到 AI 消息并访问第一个工具调用的参数来提取:
结构化输出工具调用可能在智能体完成流式输出之前没有填充
args。流式输出期间,args 可能部分填充或未定义。渲染前始终检查完整性。设置 useStream
定义一个与你的智能体状态 schema 匹配的 TypeScript 接口,并将其作为类型参数传递给 useStream,以获得类型安全的状态值访问。在以下示例中,将 typeof myAgent 替换为你的接口名称:
渲染结构化数据
一旦你有了类型化的对象,构建一个将每个字段映射到合适 UI 元素的组件。这是模式的核心:将结构化数据转化为专用界面。处理流式部分数据
在流式输出期间,工具调用参数可能是不完整的 JSON。在提取逻辑中进行保护:requiredFields 参数等到关键字段填充后再渲染:
流式输出期间渐进式渲染
不必等待完整的结构化输出,可以在字段到达时就渲染它们。这让用户在智能体仍在生成时就能获得即时反馈:重置和重新提交
要让用户在查看结果后提交新查询,添加一个开始新线程的按钮:最佳实践
- 渲染前验证:始终在渲染前检查必需字段是否存在,因为流式输出可能传递部分数据
- 使用通用提取函数:用类型和必需字段参数化你的提取逻辑,使其可跨不同 schema 工作
- 渐进式渲染:在字段到达时就显示,而不是等待完整对象,让用户看到即时反馈
- 提供回退表示:如果字段支持富渲染(LaTeX、Markdown、图表),在 schema 中也包含纯文本等效物作为回退
- 尽量保持 schema 扁平:深度嵌套的 schema 更难渐进式渲染,在部分流式输出期间更容易中断
- 匹配 UI 与数据:选择最能表示每个字段类型的渲染策略(数组用表格,嵌套对象用卡片,状态字段用徽章)
将这些文档连接到 Claude、VSCode 等工具,通过 MCP 获取实时答案。

