跳到正文

Vercel AI SDK

用 OpenAI 兼容 provider 在 Vercel AI SDK 中调用 HopBase,含流式输出与工具调用。

Vercel 的 AI SDK 是构建 AI 应用的 TypeScript 工具包。HopBase 通过官方的 @ai-sdk/openai-compatible provider 接入;Claude 模型用 @ai-sdk/anthropic。

配置项值
包@ai-sdk/openai-compatible
baseURLhttps://api.hop-base.com/v1
apiKey控制台创建的密钥,以 Authorization: Bearer 发送
模型 ID用这把密钥调 GET /v1/models 返回的原样 ID,例如 deepseek-v4.1-flash-1017

已在生产环境用 ai 7.0 与 @ai-sdk/openai-compatible 3.0 实测:generateText、streamText 和 tool() 工具调用都正常,用量正常回传。

创建密钥时选含该模型的分组:

HopBase 的密钥只能调用它所含分组里的模型。在控制台创建密钥时,选中提供目标模型的分组——例如 deepseek-v4.1-flash-1017 选DeepSeek,deepseek-v4.1-flash-1017-sg 选DeepSeek 新加坡机房,gemini-3.8-flash 选Gemini 全系(含生图)。密钥不含该模型所在分组时会返回 404 model_not_found。

安装

npm i ai @ai-sdk/openai-compatible zod

把密钥放在环境变量里:

export HOPBASE_API_KEY=sk-your-key

创建 provider

import { createOpenAICompatible } from '@ai-sdk/openai-compatible';

export const hopbase = createOpenAICompatible({
  name: 'hopbase',
  baseURL: 'https://api.hop-base.com/v1',
  apiKey: process.env.HOPBASE_API_KEY,
  includeUsage: true, // report token usage on streamed responses
});

hopbase('<模型 ID>') 返回一个对话模型,ID 必须与 GET /v1/models 完全一致。

生成文本

import { generateText } from 'ai';
import { hopbase } from './hopbase';

const { text } = await generateText({
  model: hopbase('deepseek-v4.1-flash-1017'),
  prompt: 'Reply with one word: hello.',
});
console.log(text);

流式输出

import { streamText } from 'ai';
import { hopbase } from './hopbase';

const result = streamText({
  model: hopbase('deepseek-v4.1-flash-1017'),
  prompt: 'Count from 1 to 5.',
});
for await (const delta of result.textStream) process.stdout.write(delta);

工具调用

import { generateText, tool, stepCountIs } from 'ai';
import { z } from 'zod';
import { hopbase } from './hopbase';

const { text } = await generateText({
  model: hopbase('deepseek-v4.1-flash-1017'),
  tools: {
    getWeather: tool({
      description: 'Get the weather for a city',
      inputSchema: z.object({ city: z.string() }),
      execute: async ({ city }) => ({ city, tempC: 21 }),
    }),
  },
  stopWhen: stepCountIs(3),
  prompt: 'What is the weather in Tokyo? Use the tool.',
});
console.log(text);

换模型只需改 ID,例如用包含「Gemini 全系(含生图)」分组的密钥调用 hopbase('gemini-3.8-flash')。

Claude 模型

Claude 模型走 Anthropic Messages 协议。使用 @ai-sdk/anthropic,并且 baseURL 要保留 /v1:这个包会在后面拼上 /messages,请求最终发往 https://api.hop-base.com/v1/messages。

import { createAnthropic } from '@ai-sdk/anthropic';
import { generateText } from 'ai';

const hopbaseClaude = createAnthropic({
  baseURL: 'https://api.hop-base.com/v1',
  apiKey: process.env.HOPBASE_API_KEY,
});

const { text } = await generateText({
  model: hopbaseClaude('claude-sonnet-5-5'),
  prompt: 'Reply with one word: hello.',
});

密钥必须包含 Claude 分组。这一点与 Anthropic 官方 SDK 和 Claude Code 不同:后两者填不带路径的 https://api.hop-base.com,自己拼 /v1/messages。

各模型价格见价格页。

常见问题

现象原因
401进程里没有设置 HOPBASE_API_KEY,或密钥已停用
404 model_not_found密钥不含该模型所在分组,或 ID 写简了。重新查看 GET /v1/models
只有 @ai-sdk/anthropic 的请求失败baseURL 少了 /v1。请求地址必须以 /v1/messages 结尾
route_not_found密钥属于图片或视频分组,没有对话入口

下一步