使用 @ai-sdk/gmicloud 在 AI SDK 中接入 GMI Cloud 开源权重模型推理
【免费下载链接】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-sdk/gmicloud是 AI SDK(TypeScript AI Toolkit)生态中的 GMI Cloud 官方接入包,它让开发者通过 GMI Cloud 的 GPU 推理平台调用 DeepSeek、Qwen、Kimi、GLM、MiniMax 等开源权重模型,底层走 OpenAI 兼容的 Chat Completions 协议。本文从该包的 CHANGELOG 版本演进出发,结合包内源码、测试与文档,完整讲解安装配置、模型调用、底层实现原理与 GMI 特有的错误诊断解包机制,读完即可在自己的 TypeScript / Next.js 项目中直接接入 GMI Cloud。
版本演进脉络:CHANGELOG 里的关键信号
阅读 packages/gmicloud/CHANGELOG.md 可以得到两个明确信息:
1. 包的诞生:3.0.0 主版本。3.0.0 是唯一带 Major Changes 的版本,其变更记录明确写着:
74556f7: feat(gmicloud): add GMI Cloud provider with OpenAI-compatible chat completions and unwrapped error diagnostics
这句话概括了本包的全部技术主题:新增 GMI Cloud Provider、走 OpenAI 兼容的 Chat Completions 协议、并对后端错误诊断做了解包处理。后续所有能力都围绕这三件事展开。
2. 3.0.1 到 3.0.18 全部是依赖升级的 Patch。当前最新版本为 3.0.18,此区间内没有任何 API 或行为变化,仅滚动升级三个底层依赖包:
@ai-sdk/provider(从 4.0.10 一路升至 4.0.13)@ai-sdk/openai-compatible(从 3.0.30 升至 3.0.47)@ai-sdk/provider-utils(从 5.0.27 升至 5.0.39)
这从侧面印证:本包是一个轻量适配层,自身的公共 API 自 3.0.0 发布以来保持稳定,你可以放心升级 Patch 版本获得底层修复而无需改动业务代码。这些依赖声明同样可以在 packages/gmicloud/package.json 的dependencies中看到。
安装与 Provider 实例配置
安装
GMI Cloud provider 位于@ai-sdk/gmicloud模块中,安装命令:
npm i @ai-sdk/gmicloud仓库使用 pnpm workspace 管理,包内脚本(见 packages/gmicloud/package.json)提供test:node/test:edge双环境测试、build(tsup 打包)与type-check等能力。包本身sideEffects: false,支持 Tree Shaking,engines要求 Node.js >= 22,peer 依赖zod(^3.25.76 || ^4.1.8)。
默认 Provider 实例
包从入口 packages/gmicloud/src/index.ts 导出默认实例gmicloud与工厂函数createGmicloud。直接使用默认实例即可:
import { gmicloud } from '@ai-sdk/gmicloud';默认实例的 API Key 从环境变量GMI_CLOUD_APIKEY读取(这与 GMI 官方 SDK 包的环境变量命名保持一致),该行为由 gmicloud-provider.ts 中的loadApiKey实现:读取失败时会给出明确的 "GMI Cloud API key" 描述错误。
自定义 Provider 实例
需要自定义配置时,使用createGmicloud工厂函数:
import { createGmicloud } from '@ai-sdk/gmicloud'; const gmicloud = createGmicloud({ apiKey: process.env.GMI_CLOUD_APIKEY ?? '', });createGmicloud接受的可选配置项如下(与官方文档 content/providers/01-ai-sdk-providers/100-gmicloud.mdx 及源码 gmicloud-provider.ts 一致):
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
apiKey | string | 环境变量GMI_CLOUD_APIKEY | 通过Authorization: Bearer <key>头发送 |
baseURL | string | https://api.gmi-serving.com/v1 | API 请求的 URL 前缀,可用于代理或自建网关 |
headers | Record<string, string> | 无 | 追加到每次请求的自定义请求头 |
fetch | FetchFunction | 全局 fetch | 自定义 fetch 实现,可拦截请求或用于测试 |
一个值得注意的细节:baseURL在工厂内部经过withoutTrailingSlash处理(gmicloud-provider.ts),末尾多余的斜杠会被去掉,避免拼接 URL 时出现双斜杠。请求头则通过withUserAgentSuffix自动附加ai-sdk/gmicloud/<版本号>的 User-Agent 后缀,便于 GMI 服务端识别 SDK 版本。
语言模型调用:OpenAI 兼容 Chat Completions
基础文本生成
GMI Cloud 通过 Chat Completions 接口提供文本生成能力,直接配合ai包的generateText使用:
import { gmicloud } from '@ai-sdk/gmicloud'; import { generateText } from 'ai'; const { text } = await generateText({ model: gmicloud('deepseek-ai/DeepSeek-V4-Flash-0731'), prompt: 'What is the capital of France?', });模型 ID 与模型目录
GMI Cloud 提供持续演进的开源权重模型目录,因此模型 ID 被类型化为string,不会写死枚举。从 gmicloud-chat-options.ts 的源码注释可以看到,完整目录可通过GET https://api.gmi-serving.com/v1/models获取,当前源码中示例收录的模型包括:
deepseek-ai/DeepSeek-V4-Flash-0731Qwen/Qwen3.8-Maxmoonshotai/kimi-k3zai-org/GLM-5.2-FP8MiniMaxAI/MiniMax-M3
类型定义中(string & {})的存在意味着你可以在编译期放心传入目录中出现的任何新模型 ID,无需等待包发版。
不支持的能力:Embedding 与图像模型
GMI Cloud 当前只提供文本生成。调用provider.embeddingModel(...)或provider.imageModel(...)会直接抛出NoSuchModelError(源码见 gmicloud-provider.ts),提示对应modelType不可用。集成时请避免在代码里对这些能力做分支,直接只用chat/languageModel路径即可。
Provider 的完整调用面
从 gmicloud-provider.ts 的接口定义可以看到,GmicloudProvider遵循 AI SDK 的ProviderV4规范,支持三种等价调用方式:
gmicloud('deepseek-ai/DeepSeek-V4-Flash-0731'); // 直接调用 gmicloud.languageModel('deepseek-ai/DeepSeek-V4-Flash-0731'); gmicloud.chat('deepseek-ai/DeepSeek-V4-Flash-0731');三者都会创建同一个GmicloudChatLanguageModel实例,其中provider标识为gmicloud.chat。
底层实现:复用 OpenAI 兼容适配层
GMI Cloud 的 API 与 OpenAI Chat Completions 高度兼容,因此本包没有重复实现协议解析,而是直接复用@ai-sdk/openai-compatible包的能力。gmicloud-chat-language-model.ts 展示了核心继承关系:
export class GmicloudChatLanguageModel extends OpenAICompatibleChatLanguageModel implements LanguageModelV4从源码注释看,"唯一的自定义点就是错误结构(error structure)"——GMI 的边缘网关会把后端引擎的诊断信息嵌套在error.details里,而 OpenAI 兼容层的默认错误处理会丢弃这部分信息,所以本包必须重写它。
创建模型时(gmicloud-provider.ts)向兼容层传入的配置包括:
provider: 'gmicloud.chat':模型标识url: ({ path }) => baseURL + path:按 baseURL 拼接请求路径headers: getHeaders:Bearer 鉴权 + 自定义头 + User-AgenterrorStructure: gmicloudErrorStructure:GMI 专属错误解析结构includeUsage: true:请求中携带 usage 统计
另外该类还实现了WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE两个静态方法,说明模型可以被序列化进 AI SDK 的 workflow 编排系统中(如持久化、跨进程传输),集成复杂工作流时无需额外处理。
错误诊断解包机制:把真实报错从 details 里挖出来
这是 3.0.0 变更记录中 "unwrapped error diagnostics" 的落点,也是本包最具价值的设计。
问题背景
GMI Cloud 的边缘网关在请求被后端引擎拒绝时,error.message只返回一句通用横幅,例如Backend request failed with status 400,而真正的原因(如参数校验失败)被嵌套在error.details字段的 JSON 字符串中。如果不做处理,开发者拿到的错误信息毫无排查价值。
实现原理
错误解析结构定义在 gmicloud-error.ts:
- Schema 校验(L5-L13):用 zod 定义
gmicloudErrorDataSchema,声明error.message为必填字符串,error.details为可选字符串; - 解包逻辑(L17-L31):
unwrapDetailsMessage先做空值判断,再通过secureJsonParse(provider-utils 提供的安全 JSON 解析)尝试解析details,从中提取内层error.message; - 兜底策略:只有当内层 message 是合法 JSON、且为非空字符串时才替换外层横幅,否则回退到外层的
error.message; - 暴露结果:最终
AI_APICallError.message携带的是引擎的真实原因。
实际效果
经过解包后,错误信息从:
Backend request failed with status 400变为可直接定位问题的:
The request is invalid: Invalid max_tokens value, the valid range of max_tokens is [1, 393216]. Please check the request body, required fields, and request format.这一行为在 gmicloud-error.test.ts 中通过 7 个用例覆盖,测试数据均为 2026 年 8 月从api.gmi-serving.com/v1/chat/completions逐字捕获的真实响应体:
- max_tokens 越界:解包出
max_tokens合法范围[1, 393216]的提示; - 思考模式 tool_choice 冲突:解包出
Thinking mode does not support this tool_choice; - 图片输入不被支持:解包出
messages[0]: unknown variant 'image_url', expected 'text'(再次印证该平台仅支持文本消息); - details 缺失:回退到外层 banner;
- details 不是合法 JSON(如 nginx 返回的 HTML):回退到外层 banner;
- details 无内层 message:回退到外层 banner;
- 纯文本 404 响应:schema 校验失败,交回上层按状态码处理,不会误解析。
这套"解析 → 解包 → 兜底"的阶梯式设计保证了任何异常形态的错误响应都不会让解析器本身崩溃,同时把最可能有用的信息优先呈现给开发者。
测试与验证:双重环境覆盖
包的测试脚本同时运行 Node 与 Edge 两套环境(test:node/test:edge),分别使用 vitest.node.config.js 与 vitest.edge.config.js。
gmicloud-provider.test.ts 对工厂函数做了四组断言,直接印证了上文所述行为:
- 默认端点与默认 Key 环境变量:未传参数时,URL 拼接为
https://api.gmi-serving.com/v1/chat/completions,loadApiKey以GMI_CLOUD_APIKEY为环境变量名被调用,请求头包含Bearer mock-api-key与ai-sdk/gmicloud/0.0.0-testUser-Agent; - 错误结构与 usage:
provider.chat(...)创建的模型携带gmicloudErrorStructure且includeUsage为true; - 自定义 baseURL:传入
https://example.com/gmi后请求 URL 变为https://example.com/gmi/chat/completions; - 不支持的能力:
embeddingModel/imageModel均抛出NoSuchModelError。
你可以在仓库中运行pnpm --filter @ai-sdk/gmicloud test复现以上全部验证。
总结与使用建议
结合 CHANGELOG 与源码,使用@ai-sdk/gmicloud时有几点值得记住:
- 包很薄,依赖很稳:3.0.0 之后全部为依赖升级 Patch,公共 API 稳定,可以放心跟随升级;
- 模型 ID 是字符串:以
GET /v1/models的目录为准,新模型无需升级 SDK 即可接入; - 只用文本生成:Embedding、图像模型在当前版本会直接抛错,不要设计相关分支;
- 错误信息优先看解包后的 message:GMI 的真实错误原因已经替你从
details中挖出,排障时直接读AI_APICallError.message即可; - 代理与测试友好:
baseURL、headers、fetch三个配置项足以应对自建网关、附加鉴权与请求拦截/测试场景。
该包的官方使用文档位于仓库 content/providers/01-ai-sdk-providers/100-gmicloud.mdx,包发布时prepack脚本会将其同步进docs/目录随包分发(见 packages/gmicloud/package.json 的prepack配置),感兴趣可以对照阅读。
【免费下载链接】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),仅供参考