文档
CodeRabbit
Cloudflare
AG Grid
Netlify
Neon
WorkOS
Clerk
Convex
Electric
PowerSync
Sentry
Railway
Prisma
Strapi
Unkey
CodeRabbit
Cloudflare
AG Grid
Netlify
Neon
WorkOS
Clerk
Convex
Electric
PowerSync
Sentry
Railway
Prisma
Strapi
Unkey
类引用
函数引用
接口引用
类型别名引用
变量引用
API

@tanstack/ai

TanStack AI 的核心 AI 库。

安装

sh
npm install @tanstack/ai

chat(options)

创建流式聊天响应。

typescript
import { chat } from "@tanstack/ai";
import { openaiText } from "@tanstack/ai-openai";

const stream = chat({
  adapter: openaiText("gpt-5.2"),
  messages: [{ role: "user", content: "Hello!" }],
  tools: [myTool],
  systemPrompts: ["You are a helpful assistant"],
  agentLoopStrategy: maxIterations(20),
});

参数

  • adapter - 具有模型(例如 openaiText('gpt-5.2')anthropicText('claude-sonnet-4-5'))的 AI adapter 实例
  • messages - 聊天消息数组
  • tools? - 用于函数调用的工具数组
  • systemPrompts? - 要附加到消息的系统提示
  • agentLoopStrategy? - 代理循环策略(默认:maxIterations(5)
  • abortController? - 用于取消的 AbortController
  • modelOptions? - 特定于模型的选项(重命名自 providerOptions

Returns (返回)

一个 StreamChunk 的异步迭代器。

summarize(options)

创建文本摘要。

typescript
import { summarize } from "@tanstack/ai";
import { openaiSummarize } from "@tanstack/ai-openai";

const result = await summarize({
  adapter: openaiSummarize("gpt-5.2"),
  text: "Long text to summarize...",
  maxLength: 100,
  style: "concise",
});

参数

  • adapter - 具有模型的 AI adapter 实例
  • text - 要摘要的文本
  • maxLength? - 摘要的最大长度
  • style? - 摘要风格(“concise” | “detailed”)
  • modelOptions? - 特定于模型的选项

Returns (返回)

一个包含摘要文本的 SummarizationResult

toolDefinition(config)

创建一个同构工具定义,可以实例化用于服务器或客户端执行。

typescript
import { toolDefinition } from "@tanstack/ai";
import { z } from "zod";

const myToolDef = toolDefinition({
  name: "my_tool",
  description: "Tool description",
  inputSchema: z.object({
    param: z.string(),
  }),
  outputSchema: z.object({
    result: z.string(),
  }),
  needsApproval: false, // Optional
});

// Or create client implementation
const myClientTool = myToolDef.client(async ({ param }) => {
  // Client-side implementation
  return { result: "..." };
});

// Use directly in chat() (server-side, no execute)
chat({
  adapter: openaiText("gpt-5.2"),
  tools: [myToolDef],
  messages: [{ role: "user", content: "..." }],
});

// Or create server implementation
const myServerTool = myToolDef.server(async ({ param }) => {
  // Server-side implementation
  return { result: "..." };
});

// Use directly in chat() (server-side, no execute)
chat({
  adapter: openaiText("gpt-5.2"),
  tools: [myServerTool],
  messages: [{ role: "user", content: "..." }],
});

参数

  • name - 工具名称(必须唯一)
  • description - 模型的工具描述
  • inputSchema - 用于输入验证的 Zod schema
  • outputSchema? - 用于输出验证的 Zod schema
  • needsApproval? - 工具是否需要用户批准
  • metadata? - 附加元数据

Returns (返回)

一个 ToolDefinition 对象,具有 .server().client() 方法,用于创建具体的实现。

toServerSentEventsStream(stream, abortController?)

将流转换为 Server-Sent Events 格式的 ReadableStream。

typescript
import { chat, toServerSentEventsStream } from "@tanstack/ai";
import { openaiText } from "@tanstack/ai-openai";

const stream = chat({
  adapter: openaiText("gpt-5.2"),
  messages: [...],
});
const readableStream = toServerSentEventsStream(stream);

参数

  • stream - StreamChunk 的异步迭代器
  • abortController? - 可选的 AbortController,用于在取消流时中止

Returns (返回)

一个 Server-Sent Events 格式的 ReadableStream<Uint8Array>。每个块都

  • "data: " 为前缀
  • 后跟 "\n\n"
  • 流以 "data: [DONE]\n\n" 结尾

toServerSentEventsResponse(stream, init?)

将流转换为具有适当 SSE 标头的 HTTP Response。

typescript
import { chat, toServerSentEventsResponse } from "@tanstack/ai";
import { openaiText } from "@tanstack/ai-openai";

const stream = chat({
  adapter: openaiText("gpt-5.2"),
  messages: [...],
});
return toServerSentEventsResponse(stream);

参数

  • stream - StreamChunk 的异步迭代器
  • init? - 可选的 ResponseInit 选项(包括 abortController

Returns (返回)

一个 Response 对象,适用于具有 SSE 标头(Content-Type: text/event-streamCache-Control: no-cacheConnection: keep-alive)的 HTTP 端点。

maxIterations(count)

创建一个限制迭代次数的代理循环策略。

typescript
import { chat, maxIterations } from "@tanstack/ai";
import { openaiText } from "@tanstack/ai-openai";

const stream = chat({
  adapter: openaiText("gpt-5.2"),
  messages: [...],
  agentLoopStrategy: maxIterations(20),
});

参数

  • count - 工具执行的最大迭代次数

Returns (返回)

一个 AgentLoopStrategy 对象。

类型

ModelMessage

typescript
interface ModelMessage {
  role: "user" | "assistant" | "system" | "tool";
  content: string;
  toolCallId?: string;
}

StreamChunk

typescript
type StreamChunk =
  | ContentStreamChunk
  | ThinkingStreamChunk
  | ToolCallStreamChunk
  | ToolResultStreamChunk
  | DoneStreamChunk
  | ErrorStreamChunk;

interface ThinkingStreamChunk {
  type: "thinking";
  id: string;
  model: string;
  timestamp: number;
  delta?: string; // Incremental thinking token
  content: string; // Accumulated thinking content
}

流块表示流中的不同类型的数据

  • 内容块 - 正在生成的文本内容
  • 思考块 - 模型的推理过程(如果模型支持)
  • 工具调用块 - 模型调用工具时
  • 工具结果块 - 工具执行结果
  • 完成块 - 流完成
  • 错误块 - 流错误

工具

typescript
interface Tool {
  type: "function";
  function: {
    name: string;
    description: string;
    parameters: Record<string, any>;
  };
  execute?: (args: any) => Promise<any> | any;
  needsApproval?: boolean;
}

用法示例

typescript
import { chat, summarize, generateImage } from "@tanstack/ai";
import {
  openaiText,
  openaiSummarize,
  openaiImage,
} from "@tanstack/ai-openai";

// --- Streaming chat
const stream = chat({
  adapter: openaiText("gpt-5.2"),
  messages: [{ role: "user", content: "Hello!" }],
});

// --- One-shot chat response (stream: false)
const response = await chat({
  adapter: openaiText("gpt-5.2"),
  messages: [{ role: "user", content: "What's the capital of France?" }],
  stream: false, // Returns a Promise<string> instead of AsyncIterable
});

// --- Structured response with outputSchema
import { z } from "zod";
const parsed = await chat({
  adapter: openaiText("gpt-5.2"),
  messages: [{ role: "user", content: "Summarize this text in JSON with keys 'summary' and 'keywords': ... " }],
  outputSchema: z.object({
    summary: z.string(),
    keywords: z.array(z.string()),
  }),
});

// --- Structured response with tools
import { toolDefinition } from "@tanstack/ai";
const weatherTool = toolDefinition({
  name: "getWeather",
  description: "Get the current weather for a city",
  inputSchema: z.object({
    city: z.string().describe("City name"),
  }),
}).server(async ({ city }) => {
  // Implementation that fetches weather info
  return JSON.stringify({ temperature: 72, condition: "Sunny" });
});

const toolResult = await chat({
  adapter: openaiText("gpt-5.2"),
  messages: [
    { role: "user", content: "What's the weather in Paris?" }
  ],
  tools: [weatherTool],
  outputSchema: z.object({
    answer: z.string(),
    weather: z.object({
      temperature: z.number(),
      condition: z.string(),
    }),
  }),
});

// --- Summarization
const summary = await summarize({
  adapter: openaiSummarize("gpt-5.2"),
  text: "Long text to summarize...",
  maxLength: 100,
});

// --- Image generation
const image = await generateImage({
  adapter: openaiImage("dall-e-3"),
  prompt: "A futuristic city skyline at sunset",
  numberOfImages: 1,
  size: "1024x1024",
});

下一步