Лучшее
10 лучших фреймворков JavaScript & TypeScript для создания систем ИИ (ноябрь 2026)
Unite.AI может получать вознаграждение, когда вы используете ссылки на рассмотренные нами продукты. Это не влияет на наши редакционные оценки. Читайте раскрытие об аффилированности.

Выбор лучшего фреймворка для ИИ на JavaScript или TypeScript зависит от задач приложения. Для потоковой передачи ответов модели в веб-интерфейс, координации агента с состоянием, поиска по закрытым документам и запуска модели на устройстве пользователя нужны разные инструменты. Хороший краткий список должен чётко обозначать эти различия.
В октябре 2026 года мы независимо оценили эти 10 проектов, изучив актуальную официальную документацию, поддерживаемые сценарии работы, требования к интеграции, варианты развёртывания и практические ограничения. Это редакционная оценка, а не новый практический сравнительный тест. Vercel AI SDK лидирует среди решений для генеративного ИИ в приложениях, тогда как лучший вариант для оркестрации, поиска и извлечения данных или локального инференса зависит от архитектуры.
В список входят фреймворки, SDK и библиотеки инференса, поскольку они решают взаимодополняющие задачи в составе системы ИИ. Они не взаимозаменяемы, и в некоторых случаях уместно использовать несколько решений. Начинайте с минимального набора, отвечающего конкретному требованию, а не объединяйте фреймворки только потому, что каждый из них поддерживает агентов.
Сравнение лучших фреймворков ИИ для JavaScript и TypeScript
| Инструмент ИИ | Лучше всего для | Функции |
|---|---|---|
| Vercel AI SDK | ИИ-функции с потоковой передачей данных в веб-приложениях | Адаптеры провайдеров; структурированный вывод; инструменты; агенты; интеграция с пользовательским интерфейсом |
| LangChain.js | Компонентные агенты и интеграции с моделями | Интерфейсы моделей; инструменты; промежуточное ПО; агенты на базе LangGraph |
| Mastra | Агенты и рабочие процессы на TypeScript в единой среде | Агенты; рабочие процессы; память; хранилище; Studio; трассировки и оценки |
| LangGraph.js | Явная оркестрация агентов с состоянием | Графы; сохранение состояния; прерывания; потоковая передача; детерминированные шаги и шаги с участием агентов |
| Google Genkit | Рабочие процессы ИИ-приложений со встроенными инструментами разработки | Интеграции с моделями; инструменты; структурированные данные; рабочие процессы; анализ трассировок |
| LlamaIndex TypeScript | Приложения, ориентированные на документы и знания | Коннекторы данных; индексы; средства поиска; агенты; событийные рабочие процессы |
| Transformers.js | Инференс предварительно обученных моделей на JavaScript | Конвейеры для разных задач; текст, изображения и аудио; ONNX Runtime; браузер и Node.js |
| ONNX Runtime Web | Инференс пользовательских моделей ONNX в браузерных приложениях | Сеансы инференса; тензоры; WebAssembly; возможность ускоренного выполнения |
| TensorFlow.js | Обучение пользовательских моделей и инференс на JavaScript | API моделей JavaScript; перенос обучения; выполнение в браузере и Node.js |
| MediaPipe Tasks for Web | Распознавание данных на устройстве для конкретных задач | Готовые модели; задачи компьютерного зрения и обработки аудио; API для развёртывания в веб-среде |
1. Vercel AI SDK
Vercel AI SDK — наша главная рекомендация для команд, работающих с TypeScript и добавляющих функции на базе моделей в веб-продукт. Он предоставляет единые интерфейсы для генерации, структурированных результатов, инструментов и агентов, а также средства пользовательского интерфейса для отображения потоковых ответов. Лучше всего он подходит на уровне взаимодействия с приложением: помогает связать работу модели с отзывчивым интерфейсом, не создавая заново для каждой функции инфраструктуру подключения провайдеров и потоковой передачи данных.
В актуальной документации отдельно описаны основные возможности, пользовательский интерфейс и интеграция с готовыми агентными средами. Это разделение помогает разработчикам выбрать, что им нужно: обращаться к модели, представлять её результаты или подключать готовую агентную среду. Единый интерфейс упрощает эксперименты, однако поддерживаемые входные данные, поведение инструментов и ограничения на выходные данные у провайдеров различаются. Замена адаптера — лишь первый шаг к миграции, а не гарантия того, что поведение приложения останется неизменным.
Выбирайте этот инструмент для чатов, помощи в работе с документами и других интерактивных функций продукта, где важны удобство TypeScript и потоковая передача данных. Сохранение состояния, авторизацию, качество поиска и извлечения данных, а также ограничения развёртывания по-прежнему нужно продумывать отдельно. Прежде чем добавлять ещё один фреймворк для оркестрации, выясните, отвечает ли требованиям ограниченный цикл вызова инструментов. AI SDK занимает первое место благодаря удобству разработки приложений, а не потому, что способен заменить любой механизм рабочих процессов или среду выполнения моделей.
Преимущества и недостатки
- Надёжно связывает вывод сервера с пользовательским интерфейсом
- Единые интерфейсы для разных провайдеров моделей
- Поддерживает структурированные результаты и приложения с использованием инструментов
- Возможности разных провайдеров различаются
- Архитектуру хранения данных и развёртывания всё равно нужно планировать
2. LangChain.js
LangChain.js — отличный выбор для приложений на JavaScript и TypeScript, которым нужны настраиваемые агенты и интеграции с разными поставщиками моделей. В используемой сейчас абстракции агента объединены модель, инструменты, инструкции и промежуточное ПО, благодаря чему разработчики могут задать поведение, необходимое приложению. Она особенно полезна, когда в рабочем процессе под управлением модели должны участвовать несколько внешних систем.
Связь с LangGraph важна: агенты LangChain используют LangGraph как основу, но разработчики могут напрямую выбрать LangGraph, чтобы получить более низкоуровневый контроль. Это взаимосвязанные уровни, а не совершенно независимые альтернативы. Точно так же трассировка и оценка с помощью LangSmith относятся к более широкой экосистеме; их не следует воспринимать как требование использовать в каждом приложении конкретный вариант развертывания на хостинге.
Начните с небольшого набора инструментов и четко определите их входные и выходные данные, а также поведение при сбоях. Промежуточное ПО помогает организовать политики и обработку запросов, но абстракции также вводят понятия, в которых команде придется разбираться при отладке. Мы рекомендуем LangChain.js, если его интеграции и настраиваемый цикл работы агента позволяют существенно сократить объем работы. Для одного простого вызова модели более понятным может оказаться прямое обращение к SDK; если же требуются нестандартные переходы состояний, LangGraph обеспечивает более точный контроль над выполнением.
Преимущества и недостатки
- Настраиваемые абстракции агентов и инструментов
- Широкий подход к интеграции моделей
- Интеграция с LangGraph и инструментами трассировки
- Дополнительные абстракции усложняют отладку
- Для простых вызовов модели фреймворк может не понадобиться
3. Mastra
Mastra — это фреймворк для TypeScript-команд, которым нужны агенты, рабочие процессы, память и вспомогательные инструменты разработки в рамках единой структуры проекта. В документации описаны хранение данных, интеграция с сервером, развертывание, трассировка, метрики и оценка, а Studio предоставляет интерфейс для просмотра приложения. Mastra особенно подходит для создания сервиса с агентами, а не для добавления одной конечной точки генерации текста.
В руководствах по интеграции рассматриваются распространенные веб- и серверные стеки, поэтому команда может встроить функциональность агентов в существующий продукт. Важно определить, какие решения следует поручить модели, а какие должны оставаться явными шагами рабочего процесса. Например, запрос можно интерпретировать с помощью модели, тогда как проверку данных, поиск учетной записи и допустимые изменения состояния можно выполнять детерминированным кодом приложения.
Интегрированный подход позволяет сократить объем работы по сборке, но вместе с тем делает большую часть приложения зависимой от абстракций фреймворка. Прежде чем внедрять весь стек, проверьте адаптеры хранения данных, границы аутентификации и особенности развертывания. Мы рекомендуем Mastra командам, работающим с TypeScript, если им важна единая среда разработки и они планируют эксплуатировать сложную логику агентов. Если приложению не нужны дополнительные возможности для рабочих процессов и управления состоянием, вполне разумно выбрать более компактный SDK.
Преимущества и недостатки
- Единая среда разработки агентов
- Концепции рабочих процессов, памяти и хранения данных
- Studio и инструменты наблюдаемости
- Более широкое внедрение фреймворка усиливает связанность
- Работа в производственной среде зависит от настроек хранения данных и развертывания
4. LangGraph.js
В этом обзоре LangGraph.js лучше всего подходит для случаев, когда главная задача — контролировать выполнение. Это низкоуровневый фреймворк оркестрации для длительно работающих агентов с сохранением состояния; он поддерживает сохранение данных, потоковую передачу и вмешательство человека. Разработчики могут объединять в графе предсказуемые шаги приложения с решениями, принимаемыми моделью, благодаря чему становится проще определить, на каких этапах ИИ влияет на рабочий процесс.
LangGraph можно использовать без LangChain, хотя эти два проекта тесно интегрированы. Выбирайте более высокоуровневую абстракцию агента LangChain для стандартного цикла вызова инструментов; используйте LangGraph напрямую, если требуется явно описать ветвления, приостановку и возобновление работы или пользовательские переходы состояний. Рабочий процесс, который ожидает проверки специалистом, а затем продолжается с сохраненного состояния, — более убедительный сценарий использования, чем простой чат-бот с одним инструментом.
Надежное выполнение требует тщательного проектирования приложения. Сохраняйте нужное состояние, настройте подходящее хранилище и убедитесь, что повторные попытки не приводят к случайному повторению внешнего действия. Проверяйте перезапуск между шагами, а не только успешное выполнение без прерываний. Мы рекомендуем LangGraph прежде всего за контроль, а не за простоту освоения: дополнительная структура оправдана, когда состояние и восстановление после сбоев являются ключевыми требованиями, но для короткого запроса без сохранения состояния может оказаться излишней.
Преимущества и недостатки
- Явный контроль над рабочим процессом и состоянием
- Поддержка сохранения состояния и вмешательства человека
- Возможность сочетать детерминированные шаги с шагами, управляемыми моделью
- Низкоуровневое проектирование требует больше инженерных усилий
- Повторные попытки и внешние побочные эффекты требуют продуманной обработки
5. Google Genkit
Google Genkit — это фреймворк с открытым исходным кодом для создания приложений и агентов на основе ИИ, поддерживающий, помимо прочих языков, TypeScript. Он связывает вызовы моделей и инструменты приложения с процессами разработки и проверки. Его преимущество — структурированный подход к созданию таких функций, как извлечение данных из документов, ассистенты и ответы на основе предоставленного контекста, при этом сохраняется возможность отслеживать шаги, которые привели к результату.
Хотя этот фреймворк создан Google, его интеграции с моделями не ограничиваются моделями Google. Поэтому его стоит сравнивать с другими решениями по тому, как он помогает выстраивать рабочие процессы приложения, а не считать всего лишь оболочкой для Firebase или Gemini. Начните с потока, у которого есть четкие входные данные и ожидаемый результат, а затем проверяйте ответы модели и работу инструментов, если результат неполный или неверный.
Интеграции с поставщиками моделей и варианты развертывания по-прежнему различаются по возможностям и стоимости. Убедитесь, что документация по TypeScript и поддержка плагинов подходят для конкретной модели, среды выполнения и конфигурации мониторинга, которые вы планируете использовать. Мы рекомендуем Genkit, если ориентированные на потоки средства разработки и проверки соответствуют стилю работы команды. Он менее необходим, когда простой клиент поставщика уже обеспечивает всю нужную функциональность, и не избавляет от необходимости проверять фактическую точность или задавать разрешения для инструментов в коде приложения.
Преимущества и недостатки
- Структурированная разработка приложений на основе ИИ
- Поддержка нескольких поставщиков моделей
- Инструменты для проверки выполнения
- Необходимо проверить возможности плагинов
- За качество моделей и настройку разрешений по-прежнему отвечает приложение
6. LlamaIndex TypeScript
LlamaIndex TypeScript — подходящий вариант, если основная задача состоит в том, чтобы предоставить приложению на основе ИИ полезный контекст из документов и бизнес-данных. Фреймворк включает коннекторы, компоненты для индексирования и поиска, агентов и рабочие процессы. Его ценность — в целостном пути от данных к ответу, а не в том, чтобы воспринимать большую коллекцию файлов как текст, который можно просто вставить в каждый запрос.
Текущая версия фреймворка также поддерживает событийные рабочие процессы, объединяющие поиск, генерацию и вызовы инструментов. Не следует смешивать эти возможности фреймворка с управляемыми сервисами LlamaCloud, такими как разбор и извлечение данных из документов. Пакет с открытым исходным кодом не обязательно включает все возможности размещенного сервиса, а примеры на Python из более широкой экосистемы не следует считать гарантией идентичной интеграции с TypeScript.
Прежде чем оценивать итоговый ответ, проверьте конвейер обработки данных. Убедитесь, что при разборе сохраняются таблицы и заголовки, поиск находит нужный фрагмент, а разрешения ограничивают контекст, который возвращается пользователю. Мы рекомендуем LlamaIndex TypeScript, если основная инженерная работа связана с подготовкой исходных данных и поиском по ним. Если приложение в основном координирует действия через API, лучше начать с универсального фреймворка для агентов; если поиск прост, может быть достаточно явных запросов к базе данных.
Преимущества и недостатки
- Специализированные строительные блоки для работы с данными и поиска
- Сочетает поиск с агентами и рабочими процессами
- Полезная структура для приложений, работающих со знаниями
- Управляемые сервисы — отдельные продукты
- Объем поддержки интеграций с TypeScript и Python может различаться
Познакомьтесь с LlamaIndex TypeScript
7. Transformers.js
Transformers.js — наш предпочтительный вариант для начала работы с поддерживаемыми предварительно обученными моделями-трансформерами непосредственно в JavaScript. Интерфейс конвейеров объединяет выполнение модели с обработкой входных и выходных данных для таких задач, как классификация, создание эмбеддингов и распознавание речи. Эта библиотека выполняет иную функцию, чем рассмотренные выше фреймворки для агентов: приложение запускает модель, а не просто координирует вызовы размещенного сервиса.
Библиотека использует ONNX Runtime и поддерживает выполнение в браузере, в том числе через WebAssembly и WebGPU, если они доступны. Запуск модели в браузере позволяет не передавать входные данные с устройства, однако это зависит от сетевого поведения приложения в целом, а не только от названия библиотеки. Файлы моделей все равно может потребоваться скачать; их размер, потребление памяти и время инициализации влияют на удобство первого запуска.
Прежде чем обещать совместимость, проверьте конкретную архитектуру модели, экспортированные файлы, тип данных и целевое устройство. В основной ветке документации может описываться еще не выпущенный код, поэтому пользуйтесь документацией, соответствующей установленной версии пакета. Мы рекомендуем Transformers.js для выполнения предварительно обученных моделей под конкретные задачи, если предварительная обработка с его помощью сокращает объем работы. Совместимость не гарантируется для каждой контрольной точки Transformers на Python, а для маломощных устройств могут понадобиться модели меньшего размера или переход на сервер.
Преимущества и недостатки
- Удобные конвейеры для решения конкретных задач
- Поддержка нескольких типов данных
- Запуск моделей в браузере и на сервере с использованием JavaScript
- Необходимо проверять совместимость моделей и среды выполнения
- Загрузки и объём памяти устройства влияют на удобство использования
8. ONNX Runtime Web
ONNX Runtime Web — низкоуровневый вариант для разработчиков, у которых уже есть модель ONNX и которым нужен непосредственный контроль над её выполнением в браузере. Вместо готового решения для работы с агентами или документами он предоставляет интерфейсы для сеансов, тензоров и настройки среды выполнения. Это закрывает важный пробел в нашем списке: развёртывание существующей модели может быть главной задачей, даже если оркестрация языковой модели не требуется.
По сравнению с Transformers.js разработчикам приходится самостоятельно выполнять больше работы по подготовке входных данных и интерпретации результатов. Это может быть полезно для специализированных конвейеров компьютерного зрения или классификации, если формы тензоров и этапы предварительной обработки уже определены командой, создавшей модель. Убедитесь, что экспортированный граф и его операторы совместимы с выбранной средой выполнения: работа модели в одной среде не гарантирует её совместимость со всеми браузерными ускорителями.
В документации для начинающих интеграционные решения WebGPU и WebNN сейчас помечены как экспериментальные, поэтому при планировании развёртывания следует учитывать конкретную проверяемую комбинацию среды выполнения и браузера. В ходе оценки проверьте инициализацию, загрузку модели, использование памяти и поведение при переходе на резервный вариант. Мы рекомендуем ONNX Runtime Web, если вам нужен контроль над уже имеющимся файлом модели. Если готовая поддержка предварительной обработки и моделей в библиотеке для конкретной задачи сэкономит больше усилий, чем доступ на низком уровне, выберите такую библиотеку.
Преимущества и недостатки
- Непосредственный контроль над выполнением моделей ONNX
- Подходит для специализированных экспортированных моделей
- Интерфейсы среды выполнения для JavaScript и TypeScript
- Требуется предварительная обработка данных и обработка результатов с учётом особенностей модели
- Ускоренные среды выполнения имеют ограничения совместимости
9. TensorFlow.js
TensorFlow.js остаётся актуальным решением, когда разработчикам нужно создавать, адаптировать или запускать модели машинного обучения на JavaScript, а не подключаться к сервису генеративного ИИ. Библиотека поддерживает разработку и обучение моделей, использование предварительно обученных моделей, а также преобразование совместимых моделей TensorFlow, созданных на Python. Благодаря этому TensorFlow.js подходит для интерактивных обучающих приложений и пользовательских задач прогнозирования в браузере или среде Node.js.
Возможность обучения существенно отличает библиотеку от инструментов, предназначенных главным образом для работы предварительно обученных моделей. Например, небольшое приложение может адаптировать уже имеющееся представление к категориям, заданным пользователями. Важно понять, нужно ли выполнять такое обучение на JavaScript, непосредственно на устройстве или в рамках уже существующего продукта, а не выяснять, требуется ли проекту фреймворк для агентов.
Для конкретной модели и целевой среды выполнения проверьте поддержку преобразования моделей, поведение сред выполнения, управление памятью и совместимость зависимостей. Небольшой пример работы в браузере не доказывает, что крупная модель поместится в память типичного устройства пользователя. Мы рекомендуем TensorFlow.js для специализированных задач машинного обучения, в которых полезны его средства обучения и API для работы с тензорами. Для поддерживаемых предварительно обученных трансформеров более прямой интерфейс может предложить Transformers.js, а для готовой модели ONNX подойдёт другой вариант развёртывания — ONNX Runtime Web.
Преимущества и недостатки
- Поддерживает как обучение, так и вывод
- API для разработки моделей на JavaScript
- Рабочие процессы в браузере и Node.js
- Преобразование моделей имеет ограничения совместимости
- На пользовательских устройствах важно учитывать управление ресурсами
10. MediaPipe Tasks for Web
MediaPipe Tasks for Web — практичный вариант, если приложению нужна поддерживаемая задача распознавания, например определение ключевых точек рук или позы, обнаружение объектов либо классификация аудио. API для таких задач сочетают модели с заданным способом обработки входных данных и интерпретации результатов. Для интерфейса, работающего с камерой, такой подход может быть намного проще, чем выбор универсального фреймворка для агентов и отдельная сборка конвейера распознавания.
Главное ограничение — доступность на разных платформах. Общий каталог MediaPipe охватывает несколько платформ, но в интернете доступны не все перечисленные задачи. Прежде чем строить решение на конкретной задаче, сверьтесь с официальной таблицей доступности и руководством для веб-разработки. Возможности настройки моделей также зависят от задачи: наличие Model Maker в экосистеме не означает, что любую модель можно переобучить непосредственно в браузере.
Оцените работу в реальных условиях съёмки или записи звука, учитывая, например, слабое освещение, фоновый шум и устройства, которыми действительно пользуется ваша аудитория. Не допускайте, чтобы вывод данных делал интерфейс неотзывчивым, и понятно объясняйте пользователям запросы на предоставление разрешений. Мы рекомендуем MediaPipe, если вам нужна чётко определённая и поддерживаемая задача распознавания. Это специализированный набор инструментов, а не универсальный фреймворк для больших языковых моделей; более низкая позиция в рейтинге объясняется его узкой областью применения, а не худшей производительностью при решении предусмотренных для него задач.
Преимущества и недостатки
- Специализированные API для поддерживаемых задач распознавания
- Предварительно обученные модели сокращают объём подготовительной работы
- Полезно для интерактивных приложений, работающих непосредственно на устройстве
- Доступность в веб-среде зависит от задачи
- Настройки и производительность устройства необходимо проверить
Изучите MediaPipe Tasks for Web
Сначала выберите уровень, затем — фреймворк
SDK приложений связывают модели с функциями и интерфейсами продукта. Фреймворки для агентов организуют решения моделей и работу с инструментами. Среды выполнения рабочих процессов управляют состоянием, ветвлением и восстановлением. Фреймворки для поиска подготавливают и предоставляют релевантный контекст. Библиотеки инференса выполняют модели. Отзывчивый чат-интерфейс не доказывает, что рабочий процесс сохранится после перезапуска, а успешная загрузка модели не гарантирует, что она будет хорошо работать на телефоне.
LangChain и LangGraph намеренно частично перекрываются по функциональности: агенты LangChain используют LangGraph внутри, тогда как непосредственное использование LangGraph обеспечивает более низкоуровневый контроль. Transformers.js и ONNX Runtime Web также относятся к смежным уровням: Transformers.js дополняет среду выполнения удобными средствами для работы с моделями и задачами. Эти взаимосвязи должны помогать правильно сочетать компоненты, а не побуждать к дублированию инфраструктуры.
Что проверить перед выбором
- Качество реальных результатов: Используйте репрезентативные входные данные и заранее известные ожидаемые результаты. Проверяйте структурированный вывод во время выполнения: одних типов TypeScript недостаточно, чтобы гарантировать корректность внешнего ответа.
- Сбои и восстановление: Проверьте тайм-ауты, прерывание потоков, недоступность инструментов и перезапуски. Для рабочих процессов с сохранением состояния убедитесь, что возобновление не приводит к повторному выполнению значимого внешнего действия.
- Переносимость между провайдерами: Повторите одну и ту же задачу с каждой предполагаемой к использованию моделью. Сравните работу инструментов, поддержку структурированного вывода, задержку и стоимость, а не исходите из предположения, что единый API делает провайдеров одинаковыми.
- Совместимость со средой выполнения: Проверьте конкретную среду Node.js, браузера или edge и ее зависимости. Нативные пакеты, файлы моделей, обработка соединений и длительные операции могут влиять на то, где можно развернуть код.
- Работа в браузере: На типичных устройствах измерьте время загрузки модели при холодном старте, инициализацию, потребление памяти, отзывчивость и поведение при переходе на запасной вариант. Храните секреты провайдера на сервере: локальный инференс в браузере не служит основанием для раскрытия ключей API.
- Наблюдаемость в эксплуатации: Отслеживайте вызовы моделей, результаты работы инструментов, сбои и затраты, контролируя при этом, какие конфиденциальные данные попадают в журналы. Проверяйте авторизацию инструментов в коде приложения и тестируйте ее отдельно от инструкций модели.
Зафиксируйте версии зависимостей и изучите документацию для установленной версии. В частности, в основной документации Transformers.js могут описываться сборки из исходного кода, тогда как в руководстве по ONNX Runtime Web некоторые способы ускорения помечены как экспериментальные. Ознакомьтесь с актуальными рекомендациями к выпуску, прежде чем считать демонстрационный пример гарантией возможности развертывания.
О слое данных читайте в нашем обзоре баз данных для машинного обучения и ИИ. О выборе моделей — в руководстве по LLM с открытым исходным кодом и открытыми весами. Этот выбор влияет на качество поиска и генерации независимо от JavaScript-фреймворка.
Какой JavaScript- или TypeScript-фреймворк для ИИ выбрать?
Выберите Vercel AI SDK для интерактивных функций ИИ в продукте, LangChain.js для настраиваемых агентов и интеграций или Mastra для комплексной среды разработки агентов на TypeScript. Переходите к оркестрации непосредственно с помощью LangGraph.js, если явное управление состоянием, ветвлением и восстановлением является одним из главных требований.
Рассмотрите Google Genkit для разработки приложений на основе потоков и LlamaIndex TypeScript, если основная часть работы связана с документами и поиском. Для моделей, работающих на JavaScript, начните с Transformers.js для поддерживаемых предварительно обученных задач, ONNX Runtime Web для управления известной моделью ONNX, TensorFlow.js для обучения и инференса пользовательских моделей или MediaPipe Tasks for Web для поддерживаемых задач распознавания.
В наиболее надежной архитектуре у каждого компонента есть четко определенная задача. Добавляйте абстракцию, если она избавляет от повторяющейся работы или упрощает проверку поведения, а обычную логику приложения оставляйте явной, если модели не требуется принимать решение.












