Shopping Assistant
AI-ассистент по питанию для похода в магазин: наведите камеру на товар, штрихкод или состав и получите КБЖУ, предупреждения по вашим аллергенам и диете, советы по хранению и идеи рецептов. Проект в БГУИР.
Закрытый код
git clone shopping-assistantДоступ запрещён: репозиторий приватный.Попросите у меня демоЗачем
В магазине хочется быстро понять, подходит ли продукт под вашу диету и нет ли в нём ваших аллергенов, а по этикетке это быстро не поймёшь. Shopping Assistant распознаёт продукт и сверяет его с вашим профилем питания.
Как это работает
Сфотографируйте товар, отсканируйте штрихкод, снимите состав или введите название, и вы получите карточку с КБЖУ, советами по хранению и идеями рецептов. Аллергены, диеты и норма калорий уходят в каждый запрос, а красный баннер предупреждает о совпадении с аллергеном.
Что сделал я
Соавтор вместе с Владиславом Василевским и Вячеславом Микшей, командный проект в БГУИР. У Flutter-приложения нет своего бэкенда: штрихкоды ищутся в Open Food Facts, а фото уходят в AI-модели через каскад провайдеров с квотами, общим бюджетом времени и circuit breaker.
Статус
Идёт стабилизация: аудит дефектов, исправления и тесты готовы, дальше проверка на реальных устройствах и сборки под iOS. Код закрыт, потому что принадлежит учебному проекту.
- Роль
- Соавтор (командный проект в БГУИР)
- Команда
- Роман Рында, Соавтор
- Владислав Василевский, Соавтор
- Вячеслав Андреевич Микша, Соавтор
- Период
- 2026
- Статус
- В работе
- Стек
- Flutter, Dart, flutter_bloc, get_it, go_router, dio, camera, mobile_scanner, flutter_secure_storage, Open Food Facts API, Gemini, OpenRouter, Groq, Cloudflare AI
Главное
- Распознаёт продукт четырьмя способами: по фото, штрихкоду, фото состава или названию
- Профиль питания с аллергенами, диетами и нормой калорий, который учитывает AI
- Красное предупреждение, если продукт или его состав совпадает с вашим аллергеном
- Идеи рецептов к каждому продукту, с таймером и отправкой недостающего в список покупок
- Сравнение двух продуктов, история с поиском, избранное и список покупок
- Каждая карточка говорит, откуда данные, и не выдумывает неизвестные числа
- Gemini: лимит исчерпан
- OpenRouter: готово
Овсяное печенье
Пример данныхОценка ИИ по фото, Сладости и снеки
- ккал
- 450
- Белки
- 6.5 г
- Жиры
- 18 г
- Углев.
- 64 г
- Сахара
- —
! Глютен: есть в вашем списке аллергенов
Может содержать орехи (не в вашем списке)
- Вегетарианская: да
- Веганская: нет
- Без глютена: нет
- Кето: нет
- Халяль: зависит
+ Овёс даёт клетчатку.
− Много сахара и жира: 450 ккал — около пятой части вашей нормы 2000 ккал.
- Йогуртовый парфе с крошкой печенья10 мин, легко, 2 порции
- Печёные яблоки с овсяной посыпкой35 мин, легко, 4 порции
Сочетается: молоко, кефир, ягоды
Заметки ИИ о диетах — не сертификация. Проверяйте этикетку.
Овсяное печенье
Пример данныхOpen Food Facts, на 100 г
- ккал
- 450
- Белки
- 6.5 г
- Жиры
- 18 г
- Углев.
- 64 г
- Сахара
- —
! Аллергены: глютен, совпадает с профилем. Может содержать орехи.
Неизвестное значение показано прочерком, а не нулём.


Карточка продукта: источник данных сверху, красное предупреждение при совпадении с вашими аллергенами и калории одним взглядом.


Профиль питания: аллергены, диеты и норма калорий попадают в каждый запрос к AI и включают красный баннер безопасности.


Сканер переключается между фото товара, штрихкодом и составом, а название можно просто ввести.


