Назад до журналу
6 хв читання

Створення відмовостійкого рівня маршрутизації ШІ між кількома провайдерами з Vercel AI SDK

Практичний посібник із побудови промилового рівня маршрутизації LLM з автоматичним переключенням при відмові (failover), резервними моделями та валідацією структурованого виводу за допомогою Zod та Vercel AI SDK.

Vercel AI SDKTypeScriptLLM RoutingZodAI Engineering
Створення відмовостійкого рівня маршрутизації ШІ між кількома провайдерами з Vercel AI SDK

При розгортанні великих мовних моделей (LLM) у продакшені надійність часто є головним вузьким місцем. Опора на одного провайдера моделей створює ризики виникнення єдиної точки відмови: обмеження на кількість запитів до API (HTTP 429), тимчасові збої в роботі сервісу (HTTP 500/503) або раптові скачки затримки.

Щоб гарантувати безперебійну роботу та економічну ефективність, командам потрібен рівень динамічної маршрутизації, який може автоматично переключатися на резервные моделі або змінювати провайдерів залежно від вхідних параметрів.

У цьому посібнику ми реалізуємо відмовостійкий та типізований рівень маршрутизації між кількома провайдерами за допомогою Vercel AI SDK та Zod.


Архітектура відмовостійності LLM

Відмовостійкий рівень маршрутизації працює на основі трьох ключових принципів:

  1. Послідовне переключення при відмові (Failover): якщо основний провайдер недоступний, система автоматично повторює запит, використовуючи резервного провайдера.
  2. Динамічний вибір: короткі промпти направляються у швидкі та недорогі моделі, тоді як великі вхідні дані надсилаються у моделі з більшим контекстним вікном.
  3. Безпечна валідація типів: незалежно від того, яка модель обробляє запит, схема виводу залишається ідентичною та перевіреною.
               +-------------------+
               |  Incoming Request |
               +-------------------+
                         |
                         v
             +-----------------------+
             | Dynamic Route Selector|
             +-----------------------+
               /                   \
        (Short Input)          (Long Input)
             /                       \
            v                         v
   +-----------------+       +-----------------+
   |  Primary Model  |       |  Primary Model  |
   | (OpenAI Luna)   |       | (Gemini-3.1-Pro)|
   +-----------------+       +-----------------+
            |                         |
       (On Failure)              (On Failure)
            v                         v
   +-----------------+       +-----------------+
   | Fallback Model  |       | Fallback Model  |
   | (Gemini-3.5-Fl) |       | (Claude-Sonnet5)|
   +-----------------+       +-----------------+
            \                         /
             \                       /
              v                     v
            +-------------------------+
            |  Zod Schema Validation  |
            +-------------------------+
                        |
                        v
               +-------------------+
               | Validated Output  |
               +-------------------+

Реалізація резервних моделей за допомогою Vercel AI SDK

Vercel AI SDK надає вбудовану обгортку fallback, яка дозволяє вказати пріоритетний список моделей. Якщо виклик першої моделі завершується помилкою, SDK автоматично повторює спробу, використовуючи наступні моделі з масиву.

Ось як можна ініціалізувати відмовостійку модель із резервними провайдерами:

import { fallback } from 'ai';
import { openai } from '@ai-sdk/openai';
import { google } from '@ai-sdk/google';
import { anthropic } from '@ai-sdk/anthropic';

// Initialize a resilient model that crosses three distinct providers
export const resilientModel = fallback([
  openai('terra'),
  anthropic('claude-sonnet-5'),
  google('gemini-3.1-pro')
]);

При виклику функцій generateText або generateObject з використанням resilientModel SDK автоматично обробляє помилки, таймаути та повторні спроби.

Локальне резервування з Ollama

Для автономної роботи, гібридних середовищ або безкоштовного виконання запитів під час локального тестування ви можете інтегрувати локально розгорнуті моделі через Ollama. Vercel AI SDK працює з моделями Ollama як з першокласними провайдерами, дозволяючи напряму переходити з хмарних API на локальне обладнання (локальний кремній).

Ось як налаштовується гібридне хмарно-локальне резервування:

import { fallback } from 'ai';
import { openai } from '@ai-sdk/openai';
import { ollama } from '@ai-sdk/ollama';

// Fallback to a locally hosted Llama 4 Scout model if the OpenAI API is unreachable
export const hybridModel = fallback([
  openai('luna'),
  ollama('llama4-scout')
]);

