getProvider() / getProviderFor*() 统一切换 Providerai 包的核心 API,减少业务层直接依赖底层 Provider SDKgetReasoningOptions()、MCP 工具封装、usage 估算工具import { generateText, getProvider } from "@buildingai/ai-sdk";
const provider = getProvider("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
const result = await generateText({
...provider("gpt-4o"),
prompt: "Hello, how are you?",
});
console.log(result.text);import { getProvider, streamText } from "@buildingai/ai-sdk";
const provider = getProvider("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
const result = streamText({
...provider("gpt-4o"),
messages: [{ role: "user", content: "Tell me a story about a robot." }],
});
for await (const chunk of result.textStream) {
process.stdout.write(chunk);
}generateText + Output.object(...),而不是手动解析 JSON。import { generateText, getProvider, Output } from "@buildingai/ai-sdk";
import { z } from "zod";
const provider = getProvider("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
const result = await generateText({
...provider("gpt-4o"),
output: Output.object({
schema: z.object({
name: z.string(),
age: z.number(),
email: z.string().email(),
}),
}),
prompt: "Generate a random user profile.",
});
console.log(result.output);getProvider()(推荐)import { embed, generateText, getProvider } from "@buildingai/ai-sdk";
const provider = getProvider("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
const text = await generateText({
...provider("gpt-4o"),
prompt: "Hello!",
});
const embedding = await embed({
...provider("text-embedding-3-small"),
value: "Hello!",
});getProviderFor*(),类型更准确。import {
embed,
experimental_generateSpeech as generateSpeech,
generateText,
getProviderForEmbedding,
getProviderForSpeech,
getProviderForText,
} from "@buildingai/ai-sdk";
const textProvider = getProviderForText("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
const text = await generateText({
...textProvider("gpt-4o"),
prompt: "Hello!",
});
const embeddingProvider = getProviderForEmbedding("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
const embedding = await embed({
...embeddingProvider("text-embedding-3-small"),
value: "Hello!",
});
const speechProvider = getProviderForSpeech("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
const speech = await generateSpeech({
...speechProvider("tts-1"),
text: "Hello, world!",
voice: "alloy",
});import {
experimental_generateSpeech as generateSpeech,
getProvider,
} from "@buildingai/ai-sdk";
const provider = getProvider("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
if (provider.supports("speech")) {
const speech = await generateSpeech({
...provider.speech("tts-1"),
text: "Hello!",
});
console.log(speech.audio.format);
}
console.log(provider.capabilities.getAll());import { listProviders } from "@buildingai/ai-sdk";
console.table(listProviders());packages/@buildingai/ai-sdk/src/registry/provider-registry.ts| Provider | 标识符 | 说明 |
|---|---|---|
| OpenAI | openai | OpenAI GPT 系列模型 |
| DeepSeek | deepseek | DeepSeek 深度求索 |
| 智谱 AI | zhipuai | 智谱 AI GLM 系列模型 |
| 月之暗面 | moonshot | 月之暗面 Kimi |
| 硅基流动 | siliconflow | 硅基流动 |
| 通义千问 | tongyi | 阿里云通义千问 |
| 火山引擎 | volcengine | 火山引擎豆包 |
| 腾讯混元 | hunyuan | 腾讯混元 |
| 百度文心 | wenxin | 百度文心一言 |
| 讯飞星火 | spark | 讯飞星火大模型 |
| Ollama | ollama | Ollama 本地模型 |
| MiniMax | minimax | MiniMax M2 系列模型 |
| Anthropic | anthropic | Anthropic Claude 系列模型 |
google | Google Gemini 系列模型 | |
| Cohere | cohere | Cohere 系列模型 |
| Gitee AI | gitee_ai | Gitee AI 魔力方舟 |
| xAI | x | xAI Grok 系列模型 |
| OpenRouter | openrouter | OpenRouter 统一接入 300+ 模型 |
| Azure | azure | Azure AI 服务 |
| 自定义 | custom | 自定义 OpenAI 兼容 API |
ai 6.x 中的语音合成导出名为 experimental_generateSpeech。import {
experimental_generateSpeech as generateSpeech,
getProvider,
} from "@buildingai/ai-sdk";
import { writeFile } from "node:fs/promises";
const provider = getProvider("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
const result = await generateSpeech({
...provider.speech("tts-1"),
text: "Hello, world!",
voice: "alloy",
speed: 1,
outputFormat: "mp3",
});
await writeFile("output.mp3", result.audio.uint8Array);ai 6.x 中的语音转写导出名为 experimental_transcribe。import {
experimental_transcribe as transcribe,
getProvider,
} from "@buildingai/ai-sdk";
import { readFile } from "node:fs/promises";
const provider = getProvider("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
const audio = await readFile("audio.mp3");
const result = await transcribe({
...provider.transcription("whisper-1"),
audio,
providerOptions: {
openai: {
language: "zh",
response_format: "json",
},
},
});
console.log(result.text);import { generateImage, getProvider } from "@buildingai/ai-sdk";
const provider = getProvider("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
const result = await generateImage({
...provider.image("dall-e-3"),
prompt: "A beautiful sunset over mountains",
size: "1024x1024",
providerOptions: {
openai: {
quality: "hd",
},
},
});
console.log(result.images[0]);moderate() 辅助函数。推荐直接调用 moderation model 的 doModerate():import { getProvider } from "@buildingai/ai-sdk";
const provider = getProvider("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
const moderationModel = provider.moderation("text-moderation-latest").model;
const result = await moderationModel.doModerate({
input: "Some text to check",
});
console.log(result.results[0].flagged);import { getProvider, rerankV3 } from "@buildingai/ai-sdk";
const provider = getProvider("zhipuai", {
apiKey: process.env.OPENAI_API_KEY,
});
const result = await rerankV3({
...provider.rerank("rerank-1"),
query: "AI technology trends",
documents: [
"Machine learning is a subset of AI",
"Deep learning uses neural networks",
"Natural language processing enables text understanding",
],
topN: 2,
});
result.ranking.forEach((item) => {
console.log(`Index: ${item.originalIndex}, Score: ${item.score}`);
});import {
generateText,
getProvider,
isAPIError,
isProviderCapabilityError,
isRateLimitError,
} from "@buildingai/ai-sdk";
try {
const provider = getProvider("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
const result = await generateText({
...provider("gpt-4o"),
prompt: "Hello!",
});
console.log(result.text);
} catch (error) {
if (isProviderCapabilityError(error)) {
console.error(`Provider doesn't support: ${error.capability}`);
} else if (isRateLimitError(error)) {
console.error(`Rate limited, retry after: ${error.retryAfter}ms`);
} else if (isAPIError(error)) {
console.error(`API error: ${error.statusCode} - ${error.message}`);
} else {
throw error;
}
}inputSchema,这也是当前项目内实际使用的写法。import { generateText, getProvider, tool } from "@buildingai/ai-sdk";
import { z } from "zod";
const provider = getProvider("openai", {
apiKey: process.env.OPENAI_API_KEY,
});
const result = await generateText({
...provider("gpt-4o"),
prompt: "What is the weather in Tokyo?",
tools: {
getWeather: tool({
description: "Get weather for a location",
inputSchema: z.object({
location: z.string().describe("City name"),
}),
execute: async ({ location }) => {
return { location, temperature: 22, condition: "sunny" };
},
}),
},
maxSteps: 5,
});
console.log(result.text);| 导出 | 说明 |
|---|---|
generateText | 文本生成 |
streamText | 流式文本生成 |
Output | 结构化输出定义工具 |
embed | 文本向量化 |
embedMany | 批量向量化 |
generateImage | 图像生成 |
rerank | AI SDK 原生重排序 |
rerankV3 | rerank 的兼容别名 |
tool | 定义工具 |
ToolLoopAgent | 多步工具调用 Agent |
ai 包一起被重新导出,但新代码通常更推荐使用上面的主路径:| 导出 | 说明 |
|---|---|
generateObject | 兼容导出,优先考虑 generateText + Output.object(...) |
streamObject | 流式结构化输出 |
experimental_generateSpeech | 语音合成 |
experimental_transcribe | 语音转写 |
| 导出 | 说明 |
|---|---|
getProvider | 获取通用 Provider |
getProviderForText | 获取文本模型 Provider |
getProviderForEmbedding | 获取 Embedding Provider |
getProviderForSpeech | 获取语音合成 Provider |
getProviderForTranscription | 获取语音转写 Provider |
getProviderForImage | 获取图像模型 Provider |
getProviderForModeration | 获取内容审核 Provider |
getProviderForRerank | 获取重排序 Provider |
listProviders | 列出当前内置 Provider |
getReasoningOptions | 根据 Provider 生成 reasoning 参数 |