Ui: подробный разбор популярного ИИ-проекта для разработчиков (2026)
Ui: подробный разбор популярного ИИ-проекта для разработчиков (2026)
В 2:17 утра с моделью всё было в порядке. С продуктом — нет.
Наш ассистент с дополненной поиском генерацией выдавал ответы, подкреплённые источниками, примерно за 1.8 секунд по p95, корректно передавал токены потоком и показывал достойные результаты оценок. Но интерфейс вокруг него тормозил работу команды: оформление сообщений в чате было несогласованным, ссылки на источники было трудно просматривать, индикаторы загрузки перескакивали, выдвижная панель настроек нарушала навигацию с клавиатуры, а каждое «быстрое исправление интерфейса» превращалось в очередной спор о дизайн-системе.
Именно эту инженерную задачу shadcn-ui/ui успешно решает: не «сделать ИИ умнее», а упростить создание, сопровождение и изменение интерфейса продукта вокруг ИИ-систем.
Репозиторий GitHub shadcn-ui/ui стал одним из важнейших UI-проектов с открытым исходным кодом для команд, создающих современные веб-приложения, включая ИИ-продукты. Он описывает себя как «набор красиво оформленных, доступных компонентов и платформу распространения кода» с поддержкой популярных фреймворков и тем, связанных с base-ui, components, laravel, nextjs, radix-uiи react.
Ключевая идея обманчиво проста: вместо того чтобы устанавливать закрытую библиотеку компонентов как зависимость и бороться с её абстракциями, вы копируете исходный код компонентов в свой проект. Он принадлежит вам. Вы можете его редактировать. Вы можете удалить всё ненужное.
Эта модель особенно важна для ИИ-приложений, где интерфейс — не просто оформление. Это панель управления промптами, инструментами, трассировками, загрузками файлов, ссылками на источники, согласованиями, потоковым выводом, восстановлением после ошибок и обратной связью от пользователей.
Инженерная задача: ИИ-приложениям быстро нужен интерфейс уровня полноценного продукта
Большинство команд, разрабатывающих ИИ-приложения, недооценивают масштаб интерфейса.
«Простое приложение для чата» обычно превращается в:
- Ленту сообщений с потоковым выводом
- Элементы управления промптами и системными инструкциями
- Выбор модели среди GPT, Claude, Gemini, Llama, Qwen, DeepSeek, Kimi или внутренних конечных точек
- Загрузку файлов и отображение состояния их разбора
- Отображение источников, найденных при поиске
- Просмотр вызовов инструментов
- Панели оценки и отладки
- Состояния аутентификации и оплаты
- Процессы согласования с человеком
- Обработку ошибок из-за ограничений частоты запросов, тайм-аутов, переполнения контекста и фильтров безопасности
Бэкенд может быть сложнее интеллектуально, но именно фронтенд принимает на себя все шероховатости, которые пользователи ощущают на практике.
Традиционные библиотеки компонентов помогают, но часто создают другие издержки:
- Вы зависите от абстракций на уровне пакета, которые непросто изменить.
- Переопределения стилей становятся хрупкими.
- Доступность обеспечивается лишь частично, если вы не понимаете базовые компоненты.
- Вы поставляете больше кода, чем необходимо.
- Ваше приложение начинает выглядеть как любое другое приложение на той же библиотеке.
shadcn-ui/ui предлагает иной подход: компоненты — это не продукт, который вы используете во время выполнения, а исходный код, который вы включаете в свой проект.
На практике это меняет модель сопровождения. Если отступы кнопок не подходят для вашего процесса проверки с помощью ИИ, вы редактируете components/ui/button.tsx. Если вашему меню команд нужны индикаторы задержки моделей, вы изменяете его напрямую. Если карточка источника должна показывать оценки релевантности поиска или фрагменты документов, вы полностью контролируете разметку.
Это звучит обыденно, пока вам не приходится каждую неделю выпускать специализированный ИИ-интерфейс.
Что означает shadcn-ui/ui на самом деле
Проект лучше всего рассматривать как две связанные составляющие:
- Коллекция компонентов
- Платформа распространения кода
Коллекция компонентов предоставляет переиспользуемые строительные блоки UI: кнопки, диалоговые окна, карточки, поля ввода, таблицы, меню, выдвижные панели, формы, палитры команд и другие подобные примитивы, встречающиеся в современных веб-приложениях.
Необычным этот проект делает модель распространения. Вместо такого подхода:
npm install some-ui-library
и импорта компонентов с непрозрачной реализацией из node_modules, типичный shadcn/ui рабочий процесс добавляет исходные файлы компонентов в ваше приложение:
npx shadcn@latest init
npx shadcn@latest add button card dialog input textarea
Затем вы импортируете их из своего локального проекта:
import { Button } from "@/components/ui/button"
import {
Card,
CardContent,
CardHeader,
CardTitle,
} from "@/components/ui/card"
Разница здесь архитектурная, а не косметическая. Компонент становится частью вашей кодовой базы. Вы можете изучать его, проводить рефакторинг, адаптировать к своим дизайн-токенам или интегрировать в соответствии с соглашениями своего фреймворка.
Экосистема проекта часто пересекается с React, Next.js, Radix UI, утилитарными классами в стиле Tailwind CSS и интеграциями с фреймворками. Среди тем репозитория также есть Laravel, что отражает более широкую цель: это не просто набор React-компонентов, а подход к распространению кода для переиспользуемого UI в разных стеках приложений.
Архитектура: компоненты в вашей кодовой базе вместо абстракций времени выполнения
Проще всего объяснить архитектуру через сравнение границ владения кодом.
| Подход | Где находятся компоненты | Модель настройки | Модель обновления | Лучше всего подходит для |
|---|---|---|---|---|
| Традиционный пакет UI | node_modules | Пропсы, темы, переопределения | Обновление пакета | Стандартизированные приложения с ограниченными возможностями настройки |
| Примитивы без готового визуального оформления | node_modules плюс разметка приложения | Самостоятельная сборка поведения | Обновление пакета | Команды с глубокой экспертизой во фронтенде |
shadcn/ui стиль | Ваше дерево исходного кода | Прямое редактирование кода компонентов | Повторное добавление, сравнение изменений или ручное обновление | Продуктовые команды, которым нужны скорость и контроль |
| Полностью собственная дизайн-система | Ваше дерево исходного кода / пакеты | Полное владение | Внутренний процесс | Крупные организации с командами, отвечающими за дизайн-системы |
shadcn-ui/ui занимает промежуточное положение между библиотекой компонентов и стартовым набором для дизайн-системы. Вы получаете работающие компоненты, но проект не предполагает, что они должны оставаться неизменными.
Типичный стек выглядит так:
app/
chat/
page.tsx
components/
ai/
model-picker.tsx
message-list.tsx
citation-card.tsx
tool-call-panel.tsx
ui/
button.tsx
card.tsx
dialog.tsx
input.tsx
sheet.tsx
textarea.tsx
lib/
ai/
stream.ts
models.ts
retrieval.ts
Ключевая граница — components/ui. Это универсальные примитивы. Ваши интерфейсы, специфичные для ИИ, располагаются уровнем выше, в components/ai.
Полезное практическое правило:
components/ui: универсальные, переиспользуемые, без излишествcomponents/ai: специфичные для продукта сценарии взаимодействия с ИИlib/ai: маршрутизация моделей, потоковая передача, поиск, выполнение инструментовapp/: маршрутизация фреймворка, серверные действия, компоновка страниц
Это не позволяет превратить примитивы UI в свалку поведения, специфичного для отдельных моделей.
Реалистичный рабочий процесс: создание консоли проверки ответов ИИ
Предположим, вы создаёте внутреннюю консоль проверки ответов ИИ для обращений в службу поддержки. Бэкенд выполняет поиск по предыдущим обращениям и готовит предлагаемые ответы с помощью модели, такой как GPT-5.5, Claude Sonnet 4.6, Gemini 3, или эндпоинта открытой модели. Фронтенд должен показывать:
- Обращение клиента
- Сгенерированный черновик
- Найденные подтверждающие материалы
- Индикатор уверенности
- Действие для одобрения человеком
- Выбор модели для отладки
Начните с добавления базовых компонентов UI:
npx shadcn@latest init
npx shadcn@latest add button card badge textarea select separator skeleton
Затем явно задайте конфигурацию модели. Не скрывайте её в подписях интерфейса.
// lib/ai/models.ts
export type ModelId =
| "gpt-5.5"
| "claude-sonnet-4.6"
| "gemini-3"
| "qwen"
| "deepseek"
export const models: Array<{
id: ModelId
label: string
contextHint: string
}> = [
{
id: "gpt-5.5",
label: "GPT-5.5",
contextHint: "General reasoning and agentic workflows",
},
{
id: "claude-sonnet-4.6",
label: "Claude Sonnet 4.6",
contextHint: "Long-form drafting and coding workflows",
},
{
id: "gemini-3",
label: "Gemini 3",
contextHint: "Multimodal and general assistant tasks",
},
{
id: "qwen",
label: "Qwen",
contextHint: "Open-model route",
},
{
id: "deepseek",
label: "DeepSeek",
contextHint: "Open-model route",
},
]
Теперь соберите панель проверки из локальных компонентов UI:
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import {
Card,
CardContent,
CardHeader,
CardTitle,
} from "@/components/ui/card"
import { Textarea } from "@/components/ui/textarea"
type Evidence = {
title: string
snippet: string
score?: number
}
export function TicketReviewCard({
ticket,
draft,
evidence,
isStreaming,
}: {
ticket: string
draft: string
evidence: Evidence[]
isStreaming: boolean
}) {
return (
<Card>
<CardHeader>
<CardTitle>AI Draft Review</CardTitle>
</CardHeader>
<CardContent className="space-y-6">
<section className="space-y-2">
<Badge variant="secondary">Customer ticket</Badge>
<p className="text-sm leading-6 text-muted-foreground">{ticket}</p>
</section>
<section className="space-y-2">
<Badge>{isStreaming ? "Generating" : "Draft ready"}</Badge>
<Textarea value={draft} className="min-h-40" readOnly />
</section>
<section className="space-y-3">
<h3 className="text-sm font-medium">Retrieved evidence</h3>
{evidence.map((item) => (
<div key={item.title} className="rounded-md border p-3">
<div className="flex items-center justify-between">
<p className="text-sm font-medium">{item.title}</p>
{item.score !== undefined && (
<span className="text-xs text-muted-foreground">
score {item.score.toFixed(2)}
</span>
)}
</div>
<p className="mt-2 text-sm text-muted-foreground">
{item.snippet}
</p>
</div>
))}
</section>
<div className="flex gap-2">
<Button>Approve reply</Button>
<Button variant="outline">Request revision</Button>
</div>
</CardContent>
</Card>
)
}
Именно здесь окупается подход, при котором исходный код находится под вашим контролем. Если для кнопки одобрения нужен специальный диалог подтверждения для журнала аудита, вам не придётся ждать, пока библиотека предоставит нужный пропс. Если блоку подтверждающих материалов нужны сочетания клавиш, особая обработка фокуса или компактное оформление для корпоративного интерфейса, вы можете реализовать это прямо на основе локальных примитивов.
Место в современном стеке ИИ
shadcn-ui/ui не является фреймворком инференса, векторной базой данных, маршрутизатором моделей или средой выполнения агентов. Его место — на продуктовом уровне.
Типичный стек ИИ в 2026 выглядит так:
User Interface
Next.js / React / Laravel frontend
shadcn-style components
streaming state and interaction design
Application Layer
auth, billing, projects, teams
prompt templates
eval dashboards
human approval workflows
AI Orchestration
model routing
tool execution
retry and timeout policies
structured outputs
Model Providers
Claude Opus 4.8 / Sonnet 4.6 / Haiku 4.5
GPT-5.5
Gemini 3
Fable 5 with large-context workflows
Llama / Qwen / DeepSeek / MiniMax / Kimi
Data Layer
vector search
document stores
event logs
traces and feedback
Именно на уровне UI пользователи решают, доверяют ли они системе. В продуктах с ИИ доверие часто зависит от повседневных деталей интерфейса:
- Делает ли потоковая передача ход работы видимым?
- Удобно ли читать найденные источники?
- Могут ли пользователи просматривать вызовы инструментов?
- Понятно ли, когда модель не уверена?
- Может ли человек изменить результат?
- Требуется ли подтверждение для разрушительных действий?
- Работает ли навигация с клавиатуры в насыщенных сценариях проверки?
Примитивы компонентов помогают решить эти вопросы, но не решают их автоматически. Вам всё равно нужно принимать продуманные продуктовые решения.
Распространённая ловушка: команды создают красивое окно чата и забывают о сценариях отладки. Затем возникает первая проблема в рабочей среде — неудачный поиск, неверная маршрутизация модели, некорректный JSON, тайм-аут инструмента — и оказывается, что интерфейса для выяснения произошедшего нет. Когда исходный код компонентов находится под вашим контролем, легко создавать внутренние панели для трассировок, содержимого запросов с промптами, замеров задержек и решений моделей без подключения отдельного фреймворка административного UI.
Например, наглядно представьте данные о времени выполнения:
{
"request_id": "req_92f1",
"model": "claude-sonnet-4.6",
"retrieval_ms": 142,
"first_token_ms": 610,
"total_ms": 1840,
"input_tokens": 3912,
"output_tokens": 428
}
Затем отобразите их в небольшой диагностической карточке для внутренних пользователей. Это нужно не каждому пользователю, но со временем понадобится каждой команде инженеров ИИ.
Кому стоит использовать этот подход
shadcn-ui/ui хорошо подходит командам, которые хотят получить контроль, не начиная с нуля.
Используйте его, если:
- Вы создаёте продукт, в котором активно используются React или Next.js.
- Вам нужны современные примитивы UI с поддержкой доступности.
- Вы планируете глубоко настраивать компоненты.
- Вы хотите владеть исходным кодом, а не зависеть от поведения библиотеки как чёрного ящика.
- В вашем приложении есть рабочие процессы с ИИ, для которых нужны специализированные панели, временные шкалы, редакторы или состояния проверки.
- Ваша команда уверенно справляется с поддержкой фронтенд-кода.
Этот подход особенно полезен для продуктов с ИИ, в которых UI не ограничивается статичной панелью мониторинга. Редакторы промптов, представления оценок, временные шкалы чатов, трассировки агентов и очереди одобрения требуют специально продуманного взаимодействия.
Проявите больше осторожности, если:
- Ваша команда хочет полностью готовую корпоративную дизайн-систему.
- Вы не хотите хранить код компонентов в своём репозитории.
- Вам не хватает экспертизы во фронтенде для поддержки скопированных компонентов.
- Вам нужно строгое централизованное управление дизайном во множестве приложений.
- Вы ожидаете, что обновления пакетов автоматически решат задачи поддержки UI.
Другими словами, shadcn-ui/ui даёт вам владение кодом. Это широкие возможности, но они требуют затрат.
Плюсы, минусы и ограничения
Что работает хорошо
Главное преимущество — локальный контроль. Вы можете изучить каждый компонент, понять, что попадает в приложение, и адаптировать его под свои нужды. Для интерфейсов ИИ это особенно практично, поскольку требования к продукту быстро меняются.
Другие сильные стороны:
- Основа с поддержкой доступности: Экосистема обычно опирается на примитивы, разработанные с учётом доступности, такие как Radix UI.
- Хорошее оформление по умолчанию: Компоненты достаточно доработаны, чтобы использовать их сразу.
- Комбинируемая структура: Компоненты хорошо подходят в качестве строительных блоков для интерфейсов, специфичных для продукта.
- Минимум навязанных абстракций: Вам не приходится подстраиваться под огромный API компонентов.
- Ориентация на совместимость с фреймворками: Ориентация проекта на распространение кода позволяет адаптировать его для приложений разных типов, не ограничиваясь одним узким форматом.
Что может создать проблемы
Главный недостаток — сопровождение. Как только код попадает в ваш репозиторий, ответственность за него ложится на вас.
Это означает:
- Когда в исходном проекте улучшаются подходы к реализации, вам нужно вручную отслеживать изменения.
- В разных приложениях реализации компонентов могут постепенно расходиться.
- Разработчики могут чрезмерно настраивать примитивы вместо того, чтобы собирать на их основе компоненты более высокого уровня.
- Единообразие дизайна требует дисциплины.
- Доступность может ухудшиться, если локальные правки нарушат управление фокусом или семантику.
Конкретный пример: компонент диалогового окна изначально может быть доступным, но разработчик в спешке всё равно способен удалить нужные подписи, нарушить возврат фокуса или скрыть важное состояние от программ чтения с экрана. Владение исходным кодом не избавляет от работы над доступностью; оно делает реализацию видимой.
Ещё одно ограничение: shadcn-ui/ui не определяет модель взаимодействия с ИИ. Он не подскажет, как отображать неопределённость, сравнивать ответы моделей или проектировать безопасный процесс подтверждения действий. Он предоставляет качественные строительные блоки, а не готовый ИИ-продукт.
Практические рекомендации по архитектуре
На практике я рекомендую рассматривать shadcn/ui компоненты как локальный платформенный слой.
Не усложняйте универсальные компоненты интерфейса:
components/ui/button.tsx
components/ui/dialog.tsx
components/ui/table.tsx
components/ui/tabs.tsx
Создавайте компоненты для ИИ отдельно:
components/ai/model-selector.tsx
components/ai/streaming-message.tsx
components/ai/retrieval-sources.tsx
components/ai/tool-call-log.tsx
components/ai/eval-result-card.tsx
Избегайте этого антипаттерна:
components/ui/ai-button.tsx
components/ui/prompt-dialog.tsx
components/ui/rag-card.tsx
Как только специфичные для ИИ концепции проникают в components/ui, повторно использовать примитивы становится сложнее.
В ИИ-приложениях, чувствительных к задержкам, также избегайте прямой привязки состояния интерфейса к одному огромному объекту ответа. Потоковые интерфейсы проще сопровождать, когда состояние разделено:
type AssistantRunState = {
status: "idle" | "retrieving" | "generating" | "complete" | "error"
draftText: string
evidence: Evidence[]
timings: {
retrievalMs?: number
firstTokenMs?: number
totalMs?: number
}
}
Это естественным образом соотносится с компонентами интерфейса: скелетоны во время поиска, потоковый текст во время генерации, карточки с подтверждающими материалами после завершения поиска и диагностические индикаторы при получении данных о времени выполнения.
Куда движется этот проект
Интересная сторона shadcn-ui/ui — не только набор компонентов. Это идея распространения кода.
Современным командам всё чаще нужно повторно используемое ПО, которое можно копировать, изучать и изменять, особенно по мере того, как ИИ-инструменты для написания кода становятся частью повседневной разработки. Модель компонентов, исходным кодом которых владеет команда, соответствует этому подходу. Разработчик может попросить ИИ-ассистента адаптировать локальный компонент, поскольку его код находится в репозитории. Не нужно разбираться в абстракциях пакета методом обратной разработки или бороться с недокументированными внутренними механизмами.
Это не делает его волшебным решением. Такой подход просто согласует модель компонентов с тем, как на самом деле работают многие команды: скопировать хорошую реализацию, адаптировать её и продолжать выпускать продукт.
Для команд, создающих ИИ-продукты, это часто разумный компромисс.
Практические рекомендации
shadcn-ui/uiрешает реальную задачу продуктовой разработки: создание проработанных, доступных и настраиваемых интерфейсов с сохранением контроля над компонентами.- В основе его архитектуры лежит исходный код: компоненты добавляются в ваш репозиторий и сопровождаются как локальный код, а не используются исключительно через непрозрачные API пакетов.
- Он лучше всего подходит для слоя интерфейса ИИ-систем: чатов, очередей проверки, панелей оценки, средств выбора моделей, трассировок инструментов и отображения источников поиска.
- Главный компромисс связан с сопровождением: после копирования компонентов ваша команда отвечает за их единообразие, доступность и обновления.
- Храните
components/uiуниверсальными, а поведение, специфичное для ИИ, размещайте вcomponents/ai, чтобы не привносить в примитивы постороннюю логику. - Используйте его, когда вам нужны скорость и контроль; избегайте его, если вам нужна полностью управляемая дизайн-система с централизованными обновлениями и минимальной ответственностью за фронтенд.
Один ключ API для Claude Opus 5.5, Sonnet 5, Haiku 4.5 и Fable 5.1, а также GPT-6 моделей. Оплата по мере использования, без подписки.
Получить ключ API →