TanStack AI
用一套类型安全接口构建跨模型的流式聊天、工具调用与多模态应用。
工作流使用只读 contents 权限、关闭持久化凭据并以提交散列固定第三方 Actions;Code Mode 声称使用隔离沙箱,ACP 测试也展示了沙箱边界。扣分在于 SDK 可调用外部模型、工具、本地进程及媒体服务,而所给文件未完整说明运行时最小权限、网络范围或默认工具授权;工具审批只有文档链接。提供商和可观测性路径较清楚,但没有 API 密钥、日志脱敏、提示内容保留或敏感数据处理政策。ACP 对不可恢复的 attach 会拒绝,并提示重复执行和双重追加风险,但框架整体没有通用回滚机制。仓库、包名、MIT 著作权人和社区渠道可追溯,不过维护主体及发布身份未被企业注册表验证,因此不作负面推断,也不视为充分组织身份保证。
README、包脚本、工作流和 ACP 测试对流式事件、会话恢复、协议协商、runId 与耐久性限制的描述高度一致,故自洽性满分。多提供商及 Ollama 本地选项降低单一依赖风险,但实际功能仍依赖 npm 包、模型供应商、运行时和外部服务,且来源未展示离线降级全貌。失败消息证据很强:配置错误、协议版本错误及不支持 attach 均有明确且可操作的说明,并区分可重试与非瞬态条件。
材料明确覆盖 React、Vue、Svelte、Solid、Preact、无头客户端、纯服务端、实时、多媒体及多提供商场景,受众和环境适配充分。能力边界部分明确,例如 ACP 尚不写 journal、Bun 驱动需要特定运行时,但这些限制主要出现在测试注释而非顶层说明。工具 schema、客户端/服务端实现和审批流程表明触发接口较精确,但审批文档正文和实际策略未提供,因此不能满分。
README 的开始路径、能力分类、提供商表、框架表和高级文档导航结构清晰。安装命令实用,但缺少密钥配置、运行时版本及生产部署的完整就地说明。包命名一致且采用 changesets/release 流程,不过大量活动和适配器显示接口仍可能演进,所给材料没有兼容性承诺。示例覆盖聊天、工具和结构化输出,但没有随附 FAQ;已知限制有测试级证据,却没有集中限制章节。MIT 文本完整,故许可满分。维护渠道、贡献入口和自动维护脚本存在,但未明确列出责任人、响应承诺或安全更新路径。
流式事件、类型化工具、结构化输出、多模态和框架绑定直接产出可供应用消费的结果,输出可用性证据充分。统一的 provider/activity 抽象、运行时切换、Code Mode 和可观测性相较基础模型 SDK 提供明显增量价值。树摇、按需包和 OpenRouter 成本跟踪有助于控制成本,但未给出性能、费用、延迟或运维负担的量化数据,因此成本效益不满分。
核心能力可追溯到具体 README 示例、package 脚本、固定版本工作流及针对 ACP 行为的细粒度测试;多类文件相互印证配置验证、协议协商、沙箱执行、事件输出和耐久性限制,因此追溯性与交叉佐证充分。扣分在于部分广泛能力、隔离安全性和奖项属于概述或外链声明,当前材料未提供对应实现或独立证据;测试源码只能证明测试意图,不能证明本次修订实际执行通过。
- ACP 兼容适配器目前不写 journal;在耐久 attach 场景会拒绝操作,新耐久运行也明确不可在之后恢复。
- Code Mode 和本地进程适配器可执行生成代码或命令;部署者应自行限制文件系统、网络、凭据和工具权限,并设置明确审批边界。
- 所给材料没有说明 API 密钥保护、提示与媒体数据保留、日志脱敏或供应商数据政策,处理敏感数据前需单独审查。
- 本评估仅基于所给静态文件;未执行测试,也未验证外链文档、奖项、发布物或依赖漏洞状态。
这个 Agent 能做什么,适合哪些场景?
TanStack AI 是一个类型安全、供应商无关的 TypeScript SDK,而不是可直接部署的成品智能体。其核心由可组合的活动、供应商适配器、无头客户端以及 React、Solid、Vue、Svelte 和 Preact 框架绑定组成。服务端可通过 chat() 调用模型,并用 toServerSentEventsResponse() 输出流式响应;工具则通过共享的 toolDefinition() 契约在服务端或客户端执行。它还覆盖结构化输出、图像与音视频生成、语音和转录、实时语音、摘要,以及可在隔离沙箱中执行 TypeScript 的 Code Mode。部署边界由采用者决定:它可以嵌入服务器端点、脚本、后端服务或框架应用,但仍需选择相应的模型供应商适配器并提供其服务凭据。
应用把消息交给 chat(),并用 openaiText() 等活动级适配器选择模型;流式结果可经 toServerSentEventsResponse() 返回给客户端。开发者可用 toolDefinition() 声明名称、描述、输入模式和输出模式,再绑定 server() 或客户端实现,使工具调用沿用同一套类型。outputSchema 可使用 JSON Schema、Zod、ArkType 或 Valibot,把自由文本生成约束为类型化对象。@tanstack/ai-client 负责无头聊天、实时和生成客户端,@tanstack/ai-react、@tanstack/ai-solid、@tanstack/ai-vue、@tanstack/ai-svelte 与 @tanstack/ai-preact 提供各框架接口。供应商适配器可调用 OpenAI、Anthropic、Gemini、OpenRouter、Ollama、Grok、Groq、ElevenLabs、BytePlus 和 fal.ai 所支持的活动,并产生文本、结构化对象、工具结果、图像、音频、视频、语音、转录或摘要。Code Mode 允许模型在隔离沙箱中编写并执行 TypeScript,以循环、分支和并行调用组织工具;可观测性管线还能检查消息、流片段、工具调用、错误、用量与 OpenTelemetry 追踪。
- TypeScript 后端团队需要在一个服务器端点中提供流式聊天,并希望将模型响应转换为 Server-Sent Events。
- React、Vue、Svelte、Solid 或 Preact 团队需要框架原生的聊天或生成接口,同时把模型调用保留在自己的应用架构内。
- 产品团队需要让同一个类型化工具定义在服务器或客户端执行,并明确校验输入与输出。
- 需要在 OpenAI、Anthropic、Gemini、OpenRouter或本地 Ollama之间切换的团队,可通过供应商适配器减少核心业务代码与单一模型服务的耦合。
- 需要可靠 JSON 结果的应用,可用 Zod、ArkType、Valibot 或 JSON Schema 定义 outputSchema。
- 构建实时语音、多媒体生成或复杂工具编排的团队,可分别采用 realtime、generations 或 Code Mode 能力。
这个 Agent 有哪些优点和局限?
- 供应商适配层覆盖 OpenAI、Anthropic、Gemini、OpenRouter、Ollama 等多种路径,并明确支持运行时切换适配器。
- toolDefinition() 让客户端与服务端实现共享输入、输出和工具契约,减少工具调用边界上的类型漂移。
- 活动级导入支持 tree-shaking,可只引入文本、图像、视频或语音等实际使用的能力。
- 除聊天外还统一覆盖结构化输出、实时语音、多媒体生成、Code Mode、开发工具和 OpenTelemetry 可观测性。
- 提供无头客户端和多个主流前端框架的原生绑定,便于嵌入现有 TypeScript 应用。
- 它是开发 SDK,不是开箱即用的托管智能体;采用者仍须实现应用、端点、工具逻辑、界面和部署。
- 实际运行依赖所选供应商或本地模型环境;不同适配器支持的聊天、图像、视频、语音和实时能力并不完全相同。
- 安装会随用例涉及多个包,例如核心、客户端、框架绑定和供应商适配器,需要自行管理版本与集成边界。
- Code Mode 会执行模型生成的 TypeScript,虽然资料称其位于隔离沙箱,但未给出沙箱部署、权限或资源限制细节。
- 给定资料未说明最低运行时版本、生产部署命令、密钥环境变量或各供应商的失败与重试策略。
如何安装或部署这个 Agent?
需要核心包以及至少一个供应商适配器。OpenAI 示例:
pnpm add @tanstack/ai @tanstack/ai-openaiReact 聊天界面:
pnpm add @tanstack/ai @tanstack/ai-client @tanstack/ai-react @tanstack/ai-openai若希望通过一个 API 密钥访问多个供应商,可安装 OpenRouter 适配器:
pnpm add @tanstack/ai @tanstack/ai-openrouter随后需要为所选供应商准备相应凭据;给定资料仅明确提到 OpenRouter API 密钥,没有提供环境变量名称、最低 Node.js 版本或完整凭据配置步骤。
如何使用这个 Agent?
在服务端路由中解析请求消息,创建聊天流并返回 SSE 响应:
import { chat, toServerSentEventsResponse } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'export async function POST(request: Request) {
const body = await request.json()const stream = chat({adapter: openaiText('gpt-5.2'),
messages: body.messages,
})
return toServerSentEventsResponse(stream)}
运行前需按照所选供应商适配器配置服务凭据。若要加入工具,可用 toolDefinition() 声明 inputSchema 与 outputSchema,并通过 .server(async (...) => ...) 绑定实现;若要获得类型化对象,则把 Zod、ArkType、Valibot 或 JSON Schema 传给 chat() 的 outputSchema。
这个 Agent 与同类方案有什么区别?
项目明确提供“TanStack AI vs Vercel AI SDK”比较文档,讨论架构、功能覆盖和取舍;但给定资料未列出具体差异,因此不能据此断言哪一个性能更好、功能更多或迁移成本更低。