AI SDK 集成 Baseten Provider:语言模型与嵌入模型的完整接入指南 AI SDK 集成 Baseten Provider语言模型与嵌入模型的完整接入指南【免费下载链接】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 SDKThe AI Toolkit for TypeScript官方提供的 Baseten Provider——ai-sdk/baseten它让开发者能够通过统一的 AI SDK 接口调用 Baseten 推理平台上的前沿开源模型如 DeepSeek、Kimi、Qwen、GLM 等同时支持文本生成与嵌入向量两种能力。读完本文你将掌握该 Provider 的安装、默认实例与自定义实例的创建、generateText/streamText文本生成、专用部署的modelURL接入、嵌入模型调用以及可选原生性能客户端的进阶用法并能从源码层面理解其基于 OpenAI 兼容协议实现的底层原理。概览Baseten Provider 是什么Baseten 是一个推理平台用于通过 API 对外提供前沿级、企业级开源 AI 模型的托管服务。ai-sdk/baseten是 AI SDK 的官方 Provider 包为 Baseten 平台提供语言模型language model与嵌入模型embedding model支持即同时覆盖文本生成与向量化两类场景。从源码结构看该 Provider 没有从零实现协议而是构建在ai-sdk/openai-compatible之上在 baseten-provider.ts 中聊天模型实例化自OpenAICompatibleChatLanguageModel嵌入模型实例化自OpenAICompatibleEmbeddingModel其依赖关系也在 package.json 中体现依赖ai-sdk/openai-compatible、ai-sdk/provider、ai-sdk/provider-utils。这意味着所有 Baseten 请求都走 OpenAI 兼容协议Provider 层主要负责任何 URL 拼接、鉴权头、错误结构与批处理策略。安装Baseten Provider 位于ai-sdk/baseten模块通过 npm 安装npm i ai-sdk/baseten该包以 ESM 方式发布type: module入口为dist/index.js要求 Node.js 22并声明zod为 peerDependency^3.25.76 || ^4.1.8。安装后建议在环境中配置 Baseten API Keyexport BASETEN_API_KEYyour_api_key_hereProvider 实例默认实例可以直接从ai-sdk/baseten导入默认的 provider 实例basetenimport { baseten } from ai-sdk/baseten;该默认实例由源码底部的export const baseten createBaseten();创建见 baseten-provider.ts使用全部默认配置。自定义实例如果默认配置不满足需求例如要接入专用模型部署可以通过createBaseten创建带自定义设置的实例import { createBaseten } from ai-sdk/baseten; const baseten createBaseten({ apiKey: process.env.BASETEN_API_KEY ?? , });可选配置项createBaseten接受BasetenProviderSettings对象源码接口定义于 baseten-provider.ts各配置项如下配置项类型说明apiKeystringBaseten API Key通过Authorization: Bearer头发送。默认读取BASETEN_API_KEY环境变量baseURLstringAPI 调用地址前缀可用于代理服务器等场景。默认值为https://inference.baseten.co/v1modelURLstring专用模型聊天或嵌入的 URL。未提供时走默认 Model APIsheadersRecordstring, string附加的自定义请求头会与鉴权头合并发送fetch(input, init) PromiseResponse自定义 fetch 实现可拦截请求或用于测试performanceClientPerformanceClient构造函数可选接入 Baseten 原生性能客户端仅嵌入模型见下文从源码看baseURL会经过withoutTrailingSlash处理去除末尾斜杠请求头由withUserAgentSuffix附加ai-sdk/baseten/${VERSION}的 User-Agent 标识版本号由构建期注入见 version.ts。这些行为均有对应单元测试验证见 baseten-provider.unit.test.ts 的 Headers 与 URL construction 分组。使用语言模型Model APIsBaseten 提供托管的 Model APIs可以直接用模型 ID 选中模型。Provider 本身可被直接调用baseten(modelId)也暴露了chatModel(modelId)与languageModel(modelId)两个等价的工厂方法。源码中定义的内置聊天模型 ID 列表见 baseten-chat-options.ts当前支持Model APIs 之外的自有模型也可通过string {}放宽类型传入deepseek-ai/DeepSeek-R1-0528deepseek-ai/DeepSeek-V3-0324deepseek-ai/DeepSeek-V3.1moonshotai/Kimi-K2-Instruct-0905moonshotai/Kimi-K2-ThinkingQwen/Qwen3-235B-A22B-Instruct-2507Qwen/Qwen3-Coder-480B-A35B-Instructopenai/gpt-oss-120bzai-org/GLM-4.6zai-org/GLM-4.7文本生成示例使用generateText生成文本import { baseten } from ai-sdk/baseten; import { generateText } from ai; const { text } await generateText({ model: baseten(deepseek-ai/DeepSeek-V3-0324), prompt: What is the meaning of life? Answer in one sentence., });Baseten 语言模型同样可用于streamText流式生成相关核心概念可参考仓库中的 AI SDK Core 文档。源码层面的两个关键开关在 baseten-provider.ts 中聊天模型统一配置了includeUsage: true与supportsStructuredOutputs: trueincludeUsageOpenAI 兼容服务默认不会在流式响应中附带 usagetoken 用量除非请求携带stream_options.include_usage。该开关保证流式输出也能统计用量。supportsStructuredOutputs缺少该开关时OpenAI 兼容层会把response_format: json_schema改写为json_object静默丢弃 schema、name 与 strict 标志。开启后结构化输出JSON Schema可原样透传。这两个开关对默认 Model APIs 路径和专用/sync/v1部署路径均生效由测试分别验证见 baseten-provider.unit.test.ts 的includeUsage与supportsStructuredOutputs分组。接入专用模型部署Dedicated Models除了托管的 Model APIsBaseten 还支持通过专用模型 URL 接入自定义部署的聊天模型与嵌入模型。此时需要在创建 provider 时指定modelURL。OpenAI 兼容端点/sync/v1对使用 Baseten OpenAI 兼容端点部署的模型import { createBaseten } from ai-sdk/baseten; import { generateText } from ai; const baseten createBaseten({ modelURL: https://model-{MODEL_ID}.api.baseten.co/sync/v1, }); // 指定 modelURL 后无需再传 modelId const model baseten(); const { text } await generateText({ model: model, prompt: Say hello from a Baseten chat model!, });从源码看当modelURL包含/sync/v1时provider 会以占位 modelIdplaceholder构造模型实际请求 URL 由modelURL path拼接而成例如.../sync/v1/chat/completions测试见 baseten-provider.unit.test.ts。/predict端点不支持聊天/predict端点目前不支持聊天模型聊天功能必须使用/sync/v1端点。若传入包含/predict的modelURL并调用聊天模型源码会抛出Not supported. You must use a /sync/v1 endpoint for chat models.使用嵌入模型Embedding Models通过.embeddingModel()工厂方法可创建调用 Baseten 嵌入 API 的模型。Baseten Embeddings InferenceBEI部署天然兼容 OpenAI 协议因此嵌入模型默认走普通 HTTP无需额外依赖。重要嵌入模型必须使用专用部署并配置modelURL。与聊天模型不同嵌入模型无法使用 Baseten 默认的 Model APIs。import { createBaseten } from ai-sdk/baseten; import { embed, embedMany } from ai; const baseten createBaseten({ modelURL: https://model-{MODEL_ID}.api.baseten.co/sync, }); const embeddingModel baseten.embeddingModel(); // 单个嵌入 const { embedding } await embed({ model: embeddingModel, value: sunny day at the beach, }); // 批量嵌入 const { embeddings } await embedMany({ model: embeddingModel, values: [ sunny day at the beach, rainy afternoon in the city, snowy mountain peak, ], });端点的 URL 拼接规则源码中嵌入模型的 URL 构造包含一处细节处理baseten-provider.ts 的getCommonModelConfig传入/sync端点不含/v1自动追加/v1最终请求形如.../sync/v1/embeddings传入/sync/v1端点直接拼接不会重复/v1传入/predict端点不支持抛出Not supported. You must use a /sync or /sync/v1 endpoint for embeddings.批量上限与自动分片每次请求最多发送128个值源码常量MAX_EMBEDDINGS_PER_CALL 128对应 Baseten 服务端413 batch size N maximum allowed batch size 128的限制。embedMany会将更大的输入按此大小自动分片并并行发送因此你可以放心传入任意数量的值。对应的测试在 baseten-embedding-model.test.ts 中验证了 128 个值可正常通过、129 个值直接调用doEmbed会抛出TooManyEmbeddingValuesForCallError。实际请求体遵循 OpenAI 嵌入接口形状input、model、encoding_format: floattoken 用量从响应中的prompt_tokens提取见 baseten-embedding-model.test.ts。可选原生性能客户端Native Performance ClientBaseten 额外发布了basetenlabs/performance-client原生客户端它能在你部署已有的服务端动态批处理之上再叠加客户端批处理client-side batching与请求对冲request hedging。需要特别注意的是该客户端默认不安装。因为它是原生插件native addon在边缘运行时edge runtime中无法加载打包工具也无法解析其平台二进制文件。如需使用需自行安装并把构造函数传入 providernpm i basetenlabs/performance-clientimport { createBaseten } from ai-sdk/baseten; import { PerformanceClient } from basetenlabs/performance-client; const baseten createBaseten({ modelURL: https://model-{MODEL_ID}.api.baseten.co/environments/production/sync, performanceClient: PerformanceClient, });接入后批处理交由客户端自行处理maxEmbeddingsPerCall被设为InfinityembedMany将全部值作为一次调用交给性能客户端而不再按 128 分片。源码通过结构类型structural typing声明了该客户端的最小接口embed(input, model)方法使其不进入包的依赖与类型图传给客户端的 baseUrl 会去掉/v1后缀因为客户端会自行追加/v1。相关行为均有单元测试覆盖见 baseten-provider.unit.test.ts 的opt-in performance client path分组。错误处理Provider 内置了对常见 API 错误的处理逻辑。先看基本用法import { baseten } from ai-sdk/baseten; import { generateText } from ai; try { const { text } await generateText({ model: baseten(moonshotai/Kimi-K2-Instruct-0905), prompt: Hello, world!, }); } catch (error) { console.error(Baseten API error:, error.message); }双形态错误信封的解析源码中值得注意的实现细节是Baseten 会返回两种不同的错误信封——Model APIs 返回纯字符串如{error:please check the model you provided}而专用部署透传其服务端的 OpenAI 形态对象。因此 baseten-provider.ts 中的basetenErrorSchema使用z.union同时接受两种形态errorToMessage则按类型提取可读消息。若两种形态都无法解析错误消息会退化为 HTTP 原因短语HTTP/1.1 下为 Not FoundHTTP/2 下可能为空。该行为在单元测试的errorStructure分组与嵌入模型的 HTTP 测试中均有覆盖见 baseten-provider.unit.test.ts、baseten-embedding-model.test.ts。常见错误场景// 1. 嵌入模型必须配置 modelURL try { baseten.embeddingModel(); } catch (error) { // Error: No model URL provided for embeddings. Please set modelURL option for embeddings. } // 2. 聊天模型不支持 /predict 端点 try { const baseten createBaseten({ modelURL: https://model-{MODEL_ID}.api.baseten.co/environments/production/predict, }); baseten(); // 会抛出错误 } catch (error) { // Error: Not supported. You must use a /sync/v1 endpoint for chat models. } // 3. /sync/v1 端点对嵌入模型可用 const baseten createBaseten({ modelURL: https://model-{MODEL_ID}.api.baseten.co/environments/production/sync/v1, }); const embeddingModel baseten.embeddingModel(); // 正常工作 // 4. 嵌入模型不支持 /predict 端点 try { const baseten createBaseten({ modelURL: https://model-{MODEL_ID}.api.baseten.co/environments/production/predict, }); baseten.embeddingModel(); // 会抛出错误 } catch (error) { // Error: Not supported. You must use a /sync or /sync/v1 endpoint for embeddings. } // 5. 图像模型不受支持 try { baseten.imageModel(test-model); } catch (error) { // Error: NoSuchModelError for imageModel }从源码看图像模型通过provider.imageModel直接抛出NoSuchModelError见 baseten-provider.ts 与 baseten-provider.unit.test.ts 的imageModel分组Provider 明确只覆盖文本与嵌入两类能力。与 OpenAI 兼容层的关系原理小结Baseten Provider 是 AI SDK 生态中协议复用思路的典型代表它没有自建传输层而是把 Baseten 的 Model APIs 与专用部署统一建模为 OpenAI 兼容端点从而直接复用ai-sdk/openai-compatible的聊天/嵌入实现。Provider 自身的核心工作集中在四件事上端点归一化默认baseURL与专用modelURL的拼接、/sync→/sync/v1的自动补全鉴权与标识BASETEN_API_KEY加载、Bearer头与ai-sdk/baseten/versionUser-Agent能力开关includeUsage、supportsStructuredOutputs等针对 Baseten 服务特性的适配错误语义化兼容字符串/对象两种错误信封并提取可读消息。需要进一步研究实现时可阅读 baseten-provider.tsProvider 主实现、baseten-provider.unit.test.ts配置与 URL 构造测试、baseten-embedding-model.test.ts真实 HTTP 嵌入链路测试以及包的出口 index.ts对外导出的类型与工厂函数。【免费下载链接】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),仅供参考