Безпечне вилучення структурованих даних з контролем типів

Однією з проблем маршрутизації між кількома провайдерами є забезпечення того, щоб різні моделі строго слідували одній і тій самій структурі виводу. Використання бібліотеки Zod спільно з API generateObject вирішує це завдання.

Визначимо схему для вилучення структурованих метаданих з необроблених профілів розробників:

import { generateObject } from 'ai';
import { z } from 'zod';
import { resilientModel } from './models';

const ProfileSchema = z.object({
  fullName: z.string(),
  skills: z.array(z.string()),
  yearsOfExperience: z.number(),
  certifications: z.array(
    z.object({
      name: z.string(),
      issuer: z.string()
    })
  )
});

export async function extractProfile(text: string) {
  try {
    const { object } = await generateObject({
      model: resilientModel,
      schema: ProfileSchema,
      prompt: `Extract structured profile details from the following resume text:\n\n${text}`
    });

    return object;
  } catch (error) {
    console.error('Failed to extract profile after exhausting all fallbacks:', error);
    throw new Error('Profile extraction failed');
  }
}

Оскільки вихідні дані аналізуються та валідуються за допомогою Zod під час виконання програми, ваш код може бути повністю впевнений в отриманій структурі, незалежно від того, яка модель із ланцюжка резервування виконала запит успішно.


Динамічна маршрутизація на основі розміру контексту

Хоча послідовні резервні виклики захищають від повного простою, вони не оптимізують витрати або ліміти токенів. Наприклад, надсилання документа обсягом 100 000 токенів у модель із лімітом 128 000 токенів є допустимим, но надсилання його в модель із лімітом 16 000 токенів призведе до миттєвої помилки.

Ми можемо побудувати динамічний маршрутизатор, який перевіряє розмір вхідних даних перед вибором ланцюжка моделей:

import { LanguageModel, generateText } from 'ai';
import { openai } from '@ai-sdk/openai';
import { google } from '@ai-sdk/google';
import { anthropic } from '@ai-sdk/anthropic';

// Define specialized model chains
const standardChain = fallback([
  openai('luna'),
  google('gemini-3.5-flash')
]);

const highContextChain = fallback([
  google('gemini-3.1-pro'),
  anthropic('claude-sonnet-5')
]);

// Estimate token count (simple word-count approximation for demo)
function estimateTokens(text: string): number {
  return text.trim().split(/\s+/).length * 1.3;
}

export async function smartRouteRequest(promptText: string) {
  const tokenEstimate = estimateTokens(promptText);
  
  // Route to the appropriate chain based on input size
  const model = tokenEstimate > 50000 ? highContextChain : standardChain;

  return generateText({
    model,
    prompt: promptText
  });
}

Такий патерн дозволяє мінімізувати витрати, направляючи стандартні завдання на недорогі та швидкі моделі, зберігаючи преміум-моделі з великими контекстними вікнами для важких навантажень.


Телеметрія та спостережуваність (Observability)

Щоб відстежувати, як часто ваш рівень маршрутизації звертається до резервних моделей, ви можете підключити експериментальні функції телеметрії Vercel AI SDK. Це дозволить збирати метрики використання токенів, затримки та показники успішності провайдерів:

import { generateText } from 'ai';
import { resilientModel } from './models';

const response = await generateText({
  model: resilientModel,
  prompt: 'Analyze this log output...',
  experimental_telemetry: {
    isEnabled: true,
    functionId: 'analyze-logs',
    metadata: {
      environment: 'production'
    }
  }
});

Ці трасування передаються в стандартні колектори OpenTelemetry, надаючи вашій команді повну видимість процесів переключення та стану провайдерів.


Висновок і компроміси

Маршрутизація між кількома провайдерами значно підвищує надійність. Проте, важливо враховувати такі компроміси:

  • Відмінності в стилі виводу: резервні моделі можуть відрізнятися за стилем викладу, нюансами форматування або рівнем відповідності правилам.
  • Холодний старт: повторна спроба запиту, що зазнав невдачі, на резервній моделі збільшує час очікування для користувача.
  • Ключі API провайдерів: вашій інфраструктурі потрібно буде налаштовувати та підтримувати ключі API, рівні лімітів запитів та білінгові акаунти для кількох вендорів.

Використовуючи уніфіковані інтерфейси API Vercel AI SDK, ви можете побудувати високонадійну архітектуру маршрутизації, яка захистить ваші промислові додатки від збоїв окремих провайдерів.

Share this article