hubris

Vercel AI SDK

Подключение Hubris к Vercel AI SDK — библиотеке для LLM-приложений на TypeScript. Текст, инструменты, структурированный вывод и стриминг в React.

Vercel AI SDK — библиотека для приложений с языковыми моделями на TypeScript: единый интерфейс к провайдерам, вызов инструментов, структурированный вывод и готовые хуки для стриминга ответа в React.

Hubris подключается пакетом @ai-sdk/openai-compatible — отдельного провайдера не нужно.

Требования

  • Node.js 22+ (требование пакетов ai и @ai-sdk/openai-compatible начиная с версии 7)
  • npm install ai @ai-sdk/openai-compatible zod
  • Аккаунт на hubris.pw и API-ключ

Подключение

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

const hubris = createOpenAICompatible({
  name: 'hubris',
  baseURL: 'https://api.hubris.pw/v1',
  apiKey: process.env.HUBRIS_API_KEY,
  // Наши модели умеют response_format с JSON-схемой. Без этого флага
  // generateObject уйдёт в режим json_object — см. раздел ниже.
  supportsStructuredOutputs: true,
});

const { text } = await generateText({
  model: hubris('openai/gpt-5.6-luna'),
  prompt: 'Объясни, чем кэш промпта отличается от обычного ввода',
});

console.log(text);

Адрес — именно api.hubris.pw, с api. в начале и /v1 в конце. Домен hubris.pw — это сайт и личный кабинет: запросы к API он не обслуживает.

ID модели передаётся полностью, вместе с вендором: hubris('anthropic/claude-sonnet-5').

Структурированный вывод

Без supportsStructuredOutputs: true вызов generateObject падает с ошибкой:

Response input messages must contain the word 'json' in some form
to use 'text.format' of type 'json_object'.

Это правило OpenAI, а не наше: по умолчанию SDK просит режим json_object, а он требует слова «json» в самом промпте. С флагом SDK переходит на response_format с JSON-схемой, и требование снимается. Второй способ — оставить всё как есть и добавить слово «json» в промпт, но флаг чище: схема уходит модели, а не пересказывается словами.

import { generateObject } from 'ai';
import { z } from 'zod';

const { object } = await generateObject({
  model: hubris('openai/gpt-5.6-luna'),
  schema: z.object({ name: z.string(), age: z.number() }),
  prompt: 'Ivan is 28 years old',
});

console.log(object);
//> { name: 'Ivan', age: 28 }

Инструменты

import { generateText, tool } from 'ai';
import { z } from 'zod';

const { steps, text } = await generateText({
  model: hubris('openai/gpt-5.6-luna'),
  prompt: 'Сколько будет 17 плюс 25? Используй инструмент.',
  tools: {
    add: tool({
      description: 'Складывает два числа',
      inputSchema: z.object({ a: z.number(), b: z.number() }),
      execute: async ({ a, b }) => a + b,
    }),
  },
  stopWhen: ({ steps }) => steps.length >= 3,
});

Инструменты требуют от модели поддержки function calling — смотрите tools в supported_parameters карточки модели в каталоге.

Стриминг в приложении

import { streamText } from 'ai';

export async function POST(req: Request) {
  const { messages } = await req.json();

  const result = streamText({
    model: hubris('anthropic/claude-sonnet-5'),
    messages,
  });

  return result.toUIMessageStreamResponse();
}

Ключ читается на сервере из process.env — в браузер он не попадает. Не переносите createOpenAICompatible в клиентский компонент: ключ уедет в бандл.

Выбор моделей

IDКогда подходит
google/gemini-3.7-flashдешёвые ответы, большой поток запросов
openai/gpt-5.6-lunaуниверсальный выбор, структурированный вывод
anthropic/claude-sonnet-5длинный контекст, картинки, сложные схемы
deepseek/deepseek-v4-proнедорогое рассуждение и код

Каталог у нас открыт без ключа — список можно посмотреть прямо в браузере: api.hubris.pw/v1/models.

Решение проблем

generateObject падает с требованием слова «json»

Не выставлен supportsStructuredOutputs: true — см. раздел выше.

Ошибка авторизации

Ключ неверный или отозван. Он начинается на sk-gw-, без пробелов по краям. Новый — в разделе «Ключи».

Ошибка про модель

ID должен совпадать с каталожным символ в символ, вместе с вендором перед косой чертой. Короткие имена без вендора и имена с датой на конце мы не принимаем.

Ошибка про недостаточный баланс

Пополните баланс в кабинете — от 300 ₽, через СБП, банковской картой или по счёту для юридических лиц.

Проверено на Vercel AI SDK 7.0.94 (ai 7.0.94, @ai-sdk/openai-compatible 3.0.45, zod 4.5.4), 9 сентября 2026.

Что дальше

Обновлено: