Интеграция AI
Мультивендорная AI-интеграция на базе Vercel AI SDK с поддержкой 12 провайдеров и 100+ моделей
AI-слой предоставляет единый текстовый интерфейс для больших языковых моделей от разных провайдеров. Он построен на Vercel AI SDK и поддерживает динамическую настройку API key через админ-панель.
Архитектура
Структура модулей
| Файл | Описание |
|---|---|
src/integrations/ai/index.ts | Точка входа, getAIProvider(), извлечение конфигурации |
src/integrations/ai/providers.ts | Экземпляры провайдеров и маппинг моделей |
src/integrations/ai/models.ts | Метаданные моделей: id, label, capability, creditCost |
src/integrations/ai/types.ts | Типы |
src/integrations/ai/utils.ts | Утилиты |
Быстрый старт
Настройте API key
Откройте Admin → AI Config и заполните API key нужного провайдера. Можно также использовать переменные окружения.
Получите provider в API route
import { getAIProvider } from "@/integrations/ai"
import { streamText } from "ai"
export async function POST(req: Request) {
const provider = await getAIProvider()
const model = provider.languageModel("openai/gpt-4o")
const result = await streamText({
model,
messages: [{ role: "user", content: "Hello" }],
})
return result.toDataStreamResponse()
}Используйте метаданные моделей
import {
getModelConfig,
canUseModel,
hasVisionSupport,
getCreditCost,
getModelsByProvider,
} from "@/integrations/ai"
const model = getModelConfig("openai/gpt-4o")
const { canUse } = canUseModel("openai/gpt-4o", isProUser)
const hasVision = hasVisionSupport("openai/gpt-4o")
const cost = getCreditCost("openai/gpt-4o")
const openaiModels = getModelsByProvider("openai")Возможности моделей
Каждая модель содержит следующие метаданные capability:
| Возможность | Описание |
|---|---|
vision | Поддерживает входные изображения (мультимодальность) |
reasoning | Поддерживает расширенное мышление и chain-of-thought |
pdf | Поддерживает обработку PDF-документов |
Справочник функций
| Функция | Описание |
|---|---|
getModelConfig(modelId) | Получить метаданные модели по ID |
canUseModel(modelId, isProUser) | Проверить, доступна ли модель пользователю |
hasVisionSupport(modelId) | Есть ли поддержка vision |
hasReasoningSupport(modelId) | Есть ли поддержка reasoning |
hasPdfSupport(modelId) | Есть ли поддержка PDF |
getMaxOutputTokens(modelId) | Максимальное число output tokens |
getModelParameters(modelId) | Значения по умолчанию параметров модели |
getCreditCost(modelId) | Стоимость одного вызова в кредитах |
getModelsByProvider(provider) | Список моделей по провайдеру |
getModelsByTier(tier) | Список моделей по уровню (free / pro) |
getAvailableProviders() | Все провайдеры, у которых есть модели |
getAllModels() | Все модели |
Уровни моделей
- free: доступно всем пользователям
- pro: требуется подписка Pro (
canUseModelэто проверяет)
Поддерживаемые провайдеры
| Провайдер | Кол-во моделей | Конфиг |
|---|---|---|
| OpenAI | 22 | ai_openai_api_key, ai_openai_base_url |
| Anthropic | 5 | ai_anthropic_api_key |
| 10 | ai_google_api_key | |
| xAI | 9 | ai_xai_api_key |
| Groq | 6 | ai_groq_api_key |
| Mistral | 11 | ai_mistral_api_key |
| Cohere | 3 | ai_cohere_api_key |
| DeepSeek | 2 | ai_deepseek_api_key, ai_deepseek_base_url |
| HuggingFace | 11 | ai_huggingface_api_key |
| Novita | 21 | ai_novita_api_key |
| SiliconFlow | 2 | ai_siliconflow_api_key |
| Baseten | 6 | ai_baseten_api_key |
Сводный список моделей
| Провайдер | Кол-во | Примеры |
|---|---|---|
| OpenAI | 22 | gpt-4o, gpt-5, o3, o4-mini, gpt-5.1-codex, gpt-oss-20b |
| Anthropic | 5 | claude-haiku-4-5, claude-sonnet-4-5, claude-opus-4-5 |
| 10 | gemini-2.0-flash, gemini-2.5-pro, gemini-3-flash | |
| xAI | 9 | grok-3-mini, grok-4, grok-4-fast-thinking, grok-code |
| Groq | 6 | llama-3.3-70b, qwen3-32b, kimi-k2 |
| Mistral | 11 | ministral-3b, mistral-large, codestral, devstral |
| Cohere | 3 | command-a, command-a-thinking, command-r-plus |
| DeepSeek | 2 | deepseek-chat, deepseek-reasoner |
| HuggingFace | 11 | qwen3-4b, qwen3-30b, qwen3-235b |
| Novita | 21 | deepseek-v3.2, qwen3-coder-30b, glm-4.5, minimax-m2 |
| SiliconFlow | 2 | deepseek-v3, qwen-2.5-72b |
| Baseten | 6 | deepseek-v3, qwen3-coder-480b, glm-4.7, kimi-k2 |
Reasoning модели
Модели с capabilities.reasoning: true используют extractReasoningMiddleware. Логика reasoning помещается в теги <think> и затем удаляется из финального вывода. Если для модели есть рекомендуемые параметры, их можно получить через getModelParameters.
Формат ID модели
Формат ID модели: provider/model-name, например openai/gpt-4o, anthropic/claude-sonnet-4-5, deepseek/deepseek-v3.2. Именно этот ID используется при вызове provider.languageModel(id).
Расширение
Подключение нового провайдера
1. Типы (types.ts)
Добавьте в AIProviderKey:
export type AIProviderKey =
| "openai"
| "newprovider" // added
| ...2. Экземпляр провайдера (providers.ts)
Инициализируйте его в createProviderInstances и зарегистрируйте модели в languageModels.
...(p.newprovider && {
"newprovider/model-id": p.newprovider.chatModel("actual vendor model id"),
})3. Конфигурация (dynamic-config.ts)
Добавьте новый параметр конфигурации и подгруппу в aiConfigGroups.
4. Интернационализация и извлечение конфигурации
Добавьте текст в config.content.ts, а в index.ts сопоставьте его в extractProviderConfigs.
Подключение новой модели у существующего провайдера
1. Зарегистрируйте в providers.ts
"openai/new-model": p.openai("openai actual model name")2. Добавьте метаданные в models.ts
{
id: "openai/new-model",
label: "New Model Name",
provider: "openai",
providerModelId: "openai actual model name",
capabilities: { vision: false, reasoning: false, pdf: false },
tier: "free",
maxOutputTokens: 16384,
creditCost: 1,
}Чеклист
| Шаг | Новый провайдер | Новая модель |
|---|---|---|
types.ts | Дополнить AIProviderKey | — |
providers.ts | Экземпляр и languageModels | Дополнить languageModels |
models.ts | — | Дополнить метаданные |
dynamic-config.ts | Параметр и подгруппа | — |
config.content.ts | Интернационализация | — |
index.ts | extractProviderConfigs | — |