AI SDK
Подключение Veda AI Gateway к AI SDK через провайдер @ai-sdk/openai-compatible. Генерация текста, потоковая передача, инструменты, рассуждения и изображения.
AI SDK это TypeScript-библиотека для приложений на языковых моделях. Veda подключается к ней как OpenAI-совместимый провайдер: запросы идут в формате Chat Completions на $VEDA_BASE_URL/v1. Примеры написаны для AI SDK 7.
Установка
npm install ai @ai-sdk/openai-compatibleПровайдер Veda
Создайте провайдер один раз и используйте его во всём приложении. Имя veda определяет ключ, под которым передаются настройки в providerOptions.
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
export const veda = createOpenAICompatible({
name: "veda",
apiKey: process.env.VEDA_API_KEY,
baseURL: `${process.env.VEDA_BASE_URL}/v1`,
});Модель выбирается идентификатором из каталога: veda("anthropic/claude-sonnet-5.5").
Генерация текста
import { generateText } from "ai";
import { veda } from "./lib/veda";
const { text, usage } = await generateText({
model: veda("anthropic/claude-sonnet-5.5"),
system: "Отвечай кратко.",
prompt: "Почему небо голубое?",
});
console.log(text, usage);Потоковая передача
import { streamText } from "ai";
import { veda } from "./lib/veda";
const result = streamText({
model: veda("openai/gpt-6.1-sol"),
prompt: "Напиши короткое стихотворение о море.",
});
for await (const delta of result.textStream) {
process.stdout.write(delta);
}Вызов инструментов
Инструменты описываются схемой Zod. stopWhen разрешает модели сделать несколько шагов: вызвать инструмент, получить результат и ответить.
import { generateText, isStepCount, tool } from "ai";
import { z } from "zod";
import { veda } from "./lib/veda";
const { text } = await generateText({
model: veda("anthropic/claude-sonnet-5.5"),
prompt: "Какая погода в Казани?",
stopWhen: isStepCount(3),
tools: {
getWeather: tool({
description: "Текущая погода в городе",
inputSchema: z.object({ location: z.string() }),
execute: async ({ location }) => ({ location, temperatureC: 18 }),
}),
},
});В AI SDK 5 и 6 условие остановки называется stepCountIs. Модель должна поддерживать вызов инструментов; это указано на её странице в каталоге.
Структурированный вывод
generateText с Output.object возвращает объект, проверенный по схеме Zod:
import { generateText, Output } from "ai";
import { z } from "zod";
import { veda } from "./lib/veda";
const { output } = await generateText({
model: veda("openai/gpt-6.1-sol"),
output: Output.object({
schema: z.object({ name: z.string(), age: z.number().int(), city: z.string() }),
}),
prompt: "Извлеки данные: Анна, 34 года, Новосибирск.",
});Чтобы провайдер передавал модели JSON-схему, добавьте supportsStructuredOutputs: true в настройки createOpenAICompatible. Включайте его для моделей, которые поддерживают структурированный вывод.
Рассуждения
Параметры, которых нет в общем интерфейсе AI SDK, передаются через providerOptions.veda и попадают в тело запроса как есть. Так задаётся объект reasoning:
import { generateText } from "ai";
import { veda } from "./lib/veda";
const { text } = await generateText({
model: veda("openai/gpt-6.1-sol"),
prompt: "Объясни парадокс Монти Холла по шагам.",
providerOptions: {
veda: { reasoning: { effort: "high" } },
},
});Для моделей без уровней используйте { max_tokens: 2048 } или { enabled: true }. Готовый пример для конкретной модели есть на её странице в каталоге.
Изображения на входе
import { generateText } from "ai";
import { veda } from "./lib/veda";
const { text } = await generateText({
model: veda("google/gemini-3.8-flash"),
messages: [
{
role: "user",
content: [
{ type: "text", text: "Опиши это изображение." },
{ type: "image", image: new URL("https://example.com/photo.jpg") },
],
},
],
});Атрибуция приложения
Заголовки X-Veda-App-* задаются в провайдере, чтобы статистика приложения собиралась отдельно:
export const veda = createOpenAICompatible({
name: "veda",
apiKey: process.env.VEDA_API_KEY,
baseURL: `${process.env.VEDA_BASE_URL}/v1`,
headers: { "X-Veda-App-Id": "my-assistant", "X-Veda-App-Name": "My Assistant" },
});Подробнее: Статистика приложений.
Ошибки
Ошибки Veda приходят как APICallError с кодом ответа в statusCode: 401 неверный или неактивный ключ, 402 лимит расходов, 429 ограничение частоты. AI SDK по умолчанию повторяет запросы при 429 и ошибках 5xx; повторы задаются параметром maxRetries. Полный список кодов в обзоре API.