Онбординг объясняет идею: один раз указали аллергены и диеты и получаете предупреждение ещё до покупки.
1 / 4 Карточка продукта: источник данных сверху, красное предупреждение при совпадении с вашими аллергенами и калории одним взглядом.
Что это
Вы в магазине, держите в руках продукт и хотите понять, стоит ли его брать. Сфотографируйте его, отсканируйте штрихкод, снимите состав на упаковке или просто введите название. Приложение соберёт карточку продукта под вас.
Карточка показывает калории и БЖУ, витамины и минералы, как хранить продукт и как его выбирать. Она предлагает от двух до четырёх рецептов, и у каждого есть таймер готовки, оценка калорий на порцию и кнопка, которая отправляет недостающие ингредиенты в список покупок. Основа всего это профиль питания: вы отмечаете свои аллергены, диеты (веганство, без глютена, кето, халяль и другие) и суточную норму калорий. Профиль уходит с каждым запросом к AI, так что модель проверяет продукт с его учётом, а красный баннер в карточке предупреждает, если продукт или его состав совпадает с вашим аллергеном.
Фото состава на упаковке превращается в список ингредиентов и E-добавок, которые сразу сверяются с вашими аллергенами. Всё отсканированное попадает в историю с поиском и фильтром по категориям. Два продукта из неё можно сравнить рядом, а ещё есть избранное и список покупок, разложенный по категориям.
Что я сделал
Мобильное приложение с четырьмя способами распознавания и без собственного бэкенда, вместе с Владиславом Василевским и Вячеславом Микшей. Штрихкоды ищутся в открытой базе Open Food Facts, поэтому в карточке настоящие данные с упаковки. Фото, состав и названия уходят в мультимодальные AI-модели прямо с устройства через каскад провайдеров.


Карточка продукта: источник данных сверху, красное предупреждение при совпадении с вашими аллергенами и калории одним взглядом.


Профиль питания: аллергены, диеты и норма калорий попадают в каждый запрос к AI и включают красный баннер безопасности.


Сканер переключается между фото товара, штрихкодом и составом, а название можно просто ввести.


Онбординг объясняет идею: один раз указали аллергены и диеты и получаете предупреждение ещё до покупки.
1 / 4 Карточка продукта: источник данных сверху, красное предупреждение при совпадении с вашими аллергенами и калории одним взглядом.
Технические решения
- Промпты с учётом профиля. Версионированные промпты просят у модели строгую JSON-карточку: пищевая ценность, польза и предостережения, совместимость с каждой диетой, аллергены с пометкой о совпадении с профилем, хранение, советы по выбору и рецепты. Профиль подставляется в промпт, и конфликты с ним должны идти первыми в предостережениях. Профиль входит и в ключ кэша, так что после его изменения устаревшая карточка не вернётся.
- Аллергены проверяются локально, а не на слово. Что бы ни ответила модель, локальный сопоставитель с русскими и английскими синонимами для 12 групп аллергенов ещё раз проверяет состав, аллергены и следы из Open Food Facts, и его результат главнее. Отсутствие совпадения никогда не выдаётся за гарантию: карточка просит сверяться с упаковкой.
- Каскад провайдеров. Запросы по очереди идут через разрешённые модели Gemini, OpenRouter, Groq и Cloudflare с общим бюджетом в 90 секунд, политикой на каждый тип ошибки (повторить, следующая модель или остановиться), учётом квот по минутам и дням, circuit breaker, который переживает перезапуск, и журналом попыток. Ответы проверяются по схеме, а сломанный ответ запускает короткий запрос на исправление.
- Подготовка на устройстве. Фото поворачивается по EXIF, уменьшается максимум до 1024 px и сжимается в JPEG с качеством 80 перед отправкой. Штрихкоды сканируются на устройстве через
mobile_scanner. - Честные данные. Каждая карточка говорит, откуда данные: Open Food Facts, оценка AI или состав, прочитанный AI. Неизвестные нутриенты показываются прочерком, а не нулём, а сравнение отказывается сопоставлять значения на разную базу. Неизвестный штрихкод даёт ошибку, а не придуманную моделью карточку.
- Офлайн-очередь. Текстовый запрос без сети сохраняется и повторяется, когда сеть возвращается или приложение снова становится активным.
- Секреты. API-ключи лежат во
flutter_secure_storage, старые ключи удаляются из обычных настроек только после успешной миграции. - Структура. Папки по фичам с BLoC и Cubit,
get_itдля зависимостей иgo_routerдля пяти вкладок: сканер, история, список, профиль и настройки. Экран диагностики показывает цепочку моделей, очередь и состояние предохранителей. Юнит- и виджет-тесты работают с замоканными AI и HTTP.
Результат
Приложение на стадии стабилизации: письменный аудит дефектов, исправления и тесты сделаны. Сборки для Android пока только тестовые, проверки на реальных устройствах и сборки под iOS впереди. Код закрыт, потому что это учебный проект БГУИР. Скриншоты сняты в симуляторе iOS и показывают сценарии, которые работают без AI-ключей.
Моя роль
Соавтор приложения вместе с Владиславом Василевским и Вячеславом Андреевичем Микшей в рамках командного проекта в БГУИР.