如何用 AI SDK 的 ToolLoopAgent 定义可复用的聊天 Agent
如何用 AI SDK 的 ToolLoopAgent 定义可复用的聊天 Agent【免费下载链接】aiThe AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and agents项目地址: https://gitcode.com/GitHub_Trending/ai/ai如果你的应用里有多处需要「模型 工具 固定行为」的组合聊天接口、后台任务、脚本把模型、系统指令和工具在每次调用点各自拼装很快就会改一处漏一处。AI SDKVercel 出品的 TypeScript AI 工具包提供的ToolLoopAgent类解决的就是这个问题把 LLM 配置、工具和 Agent 循环封装成一个可复用组件定义一次后同一实例可以同时用于一次性生成、流式输出和聊天 UI 接口。本文基于仓库内文档走一遍「定义 Agent → 验证 → 挂到聊天接口」的完整路径。前提一个 TypeScript 项目已安装ai包、你选择的模型 provider 包下文示例使用ai-sdk/openai和zod。本文代码示例沿用了仓库文档的模板写法__PROVIDER_IMPORT__和__MODEL__是文档占位符分别替换为你自己的 provider 导入语句如import { openai } from ai-sdk/openai和模型实例如openai(gpt-4o)。下文代码块会直接写成可运行的形式。定义一个带工具的 Agent在 Agents 概览 中Agent 由三部分组成LLM 负责决策、工具扩展能力、循环负责上下文管理与停止条件。ToolLoopAgent替你管理后两者。下面这个 Agent 带两个工具查天气返回华氏度和摄氏度换算。模型会先调weather再调convertFahrenheitToCelsius最后生成文本回答import { ToolLoopAgent, tool } from ai; import { openai } from ai-sdk/openai; import { z } from zod; const weatherAgent new ToolLoopAgent({ model: openai(gpt-4o), instructions: You are a helpful assistant., tools: { weather: tool({ description: Get the weather in a location (in Fahrenheit), inputSchema: z.object({ location: z.string().describe(The location to get the weather for), }), execute: async ({ location }) ({ location, temperature: 72 Math.floor(Math.random() * 21) - 10, }), }), convertFahrenheitToCelsius: tool({ description: Convert temperature from Fahrenheit to Celsius, inputSchema: z.object({ temperature: z.number().describe(Temperature in Fahrenheit), }), execute: async ({ temperature }) { const celsius Math.round((temperature - 32) * (5 / 9)); return { celsius }; }, }), }, });构造参数中常用的几个配置均可在 ToolLoopAgent API 参考中查到完整定义model必填语言模型实例来自 provider 包instructionsAgent 的系统指令用来定义角色和行为边界toolsRecordstring, Tool键是工具名。注意文档明确说明工具调用要求底层模型支持 tool callingstopWhen循环停止条件默认isStepCount(20)即最多 20 步toolChoice工具选择策略auto默认由模型决定、none禁用工具、required强制使用工具或{ type: tool, toolName: ... }强制使用某个具体工具allowSystemInMessages是否允许prompt/messages中出现role: system消息。文档说明其未设置时会被拒绝理由是存在 prompt injection 风险并建议改用instructions——对聊天 Agent 这是一个值得知道的默认行为。用 stopWhen 控制 Agent 循环每个 step 对应一次模型生成要么产出文本Agent 结束要么调用工具SDK 执行工具后进入下一个 step。默认 20 步的上限对多数聊天场景足够任务链更长时用isStepCount调整import { ToolLoopAgent, isStepCount } from ai; import { openai } from ai-sdk/openai; const agent new ToolLoopAgent({ model: openai(gpt-4o), stopWhen: isStepCount(50), // Increase default from 20 to 50. });也可以组合多个条件满足任一条件即停止import { ToolLoopAgent, isStepCount } from ai; import { openai } from ai-sdk/openai; const agent new ToolLoopAgent({ model: openai(gpt-4o), stopWhen: [ isStepCount(20), // Maximum 20 steps yourCustomCondition(), // Custom logic for when to stop ], });除步数条件外循环还会在以下情况提前结束引自 Building Agents模型返回非 tool-calls 的 finish reasoning被调用的工具没有execute函数工具调用需要审批。更多停止条件与prepareStep的用法见 Loop Control。调用 generate() 并核对结果最直接的验证方式是generate()。它返回GenerateTextResult其中result.text是最终回答result.steps是 Agent 走过的所有步骤const result await weatherAgent.generate({ prompt: What is the weather in San Francisco in celsius?, }); console.log(result.text); // agents final answer console.log(result.steps); // steps taken by the agent按 Agents 概览 的说明上面的 prompt 会触发 Agent 自动完成三步调用weather获取华氏度、调用convertFahrenheitToCelsius换算、生成最终文本。你可以检查result.steps里是否依次出现了这两个工具调用。如果需要观测日志generate()支持生命周期回调onStart、onStepStart、onToolExecutionStart、onToolExecutionEnd、onStepEnd、onEnd。这些回调既可以写在构造器里Agent 级跟踪也可以写在generate()/stream()调用里单次调用跟踪两处同时提供时构造器回调先执行。例如记录每一步的 token 用量const result await weatherAgent.generate({ prompt: What is the weather in NYC?, onStepEnd({ stepNumber, usage }) { console.log(Step ${stepNumber}:, { inputTokens: usage.inputTokens, outputTokens: usage.outputTokens, }); }, onEnd({ usage, steps }) { console.log(Agent finished:, { totalSteps: steps.length, totalTokens: usage.totalTokens, }); }, });流式输出与聊天 UI 复用同一个 Agent 实例可以直接用于流式响应无需重新定义配置const stream weatherAgent.stream({ prompt: What is the weather in NYC and what is 100 * 25?, }); for await (const chunk of stream.textStream) { process.stdout.write(chunk); }要把它接成聊天接口在 API 路由如app/api/chat/route.ts中用createAgentUIStreamResponse把 Agent 的流式输出包装成 UI message stream 返回。该函数只用于服务端上下文且要求 Agent 实现.stream({ prompt, ... })并定义tools属性即使为空对象也要定义ToolLoopAgent天然满足。路由代码来自 createAgentUIStreamResponse 参考import { createAgentUIStreamResponse } from ai; import { weatherAgent } from /agent/weather-agent; export async function POST(request: Request) { const { messages } await request.json(); return createAgentUIStreamResponse({ agent: weatherAgent, uiMessages: messages, // Optional: support cancellation (aborts on disconnect, etc.) // abortSignal: abortController.signal, }); }它的内部流程引自同一篇参考文档先按 Agent 的工具配置校验uiMessages再转换为模型消息然后调用 Agent 的.stream()最后把输出流包成可读的 HTTPResponse。你的平台需要支持 HTTP 流式消费。客户端用useChat对接这个端点。UI 消息推荐使用parts属性渲染支持 text、tool invocation、tool result 等类型见 Chatbot 指南use client; import { useChat } from ai-sdk/react; import { DefaultChatTransport } from ai; import { useState } from react; export default function Page() { const { messages, sendMessage, status } useChat({ transport: new DefaultChatTransport({ api: /api/chat, }), }); const [input, setInput] useState(); return ( {messages.map(message ( div key{message.id} {message.role user ? User: : AI: } {message.parts.map((part, index) part.type text ? span key{index}{part.text}/span : null, )} /div ))} form onSubmit{e { e.preventDefault(); if (input.trim()) { sendMessage({ text: input }); setInput(); } }} input value{input} onChange{e setInput(e.target.value)} disabled{status ! ready} placeholderSay something... / button typesubmit disabled{status ! ready} Submit /button /form / ); }useChat的status取值submitted已发送、等待响应流开始、streaming正在接收流、ready响应完成可发送新消息、error请求出错。用status ! ready禁用输入框就是文档示例的做法。出错时可显示通用错误提示并用regenerate重试流式过程中可用stop中止请求。用 InferAgentUIMessage 获得端到端类型安全Agent 的工具和输出类型可以直接推导成 UI 消息类型供useChat使用。定义在 Agent 所在模块并导出客户端组件导入import { ToolLoopAgent, InferAgentUIMessage } from ai; const myAgent new ToolLoopAgent({ // ... configuration }); // Infer the UIMessage type for UI components or persistence export type MyAgentUIMessage InferAgentUIMessagetypeof myAgent;use client; import { useChat } from ai-sdk/react; import type { MyAgentUIMessage } from /agent/my-agent; export function Chat() { const { messages } useChatMyAgentUIMessage(); // Full type safety for your messages and tools }边界与限制工具调用依赖模型能力tools配置要求底层模型支持 tool calling换成不支持的模型时工具不会生效步数上限不是失败stopWhen命中时循环直接结束如果你的任务经常在第 20 步被截断先用result.steps确认步数分布再调大isStepCountprepareStep中返回的模型调用设置如temperature只作用于当前 step后续 step 回到 Agent 顶层设置除非再次返回覆盖createAgentUIStreamResponse仅限服务端使用不能在浏览器中调用。工具审批toolApproval、runtimeContext/toolsContext的传递规则分别是独立的进阶主题参见 Tool Approvals 和 Runtime and Tool Context需要可预测的显式控制流时可以看 Workflow Patterns 了解用核心函数构建结构化工作流的方式。【免费下载链接】aiThe AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and agents项目地址: https://gitcode.com/GitHub_Trending/ai/ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

端侧AI大模型部署实战:从模型量化到NPU推理的完整复盘

端侧AI大模型部署实战:从模型量化到NPU推理的完整复盘

端侧AI这三个字,过去两年几乎被讲烂了。每次行业大会都有人端着手机说“我们已经在端侧跑起了大模型”,但真正自己去趟一遍完整链路,从选型、裁剪、量化到死磕算子和内存,才会明白台上那一句“跑起来”背后有多少妥协和脏活。这篇…

2026/9/13 17:01:59 阅读更多 →
n8n 表达式语法完全指南:掌握 {{ }} 变量引用、Webhook 数据结构与常见错误排查(n8n-mcp)

n8n 表达式语法完全指南:掌握 {{ }} 变量引用、Webhook 数据结构与常见错误排查(n8n-mcp)

n8n 表达式语法完全指南:掌握 {{ }} 变量引用、Webhook 数据结构与常见错误排查(n8n-mcp) 【免费下载链接】n8n-mcp A MCP for Claude Desktop / Claude Code / Windsurf / Cursor to build n8n workflows for you 项目地址: https://gitc…

2026/9/13 17:01:59 阅读更多 →
粒子群优化改进OMP算法:压缩感知稀疏重构的自动调参方案

粒子群优化改进OMP算法:压缩感知稀疏重构的自动调参方案

