TeamoRouter в Vercel AI SDK
Vercel AI SDK (пакет ai) подключается к TeamoRouter через OpenAI-совместимый провайдер: укажите base URL TeamoRouter, передайте ваш API-ключ TeamoRouter и используйте ID моделей из нашего каталога. Код с generateText, streamText и инструментами менять не нужно.
У нового аккаунта баланс $0 — пополните его до первого запроса. Пополнить можно от $5. Если запрос возвращает 402 (400 для формата OpenAI) с текстом «wallet balance is insufficient», значит, баланс пуст, а base URL и ключ настроены правильно. Пополните баланс и повторите запрос.
1. Установка и настройка
Создайте API-ключ в панели TeamoRouter и сохраните его в переменной окружения:
npm install ai @ai-sdk/openai-compatible zod
export TEAMOROUTER_API_KEY=sk-teamo-...
Создайте провайдер один раз и используйте его везде:
// teamorouter.ts
import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
export const teamorouter = createOpenAICompatible({
name: 'teamorouter',
baseURL: 'https://api.teamorouter.cn/v1',
apiKey: process.env.TEAMOROUTER_API_KEY,
includeUsage: true, // возвращать расход токенов и при стриминге
});
| Параметр | Значение |
|---|---|
| Base URL | https://api.teamorouter.cn/v1 |
| API-ключ | sk-teamo-..., передаётся как Authorization: Bearer |
| ID модели | ID из нашего каталога без префикса vendor/, например deepseek-flash |
Доступные ID моделей:
DeepSeek6
deepseek-flashdeepseek-flash-freedeepseek-v4-flash-vision-expdeepseek-v4-prodeepseek-v4-flashdeepseek-v4-flash-free
GLM4
glm-5.3-flashglm-5.3-flash-freeglm-5.3glm-5.2
2. generateText и streamText
import { generateText, streamText } from 'ai';
import { teamorouter } from './teamorouter';
const { text, usage } = await generateText({
model: teamorouter('deepseek-flash'),
prompt: 'Объясни в одном предложении, что делает API-шлюз.',
});
console.log(text, usage);
const result = streamText({
model: teamorouter('deepseek-flash'),
prompt: 'Напиши хайку о задержках в сети.',
});
for await (const chunk of result.textStream) {
process.stdout.write(chunk);
}
3. Вызов инструментов
import { generateText, tool, stepCountIs } from 'ai';
import { z } from 'zod';
import { teamorouter } from './teamorouter';
const { text } = await generateText({
model: teamorouter('deepseek-flash'),
tools: {
getWeather: tool({
description: 'Узнать текущую температуру в городе',
inputSchema: z.object({ city: z.string() }),
execute: async ({ city }) => ({ city, temperatureC: 22 }),
}),
},
stopWhen: stepCountIs(3), // модель сначала вызывает инструмент, потом отвечает
prompt: 'Какая сейчас погода в Шанхае?',
});
console.log(text);
Возможные ошибки
| Код | Что значит | Что делать |
|---|---|---|
| 401 | Ключ не передан или неверный | Проверьте TEAMOROUTER_API_KEY: ключ должен начинаться с sk-teamo- |
| 402 (400 для формата OpenAI) с «wallet balance is insufficient» | Баланс $0 | Пополните баланс и повторите |
400 model_not_available |
ID модели нет в каталоге или у него префикс vendor/ |
Возьмите ID из списка выше без префикса |
Сырые HTTP-эндпоинты, стриминг и кэширование описаны в руководстве по API.