简介:压缩包中包含基于粒子群优化(PSO)改进正交匹配追踪(OMP)算法的 MATLAB 程序,面向压缩感知、稀疏信号恢复以及图像重建等方向的研究者与工程师。原版 OMP 在迭代选原子时容易陷入局部最优,导…

2026/9/13 17:01:59 阅读更多 →

最新新闻

Matlab/Simulink柴油发电机微电网仿真建模实践

Matlab/Simulink柴油发电机微电网仿真建模实践

1. 柴油发电机仿真系统概述柴油发电机作为微电网系统中的关键备用电源,其动态特性直接影响整个系统的稳定性。在Matlab/Simulink环境下搭建柴油发电机仿真模型,能够有效评估其在并网/孤岛模式下的运行性能。典型的微电网架构包含光伏阵列(PV&…

2026/9/14 21:00:32 阅读更多 →
基于Django与微信小程序的智能制造业ERP系统开发实践

基于Django与微信小程序的智能制造业ERP系统开发实践

1. 项目背景与核心价值制造业ERP系统作为企业资源管理的核心平台,其移动化转型已成为行业刚需。这个基于Django框架的智能制造业ERP解决方案,通过微信小程序实现移动端接入,解决了传统ERP系统在以下场景的痛点:车间主任需要实时审…

2026/9/14 21:00:32 阅读更多 →
海尔Horizon冰箱技术解析与市场战略

海尔Horizon冰箱技术解析与市场战略

1. 项目概述:海尔Horizon冰箱英国首发的战略意义2023年海尔在英国市场推出的Horizon系列冰箱,是其全球化战略中的关键落子。作为定位高端的旗舰产品线,Horizon的命名本身就蕴含着三重战略意图:首先"地平线"象征技术边界…

2026/9/14 21:00:32 阅读更多 →
Vue3双向绑定组件开发:多变量与修饰符实战

Vue3双向绑定组件开发:多变量与修饰符实战

1. Vue3双向绑定组件的核心需求解析双向绑定是Vue框架最标志性的特性之一,在Vue3中通过组合式API得到了进一步增强。当我们谈到"支持多绑定变量和修饰符的双向绑定组件"时,实际上是在解决以下三个核心问题:多变量同步:传…

2026/9/14 21:00:32 阅读更多 →
IntelliJ IDEA社区版:开源轻量IDE的调优与ARM边缘设备实战

IntelliJ IDEA社区版:开源轻量IDE的调优与ARM边缘设备实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 21:00:32 阅读更多 →
SpringBoot+Vue校园商铺管理系统开发实践

SpringBoot+Vue校园商铺管理系统开发实践

1. 项目概述太原学院商铺管理系统是一套基于SpringBootVueMySQL技术栈的校园商铺信息化解决方案。这个系统我花了三个月时间从零开发完成,目前已在太原学院实际运行半年多,稳定支撑着校内30多家商铺的日常运营管理。相比市面上通用的商业管理系统&#x…

2026/9/14 20:59:31 阅读更多 →

日新闻

AI音乐侵权案中的测试工程与版权保护技术

AI音乐侵权案中的测试工程与版权保护技术

1. 项目概述:当测试工程师遇上AI音乐侵权案去年夏天,我作为技术顾问参与了一起特殊的著作权纠纷案——某音乐平台AI作曲功能被指控批量侵权。这起案件的特殊性在于:原告方并非传统音乐人,而是一家拥有百万级曲库的数字音乐发行商&…

2026/9/14 0:00:26 阅读更多 →
嵌入式面试I2C与SPI深度解析:从协议到量产调试

嵌入式面试I2C与SPI深度解析:从协议到量产调试

1. 这份“高频知识点洞察”到底是什么,又为什么值得你花时间细读? 如果你最近在刷嵌入式开发岗位的招聘JD,或者正坐在工位上改第7版简历,又或者刚被面试官一句“讲讲I2C和SPI的区别”问得手心冒汗——那你不是一个人。过去两年我带…

2026/9/14 0:00:26 阅读更多 →
51单片机开环控制磁阻传感器的硬件匹配与代码实现

51单片机开环控制磁阻传感器的硬件匹配与代码实现

简介:本资源是一份面向嵌入式初学者与单片机课程实践者的51单片机开关磁阻电机(SRM)开环控制教学方案,聚焦磁阻位置检测、固定时序驱动与基础状态可视化。资源包含1个C语言主程序文件(zhuang600.c)实现电机…

2026/9/14 0:00:26 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/14 5:45:49 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/14 0:52:26 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/14 0:06:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/14 17:35:10 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/14 16:59:29 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/14 5:45:14 阅读更多 →